From d2928bd43fe5de8d8548bdc08fce2db33f65ee7c Mon Sep 17 00:00:00 2001 From: wuxiang Date: Tue, 19 Nov 2024 16:59:54 +0800 Subject: [PATCH] init --- .browserslistrc | 16 + .editorconfig | 16 + .eslintrc.json | 46 + .gitignore | 68 + .vscode/extensions.json | 5 + .vscode/settings.json | 3 + README.md | 3 + angular.json | 179 + config.xml | 101 + ionic.config.json | 7 + karma.conf.js | 44 + package-lock.json | 15829 ++++ package.json | 77 + resources/README.md | 8 + resources/android/icon/drawable-hdpi-icon.png | Bin 0 -> 4264 bytes resources/android/icon/drawable-ldpi-icon.png | Bin 0 -> 1654 bytes resources/android/icon/drawable-mdpi-icon.png | Bin 0 -> 2597 bytes .../android/icon/drawable-xhdpi-icon.png | Bin 0 -> 6529 bytes .../android/icon/drawable-xxhdpi-icon.png | Bin 0 -> 11034 bytes .../android/icon/drawable-xxxhdpi-icon.png | Bin 0 -> 14886 bytes .../splash/drawable-land-hdpi-screen.png | Bin 0 -> 28087 bytes .../splash/drawable-land-ldpi-screen.png | Bin 0 -> 8520 bytes .../splash/drawable-land-mdpi-screen.png | Bin 0 -> 14547 bytes .../splash/drawable-land-xhdpi-screen.png | Bin 0 -> 48332 bytes .../splash/drawable-land-xxhdpi-screen.png | Bin 0 -> 81272 bytes .../splash/drawable-land-xxxhdpi-screen.png | Bin 0 -> 113380 bytes .../splash/drawable-port-hdpi-screen.png | Bin 0 -> 26962 bytes .../splash/drawable-port-ldpi-screen.png | Bin 0 -> 8207 bytes .../splash/drawable-port-mdpi-screen.png | Bin 0 -> 13979 bytes .../splash/drawable-port-xhdpi-screen.png | Bin 0 -> 47984 bytes .../splash/drawable-port-xxhdpi-screen.png | Bin 0 -> 70891 bytes .../splash/drawable-port-xxxhdpi-screen.png | Bin 0 -> 101114 bytes .../android/xml/network_security_config.xml | 6 + resources/icon.png | Bin 0 -> 60857 bytes resources/ios/icon/icon-1024.png | Bin 0 -> 61395 bytes resources/ios/icon/icon-20.png | Bin 0 -> 686 bytes resources/ios/icon/icon-20@2x.png | Bin 0 -> 1937 bytes resources/ios/icon/icon-20@3x.png | Bin 0 -> 3417 bytes resources/ios/icon/icon-24@2x.png | Bin 0 -> 2597 bytes resources/ios/icon/icon-27.5@2x.png | Bin 0 -> 3066 bytes resources/ios/icon/icon-29.png | Bin 0 -> 1267 bytes resources/ios/icon/icon-29@2x.png | Bin 0 -> 3362 bytes resources/ios/icon/icon-29@3x.png | Bin 0 -> 5937 bytes resources/ios/icon/icon-40.png | Bin 0 -> 1937 bytes resources/ios/icon/icon-40@2x.png | Bin 0 -> 5253 bytes resources/ios/icon/icon-40@3x.png | Bin 0 -> 8254 bytes resources/ios/icon/icon-44@2x.png | Bin 0 -> 5833 bytes resources/ios/icon/icon-50.png | Bin 0 -> 2757 bytes resources/ios/icon/icon-50@2x.png | Bin 0 -> 6842 bytes resources/ios/icon/icon-60.png | Bin 0 -> 3417 bytes resources/ios/icon/icon-60@2x.png | Bin 0 -> 8254 bytes resources/ios/icon/icon-60@3x.png | Bin 0 -> 14475 bytes resources/ios/icon/icon-72.png | Bin 0 -> 4264 bytes resources/ios/icon/icon-72@2x.png | Bin 0 -> 11034 bytes resources/ios/icon/icon-76.png | Bin 0 -> 4931 bytes resources/ios/icon/icon-76@2x.png | Bin 0 -> 11699 bytes resources/ios/icon/icon-83.5@2x.png | Bin 0 -> 12660 bytes resources/ios/icon/icon-86@2x.png | Bin 0 -> 13553 bytes resources/ios/icon/icon-98@2x.png | Bin 0 -> 16355 bytes resources/ios/icon/icon-small.png | Bin 0 -> 1267 bytes resources/ios/icon/icon-small@2x.png | Bin 0 -> 3362 bytes resources/ios/icon/icon-small@3x.png | Bin 0 -> 5937 bytes resources/ios/icon/icon.png | Bin 0 -> 3281 bytes resources/ios/icon/icon@2x.png | Bin 0 -> 8226 bytes resources/ios/splash/Default-2436h.png | Bin 0 -> 106666 bytes .../ios/splash/Default-568h@2x~iphone.png | Bin 0 -> 40249 bytes resources/ios/splash/Default-667h.png | Bin 0 -> 51333 bytes resources/ios/splash/Default-736h.png | Bin 0 -> 108540 bytes .../ios/splash/Default-Landscape-2436h.png | Bin 0 -> 115885 bytes .../ios/splash/Default-Landscape-736h.png | Bin 0 -> 119640 bytes .../ios/splash/Default-Landscape@2x~ipad.png | Bin 0 -> 136246 bytes .../ios/splash/Default-Landscape@~ipadpro.png | Bin 0 -> 95354 bytes .../ios/splash/Default-Landscape~ipad.png | Bin 0 -> 44293 bytes .../ios/splash/Default-Portrait@2x~ipad.png | Bin 0 -> 150631 bytes .../ios/splash/Default-Portrait@~ipadpro.png | Bin 0 -> 101584 bytes .../ios/splash/Default-Portrait~ipad.png | Bin 0 -> 44140 bytes resources/ios/splash/Default@2x~iphone.png | Bin 0 -> 36620 bytes .../splash/Default@2x~universal~anyany.png | Bin 0 -> 123242 bytes resources/ios/splash/Default~iphone.png | Bin 0 -> 13979 bytes resources/splash.png | Bin 0 -> 78688 bytes src/app/app-routing.module.ts | 22 + src/app/app.component.html | 3 + src/app/app.component.scss | 0 src/app/app.component.spec.ts | 21 + src/app/app.component.ts | 10 + src/app/app.module.ts | 16 + src/app/home/home-routing.module.ts | 16 + src/app/home/home.module.ts | 19 + src/app/home/home.page.html | 17 + src/app/home/home.page.scss | 27 + src/app/home/home.page.spec.ts | 24 + src/app/home/home.page.ts | 16 + src/assets/icon/favicon.png | Bin 0 -> 930 bytes .../pdf-annotation/annotation/annotation.js | 5364 ++ .../pdf-annotation/annotation/config.js | 829 + src/assets/pdf-annotation/annotation/drag.js | 212 + src/assets/pdf-annotation/annotation/main.js | 239 + .../pdf-annotation/annotation/promise_js.js | 422 + src/assets/pdf-annotation/annotation/utils.js | 1707 + src/assets/pdf-annotation/build/pdf.js | 20056 +++++ .../pdf-annotation/build/pdf.sandbox.js | 281 + src/assets/pdf-annotation/build/pdf.worker.js | 68205 ++++++++++++++++ src/assets/pdf-annotation/css/annotation.css | 997 + .../pdf-annotation/css/svgs/edgecontrol.svg | 17 + .../pdf-annotation/css/svgs/middlecontrol.svg | 17 + .../css/svgs/middlecontrolhoz.svg | 17 + .../pdf-annotation/css/svgs/rotateicon.svg | 20 + .../fontawesome/HELP-US-OUT.txt | 7 + .../fontawesome/css/font-awesome.css | 2337 + .../fontawesome/css/font-awesome.min.css | 4 + .../fontawesome/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../fontawesome/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../fontawesome/fonts/fontawesome-webfont.svg | 2671 + .../fontawesome/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../fontawesome/less/animated.less | 34 + .../fontawesome/less/bordered-pulled.less | 25 + .../pdf-annotation/fontawesome/less/core.less | 12 + .../fontawesome/less/fixed-width.less | 6 + .../fontawesome/less/font-awesome.less | 18 + .../fontawesome/less/icons.less | 789 + .../fontawesome/less/larger.less | 13 + .../pdf-annotation/fontawesome/less/list.less | 19 + .../fontawesome/less/mixins.less | 60 + .../pdf-annotation/fontawesome/less/path.less | 15 + .../fontawesome/less/rotated-flipped.less | 20 + .../fontawesome/less/screen-reader.less | 5 + .../fontawesome/less/stacked.less | 20 + .../fontawesome/less/variables.less | 800 + .../fontawesome/scss/_animated.scss | 34 + .../fontawesome/scss/_bordered-pulled.scss | 25 + .../fontawesome/scss/_core.scss | 12 + .../fontawesome/scss/_fixed-width.scss | 6 + .../fontawesome/scss/_icons.scss | 789 + .../fontawesome/scss/_larger.scss | 13 + .../fontawesome/scss/_list.scss | 19 + .../fontawesome/scss/_mixins.scss | 60 + .../fontawesome/scss/_path.scss | 15 + .../fontawesome/scss/_rotated-flipped.scss | 20 + .../fontawesome/scss/_screen-reader.scss | 5 + .../fontawesome/scss/_stacked.scss | 20 + .../fontawesome/scss/_variables.scss | 800 + .../fontawesome/scss/font-awesome.scss | 18 + src/assets/pdf-annotation/thirdjs/1.js | 31542 +++++++ src/assets/pdf-annotation/thirdjs/2.js | 253 + src/assets/pdf-annotation/thirdjs/3.js | 7 + src/assets/pdf-annotation/thirdjs/4.js | 39674 +++++++++ .../pdf-annotation/web/cmaps/78-EUC-H.bcmap | Bin 0 -> 2404 bytes .../pdf-annotation/web/cmaps/78-EUC-V.bcmap | Bin 0 -> 173 bytes .../pdf-annotation/web/cmaps/78-H.bcmap | Bin 0 -> 2379 bytes .../pdf-annotation/web/cmaps/78-RKSJ-H.bcmap | Bin 0 -> 2398 bytes .../pdf-annotation/web/cmaps/78-RKSJ-V.bcmap | Bin 0 -> 173 bytes .../pdf-annotation/web/cmaps/78-V.bcmap | Bin 0 -> 169 bytes .../web/cmaps/78ms-RKSJ-H.bcmap | Bin 0 -> 2651 bytes .../web/cmaps/78ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../web/cmaps/83pv-RKSJ-H.bcmap | Bin 0 -> 905 bytes .../web/cmaps/90ms-RKSJ-H.bcmap | Bin 0 -> 721 bytes .../web/cmaps/90ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../web/cmaps/90msp-RKSJ-H.bcmap | Bin 0 -> 715 bytes .../web/cmaps/90msp-RKSJ-V.bcmap | Bin 0 -> 291 bytes .../web/cmaps/90pv-RKSJ-H.bcmap | Bin 0 -> 982 bytes .../web/cmaps/90pv-RKSJ-V.bcmap | Bin 0 -> 260 bytes .../pdf-annotation/web/cmaps/Add-H.bcmap | Bin 0 -> 2419 bytes .../pdf-annotation/web/cmaps/Add-RKSJ-H.bcmap | Bin 0 -> 2413 bytes .../pdf-annotation/web/cmaps/Add-RKSJ-V.bcmap | Bin 0 -> 287 bytes .../pdf-annotation/web/cmaps/Add-V.bcmap | Bin 0 -> 282 bytes .../web/cmaps/Adobe-CNS1-0.bcmap | Bin 0 -> 317 bytes .../web/cmaps/Adobe-CNS1-1.bcmap | Bin 0 -> 371 bytes .../web/cmaps/Adobe-CNS1-2.bcmap | Bin 0 -> 376 bytes .../web/cmaps/Adobe-CNS1-3.bcmap | Bin 0 -> 401 bytes .../web/cmaps/Adobe-CNS1-4.bcmap | Bin 0 -> 405 bytes .../web/cmaps/Adobe-CNS1-5.bcmap | Bin 0 -> 406 bytes .../web/cmaps/Adobe-CNS1-6.bcmap | Bin 0 -> 406 bytes .../web/cmaps/Adobe-CNS1-UCS2.bcmap | Bin 0 -> 41193 bytes .../web/cmaps/Adobe-GB1-0.bcmap | Bin 0 -> 217 bytes .../web/cmaps/Adobe-GB1-1.bcmap | Bin 0 -> 250 bytes .../web/cmaps/Adobe-GB1-2.bcmap | Bin 0 -> 465 bytes .../web/cmaps/Adobe-GB1-3.bcmap | Bin 0 -> 470 bytes .../web/cmaps/Adobe-GB1-4.bcmap | Bin 0 -> 601 bytes .../web/cmaps/Adobe-GB1-5.bcmap | Bin 0 -> 625 bytes .../web/cmaps/Adobe-GB1-UCS2.bcmap | Bin 0 -> 33974 bytes .../web/cmaps/Adobe-Japan1-0.bcmap | Bin 0 -> 225 bytes .../web/cmaps/Adobe-Japan1-1.bcmap | Bin 0 -> 226 bytes .../web/cmaps/Adobe-Japan1-2.bcmap | Bin 0 -> 233 bytes .../web/cmaps/Adobe-Japan1-3.bcmap | Bin 0 -> 242 bytes .../web/cmaps/Adobe-Japan1-4.bcmap | Bin 0 -> 337 bytes .../web/cmaps/Adobe-Japan1-5.bcmap | Bin 0 -> 430 bytes .../web/cmaps/Adobe-Japan1-6.bcmap | Bin 0 -> 485 bytes .../web/cmaps/Adobe-Japan1-UCS2.bcmap | Bin 0 -> 40951 bytes .../web/cmaps/Adobe-Korea1-0.bcmap | Bin 0 -> 241 bytes .../web/cmaps/Adobe-Korea1-1.bcmap | Bin 0 -> 386 bytes .../web/cmaps/Adobe-Korea1-2.bcmap | Bin 0 -> 391 bytes .../web/cmaps/Adobe-Korea1-UCS2.bcmap | Bin 0 -> 23293 bytes .../pdf-annotation/web/cmaps/B5-H.bcmap | Bin 0 -> 1086 bytes .../pdf-annotation/web/cmaps/B5-V.bcmap | Bin 0 -> 142 bytes .../pdf-annotation/web/cmaps/B5pc-H.bcmap | Bin 0 -> 1099 bytes .../pdf-annotation/web/cmaps/B5pc-V.bcmap | Bin 0 -> 144 bytes .../pdf-annotation/web/cmaps/CNS-EUC-H.bcmap | Bin 0 -> 1780 bytes .../pdf-annotation/web/cmaps/CNS-EUC-V.bcmap | Bin 0 -> 1920 bytes .../pdf-annotation/web/cmaps/CNS1-H.bcmap | Bin 0 -> 706 bytes .../pdf-annotation/web/cmaps/CNS1-V.bcmap | Bin 0 -> 143 bytes .../pdf-annotation/web/cmaps/CNS2-H.bcmap | Bin 0 -> 504 bytes .../pdf-annotation/web/cmaps/CNS2-V.bcmap | 3 + .../pdf-annotation/web/cmaps/ETHK-B5-H.bcmap | Bin 0 -> 4426 bytes .../pdf-annotation/web/cmaps/ETHK-B5-V.bcmap | Bin 0 -> 158 bytes .../pdf-annotation/web/cmaps/ETen-B5-H.bcmap | Bin 0 -> 1125 bytes .../pdf-annotation/web/cmaps/ETen-B5-V.bcmap | Bin 0 -> 158 bytes .../web/cmaps/ETenms-B5-H.bcmap | 3 + .../web/cmaps/ETenms-B5-V.bcmap | Bin 0 -> 172 bytes .../pdf-annotation/web/cmaps/EUC-H.bcmap | Bin 0 -> 578 bytes .../pdf-annotation/web/cmaps/EUC-V.bcmap | Bin 0 -> 170 bytes .../pdf-annotation/web/cmaps/Ext-H.bcmap | Bin 0 -> 2536 bytes .../pdf-annotation/web/cmaps/Ext-RKSJ-H.bcmap | Bin 0 -> 2542 bytes .../pdf-annotation/web/cmaps/Ext-RKSJ-V.bcmap | Bin 0 -> 218 bytes .../pdf-annotation/web/cmaps/Ext-V.bcmap | Bin 0 -> 215 bytes .../pdf-annotation/web/cmaps/GB-EUC-H.bcmap | Bin 0 -> 549 bytes .../pdf-annotation/web/cmaps/GB-EUC-V.bcmap | Bin 0 -> 179 bytes .../pdf-annotation/web/cmaps/GB-H.bcmap | 4 + .../pdf-annotation/web/cmaps/GB-V.bcmap | Bin 0 -> 175 bytes .../pdf-annotation/web/cmaps/GBK-EUC-H.bcmap | Bin 0 -> 14692 bytes .../pdf-annotation/web/cmaps/GBK-EUC-V.bcmap | Bin 0 -> 180 bytes .../pdf-annotation/web/cmaps/GBK2K-H.bcmap | Bin 0 -> 19662 bytes .../pdf-annotation/web/cmaps/GBK2K-V.bcmap | Bin 0 -> 219 bytes .../pdf-annotation/web/cmaps/GBKp-EUC-H.bcmap | Bin 0 -> 14686 bytes .../pdf-annotation/web/cmaps/GBKp-EUC-V.bcmap | Bin 0 -> 181 bytes .../pdf-annotation/web/cmaps/GBT-EUC-H.bcmap | Bin 0 -> 7290 bytes .../pdf-annotation/web/cmaps/GBT-EUC-V.bcmap | Bin 0 -> 180 bytes .../pdf-annotation/web/cmaps/GBT-H.bcmap | Bin 0 -> 7269 bytes .../pdf-annotation/web/cmaps/GBT-V.bcmap | Bin 0 -> 176 bytes .../web/cmaps/GBTpc-EUC-H.bcmap | Bin 0 -> 7298 bytes .../web/cmaps/GBTpc-EUC-V.bcmap | Bin 0 -> 182 bytes .../pdf-annotation/web/cmaps/GBpc-EUC-H.bcmap | Bin 0 -> 557 bytes .../pdf-annotation/web/cmaps/GBpc-EUC-V.bcmap | Bin 0 -> 181 bytes src/assets/pdf-annotation/web/cmaps/H.bcmap | Bin 0 -> 553 bytes .../pdf-annotation/web/cmaps/HKdla-B5-H.bcmap | Bin 0 -> 2654 bytes .../pdf-annotation/web/cmaps/HKdla-B5-V.bcmap | Bin 0 -> 148 bytes .../pdf-annotation/web/cmaps/HKdlb-B5-H.bcmap | Bin 0 -> 2414 bytes .../pdf-annotation/web/cmaps/HKdlb-B5-V.bcmap | Bin 0 -> 148 bytes .../web/cmaps/HKgccs-B5-H.bcmap | Bin 0 -> 2292 bytes .../web/cmaps/HKgccs-B5-V.bcmap | Bin 0 -> 149 bytes .../web/cmaps/HKm314-B5-H.bcmap | Bin 0 -> 1772 bytes .../web/cmaps/HKm314-B5-V.bcmap | Bin 0 -> 149 bytes .../web/cmaps/HKm471-B5-H.bcmap | Bin 0 -> 2171 bytes .../web/cmaps/HKm471-B5-V.bcmap | Bin 0 -> 149 bytes .../pdf-annotation/web/cmaps/HKscs-B5-H.bcmap | Bin 0 -> 4437 bytes .../pdf-annotation/web/cmaps/HKscs-B5-V.bcmap | Bin 0 -> 159 bytes .../pdf-annotation/web/cmaps/Hankaku.bcmap | Bin 0 -> 132 bytes .../pdf-annotation/web/cmaps/Hiragana.bcmap | Bin 0 -> 124 bytes .../pdf-annotation/web/cmaps/KSC-EUC-H.bcmap | Bin 0 -> 1848 bytes .../pdf-annotation/web/cmaps/KSC-EUC-V.bcmap | Bin 0 -> 164 bytes .../pdf-annotation/web/cmaps/KSC-H.bcmap | Bin 0 -> 1831 bytes .../web/cmaps/KSC-Johab-H.bcmap | Bin 0 -> 16791 bytes .../web/cmaps/KSC-Johab-V.bcmap | Bin 0 -> 166 bytes .../pdf-annotation/web/cmaps/KSC-V.bcmap | Bin 0 -> 160 bytes .../web/cmaps/KSCms-UHC-H.bcmap | Bin 0 -> 2787 bytes .../web/cmaps/KSCms-UHC-HW-H.bcmap | Bin 0 -> 2789 bytes .../web/cmaps/KSCms-UHC-HW-V.bcmap | Bin 0 -> 169 bytes .../web/cmaps/KSCms-UHC-V.bcmap | Bin 0 -> 166 bytes .../web/cmaps/KSCpc-EUC-H.bcmap | Bin 0 -> 2024 bytes .../web/cmaps/KSCpc-EUC-V.bcmap | Bin 0 -> 166 bytes .../pdf-annotation/web/cmaps/Katakana.bcmap | Bin 0 -> 100 bytes src/assets/pdf-annotation/web/cmaps/LICENSE | 36 + .../pdf-annotation/web/cmaps/NWP-H.bcmap | Bin 0 -> 2765 bytes .../pdf-annotation/web/cmaps/NWP-V.bcmap | Bin 0 -> 252 bytes .../pdf-annotation/web/cmaps/RKSJ-H.bcmap | Bin 0 -> 534 bytes .../pdf-annotation/web/cmaps/RKSJ-V.bcmap | Bin 0 -> 170 bytes .../pdf-annotation/web/cmaps/Roman.bcmap | Bin 0 -> 96 bytes .../web/cmaps/UniCNS-UCS2-H.bcmap | Bin 0 -> 48280 bytes .../web/cmaps/UniCNS-UCS2-V.bcmap | Bin 0 -> 156 bytes .../web/cmaps/UniCNS-UTF16-H.bcmap | Bin 0 -> 50419 bytes .../web/cmaps/UniCNS-UTF16-V.bcmap | Bin 0 -> 156 bytes .../web/cmaps/UniCNS-UTF32-H.bcmap | Bin 0 -> 52679 bytes .../web/cmaps/UniCNS-UTF32-V.bcmap | Bin 0 -> 160 bytes .../web/cmaps/UniCNS-UTF8-H.bcmap | Bin 0 -> 53629 bytes .../web/cmaps/UniCNS-UTF8-V.bcmap | Bin 0 -> 157 bytes .../web/cmaps/UniGB-UCS2-H.bcmap | Bin 0 -> 43366 bytes .../web/cmaps/UniGB-UCS2-V.bcmap | Bin 0 -> 193 bytes .../web/cmaps/UniGB-UTF16-H.bcmap | Bin 0 -> 44086 bytes .../web/cmaps/UniGB-UTF16-V.bcmap | Bin 0 -> 178 bytes .../web/cmaps/UniGB-UTF32-H.bcmap | Bin 0 -> 45738 bytes .../web/cmaps/UniGB-UTF32-V.bcmap | Bin 0 -> 182 bytes .../web/cmaps/UniGB-UTF8-H.bcmap | Bin 0 -> 46837 bytes .../web/cmaps/UniGB-UTF8-V.bcmap | Bin 0 -> 181 bytes .../web/cmaps/UniJIS-UCS2-H.bcmap | Bin 0 -> 25439 bytes .../web/cmaps/UniJIS-UCS2-HW-H.bcmap | Bin 0 -> 119 bytes .../web/cmaps/UniJIS-UCS2-HW-V.bcmap | Bin 0 -> 680 bytes .../web/cmaps/UniJIS-UCS2-V.bcmap | Bin 0 -> 664 bytes .../web/cmaps/UniJIS-UTF16-H.bcmap | Bin 0 -> 39443 bytes .../web/cmaps/UniJIS-UTF16-V.bcmap | Bin 0 -> 643 bytes .../web/cmaps/UniJIS-UTF32-H.bcmap | Bin 0 -> 40539 bytes .../web/cmaps/UniJIS-UTF32-V.bcmap | Bin 0 -> 677 bytes .../web/cmaps/UniJIS-UTF8-H.bcmap | Bin 0 -> 41695 bytes .../web/cmaps/UniJIS-UTF8-V.bcmap | Bin 0 -> 678 bytes .../web/cmaps/UniJIS2004-UTF16-H.bcmap | Bin 0 -> 39534 bytes .../web/cmaps/UniJIS2004-UTF16-V.bcmap | Bin 0 -> 647 bytes .../web/cmaps/UniJIS2004-UTF32-H.bcmap | Bin 0 -> 40630 bytes .../web/cmaps/UniJIS2004-UTF32-V.bcmap | Bin 0 -> 681 bytes .../web/cmaps/UniJIS2004-UTF8-H.bcmap | Bin 0 -> 41779 bytes .../web/cmaps/UniJIS2004-UTF8-V.bcmap | Bin 0 -> 682 bytes .../web/cmaps/UniJISPro-UCS2-HW-V.bcmap | Bin 0 -> 705 bytes .../web/cmaps/UniJISPro-UCS2-V.bcmap | Bin 0 -> 689 bytes .../web/cmaps/UniJISPro-UTF8-V.bcmap | Bin 0 -> 726 bytes .../web/cmaps/UniJISX0213-UTF32-H.bcmap | Bin 0 -> 40517 bytes .../web/cmaps/UniJISX0213-UTF32-V.bcmap | Bin 0 -> 684 bytes .../web/cmaps/UniJISX02132004-UTF32-H.bcmap | Bin 0 -> 40608 bytes .../web/cmaps/UniJISX02132004-UTF32-V.bcmap | Bin 0 -> 688 bytes .../web/cmaps/UniKS-UCS2-H.bcmap | Bin 0 -> 25783 bytes .../web/cmaps/UniKS-UCS2-V.bcmap | Bin 0 -> 178 bytes .../web/cmaps/UniKS-UTF16-H.bcmap | Bin 0 -> 26327 bytes .../web/cmaps/UniKS-UTF16-V.bcmap | Bin 0 -> 164 bytes .../web/cmaps/UniKS-UTF32-H.bcmap | Bin 0 -> 26451 bytes .../web/cmaps/UniKS-UTF32-V.bcmap | Bin 0 -> 168 bytes .../web/cmaps/UniKS-UTF8-H.bcmap | Bin 0 -> 27790 bytes .../web/cmaps/UniKS-UTF8-V.bcmap | Bin 0 -> 169 bytes src/assets/pdf-annotation/web/cmaps/V.bcmap | Bin 0 -> 166 bytes .../pdf-annotation/web/cmaps/WP-Symbol.bcmap | Bin 0 -> 179 bytes src/assets/pdf-annotation/web/debugger.css | 113 + src/assets/pdf-annotation/web/debugger.js | 612 + .../web/images/annotation-check.svg | 13 + .../web/images/annotation-comment.svg | 18 + .../web/images/annotation-help.svg | 28 + .../web/images/annotation-insert.svg | 12 + .../web/images/annotation-key.svg | 13 + .../web/images/annotation-newparagraph.svg | 13 + .../web/images/annotation-noicon.svg | 9 + .../web/images/annotation-note.svg | 44 + .../web/images/annotation-paperclip.svg | 6 + .../web/images/annotation-paragraph.svg | 18 + .../web/images/annotation-pushpin.svg | 7 + .../web/images/cursor-editorFreeText.svg | 3 + .../web/images/cursor-editorInk.svg | 4 + .../web/images/findbarButton-next.svg | 3 + .../web/images/findbarButton-previous.svg | 3 + .../web/images/loading-dark.svg | 24 + .../web/images/loading-icon.gif | Bin 0 -> 2545 bytes .../pdf-annotation/web/images/loading.svg | 1 + ...ondaryToolbarButton-documentProperties.svg | 3 + .../secondaryToolbarButton-firstPage.svg | 3 + .../secondaryToolbarButton-handTool.svg | 3 + .../secondaryToolbarButton-lastPage.svg | 3 + .../secondaryToolbarButton-rotateCcw.svg | 3 + .../secondaryToolbarButton-rotateCw.svg | 3 + ...econdaryToolbarButton-scrollHorizontal.svg | 3 + .../secondaryToolbarButton-scrollPage.svg | 3 + .../secondaryToolbarButton-scrollVertical.svg | 3 + .../secondaryToolbarButton-scrollWrapped.svg | 3 + .../secondaryToolbarButton-selectTool.svg | 3 + .../secondaryToolbarButton-spreadEven.svg | 3 + .../secondaryToolbarButton-spreadNone.svg | 3 + .../secondaryToolbarButton-spreadOdd.svg | 3 + .../pdf-annotation/web/images/shadow.png | Bin 0 -> 269 bytes .../web/images/toolbarButton-bookmark.svg | 3 + .../toolbarButton-currentOutlineItem.svg | 3 + .../web/images/toolbarButton-download.svg | 4 + .../images/toolbarButton-editorFreeText.svg | 3 + .../web/images/toolbarButton-editorInk.svg | 4 + .../web/images/toolbarButton-menuArrow.svg | 3 + .../web/images/toolbarButton-openFile.svg | 3 + .../web/images/toolbarButton-pageDown.svg | 3 + .../web/images/toolbarButton-pageUp.svg | 3 + .../images/toolbarButton-presentationMode.svg | 3 + .../web/images/toolbarButton-print.svg | 3 + .../web/images/toolbarButton-search.svg | 3 + .../toolbarButton-secondaryToolbarToggle.svg | 3 + .../images/toolbarButton-sidebarToggle.svg | 3 + .../images/toolbarButton-viewAttachments.svg | 3 + .../web/images/toolbarButton-viewLayers.svg | 3 + .../web/images/toolbarButton-viewOutline.svg | 3 + .../images/toolbarButton-viewThumbnail.svg | 3 + .../web/images/toolbarButton-zoomIn.svg | 3 + .../web/images/toolbarButton-zoomOut.svg | 3 + .../web/images/treeitem-collapsed.svg | 1 + .../web/images/treeitem-expanded.svg | 1 + .../web/locale/ach/viewer.properties | 200 + .../web/locale/af/viewer.properties | 177 + .../web/locale/an/viewer.properties | 243 + .../web/locale/ar/viewer.properties | 247 + .../web/locale/ast/viewer.properties | 207 + .../web/locale/az/viewer.properties | 243 + .../web/locale/be/viewer.properties | 274 + .../web/locale/bg/viewer.properties | 235 + .../web/locale/bn/viewer.properties | 239 + .../web/locale/bo/viewer.properties | 238 + .../web/locale/br/viewer.properties | 247 + .../web/locale/brx/viewer.properties | 205 + .../web/locale/bs/viewer.properties | 194 + .../web/locale/ca/viewer.properties | 251 + .../web/locale/cak/viewer.properties | 249 + .../web/locale/ckb/viewer.properties | 234 + .../web/locale/cs/viewer.properties | 274 + .../web/locale/cy/viewer.properties | 274 + .../web/locale/da/viewer.properties | 274 + .../web/locale/de/viewer.properties | 274 + .../web/locale/dsb/viewer.properties | 274 + .../web/locale/el/viewer.properties | 274 + .../web/locale/en-CA/viewer.properties | 274 + .../web/locale/en-GB/viewer.properties | 274 + .../web/locale/en-US/viewer.properties | 253 + .../web/locale/eo/viewer.properties | 274 + .../web/locale/es-AR/viewer.properties | 274 + .../web/locale/es-CL/viewer.properties | 274 + .../web/locale/es-ES/viewer.properties | 274 + .../web/locale/es-MX/viewer.properties | 274 + .../web/locale/et/viewer.properties | 262 + .../web/locale/eu/viewer.properties | 274 + .../web/locale/fa/viewer.properties | 216 + .../web/locale/ff/viewer.properties | 235 + .../web/locale/fi/viewer.properties | 274 + .../web/locale/fr/viewer.properties | 274 + .../web/locale/fur/viewer.properties | 267 + .../web/locale/fy-NL/viewer.properties | 274 + .../web/locale/ga-IE/viewer.properties | 202 + .../web/locale/gd/viewer.properties | 249 + .../web/locale/gl/viewer.properties | 249 + .../web/locale/gn/viewer.properties | 274 + .../web/locale/gu-IN/viewer.properties | 235 + .../web/locale/he/viewer.properties | 274 + .../web/locale/hi-IN/viewer.properties | 235 + .../web/locale/hr/viewer.properties | 267 + .../web/locale/hsb/viewer.properties | 274 + .../web/locale/hu/viewer.properties | 274 + .../web/locale/hy-AM/viewer.properties | 239 + .../web/locale/hye/viewer.properties | 252 + .../web/locale/ia/viewer.properties | 274 + .../web/locale/id/viewer.properties | 274 + .../web/locale/is/viewer.properties | 274 + .../web/locale/it/viewer.properties | 215 + .../web/locale/ja/viewer.properties | 274 + .../web/locale/ka/viewer.properties | 274 + .../web/locale/kab/viewer.properties | 274 + .../web/locale/kk/viewer.properties | 274 + .../web/locale/km/viewer.properties | 210 + .../web/locale/kn/viewer.properties | 187 + .../web/locale/ko/viewer.properties | 274 + .../web/locale/lij/viewer.properties | 235 + .../web/locale/lo/viewer.properties | 145 + .../web/locale/locale.properties | 330 + .../web/locale/lt/viewer.properties | 260 + .../web/locale/ltg/viewer.properties | 213 + .../web/locale/lv/viewer.properties | 235 + .../web/locale/meh/viewer.properties | 111 + .../web/locale/mk/viewer.properties | 139 + .../web/locale/mr/viewer.properties | 231 + .../web/locale/ms/viewer.properties | 235 + .../web/locale/my/viewer.properties | 191 + .../web/locale/nb-NO/viewer.properties | 274 + .../web/locale/ne-NP/viewer.properties | 218 + .../web/locale/nl/viewer.properties | 274 + .../web/locale/nn-NO/viewer.properties | 274 + .../web/locale/oc/viewer.properties | 274 + .../web/locale/pa-IN/viewer.properties | 274 + .../web/locale/pl/viewer.properties | 274 + .../web/locale/pt-BR/viewer.properties | 274 + .../web/locale/pt-PT/viewer.properties | 274 + .../web/locale/rm/viewer.properties | 274 + .../web/locale/ro/viewer.properties | 241 + .../web/locale/ru/viewer.properties | 274 + .../web/locale/sat/viewer.properties | 198 + .../web/locale/sc/viewer.properties | 261 + .../web/locale/scn/viewer.properties | 101 + .../web/locale/sco/viewer.properties | 249 + .../web/locale/si/viewer.properties | 237 + .../web/locale/sk/viewer.properties | 274 + .../web/locale/sl/viewer.properties | 274 + .../web/locale/son/viewer.properties | 173 + .../web/locale/sq/viewer.properties | 267 + .../web/locale/sr/viewer.properties | 274 + .../web/locale/sv-SE/viewer.properties | 274 + .../web/locale/szl/viewer.properties | 245 + .../web/locale/ta/viewer.properties | 194 + .../web/locale/te/viewer.properties | 237 + .../web/locale/tg/viewer.properties | 274 + .../web/locale/th/viewer.properties | 274 + .../web/locale/tl/viewer.properties | 243 + .../web/locale/tr/viewer.properties | 274 + .../web/locale/trs/viewer.properties | 206 + .../web/locale/uk/viewer.properties | 274 + .../web/locale/ur/viewer.properties | 239 + .../web/locale/uz/viewer.properties | 163 + .../web/locale/vi/viewer.properties | 274 + .../web/locale/wo/viewer.properties | 123 + .../web/locale/xh/viewer.properties | 177 + .../web/locale/zh-CN/viewer.properties | 274 + .../web/locale/zh-TW/viewer.properties | 274 + .../web/standard_fonts/FoxitDingbats.pfb | Bin 0 -> 29513 bytes .../web/standard_fonts/FoxitFixed.pfb | Bin 0 -> 17597 bytes .../web/standard_fonts/FoxitFixedBold.pfb | Bin 0 -> 18055 bytes .../standard_fonts/FoxitFixedBoldItalic.pfb | Bin 0 -> 19151 bytes .../web/standard_fonts/FoxitFixedItalic.pfb | Bin 0 -> 18746 bytes .../web/standard_fonts/FoxitSans.pfb | Bin 0 -> 15025 bytes .../web/standard_fonts/FoxitSansBold.pfb | Bin 0 -> 16344 bytes .../standard_fonts/FoxitSansBoldItalic.pfb | Bin 0 -> 16418 bytes .../web/standard_fonts/FoxitSansItalic.pfb | Bin 0 -> 16339 bytes .../web/standard_fonts/FoxitSerif.pfb | Bin 0 -> 19469 bytes .../web/standard_fonts/FoxitSerifBold.pfb | Bin 0 -> 19395 bytes .../standard_fonts/FoxitSerifBoldItalic.pfb | Bin 0 -> 20733 bytes .../web/standard_fonts/FoxitSerifItalic.pfb | Bin 0 -> 21227 bytes .../web/standard_fonts/FoxitSymbol.pfb | Bin 0 -> 16729 bytes .../web/standard_fonts/LICENSE_FOXIT | 27 + .../web/standard_fonts/LICENSE_LIBERATION | 102 + .../standard_fonts/LiberationSans-Bold.ttf | Bin 0 -> 137052 bytes .../LiberationSans-BoldItalic.ttf | Bin 0 -> 135124 bytes .../standard_fonts/LiberationSans-Italic.ttf | Bin 0 -> 162036 bytes .../standard_fonts/LiberationSans-Regular.ttf | Bin 0 -> 139512 bytes src/assets/pdf-annotation/web/tutorial.pdf | Bin 0 -> 747695 bytes src/assets/pdf-annotation/web/viewer.css | 3199 + src/assets/pdf-annotation/web/viewer.html | 579 + src/assets/pdf-annotation/web/viewer.js | 15217 ++++ src/assets/shapes.svg | 1 + src/environments/environment.prod.ts | 3 + src/environments/environment.ts | 16 + src/global.scss | 26 + src/index.html | 26 + src/main.ts | 12 + src/polyfills.ts | 55 + src/test.ts | 14 + src/theme/variables.scss | 244 + src/zone-flags.ts | 6 + tsconfig.app.json | 15 + tsconfig.json | 33 + tsconfig.spec.json | 18 + 522 files changed, 243091 insertions(+) create mode 100644 .browserslistrc create mode 100644 .editorconfig create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 angular.json create mode 100644 config.xml create mode 100644 ionic.config.json create mode 100644 karma.conf.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 resources/README.md create mode 100644 resources/android/icon/drawable-hdpi-icon.png create mode 100644 resources/android/icon/drawable-ldpi-icon.png create mode 100644 resources/android/icon/drawable-mdpi-icon.png create mode 100644 resources/android/icon/drawable-xhdpi-icon.png create mode 100644 resources/android/icon/drawable-xxhdpi-icon.png create mode 100644 resources/android/icon/drawable-xxxhdpi-icon.png create mode 100644 resources/android/splash/drawable-land-hdpi-screen.png create mode 100644 resources/android/splash/drawable-land-ldpi-screen.png create mode 100644 resources/android/splash/drawable-land-mdpi-screen.png create mode 100644 resources/android/splash/drawable-land-xhdpi-screen.png create mode 100644 resources/android/splash/drawable-land-xxhdpi-screen.png create mode 100644 resources/android/splash/drawable-land-xxxhdpi-screen.png create mode 100644 resources/android/splash/drawable-port-hdpi-screen.png create mode 100644 resources/android/splash/drawable-port-ldpi-screen.png create mode 100644 resources/android/splash/drawable-port-mdpi-screen.png create mode 100644 resources/android/splash/drawable-port-xhdpi-screen.png create mode 100644 resources/android/splash/drawable-port-xxhdpi-screen.png create mode 100644 resources/android/splash/drawable-port-xxxhdpi-screen.png create mode 100644 resources/android/xml/network_security_config.xml create mode 100644 resources/icon.png create mode 100644 resources/ios/icon/icon-1024.png create mode 100644 resources/ios/icon/icon-20.png create mode 100644 resources/ios/icon/icon-20@2x.png create mode 100644 resources/ios/icon/icon-20@3x.png create mode 100644 resources/ios/icon/icon-24@2x.png create mode 100644 resources/ios/icon/icon-27.5@2x.png create mode 100644 resources/ios/icon/icon-29.png create mode 100644 resources/ios/icon/icon-29@2x.png create mode 100644 resources/ios/icon/icon-29@3x.png create mode 100644 resources/ios/icon/icon-40.png create mode 100644 resources/ios/icon/icon-40@2x.png create mode 100644 resources/ios/icon/icon-40@3x.png create mode 100644 resources/ios/icon/icon-44@2x.png create mode 100644 resources/ios/icon/icon-50.png create mode 100644 resources/ios/icon/icon-50@2x.png create mode 100644 resources/ios/icon/icon-60.png create mode 100644 resources/ios/icon/icon-60@2x.png create mode 100644 resources/ios/icon/icon-60@3x.png create mode 100644 resources/ios/icon/icon-72.png create mode 100644 resources/ios/icon/icon-72@2x.png create mode 100644 resources/ios/icon/icon-76.png create mode 100644 resources/ios/icon/icon-76@2x.png create mode 100644 resources/ios/icon/icon-83.5@2x.png create mode 100644 resources/ios/icon/icon-86@2x.png create mode 100644 resources/ios/icon/icon-98@2x.png create mode 100644 resources/ios/icon/icon-small.png create mode 100644 resources/ios/icon/icon-small@2x.png create mode 100644 resources/ios/icon/icon-small@3x.png create mode 100644 resources/ios/icon/icon.png create mode 100644 resources/ios/icon/icon@2x.png create mode 100644 resources/ios/splash/Default-2436h.png create mode 100644 resources/ios/splash/Default-568h@2x~iphone.png create mode 100644 resources/ios/splash/Default-667h.png create mode 100644 resources/ios/splash/Default-736h.png create mode 100644 resources/ios/splash/Default-Landscape-2436h.png create mode 100644 resources/ios/splash/Default-Landscape-736h.png create mode 100644 resources/ios/splash/Default-Landscape@2x~ipad.png create mode 100644 resources/ios/splash/Default-Landscape@~ipadpro.png create mode 100644 resources/ios/splash/Default-Landscape~ipad.png create mode 100644 resources/ios/splash/Default-Portrait@2x~ipad.png create mode 100644 resources/ios/splash/Default-Portrait@~ipadpro.png create mode 100644 resources/ios/splash/Default-Portrait~ipad.png create mode 100644 resources/ios/splash/Default@2x~iphone.png create mode 100644 resources/ios/splash/Default@2x~universal~anyany.png create mode 100644 resources/ios/splash/Default~iphone.png create mode 100644 resources/splash.png create mode 100644 src/app/app-routing.module.ts create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.spec.ts create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/home/home-routing.module.ts create mode 100644 src/app/home/home.module.ts create mode 100644 src/app/home/home.page.html create mode 100644 src/app/home/home.page.scss create mode 100644 src/app/home/home.page.spec.ts create mode 100644 src/app/home/home.page.ts create mode 100644 src/assets/icon/favicon.png create mode 100755 src/assets/pdf-annotation/annotation/annotation.js create mode 100755 src/assets/pdf-annotation/annotation/config.js create mode 100755 src/assets/pdf-annotation/annotation/drag.js create mode 100755 src/assets/pdf-annotation/annotation/main.js create mode 100755 src/assets/pdf-annotation/annotation/promise_js.js create mode 100755 src/assets/pdf-annotation/annotation/utils.js create mode 100755 src/assets/pdf-annotation/build/pdf.js create mode 100755 src/assets/pdf-annotation/build/pdf.sandbox.js create mode 100755 src/assets/pdf-annotation/build/pdf.worker.js create mode 100755 src/assets/pdf-annotation/css/annotation.css create mode 100755 src/assets/pdf-annotation/css/svgs/edgecontrol.svg create mode 100755 src/assets/pdf-annotation/css/svgs/middlecontrol.svg create mode 100755 src/assets/pdf-annotation/css/svgs/middlecontrolhoz.svg create mode 100755 src/assets/pdf-annotation/css/svgs/rotateicon.svg create mode 100755 src/assets/pdf-annotation/fontawesome/HELP-US-OUT.txt create mode 100755 src/assets/pdf-annotation/fontawesome/css/font-awesome.css create mode 100755 src/assets/pdf-annotation/fontawesome/css/font-awesome.min.css create mode 100755 src/assets/pdf-annotation/fontawesome/fonts/FontAwesome.otf create mode 100755 src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.eot create mode 100755 src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.svg create mode 100755 src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.ttf create mode 100755 src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.woff create mode 100755 src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.woff2 create mode 100755 src/assets/pdf-annotation/fontawesome/less/animated.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/bordered-pulled.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/core.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/fixed-width.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/font-awesome.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/icons.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/larger.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/list.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/mixins.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/path.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/rotated-flipped.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/screen-reader.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/stacked.less create mode 100755 src/assets/pdf-annotation/fontawesome/less/variables.less create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_animated.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_bordered-pulled.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_core.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_fixed-width.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_icons.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_larger.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_list.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_mixins.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_path.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_rotated-flipped.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_screen-reader.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_stacked.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/_variables.scss create mode 100755 src/assets/pdf-annotation/fontawesome/scss/font-awesome.scss create mode 100755 src/assets/pdf-annotation/thirdjs/1.js create mode 100755 src/assets/pdf-annotation/thirdjs/2.js create mode 100755 src/assets/pdf-annotation/thirdjs/3.js create mode 100755 src/assets/pdf-annotation/thirdjs/4.js create mode 100755 src/assets/pdf-annotation/web/cmaps/78-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/78-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/78-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/78-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/78-RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/78-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/78ms-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/78ms-RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/83pv-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/90ms-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/90ms-RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/90msp-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/90msp-RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/90pv-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/90pv-RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Add-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Add-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Add-RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Add-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-0.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-1.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-3.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-4.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-5.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-6.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-UCS2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-GB1-0.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-GB1-1.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-GB1-2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-GB1-3.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-GB1-4.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-GB1-5.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-GB1-UCS2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-0.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-1.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-3.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-4.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-5.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-6.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-UCS2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-0.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-1.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-UCS2.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/B5pc-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/B5pc-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/CNS-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/CNS-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/CNS1-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/CNS1-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/CNS2-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/CNS2-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/ETHK-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/ETHK-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/ETen-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/ETen-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/ETenms-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/ETenms-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Ext-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Ext-RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Ext-RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Ext-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GB-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GB-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GB-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GB-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBK-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBK-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBK2K-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBK2K-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBKp-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBKp-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBT-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBT-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBT-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBT-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBTpc-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBTpc-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBpc-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/GBpc-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKdla-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKdla-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKdlb-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKdlb-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKgccs-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKgccs-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKm314-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKm314-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKm471-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKm471-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKscs-B5-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/HKscs-B5-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Hankaku.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Hiragana.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSC-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSC-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSC-Johab-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSC-Johab-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSCms-UHC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSCms-UHC-HW-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSCms-UHC-HW-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSCms-UHC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSCpc-EUC-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/KSCpc-EUC-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Katakana.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/LICENSE create mode 100755 src/assets/pdf-annotation/web/cmaps/NWP-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/NWP-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/RKSJ-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/RKSJ-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/Roman.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UCS2-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UCS2-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UTF16-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UTF16-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UTF32-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UTF32-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UTF8-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniCNS-UTF8-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UCS2-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UCS2-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UTF16-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UTF16-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UTF32-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UTF32-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UTF8-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniGB-UTF8-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-HW-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-HW-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UTF16-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UTF16-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UTF32-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UTF32-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UTF8-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS-UTF8-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF16-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF16-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF32-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF32-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF8-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF8-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJISPro-UCS2-HW-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJISPro-UCS2-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJISPro-UTF8-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJISX0213-UTF32-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJISX0213-UTF32-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJISX02132004-UTF32-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniJISX02132004-UTF32-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UCS2-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UCS2-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UTF16-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UTF16-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UTF32-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UTF32-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UTF8-H.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/UniKS-UTF8-V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/V.bcmap create mode 100755 src/assets/pdf-annotation/web/cmaps/WP-Symbol.bcmap create mode 100755 src/assets/pdf-annotation/web/debugger.css create mode 100755 src/assets/pdf-annotation/web/debugger.js create mode 100755 src/assets/pdf-annotation/web/images/annotation-check.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-comment.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-help.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-insert.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-key.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-newparagraph.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-noicon.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-note.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-paperclip.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-paragraph.svg create mode 100755 src/assets/pdf-annotation/web/images/annotation-pushpin.svg create mode 100755 src/assets/pdf-annotation/web/images/cursor-editorFreeText.svg create mode 100755 src/assets/pdf-annotation/web/images/cursor-editorInk.svg create mode 100755 src/assets/pdf-annotation/web/images/findbarButton-next.svg create mode 100755 src/assets/pdf-annotation/web/images/findbarButton-previous.svg create mode 100755 src/assets/pdf-annotation/web/images/loading-dark.svg create mode 100755 src/assets/pdf-annotation/web/images/loading-icon.gif create mode 100755 src/assets/pdf-annotation/web/images/loading.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-documentProperties.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-firstPage.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-handTool.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-lastPage.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCcw.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCw.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollHorizontal.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollPage.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollVertical.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollWrapped.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-selectTool.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadEven.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadNone.svg create mode 100755 src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadOdd.svg create mode 100755 src/assets/pdf-annotation/web/images/shadow.png create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-bookmark.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-currentOutlineItem.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-download.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-editorFreeText.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-editorInk.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-menuArrow.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-openFile.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-pageDown.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-pageUp.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-presentationMode.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-print.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-search.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-secondaryToolbarToggle.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-sidebarToggle.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-viewAttachments.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-viewLayers.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-viewOutline.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-viewThumbnail.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-zoomIn.svg create mode 100755 src/assets/pdf-annotation/web/images/toolbarButton-zoomOut.svg create mode 100755 src/assets/pdf-annotation/web/images/treeitem-collapsed.svg create mode 100755 src/assets/pdf-annotation/web/images/treeitem-expanded.svg create mode 100755 src/assets/pdf-annotation/web/locale/ach/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/af/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/an/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ar/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ast/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/az/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/be/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/bg/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/bn/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/bo/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/br/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/brx/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/bs/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ca/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/cak/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ckb/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/cs/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/cy/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/da/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/de/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/dsb/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/el/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/en-CA/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/en-GB/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/en-US/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/eo/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/es-AR/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/es-CL/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/es-ES/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/es-MX/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/et/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/eu/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/fa/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ff/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/fi/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/fr/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/fur/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/fy-NL/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ga-IE/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/gd/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/gl/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/gn/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/gu-IN/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/he/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/hi-IN/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/hr/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/hsb/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/hu/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/hy-AM/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/hye/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ia/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/id/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/is/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/it/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ja/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ka/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/kab/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/kk/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/km/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/kn/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ko/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/lij/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/lo/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/locale.properties create mode 100755 src/assets/pdf-annotation/web/locale/lt/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ltg/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/lv/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/meh/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/mk/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/mr/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ms/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/my/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/nb-NO/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ne-NP/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/nl/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/nn-NO/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/oc/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/pa-IN/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/pl/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/pt-BR/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/pt-PT/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/rm/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ro/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ru/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sat/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sc/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/scn/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sco/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/si/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sk/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sl/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/son/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sq/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sr/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/sv-SE/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/szl/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ta/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/te/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/tg/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/th/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/tl/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/tr/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/trs/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/uk/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/ur/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/uz/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/vi/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/wo/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/xh/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/zh-CN/viewer.properties create mode 100755 src/assets/pdf-annotation/web/locale/zh-TW/viewer.properties create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitDingbats.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitFixed.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitFixedBold.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitFixedBoldItalic.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitFixedItalic.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSans.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSansBold.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSansBoldItalic.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSansItalic.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSerif.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSerifBold.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSerifBoldItalic.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSerifItalic.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/FoxitSymbol.pfb create mode 100755 src/assets/pdf-annotation/web/standard_fonts/LICENSE_FOXIT create mode 100755 src/assets/pdf-annotation/web/standard_fonts/LICENSE_LIBERATION create mode 100755 src/assets/pdf-annotation/web/standard_fonts/LiberationSans-Bold.ttf create mode 100755 src/assets/pdf-annotation/web/standard_fonts/LiberationSans-BoldItalic.ttf create mode 100755 src/assets/pdf-annotation/web/standard_fonts/LiberationSans-Italic.ttf create mode 100755 src/assets/pdf-annotation/web/standard_fonts/LiberationSans-Regular.ttf create mode 100755 src/assets/pdf-annotation/web/tutorial.pdf create mode 100755 src/assets/pdf-annotation/web/viewer.css create mode 100755 src/assets/pdf-annotation/web/viewer.html create mode 100755 src/assets/pdf-annotation/web/viewer.js create mode 100644 src/assets/shapes.svg create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/global.scss create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/polyfills.ts create mode 100644 src/test.ts create mode 100644 src/theme/variables.scss create mode 100644 src/zone-flags.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..b9ebd7e --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,16 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +Chrome >=79 +ChromeAndroid >=79 +Firefox >=70 +Edge >=79 +Safari >=14 +iOS >=14 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..9d48db4 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,46 @@ +{ + "root": true, + "ignorePatterns": ["projects/**/*"], + "overrides": [ + { + "files": ["*.ts"], + "parserOptions": { + "project": ["tsconfig.json"], + "createDefaultProgram": true + }, + "extends": [ + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/component-class-suffix": [ + "error", + { + "suffixes": ["Page", "Component"] + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ], + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ] + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@angular-eslint/template/recommended"], + "rules": {} + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f927a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,68 @@ +# Specifies intentionally untracked files to ignore when using Git +# http://git-scm.com/docs/gitignore + +*~ +*.sw[mnpcod] +.tmp +*.tmp +*.tmp.* +UserInterfaceState.xcuserstate +$RECYCLE.BIN/ + +*.log +log.txt + + +/.sourcemaps +/.versions +/coverage + +# Ionic +/.ionic +/www +/platforms +/plugins + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-project +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + + +# Miscellaneous +/.angular +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..623309d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ionic.ionic" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0abbfd2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.preferences.autoImportFileExcludePatterns": ["@ionic/angular/common", "@ionic/angular/standalone"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d8bc58 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +### pdf js annotation 的 Demo +是一个 ionic 的项目,为了山核项目准备的。 +在满足山核功能的基础上,精简了界面,处理了保存功能。 \ No newline at end of file diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..07f7608 --- /dev/null +++ b/angular.json @@ -0,0 +1,179 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "app": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "www", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "src/assets", + "output": "assets" + }, + { + "glob": "**/*.svg", + "input": "node_modules/ionicons/dist/ionicons/svg", + "output": "./svg" + } + ], + "styles": [ + "src/global.scss", + "src/theme/variables.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + }, + "ci": { + "progress": false + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "app:build:production" + }, + "development": { + "buildTarget": "app:build:development" + }, + "ci": { + "progress": false + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "app:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "src/assets", + "output": "assets" + }, + { + "glob": "**/*.svg", + "input": "node_modules/ionicons/dist/ionicons/svg", + "output": "./svg" + } + ], + "styles": [ + "src/global.scss", + "src/theme/variables.scss" + ], + "scripts": [] + }, + "configurations": { + "ci": { + "progress": false, + "watch": false + } + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] + } + }, + "ionic-cordova-serve": { + "builder": "@ionic/cordova-builders:cordova-serve", + "options": { + "cordovaBuildTarget": "app:ionic-cordova-build", + "devServerTarget": "app:serve" + }, + "configurations": { + "production": { + "cordovaBuildTarget": "app:ionic-cordova-build:production", + "devServerTarget": "app:serve:production" + } + } + }, + "ionic-cordova-build": { + "builder": "@ionic/cordova-builders:cordova-build", + "options": { + "browserTarget": "app:build" + }, + "configurations": { + "production": { + "browserTarget": "app:build:production" + } + } + } + } + } + }, + "cli": { + "schematicCollections": [ + "@ionic/angular-toolkit" + ] + }, + "schematics": { + "@ionic/angular-toolkit:component": { + "styleext": "scss" + }, + "@ionic/angular-toolkit:page": { + "styleext": "scss" + } + } +} \ No newline at end of file diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..1469178 --- /dev/null +++ b/config.xml @@ -0,0 +1,101 @@ + + + pdfannotation-demo + An awesome Ionic/Cordova app. + Ionic Framework Team + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ionic.config.json b/ionic.config.json new file mode 100644 index 0000000..fd7f621 --- /dev/null +++ b/ionic.config.json @@ -0,0 +1,7 @@ +{ + "name": "pdfannotation-demo", + "integrations": { + "cordova": {} + }, + "type": "angular" +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..611c27f --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/app'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a5bbdd1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15829 @@ +{ + "name": "pdfannotation-demo", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pdfannotation-demo", + "version": "0.0.1", + "dependencies": { + "@angular/animations": "^17.0.2", + "@angular/common": "^17.0.2", + "@angular/compiler": "^17.0.2", + "@angular/core": "^17.0.2", + "@angular/forms": "^17.0.2", + "@angular/platform-browser": "^17.0.2", + "@angular/platform-browser-dynamic": "^17.0.2", + "@angular/router": "^17.0.2", + "@ionic/angular": "^7.0.0", + "@ionic/cordova-builders": "^11.0.0", + "ionicons": "^7.0.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.0.0", + "@angular-eslint/builder": "^17.0.0", + "@angular-eslint/eslint-plugin": "^17.0.0", + "@angular-eslint/eslint-plugin-template": "^17.0.0", + "@angular-eslint/schematics": "^17.0.0", + "@angular-eslint/template-parser": "^17.0.0", + "@angular/cli": "^17.0.0", + "@angular/compiler-cli": "^17.0.2", + "@angular/language-service": "^17.0.2", + "@ionic/angular-toolkit": "^11.0.1", + "@types/jasmine": "~5.1.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "cordova-android": "^12.0.1", + "cordova-plugin-device": "2.0.2", + "cordova-plugin-ionic-keyboard": "^2.0.5", + "cordova-plugin-ionic-webview": "^5.0.0", + "cordova-plugin-splashscreen": "5.0.2", + "cordova-plugin-statusbar": "^2.4.2", + "eslint": "^8.57.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsdoc": "^48.2.1", + "eslint-plugin-prefer-arrow": "1.2.2", + "jasmine-core": "~5.1.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.2.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1703.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.3.tgz", + "integrity": "sha512-BKbdigCjmspqxOxSIQuWgPZzpyuKqZoTBDh0jDeLcAmvPsuxCgIWbsExI4OQ0CyusnQ+XT0IT39q8B9rvF56cg==", + "dependencies": { + "@angular-devkit/core": "17.3.3", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.3.tgz", + "integrity": "sha512-E/6Z1MIMhEB1I2sN+Pw4/zinwAFj4vLDh6dEuj856WWEPndgPiUB6fGX4EbCTsyIUzboXI5ysdNyt2Eq56bllA==", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1703.3", + "@angular-devkit/build-webpack": "0.1703.3", + "@angular-devkit/core": "17.3.3", + "@babel/core": "7.24.0", + "@babel/generator": "7.23.6", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-transform-async-generator-functions": "7.23.9", + "@babel/plugin-transform-async-to-generator": "7.23.3", + "@babel/plugin-transform-runtime": "7.24.0", + "@babel/preset-env": "7.24.0", + "@babel/runtime": "7.24.0", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "17.3.3", + "@vitejs/plugin-basic-ssl": "1.1.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.18", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.22", + "css-loader": "6.10.0", + "esbuild-wasm": "0.20.1", + "fast-glob": "3.3.2", + "http-proxy-middleware": "2.0.6", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", + "karma-source-map-support": "1.4.0", + "less": "4.2.0", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.8", + "mini-css-extract-plugin": "2.8.1", + "mrmime": "2.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.1", + "piscina": "4.4.0", + "postcss": "8.4.35", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.71.1", + "sass-loader": "14.1.1", + "semver": "7.6.0", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.29.1", + "tree-kill": "1.2.2", + "tslib": "2.6.2", + "undici": "6.7.1", + "vite": "5.1.5", + "watchpack": "2.4.0", + "webpack": "5.90.3", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.10.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.20.1" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0", + "@angular/localize": "^17.0.0", + "@angular/platform-server": "^17.0.0", + "@angular/service-worker": "^17.0.0", + "@web/test-runner": "^0.18.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^17.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.2 <5.5" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1703.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.3.tgz", + "integrity": "sha512-d0JjE8MaGVNphlJfeP1OZKhNT4wCXkEZKdSdwE0+W+vDHNUuZiUBB1czO48sb7T4xBrdjRWlV/9CzMNJ7n3ydA==", + "dependencies": { + "@angular-devkit/architect": "0.1703.3", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.3.tgz", + "integrity": "sha512-J22Sh3M7rj8Ar3iEs20ko5wgC3DE7vWfYZNdimt2IJiS4J7BEX8R3Awf+TRt+6AN3NFm3/xe1Sz4yvDh3FvNFg==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.3.tgz", + "integrity": "sha512-SABqTtj2im4PJhQjNaAsSypbNkpZFW8YozJ3P748tlh5a9XoHpgiqXv5JhRbyKElLDAyk5i9fe2++JmSudPG/Q==", + "dependencies": { + "@angular-devkit/core": "17.3.3", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.3.0.tgz", + "integrity": "sha512-JXSZE7+KA3UGU6jwc0v9lwOIMptosrvLIOXGlXqrhHWEXfkfu3ENPq1Lm3K8jLndQ57XueEhC+Nab/AuUiWA/Q==", + "dev": true, + "dependencies": { + "@nx/devkit": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz", + "integrity": "sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz", + "integrity": "sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A==", + "dev": true, + "dependencies": { + "@angular-eslint/utils": "17.3.0", + "@typescript-eslint/utils": "7.2.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz", + "integrity": "sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.3.0", + "@angular-eslint/utils": "17.3.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.3.0.tgz", + "integrity": "sha512-5yssd5EOomxlKt9vN/OXXCTCuI3Pmfj16pkjBDoW0wzC8/M2l5zlXIEfoKumHYv2wtF553LhaMXVYVU35e0lTw==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "17.3.0", + "@angular-eslint/eslint-plugin-template": "17.3.0", + "@nx/devkit": "^17.2.8 || ^18.0.0", + "ignore": "5.3.1", + "nx": "^17.2.8 || ^18.0.0", + "strip-json-comments": "3.1.1", + "tmp": "0.2.3" + }, + "peerDependencies": { + "@angular/cli": ">= 17.0.0 < 18.0.0" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.3.0.tgz", + "integrity": "sha512-m+UzAnWgtjeS0x6skSmR0eXltD/p7HZA+c8pPyAkiHQzkxE7ohhfyZc03yWGuYJvWQUqQAKKdO/nQop14TP0bg==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.3.0", + "eslint-scope": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.3.0.tgz", + "integrity": "sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.3.0", + "@typescript-eslint/utils": "7.2.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/animations": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.2.tgz", + "integrity": "sha512-9RplCRS3dS7I8UeMmnwVCAxEaixQCj98UkSqjErO+GX5KJwMsFPydh7HKWH0/yclidJe5my41psEiQkyEyGKww==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.2" + } + }, + "node_modules/@angular/cli": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.3.tgz", + "integrity": "sha512-veIGK2sRm0SfiLHeftx0W0xC3N8uxoqxXiSG57V6W2wIFN/fKm3aRq3sa8phz7vxUzoKGqyZh6hsT7ybkjgkGA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1703.3", + "@angular-devkit/core": "17.3.3", + "@angular-devkit/schematics": "17.3.3", + "@schematics/angular": "17.3.3", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.2", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "17.0.6", + "resolve": "1.22.8", + "semver": "7.6.0", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.2.tgz", + "integrity": "sha512-7fo+hrQEzo+VX0fJAKK+P4YNeiEnpdMOAkyIdwweyAeUZYeFIs6TKtax3CiJAubnkIkhQ/52uxiusDhK3Wg/WQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.2.tgz", + "integrity": "sha512-+/l/FQpVsOPbxZzSKyqEra+yxoI/r8LlTRqshVACv10+DKMWJMHnDkVUrNxvWHutfn4RszpGMtbtHp3yM9rxcA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.2" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.2.tgz", + "integrity": "sha512-PG81BrJjeF679tkafjt+t9VEBE1rPq39cdLoBTnPY7Q+E/thVoem5JTRG6hmnLmwEc0xxY6sfYpvx2BB5ywUSA==", + "dependencies": { + "@babel/core": "7.23.9", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/compiler": "17.3.2", + "typescript": ">=5.2 <5.5" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.2.tgz", + "integrity": "sha512-eylatBGaN8uihKomEcXkaSHmAea5bEqu1OXifEoVOJiJpJA9Dbt/VcLXkIRFnRGH2NWUT5W79vSoU9GRvPMk5w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.0" + } + }, + "node_modules/@angular/forms": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.2.tgz", + "integrity": "sha512-sbHYjAEeEWW+02YDEKuuuTEUukm6AayQuHiAu37vACj/2q/2RWQar49IoRcSJfAwP2ckqRSK4mmLoDX4IG/KSg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.2", + "@angular/core": "17.3.2", + "@angular/platform-browser": "17.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.3.2.tgz", + "integrity": "sha512-IYlPHPi6RIQB9BQFwCY7rKRymlb4KhEr2UmXEpxIcj1QqVlMchYBVg2+twZloRj3qj/YQ19y2xxyPcgQRWHLIA==", + "dev": true, + "engines": { + "node": "^18.13.0 || >=20.9.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.2.tgz", + "integrity": "sha512-rBVmpJ/uh+CTjYef3Nib1K+31GFbM4mZaw2R2PowKZLgWOT3MWXKy41i44NEyM8qY1dxESmzMzy4NuGfZol42Q==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/animations": "17.3.2", + "@angular/common": "17.3.2", + "@angular/core": "17.3.2" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.2.tgz", + "integrity": "sha512-fcGo9yQ+t9VaG9zPgjQW5HIizbYOKj+9kVk9FPru+uJbYyvJUwEDgpD3aI0DUrQy/OvSf4NMzY/Ucgw1AUknQw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.2", + "@angular/compiler": "17.3.2", + "@angular/core": "17.3.2", + "@angular/platform-browser": "17.3.2" + } + }, + "node_modules/@angular/router": { + "version": "17.3.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.2.tgz", + "integrity": "sha512-BJiaG7zldhe8FPsg3Xv1o2xsmWNMIuntubRiSt2NlSceAr/NEgHoARpZfAGKTaFSngl6jc407wHOmBBPPALECw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.2", + "@angular/core": "17.3.2", + "@angular/platform-browser": "17.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "devOptional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", + "integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==", + "dev": true, + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", + "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@ionic/angular": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-7.8.2.tgz", + "integrity": "sha512-riw1BnvsabDZoo8WGgD+XRNJqP3RjAWmpLL0OWSoF7yCYdm407D0kdHMcDrve/Hgc7UMiwbFZ7cDqdmzyf1hjg==", + "dependencies": { + "@ionic/core": "7.8.2", + "ionicons": "^7.0.0", + "jsonc-parser": "^3.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=14.0.0", + "@angular/forms": ">=14.0.0", + "@angular/router": ">=14.0.0", + "rxjs": ">=7.5.0", + "zone.js": ">=0.11.0" + } + }, + "node_modules/@ionic/angular-toolkit": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-11.0.1.tgz", + "integrity": "sha512-dxx2RDbxDYM2nWRPIirKMJySHtqJ1u02T25PGbNb99W2Wlcmu1cza3+2/PQ8ga18yMz/dQqaGyEmPDf3ZSVO0w==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "^17.0.0", + "@angular-devkit/schematics": "^17.0.0", + "@schematics/angular": "^17.0.0" + } + }, + "node_modules/@ionic/cordova-builders": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@ionic/cordova-builders/-/cordova-builders-11.0.0.tgz", + "integrity": "sha512-JVe2KvdxmEqt/YH6FJnYHiRZGBiDhC1dWkwAVifLk1Y7eMWu1NI3gcLe7i0t4+LE+GIbKb1xtQpNVfwCT+ExVQ==", + "dependencies": { + "@angular-devkit/architect": "^0.1700.0", + "@angular-devkit/build-angular": "^17.0.0", + "@angular-devkit/core": "^17.0.0", + "@angular-devkit/schematics": "^17.0.0", + "@schematics/angular": "^17.0.0", + "cheerio": "^1.0.0-rc.10", + "colorette": "^2.0.16", + "copy-webpack-plugin": "^9.0.1", + "ws": "^8.2.3" + } + }, + "node_modules/@ionic/cordova-builders/node_modules/@angular-devkit/architect": { + "version": "0.1700.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.10.tgz", + "integrity": "sha512-JD/3jkdN1jrFMIDEk9grKdbjutIoxUDMRazq1LZooWjTkzlYk09i/s6HwvIPao7zvxJfelD6asTPspgkjOMP5A==", + "dependencies": { + "@angular-devkit/core": "17.0.10", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/cordova-builders/node_modules/@angular-devkit/core": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.10.tgz", + "integrity": "sha512-93N6oHnmtRt0hL3AXxvnk47sN1rHndfj+pqI5haEY41AGWzIWv9cSBsqlM0PWltNpo6VivcExZESvbLJ71wqbQ==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "3.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@ionic/cordova-builders/node_modules/copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/@ionic/cordova-builders/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@ionic/cordova-builders/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@ionic/cordova-builders/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/@ionic/cordova-builders/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@ionic/cordova-builders/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@ionic/cordova-builders/node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@ionic/cordova-builders/node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@ionic/core": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.8.2.tgz", + "integrity": "sha512-1Iwe4XSaEYD0u7U/AnnKYNRXmPxx/doTl6pExXq/nlEd7q0AykRkPEy5rClqrQcJOrgFogAx1FwSObfgm0xnNw==", + "dependencies": { + "@stencil/core": "^4.12.2", + "ionicons": "^7.2.2", + "tslib": "^2.1.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@netflix/nerror": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", + "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "extsprintf": "^1.4.0", + "lodash": "^4.17.15" + } + }, + "node_modules/@ngtools/webpack": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.3.tgz", + "integrity": "sha512-053KMbg1Tb+Mmg4Htsv8yTpI7ABghguoxhwosQXKB0CjO6M0oexuvdaxbRDQ1vd5xYNOW9LcOfxOMPIwyU4BBA==", + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0", + "typescript": ">=5.2 <5.5", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", + "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.0.0.tgz", + "integrity": "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", + "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", + "dev": true, + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz", + "integrity": "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/devkit": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.2.2.tgz", + "integrity": "sha512-6RBr1aMzrpY0kk9L9buqT9H7Nv8+QujJPo4ASr6jp/5d5gPBsebeTn6qSvv1xJSB0GhB1ACOeq1nVkbwRQoQCw==", + "dev": true, + "dependencies": { + "@nx/devkit": "18.2.2" + } + }, + "node_modules/@nrwl/tao": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.2.2.tgz", + "integrity": "sha512-tXjAbbw8Ir3cY/PQVHiC7q10jsU43r5kkEVwa2vzd1rfPtPFvj9WtgwISd+GstuppYtsbNi+UgTNmHX8dRKPYQ==", + "dev": true, + "dependencies": { + "nx": "18.2.2", + "tslib": "^2.3.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/devkit": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.2.2.tgz", + "integrity": "sha512-Yz/uLYfy2QLeeCJecgKXuT4z0eGx/yBw3VxkgD0zSvpSIg8p1OGSK/rUQ47n/FibsLRdXa1Me5uE57rNt/FKvA==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "18.2.2", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 16 <= 18" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.2.2.tgz", + "integrity": "sha512-mZ5X2rmtzmEGnt5ddpKlyQDGRd1wh0HSJtWvjruj6fYLNNpoosnXefI0PQLZUw13hf8OpJNo8J6xKfjIViSa8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.2.2.tgz", + "integrity": "sha512-FeYvbr0OOIdn9xvuNZlLHQKwdAPN9KcWnmIysJTQZeanvUf6tifkhBUU1cXDduAkdut5iibnnA91JhcEj4x9yg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.2.2.tgz", + "integrity": "sha512-Owt/5jT8IG5I6eRbs8en+bHvi2St+k1Z1S1CLArlnfTzkTgVGz/R39HD4OouEVnr2dQPkfc7ms6+XkhlYx5NLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.2.2.tgz", + "integrity": "sha512-6D6ZC4EdBjAE0QgLYXuk7AC5r/LM+XUUOa5tFAV6fsAKn+GjVFsmP8dl/HEHfg+vx619+o+IrVrOA+h6ztmNJA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.2.2.tgz", + "integrity": "sha512-RHZ9nPZ4ivv9p+djO9WqoilMhjlR8/rj7P4sog5OpeRE5EWc65Rb7SFwjek1IovS2gbbK+3P2y8Q4G7lyvbe5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.2.2.tgz", + "integrity": "sha512-WginA4UHdrRhK40pDV8sv3Izho5aOzWf3iC8WVXi8r850mVbOE88JaWnO7TJ7zNWgiM32/OZeVyaYQ/Wv8pYjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.2.2.tgz", + "integrity": "sha512-Fekq6TWZAN7T1Yi+IVAPQ3wUmsmtvu3WyvXiVBjVKh8C1H/PKPcNi+4kaG9Ys1BhBZhqiEfTgc44RF9xLM9IAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.2.2.tgz", + "integrity": "sha512-3Uk7x2/giczRCva7RsWd/KjgeYH9kOQFiqzE4heMrjBEuJQfACDlasjIrTRv9bwLrZ6otkBVeX/zmE9kBo3tOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.2.2.tgz", + "integrity": "sha512-y0d79+FYtSEI96KGAjIUrD7/xybAp7aSjqqesM0WP2+DIJBYkdjK6maTKxkB5gb3FBJyhfNYr4A1NqDnvbPtvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.2.tgz", + "integrity": "sha512-17b7hh8VMGWHq0yQDxevLUM0K4ZoNUah3oYVbYe46tp1w7D4u44vDkOOE2SpV2E/alllcDES1etcVsYQSMTGig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", + "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz", + "integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", + "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz", + "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz", + "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz", + "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz", + "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz", + "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==", + "cpu": [ + "ppc64le" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz", + "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz", + "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.0.tgz", + "integrity": "sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.0.tgz", + "integrity": "sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz", + "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz", + "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz", + "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.3.tgz", + "integrity": "sha512-kNlyjIKTBhfi8Jab3MCkxNRbbpErbzdu0lZNSL8Nidmqs6Tk23Dc1bZe4t/gPNOCkCvQlwYa6X88SjC/ntyVng==", + "dependencies": { + "@angular-devkit/core": "17.3.3", + "@angular-devkit/schematics": "17.3.3", + "jsonc-parser": "3.2.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.0.tgz", + "integrity": "sha512-MU3XYHkOvKEFnuUtcAtVh0s4RTemRyi1NN87+v9fAL0qR9JZuK/nF27YJ79wjPvvi1W9sz3qc7cTgshH5tji6Q==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.1.tgz", + "integrity": "sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.3.tgz", + "integrity": "sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", + "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.1.tgz", + "integrity": "sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "devOptional": true + }, + "node_modules/@stencil/core": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.14.0.tgz", + "integrity": "sha512-+s0u/KsNolXZ7tC2hEMgMA3jaNaqOhZvYKwSzjQbc0Wv+cB481Isxzo7ifgEWRYqsJzNSyqhO6cyu/EJrGGTdg==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "devOptional": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "devOptional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz", + "integrity": "sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.4.tgz", + "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/node": { + "version": "20.12.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.3.tgz", + "integrity": "sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", + "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", + "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/android-versions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.9.0.tgz", + "integrity": "sha512-13O2B6PQMEM4ej9n13ePRQeckrCoKbZrvuzlLvK+9s2QmncpHDbYzZxhgapN32sJNoifN6VAHexLnd/6CYrs7Q==", + "dev": true, + "dependencies": { + "semver": "^7.5.2" + } + }, + "node_modules/ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "devOptional": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001605", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", + "integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "devOptional": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "devOptional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova-android": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-12.0.1.tgz", + "integrity": "sha512-6fXWoYb/X5AJlluhBg5RvOaX6iRxsvNH7yEOiXzUmLIflf5Ho7LtYCSKZaWMHh3f5cJe/sPCBKmFFBS+EWepVg==", + "dev": true, + "dependencies": { + "android-versions": "^1.8.1", + "cordova-common": "^5.0.0", + "dedent": "^1.0.1", + "execa": "^5.1.1", + "fast-glob": "^3.2.12", + "fs-extra": "^11.1.1", + "is-path-inside": "^3.0.3", + "nopt": "^7.1.0", + "properties-parser": "^0.3.1", + "semver": "^7.3.8", + "string-argv": "^0.3.1", + "untildify": "^4.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": ">=16.13.0" + } + }, + "node_modules/cordova-android/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cordova-common": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-5.0.0.tgz", + "integrity": "sha512-6Aa7o52/iEvsKx6K94ijzFel5acCULR49KL27OUVhEpJ4oS7Dc3y2eOP1Eu0P4Wmiw/eLEDQjGXGiAa2D5zFZA==", + "dev": true, + "dependencies": { + "@netflix/nerror": "^1.1.3", + "ansi": "^0.3.1", + "bplist-parser": "^0.3.2", + "cross-spawn": "^7.0.3", + "elementtree": "^0.1.7", + "endent": "^2.1.0", + "fast-glob": "^3.2.12", + "fs-extra": "^11.1.0", + "glob": "^7.1.6", + "lodash.assign": "^4.2.0", + "lodash.isdate": "^4.0.1", + "lodash.isobject": "^3.0.2", + "lodash.zip": "^4.2.0", + "plist": "^3.0.6", + "q": "^1.5.1", + "read-chunk": "^3.2.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/cordova-common/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cordova-plugin-device": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.0.2.tgz", + "integrity": "sha512-R5cQod5kc4rVCrKW5ciZf1w//qW/LOrNXEs8tOABN6OxHF/pG3JavCIlNPmbiS7GIniIuC5OeAUrKTgdltirjg==", + "dev": true, + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-ionic-keyboard": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.2.0.tgz", + "integrity": "sha512-yDUG+9ieKVRitq5mGlNxjaZh/MgEhFFIgTIPhqSbUaQ8UuZbawy5mhJAVClqY97q8/rcQtL6dCDa7x2sEtCLcA==", + "dev": true + }, + "node_modules/cordova-plugin-ionic-webview": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-5.0.1.tgz", + "integrity": "sha512-dF3x7ee8s7ITPImz8WG5HFMnzMW1LaCve+Pdm5WzonKxcwkmMsPrW2zoWuIFBTWjXvFyNoxprzRn6aq/WotvKg==", + "dev": true, + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova-android": ">=6.4.0", + "cordova-ios": ">=4.0.0-dev" + }, + "3.1.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.4.0", + "cordova-ios": ">=4.0.0-dev" + } + } + } + }, + "node_modules/cordova-plugin-splashscreen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.2.tgz", + "integrity": "sha512-zc4HOECJb+5Gz1rZh5QvdIm6DREom57yXOuEmMRSqu0pJRMXTrJPlemsE1gQ+9v9gGhAyXIREibBXHHRG7eFQQ==", + "dev": true, + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova-android": ">=3.6.0" + }, + "4.0.0": { + "cordova-android": ">=3.6.0", + "cordova-windows": ">=4.4.0" + }, + "6.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-statusbar": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-2.4.2.tgz", + "integrity": "sha512-S68f/nm2AO0szAITockKHt4pDc6wwIolg+PuooKY+g9degrDU9NCV/A06QUOhBOkywy3MAozG0Xaie/hyDszdg==", + "dev": true, + "engines": { + "cordovaDependencies": { + "0.1.0": { + "cordova": ">=3.0.0" + }, + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "devOptional": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/critters": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", + "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "postcss-media-query-parser": "^0.2.3" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "devOptional": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "devOptional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "devOptional": true + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "devOptional": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", + "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.724", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz", + "integrity": "sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA==" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/elementtree/node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "dev": true, + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, + "node_modules/endent/node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "devOptional": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "devOptional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "devOptional": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", + "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "48.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.2.tgz", + "integrity": "sha512-S0Gk+rpT5w/ephKCncUY7kUsix9uE4B9XI8D/fS1/26d8okE+vZsuG1IvIt4B6sJUdQqsnzi+YXfmh+HJG11CA==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.42.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", + "semver": "^7.6.0", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz", + "integrity": "sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "devOptional": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "devOptional": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "devOptional": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "devOptional": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", + "dependencies": { + "@ljharb/through": "^2.3.12", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^3.2.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ionicons": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.3.1.tgz", + "integrity": "sha512-1boG4EQTBBpQ4/0PU60Yi78Iw/k8iNtKu9c0NmsbzHGnWAcwpiovG9Wi/rk5UlF+DC+CR4XDCxKo91YqvAxkww==", + "dependencies": { + "@stencil/core": "^4.0.3" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "devOptional": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", + "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", + "dev": true + }, + "node_modules/jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "dev": true, + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "devOptional": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "dev": true + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "devOptional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/karma/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true + }, + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "devOptional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "devOptional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "devOptional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.isdate": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isdate/-/lodash.isdate-4.0.1.tgz", + "integrity": "sha512-hg5B1GD+R9egsBgMwmAhk+V53Us03TVvXT4dnyKugEfsD4QKuG9Wlyvxq8OGy2nu7qVGsh4DRSnMk33hoWBq/Q==", + "dev": true + }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "devOptional": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "devOptional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "devOptional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "devOptional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nx": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-18.2.2.tgz", + "integrity": "sha512-ZEnN+2XV6QWI3q6N/I9byjSK2ErxAJJjKIWFQ45RW7+KCFbiwF0zeGnn5zruSHY7nbTrUf5C7MDA80eXam5DTg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/tao": "18.2.2", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.6.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.3.1", + "dotenv-expand": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "18.2.2", + "@nx/nx-darwin-x64": "18.2.2", + "@nx/nx-freebsd-x64": "18.2.2", + "@nx/nx-linux-arm-gnueabihf": "18.2.2", + "@nx/nx-linux-arm64-gnu": "18.2.2", + "@nx/nx-linux-arm64-musl": "18.2.2", + "@nx/nx-linux-x64-gnu": "18.2.2", + "@nx/nx-linux-x64-musl": "18.2.2", + "@nx/nx-win32-arm64-msvc": "18.2.2", + "@nx/nx-win32-x64-msvc": "18.2.2" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nx/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", + "dev": true + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", + "integrity": "sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", + "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==" + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/properties-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.3.1.tgz", + "integrity": "sha512-AkSQxQAviJ89x4FIxOyHGfO3uund0gvYo7lfD0E+Gp7gFQKrTNgtoYQklu8EhrfHVZUzTwKGZx2r/KDSfnljcA==", + "dev": true, + "dependencies": { + "string.prototype.codepointat": "^0.2.0" + }, + "engines": { + "node": ">= 0.3.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "devOptional": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-package-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "devOptional": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz", + "integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.0", + "@rollup/rollup-android-arm64": "4.14.0", + "@rollup/rollup-darwin-arm64": "4.14.0", + "@rollup/rollup-darwin-x64": "4.14.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.0", + "@rollup/rollup-linux-arm64-gnu": "4.14.0", + "@rollup/rollup-linux-arm64-musl": "4.14.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.0", + "@rollup/rollup-linux-riscv64-gnu": "4.14.0", + "@rollup/rollup-linux-s390x-gnu": "4.14.0", + "@rollup/rollup-linux-x64-gnu": "4.14.0", + "@rollup/rollup-linux-x64-musl": "4.14.0", + "@rollup/rollup-win32-arm64-msvc": "4.14.0", + "@rollup/rollup-win32-ia32-msvc": "4.14.0", + "@rollup/rollup-win32-x64-msvc": "4.14.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", + "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sigstore": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.2.tgz", + "integrity": "sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/sign": "^2.2.3", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "devOptional": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "devOptional": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "devOptional": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "devOptional": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "devOptional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "devOptional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "devOptional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "devOptional": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tuf-js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.0.tgz", + "integrity": "sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==" + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz", + "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "node_modules/with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.4.tgz", + "integrity": "sha512-NtTUvIlNELez7Q1DzKVIFZBzNb646boQMgpATo9z3Ftuu/gWvzxCW7jdjcUDoRGxRikrhVHB/zLXh1hxeJawvw==", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..401bd34 --- /dev/null +++ b/package.json @@ -0,0 +1,77 @@ +{ + "name": "pdfannotation-demo", + "version": "0.0.1", + "author": "Ionic Framework", + "homepage": "https://ionicframework.com/", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "lint": "ng lint" + }, + "private": true, + "dependencies": { + "@angular/animations": "^17.0.2", + "@angular/common": "^17.0.2", + "@angular/compiler": "^17.0.2", + "@angular/core": "^17.0.2", + "@angular/forms": "^17.0.2", + "@angular/platform-browser": "^17.0.2", + "@angular/platform-browser-dynamic": "^17.0.2", + "@angular/router": "^17.0.2", + "@ionic/angular": "^7.0.0", + "@ionic/cordova-builders": "^11.0.0", + "ionicons": "^7.0.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.0.0", + "@angular-eslint/builder": "^17.0.0", + "@angular-eslint/eslint-plugin": "^17.0.0", + "@angular-eslint/eslint-plugin-template": "^17.0.0", + "@angular-eslint/schematics": "^17.0.0", + "@angular-eslint/template-parser": "^17.0.0", + "@angular/cli": "^17.0.0", + "@angular/compiler-cli": "^17.0.2", + "@angular/language-service": "^17.0.2", + "@ionic/angular-toolkit": "^11.0.1", + "@types/jasmine": "~5.1.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "cordova-android": "^12.0.1", + "cordova-plugin-device": "2.0.2", + "cordova-plugin-ionic-keyboard": "^2.0.5", + "cordova-plugin-ionic-webview": "^5.0.0", + "cordova-plugin-splashscreen": "5.0.2", + "cordova-plugin-statusbar": "^2.4.2", + "eslint": "^8.57.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsdoc": "^48.2.1", + "eslint-plugin-prefer-arrow": "1.2.2", + "jasmine-core": "~5.1.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.2.2" + }, + "description": "An Ionic project", + "cordova": { + "plugins": { + "cordova-plugin-statusbar": {}, + "cordova-plugin-device": {}, + "cordova-plugin-splashscreen": {}, + "cordova-plugin-ionic-webview": {}, + "cordova-plugin-ionic-keyboard": {} + }, + "platforms": [ + "android" + ] + } +} \ No newline at end of file diff --git a/resources/README.md b/resources/README.md new file mode 100644 index 0000000..46c696e --- /dev/null +++ b/resources/README.md @@ -0,0 +1,8 @@ +These are Cordova resources. You can replace icon.png and splash.png and run +`ionic cordova resources` to generate custom icons and splash screens for your +app. See `ionic cordova resources --help` for details. + +Cordova reference documentation: + +- Icons: https://cordova.apache.org/docs/en/latest/config_ref/images.html +- Splash Screens: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/ diff --git a/resources/android/icon/drawable-hdpi-icon.png b/resources/android/icon/drawable-hdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3f84fc1b2b36263e0eef1f0a9d23269b873ab613 GIT binary patch literal 4264 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 KMNUMnLSTZt%v5>+ literal 0 HcmV?d00001 diff --git a/resources/android/icon/drawable-ldpi-icon.png b/resources/android/icon/drawable-ldpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3de9b4f79ba0742e8cca99c24289d8a62d8e74d4 GIT binary patch literal 1654 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 nv~7_Gz@ZH00000NkvXXu0mjfdyjda literal 0 HcmV?d00001 diff --git a/resources/android/icon/drawable-xxhdpi-icon.png b/resources/android/icon/drawable-xxhdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..391b4af13a2b8f878c1db28ff3cfc6ba708dfec0 GIT binary patch literal 11034 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 PA`~Dmtt?d|VI25>b3S%1 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-hdpi-screen.png b/resources/android/splash/drawable-land-hdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..74abe28ea792c29b9b3f117a3fd4b5fed614dc69 GIT binary patch literal 28087 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 r_#HNjXDH^*wd!noIIe%BN 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 z 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 T)f>d0QUtWs4b*DxK6w6rd094j literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-xhdpi-screen.png b/resources/android/splash/drawable-land-xhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..76eab0d7271e38f78d28f2e9369029ce2f53979c GIT binary patch literal 48332 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 QUls#kVrXgbUJn)Ve<-iYbN~PV literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-xxhdpi-screen.png b/resources/android/splash/drawable-land-xxhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..b15925df5b477a3abe24f3ae7f8ec34800d93bd7 GIT binary patch literal 81272 zcmZ5ocRbYpAJ=uV_lWG7ak2^-g(9024&lzs-XjW^Raqe?geJ-1ki9M|TamN($}Sn1 z{obeVx9|7&{i8=cJbd2o*ZVb|uiZlfy=zqDXUK_&h^RC*t{M^%ol+(uI*B8NfS*jy z^Tva}$UHPmy@`k@=m~#L^o|7|5D{?`Xi zcf@^T5;=LUniw_5aOZa8Fgve5)z03!JWR@^0)>+zfppwh=D|Kw3AjK4p;!xS5a6(0 zH8SEW8}%RlAW8}=4=c6Jdw)fMJ^o7HEj)5dNfbLt0YzV=g=d=4pyu4=uLfL5A>+ex zZ$mYs8iqwzn7onSh#(zyX}(1)F`tbjDbH3eBC&#vkrbpbZ*Ht&DJP`E!af35EPGE4 zq4Iz_eXRlg@Ve16y^~>~CYQGNGvm|sxsHSxOf+xqXP(Mk#P1xsRUaJT!n-LC3GWQkIH{o%-p?3m2K_oKbt zEt0H|;9HG_JvS`h_sj);74g2@TRp6MO@W2teu|LBjhhE#uckwOZH8Qu4YF6?>WV2F zamBp7;w-m+S3_fdW}#&9XlH%CWUP%r+xg2j-KF%^kfX6uU2T%LwbDLg^;shw2FlJ) zEA2K8+AU_#UF?TxW&7nrtLHwu@60fmI zcgvH0?a%zE4-pvl+xf+LX(VJ;|1crM?brVLQC3gJ=%-(Yi_;71S+xfPUD5FeS9dFa zRo@D`rFnMX$2WQR3DvqUs}x5^dqryJR)1)^N&MoAJ?P=$)Ys-)%2K~HTHJm)gEINo zQNkkKE2}q^A1-H^KYZ;;#>pkiRYqIIyF!PkcJB{jmq7|PJ~AD|MtmBVAt|FhM;0=2 zZ;H|-PsmX<&IK0u|JYvM3E7rY z$2hY5+MU^$Eg3sH;Ptoqwk#SY?nN5%@q67pgkQi|al|KMTK?1TI9X4L+h_T_wdS8} z=^r{Dah4Wd5a}2fDbR>Unh6@{HnKh`y+TFMm23|=_QnMdql;D)n4=wsk@swi+n(Yt z?)nXgy_aGcZ!##NH7!1cujQ^5!=@B+jqqR;Mh<>dCRcbQ-74C$w&9FFdFW&v@P>mD zg|jw$KXgk3GNH#4E}y_Xa9*sBSDzbuFuS?oL4DHk_8jZ>fN*#(LqmbPrQ8<^NC!J9 zhD~bjvC0Z|TK3}Wln3q}f!&GXcSu*o>QWF-#28I#ZFA6@reqrSQLaBPN ztXvRSy{T@CXi@zX6UvSfYTVUSYGU<@3li-Kk+ zAmSnOH{96H>o0Kf#M6+MaQm&Y;3eZ?CpH?s3YV{Jv))x3Glj!mCj32JQ|LqY@>J%hz+E#8jZ$DF6{-y#w#9fa86NcMR#`J0_ z;A(O5HZsenPzJ|0Sjx?wDl-z)1wW-WD1M!m zZ?wH-Vy*hFYR1nim<)FdM;>e^3imEHYI`XLcVEF)=KYYzbm|>ic;v%q9)I>2su1aw zBV^<~U%0Io6M(-cHIx8SBm2Pw#aW9dMncfwi{k}@+fq>c;MPjJEk)5=W5tPY%ar>R zDRp#Z4=mBQO`j=(XM!spIUHYM_4)CKQF&6>NZE9q1`kde<(r)ybPxOrQVpS5pSV2g zR=#5nDQsENShlz^t3`}2xx_&8BzL@tOfuKGb?wO{YH6?41xIxXDYw`{_<@AZCd5WU?zP_g2avwYZ5zDBbV zzrt7a5DLyMb{YCJK&gB)`Eof|iRz_Rf_>z&IgJIlu`ueDWs!Jzm)1+|!P)+Z;^lj= z&$`RC6cA_5-l3O@$rN#HH*K^FE~Whz8crn!Q(Lu6_WBCWWtfH(7Nntw&W(7;O3c`U z-4|w+*}@WtluQx9D6VN^tvcveXMdT+h?8Q9mWNCgH|C5z#EiSi4@<1yr=TSy%p2*0F)Naf4APbQilx8s1*6naR4t85#gg>UiG>|7XLD`RarN#(ueaO_1b z$$SgP-{N9%_ZL1lb)NX-K?CVPXI4-S1y~1+U)d{{a#=!NB-re%=}o!i)!@YXXwm%J zwGeLXBc78M6YDlqKd}scr@KGujP@MMyV7>A`@^~t%7--5UQ4%6%6JfhvJ+Bcdz#Py zj~uH{N0y{~5~VynukjKQIpti`FUTE|W8;`yvqgU&XXY%z+r_!fVkyJgZlYKEk(OZg z=#Mb}%QlUt!GrmdxMk>v!Fea|yd7L6W>5{f%-3kofz}2(41bB36&_#RtGFV8E=^2L z-zqk4HWMcy#rWP3Ts+tyZL%{hzi+CobMBal4ow+h()Z6mC#r&Ai*<`Pmhblt&WaKIOi+3<#d`x%&Y z-nIstntA29lzKR78s(c%LeZ)Xry7rrhEmVn1$;!vFGaHY76xxYdwEzg+_=*1ugKUz zplH9B^y;Fx_mtIEiO3r?9Sp!4Ym6l>mtAd^9uOLmDB5Zd!}VsEQf>TfGX3t`k*}!R z*zp^fJGAYC?&#%YUHthPfanJ~dJ2ByUg|v+#9|0~@Cij<YYLWx&` zOzH$g`-0S@n+(Q2JQsEv?yyZC2rND>h?rqVzO694R&QjiAnST*&M>|Y#A)m%Nu{xZ z+MKw3N9kk9EW<`G{;VaC_(hqUCp5R*ixwXE@C@8gC=DW*comW12|ot}!}la*JYt7A zq(|4LsDBg0p0zccP&^x*#G2Wo_^BxmQVO0RC|Zmbo~>zD*i8xxxO}VqlfJ_3Q>Zuc z9B0k%muoylT5&M9Wf=i%e#~CG9;8{Eo}K(&GgAR?-u2)qDQ1B6B4pWOR`N-dXUS00 z%XJEh@5)G8xS!^2!g)`VRT(5Ngy9Sy&FWwf;r^QYkDdm?@vp=o+84hoeyGrwI7$k4 zlp%nF3Zg4SPvDH!Nf})>|I=Q<_sMAC_BV#^nVA9?;h#W#g*l%UitcsMR5#~j3%I;= zc6CZ-v z#F7vSds_5Fae{#`DJ z5>%-~&6-uXiRL)azB79tr?ue3P&CiRP@Xh|0RwlX5Y!j`&lUwF!hb9)4@N|sVnWkm-?GkJZf-Ro!2h(ZMW zsce2Z1<|Ja&f+^h{NX;O!YiCSKrBX5%tlkY+y90}s>3YA4YoD7*U@=fbr>$RcfL*1pI4G#Og>Bl}BIQ?}s|cC3DuDBl+3 z&a2$ogNcq$GQ30>HmAHL%0bmEC0EUR&K6cwty?9^iXs#`5@u7hB}4dwd7Fr z%h~i-$&9)FHuK9}vHN2_%L2 zPx;m>*0eumKfC&(+K@+7oD|m88uqCyLhuqP46YY&XF~F}=m}KmCC?w+%ck6Fkro<= z4B(Dd48%w=I*nVahz|wYHHi?^T<#Vve63;ml2JgcsH|*yg_n2F7kPkWUHVBrN7jX_ zbnwUFKlf06pNJsZYQq*f@}WD=o{JBqyp4Lp3N<$4?~hZXotD~QH%k5MiSF$gfU?)} znf1)h3!hsZRS=G4L;|uI+*oc4r?Ix@x(XO-h_jt7^Oy6T(mY0yW2ezCia7C8%JcaW z?NV5N<-`?pl;53-y`#tCtLlh5PD)U8^|z`XM$1C4yKLw2$Z_rlw|ZH!Rn z*Q$}XQ_G~a3c;y!xpakN+>Z92QmnfC^B47G@x%~OwTVmZCk5Ib9h4~B@cvFYCz=%e z1ClS6&4x=&wsy4_wUhvrAm@5%{g+K>goPW*=;ebG#~daTX|7ju^a_w1io6op!ZHHK z_$f;~qM*v{bR6Z#>AazbzeN(_y)HGi6~JztT_GtYqWLl z^9nt#*b672XwLS5-zuZE zk%wJEMmQ_~VWBverQNNi{jk^3uGRMq{U6)&VV@`}hz=92;cF* zml7hZSyr@w`;!x?*#H#q@=14DbxiM&veHKcZ?)gYG#Wx6&Wx!etv`CpGCEf;P_~l7 z^z)-|8?rQ3N;NGu0@IJ1!|yUe@k^L$LNYLU2eo;!IC9P6EQlS{4L3AelaM=S;#w*) zwKb+I1W7Rt;d7MNEnLe+@-zKGI7~Rp>$K&LmR@Ee$|BHYaJ?oe#9?ofcSs$Pzuzj9 zIu5E6R?|G6sOMA=$=SfsC}_xW>sNisYr~pGl}eFf&hmM{gi5YgFn}O}U>ryGGwdO~Wri-w=xP^Ra6*k2!^2DkW;?M#N~|(LWCIZ|=1HWI zhFr?hqFetia|HAYVBI{ok2cBN`T)w88WbNta4{6tdOj*PoIp=EmPt@~QmApQw3fF8 znNJK^ZWn%=SFz+&c(LstIhv%`k2%944}snoeX=L`zt%MCOd+cG5K@d+>(_^`B05?9 z3dIQVLt<+$H@4da0NEkxK6N?Q5GroAU+kid z!1r^Vsw{X%veuC%INtpuQQaN9h-wIjZR{3JLZPDkEGxC1RJ0A-o zNZvQ7CrD zC;@Nj#UD~F?VDaKF7Ca5Fv_XAsZG~LQ~&Mkc^;_oiOpjow0LMBBtpq2P{~R*x6{yz z@=w~aL5Hj|%h>kGOAlIj#RqnuM!ARoEtvi*vExX&i*SrQ9n{!O=h(-zUt&y5G5jGf z3y2Zsiza)4h#X6A#pXsC5q*R#n`QlcS)iEA_JXP*LPWVDSNd5|#C8v_l@}#Qh>~LNGURtWcz8denAOi+s4;E}+bS*%5`N7c^fR2N z;G;heO2<8FGRfy*4q`K*gYRY%Um;}5kZhYZWrSTPSyh2T5d|}gWLBd*=57EzJTb6^ zO8nmXokmb~AxP#xceqwh!`2|#eV{C(M0bc3!+uNq;2CBM3T0;GxcO$Fh*Xq|6mzR@ zBioVn+>3xnSN+{JsHyO&(jU@2etO_{B_!`Egtz zEhVJHC!G^Wg~GKb3u}FR!}0vU!%?ykB=6K13JiShouk=qPQ8~2&ELA48$@NU8uwA9 zN=xq2$la^zh&Ro~V|i9eCs4$BgG3E(%(U>uhrW`Y1z7b+SKmHgOjJap)&mQafKAS3 zcr4|sF=KgkrEo+wH5O4F z6Kxcqr-NgyXWyg+QPaX-%T0=mogX_K)P73q4H0#-AQLCr_ANlD9a|>zP{v8U93JLX z^tg@N78OL)sHeOxABrNTyxOgd5XcJl{z`;->hSb(d9pXz4Wu?=>+sF+o6aKV@w>6V zr5@7v)5%I->lXUr)5;m+r?Tfhx)GRz%4NkQPjJ44Jz<9$PeaX~b0BIdtNkA%OQ=Q3 zjG<^9iF5r0RbqCKzskwyYVdV+m+;3%$Ff!eO4K2XEG;Z{8s2T71pt(0Je2Ac{P?QZj+hi?f8JjSb@$}?&f6>ry`eZQ+@cS8sTeCeatp8qjg+45 zQGbC;4411bPho3s$eZ}{I5mV)Yp}rb?X=kL0zeKby~?CM5aN9vo?5s5Mzoh&6Ud5n z&6Jr`OKN4@D)L@_l-ij+&S9wWT?_FmZ-xi9^8Un2$G4QkiMASvX(QfTy<_Az+ z`okji$10X-8mI0G43nZRa1FO$2;zo`Q}x2KDXVuf zkXFmcB5LPnOvLDz*cb31QAf$;g6w~D$Bh(TS)l-NCjVgRdRII_9f2x~io0D*3&kfM zmB0FhDh9HeI2(n$eTE$`=S&7mmAG}Uu9Kq!={3&XIpmQ7TA zjmnCdWWRBhP;Lt)+{yMasw~^VFWyN?j(U!llU9 zIXyyxSX=%lmGZq!)`e8NGcqgnA+aLD+xA`5D2L>Z;ijikB;Q0?1#jBye!xJ#X`a(mJCZwv3_ zLM2Pw_pvxlE!0`TNP*f4d$(kHxI`ugG1$9FZ)zWkOXDGxA3njj({twIhrC8>@hPhf zAZ-#^-40v1i+@6+RQuPnK2?~hWP`+Y*c~W7{*G5^P9}hg9~v6Jo}GY1>zxAeNZl}{ zf;_CapY0+PeGt+6p@EM1q}Vg|-vM?dMIk9>vq|Jp??vw>5Dwp4&#%07-don-vcHXI zXApQ%$FH}gr>eJ^c{&QAfkq=ggPK_ zPw%RQ7AMR>JB8PVYnfX4UgVfbCeo@$fZst^7;8J46l}Ee^{vxiey$o+tJ<3vH~oc; zReSD(jzQtkHgLS$tOudEK)#FUm3Tj*F;+i)LJ7UJuu)3@YYX{wUTkZ)<0>ekq=Q1x z@jGgs>E%?YDfQ=_hN2aJ9LF@B0jI1tZvw;2Y5G`Zw{_xc50(yodQdw+j~{D2WMXN3 zTHA^i?ndY;5l+55P(Ox7E4l1+zTQjE9J7l*`a^OK};y4w8km!54Zj5^KT$DuTh;XKokaV zLJiMIgz{6v(o#WQ1Rb{t&21t^Z6!@&tH?RdU84B zt`U&viyc1*Z(-mYSDqUZ=Ehp`NQSyWv!z_1_`U!Gb0v&FG1`Z7myh%b2-5$`qaWeS z#F$d*6!_Q*brHxyOM*DzfsY-d2Dq{6dyi-DzCStG23QfFi{-@opqSpp`taBN+f$SZ z7IEXuFWxbNPy}7TGtj~j!dbaxq3c&^;e~>}$WwBk7!hY1)e*6;>$k$gAA;zD?MbDK zfb{v-uzy+WGKps;@kVMz29^^QQJeOOaL%c?csB5M5l-v@ImT{~6k~F;l-l_bE|I$L zyx97kC;wvQ8-a`NX__NsqIB@VJV%0Bml>wT%^nbwVm`Ju#m|`_BnTuJ#5V?tVW)ZK zTt_6^9otQ4;lY0^)O*lPOtUV&a`lS5(Tss>H{Sk>VlpC z^>PI6kr=HW+iL}(KlKt(h_+Fs)ne7(vjFUuV>45iEdfWfdltc4uoG^cbRaiTQifRe zy_b$#A%-geigbDLjT;%mml)t1`E!>wr?q?YsQ$5cm<45{X5f~6pHh&~j5$Ixs>xE9 z`2>ZQk3Pw0`l}UkQ0>HCh!eAFK1_U&9 zJST6#gCiE9uLuU@YOMqdpqj!RykhssS%{$Wkq=qCfbXpJf8 z>Nqiq7=2baMfTI%hoA)+Y>!*(5j;6D#KyXf`8N3p3Ho^@#%L}!a^-*N-YHVMc-f*n z1qL{Bf!n!o9+*&HYiJ8E2ApuzyFtI z;%f?up#L~-bfx5rea|z6pW~ux%}Bwwe0-rkHpP3OAW;8`4cr|Z8H+P}wB-w*dhk+L zF23RJwB>{k1!^wmFFfoRed;lE)qU>`?dN zUZZObGJ@5lu&_QcC_3wJ2G}(5uI2P$hg@F&N-t5~XtFNsB{WB{y0^mB1TdtKtASwluz-CpVWKsZk3f#=Y4v% zF3-=qVu}9JS8`YFEm4moK!>5VwfKvx#Ri*83*3=^hFyMlpM!fg`O{>()OR;&f|7GU z!{bCkD-Bow&dGOHsJx@j3N-T^wf5T2lB9;?z8V2dnfp$`Q=+t)?l(I1*Oh0l8I^%P zJCw76`O=c8dsKY80%~!lg$VRjfg^wG3zy=HC854_0JP`N;0sU$)|nwowudpUBO-U% z;X%nI;ARxVwBt;&tZF|bdd_6BP&)~^pbWqqS@GmYfJGwnaTo57Cfd{pF*8tHi+n{^ zI>@_XG*2KwucDwnH;@j0ZL2&BoFEKz)rw3igMbiz^4x52a<&ZLy1p8_z^?V}DUiViJv-iM8QUO&jUAm6u4nzv zYjoOv*vVtpmd>si3qA#%9KRXXkqAh{<_H!>r=bP3s}Pbn~xb9C#Uces}+ z2b4B%p6*Xn$fuVax(LS-SScz}2(DicODT$3GMSVFoJi&_2p72+*|fUm{$}96vdGV1 z_6nhJZ+p1y#DX=kBWO~_ZECq2EsY#jV+Q#DC@k6wW!dIy~1@gRIl_@n&pD|wW_hlfD8vfxQf z0?taXHa9zJ#r??tiseq!h31{nT~6jD%lt0{x$=0@;bT%p@ws{k&!5~C-2iFcRLWzT z#9eH3%)Dg(Xg8?2Kf=8en6lyw$)f8pwJyYe1-B@wP{#x%h;eBUXOQzxXtPWZ zi9b91@5K@Bn7M?6968t1AZ80Bbf9axRrIFh9#kLwT$-he~qM#A4=@iND2_FGwo)Mm-o{zCfZ91b z_z{3Xeg<&6#=mdpGx|IdK}`|#<`qGe9GuL@I}ishMF@KRD3HCMPiAvoLXd>h4tw{-0lg#W(+8fENi2X7UC zPaT&CpFVrXj0D|->E1{rcX;SN@YHYam*bJmCqyb;RR42ro0WyOPSzS0Ytl|oTe)jq zM>nJNzUGjlnlVK02q9e{q>Vp{Y1Jt13pq;d?Mp%f`8c+YNw8U0o6t9l5~vk$S@>YN zcuaN{?bkeb_?#6&bJKd4=_Ua`86~Sy47^6O9i<%w|1rE{98bs%(3s%j_u!(|=c`t9 z#MJf<5R~om_pv)v(bxkD7;70lUhUMU3~-DO9lP<)CnRxDX`BDj?6}~1o@@>EHl1j*Zt%ltvNE(YRD5KC&kE_92~gtPg?(V zeO}MLW%!&iLX+EZ?`0DnuqnMIdVKHF+i5seye=@?0p7P#1&62O&sJm;y@d`I$_K)_s@n1u*^5x+k zT{r>0G}rY%V`Zg3nXPOQZmq>un2fzk4r6_1+p94VaeRH%#rW4HG|tuYe*ZF^34~t2 z1=-WBjK~l$GPDrDe(5q>S?E{7?2rKm{Z4J9SQJEi-sPDcMXCKDDNIeH;mi3|ifBfE zc6Mr07lr@ecPl@(z_&27TWYV4<|CE&qbKhOj;NpK)ngNZX#+$A3_WLJ-~iyex8Zxh zvzL!IjJm*}8l|Pssk49AB3fE`ux<-QHAk-ZLLSq`H1-mZ_qlpaWUxC#^jtl!y>dQ5 zmc)r7x;xhf($*gS0G$1Mi1xQV-9p3`)K=xJ2eG5GkMHlkR)zdlM%s~%OWeHANF_o5 zZmpNiK^sC*jj9OK7^{CpxGfr@*y-;E?yfB#kjF@3;O@siH8GUpC4i0lhywKc69UA0 zjPl*m*G!_4UBr1H9oC7ce+Akx;gIG0Qj?uY?3Yb~F)%J39El(+>ETjADNhnI$(bBL zSd$!fweNk2^S3t^QNM>z{_3RwO)wlBW~csm$An)Z-4UBVmSwM5v=_R``w?LQ`o1qCovH^qR*PeFGHep6^Qgdm}&Tl zE;=Uu&@Wt|Kc`#$j}{XgmQ;%us?=k(Kc2+kNW`uE*zbsBy{-r(zcf0^!kU@LHA9RL zBV5nKB2#TqykTS#Rr*!@>VLo#)DaXV94S7wN)P(VVM+;rdNY=vC{y(*14=-;w#z<9 z{`2J*8^EBA(r))8^-!j)3;g#CZK!c#Mi@;Lao}eyf<3*nXStPZ=EaLuogeN~c(DgQ zE^U}hTFh8d1>7rUZ8f0O`#U?0ku*ox6`PcQ>P)IoCk%WHlR4tLKl*>?#y0q+yRpDS zh;0G?dp~eHhlyWI`8}ESPfXa!05@Ij->q^=Pg!dw_{}eII^@OFZUW%@G9K|)R$yR^ zT%UBrFG+#EvtTjqKUQo{iU~Iwv67&?()V5tQ%oQpr=RI)iD+gb@9ZP$CdJ%uy@?&n z9rR3Ctfr1eB{bc~n}flP-vX!xJ*VNkb>!jTdA9CMkwKvPMBP&JKjGnamIz53l1Wb? zPNF@m>m8wO28S;|cmLmgx|3lNw?(|<*va~cgCMJv-%2Cyw0*~D{geo1J9kmkU4p0p z*iN2u?;WAC?WIirWn=DtHzAkllb}wR}>R-LxMih zD8MmeOZ-^Lfw2Li$R@?yF2pN+yp^fTZhS4?y_!~ox@g1-nBQ!n2X9eQ3YY#vN}{3)fj1n^)PjWZLSO>5Or%f~02zQg;z%Xz%v9qy64 z-q#SK32!N=G1}OoR=wqlW#PYt2sr@)uO3k6Bc!~ zQ0s@w5>y!{>!;9Yiqb^c-5X+4E(2DSoH+BH#Za^VPESeN+W!YstTW{}L!+G~HQsBn zPbiQ1`EhfKaXaNHyORz%tc|C&k%)6%$#!s2efvXu^rxsT07lGL*#7Aupd~?Nv0}Tu z>4UjfuDt9;vo+vVh-m1~zIupKLNTG)d}`8&0-kJgV|!`iO4lfp@Hp&$iLFg9ZvD;F7c4g|3#-lh!(j)iQ;RpwI&uw>AJy4pQRh_Ll z!^>R!-mvu0*YY&A0DoGKL&*?(JlK4h)C@%Q6x?ma-k$4w5B4iEUQo<8<{T_c^oYeu z%rJaC+U4WZasE~9qg%3DAF?B5-(K(SoqzWdoAs@2eD$mJpSv#Q8@qijbEw3SOZ%;Z zqFI-9cd{-A?biR=asSmb_Y167IGheX99h4+ozhzV;IiA^+*n{ov_tB$~DUYxFm)0udvgEXD?giH8~e9Vgf$-(|n#YkJB)luKTdd*?NHLhLejj*)!JF|xoW9I_ShPY3zpXOYv zUo8Ki8>}KFRCy|J;NV-8Kuy}idD&dCo{BJc{t49W+nSoulM6O&Vh-rI7WGiDWI`l#BjdBcOPBX-YETr-2J6$q+> z8GKUsiiceLV8zI)fJ*fCLfKtMe>G0@mC15S`3ya2^~fRfGc)n~Zm;5^M9V4a?nNuS zDNTvL8y`h7hK=y>46vhkk*dJ-s#1~dy9NVE(-K-L&NF1;%@r3OXn;xxnFm@5Dh&~3 zY|FVTh+D3S>kuezt&BjRj`4kbF z4-gAxyJva}m^yiX-GYEaDeZV`?Yb>pmu6zSsp^jUj`F&S%G=9d&r&o%)kdkf^>_2v zl1p}EqZ;ipeYd_kKtl9wIL1jgkB z%#n`$D)V`sVum+mu1~aTu#{1A%k>$ zr}Uq(q=OId79|c(Kx_*awT^`OAruHj;tPy3E~FUk6POM*rbw620pJFgSBunoRZ?;~ zCZPD;!bWSd+U=DSsI3?TMz1%jd?e$p+g3+o@4H%`Eo_6v_2qm~ET?6>kA&k}tg6_W z@9njeLC7v^>@wB(MPNXQ`BL#@@V=q{E8B0^cpJ$ z5;Zq=KzwGXr2A88%S#wLE2_TOsT(5NcLi}mr%g3qhXG8Rl4&3ZWPh9s{Y>DdW&4P) zTM3Q}BKnnx9libKg%|1qWez;&K=4MxO;@(ee6&lELEOOXi z?BN7tSw{&r_C*+L&AMSOoOfGi`b=KAF%b_KcXimoGk3u4U|%ACc{=aOFJI)w`tTl> zxN^A%dBU*PD*l$&bis6lLjJ)MwUWqfx zmpZEC#;1F{q_EJo+=lV17Kl|y$72ep!DE2>g0Uir+m!>;;*=a)Sf6QgLS8 z&;{<4TF39Wppg6p9mKu*D}H4+?kAJ!I1nw@>V&%7Yl*sY-Mfsa}t2OdwmtuX*#{cv9rrTO6nKI2v2zRNQaAZ zrT6Eju?J^&rbxIQwW4roy;m)$#9`NVG%TH~X0Y!kH4zbJlPP2&eJ;~GiQ`XwB`-jn zR|5S^&sKf5)x@*yu(-*LIDdeheI*9b?yn6f^8ThyCH(-aZ`XL$QB_|VapEVL-#cP7 zrR)?j#XT~_^z$%WU_@tOTK1O3-crjGUaJ*>n-RV!CdL-**qX8M&sf4DfkjdBnakuq zJ|

r-R5alTET}Tg0$U)Z&6; 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 UFN(tSJK(3IX`u1u94_#G0BTSJQUCw| literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-land-xxxhdpi-screen.png b/resources/android/splash/drawable-land-xxxhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..4b22b8b59ac6abca0731ac281c4977ba2bb1213e GIT binary patch literal 113380 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�zY_Q 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�_h-#|EuM7X}hyiKrg|cvq$?IU%X1K!qBe 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%0A57s_x@VZ+i<0y5N5Rv&r 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 literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-hdpi-screen.png b/resources/android/splash/drawable-port-hdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c981b971feaa8ae304b857bd8b69d38a040229 GIT binary patch literal 26962 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 A{Qv*} literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-ldpi-screen.png b/resources/android/splash/drawable-port-ldpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..dfba932196d9e55729d7244f6bd22b10e2b9827a GIT binary patch literal 8207 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 BO`nkwqn;Fz|f7ImR9(wpDr&OOa@={rd; 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 b_{v(DVd9#3!w3=v{!aXBaxC}gg&Y45ykSrO literal 0 HcmV?d00001 diff --git a/resources/android/splash/drawable-port-xxxhdpi-screen.png b/resources/android/splash/drawable-port-xxxhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..53f97f9d936562a2755e7d6308430fb3d2e58b0e GIT binary patch literal 101114 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⋙Me*1>u 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 literal 0 HcmV?d00001 diff --git a/resources/android/xml/network_security_config.xml b/resources/android/xml/network_security_config.xml new file mode 100644 index 0000000..de61259 --- /dev/null +++ b/resources/android/xml/network_security_config.xml @@ -0,0 +1,6 @@ + + + + localhost + + diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bee77667f603fb18bded673bb3820e7af33cbe37 GIT binary patch literal 60857 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

wN)_?i#aZHj68_|*P2;( z2>UUPVQ}t8hklo9+%f4{KXlOaC}?Vno30B2!FL#yR^JTRoXnIKVDJVNSeQN-6!EPe zhX7bhBO^&Xk%*(HBR=kR(1t+C@^Q!D=Tr9SzsLUVa@PQn7}0Bv!C7p5F*`U{mGg@? z->{Uv#VV}Y6z|qOicZTwQHA@$cLa9)5fu+_Nt}<4O>N<0Emg>(Y8`^Mw7h-K&5a{# zpR@Iy2Sf_G@)m^E^>h!IHR*Bo4YBs#A(URKo_yNG-Uz^7UuVs(@6#8{w%IYkrr`79 z;bhDQ02giFq*Q>Y;j308G@%pFBKVUB^ z?qOJ6myL?)0{2nh3_q~NC>~PX6qTA!Ch#hqXacMNRc{Fo?+-@`Sqq?FZGRlfspeHW z)*S=&`KOE`Fgxj)-tFB&NHxT9mMjR`w1set}36 z_P=fb?yHeO(V^vZ#^))?7D?SG)MF8}&GuUASl-+UY((uD3w!d5*6rPlN)e~rF1rH3 zSAKa9Qt}HS2I){U`CR(KY}yRdo4jw{5a4mVr%sQ7D8D-1x{(SN92b|=es%0Dx+V3J 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�i)q-T~26C+f>2i&`Nw#o+ulrLx{L>Yx z${V|>A(uLS{@ivls);RrGk$w!mSc1M2hRU7{9vuei;-sbt!$dXI=A^J4KIl^Xg0l2 z0o}_5Di`tv&J-(sx@Cd{SdpVUXU;T;N7F9tfSsd`AFR`M(hN%42^n<>lwFE%G+nJk zvwQoSLTDL~&04(%Lwd)!(nowHx*X&pVi_d%<2?dZXa^t}S7aT7mnbm6irBAo*TNs@HK zp-QGh#Wy4xIP+$Mll}ZGHZ4{@`WOaE4rPyLz6&?{EQov|5lJCK(@RUU4rf78riX|7 z=ci)!v@QI<`~CVD`tru5n#r!Ub4&bwcgIsc_rDpz33n!Z{2XU9eW;OHr>LlO2Ru+N z2Q35L6E+PP@WCz=#|JGvqkO$!T6Nd0t!?93f8`WTnGF0Dx|DCtai0;+}7Jtc0r!yleFPi*&!x^d>vb6%bes6+t10KA1}*#aG?DP z(ZBBN7A-a(#yqWSH|?u7E&1m*=0vfJYR6YQ-_70H;lVoQ@;$U#8NJI; z-D>}{NjhxN>sX`ap)*3Soc4Vsws&@T=@%3ZPlF$C1j`E0e7U=|Udt`=d1D~k~os2907iC4hO;T0hiWh4<*op z@X+wkh}P-r_-Knld*7^15)?Mee@< zdR6woNx~3k5Sxfipy)P{64+Bn%{}Ko9(#@Tb(TR`!^%G&eM=r82S9ZK{(;q;!n|t& z&eEdEVO}sV)PE&`cfcth&7z}92&4eOvqnY>@b3bYjhX)hUC|@@h;QWDe_#!#u(dzl z*3&W9r0)Qv^5CO|e(vL0FM;@Rwnn zvS^}5l86ldKao*PX`_JG-fyCuyGxCPcVL7BQ@fLH^^gv}N6b1&7v(*aLP*NcV>B_* z#Q_wgWx%w&CxU_v3mnWGR{l=73_V8^^JBPy=uZ^K090BXR_HWeh|v5obao2-8`r5^ zNck;JSnfa04spQMhZvLJY8i{pkhEj}k8Vofgr)xDJIEikY>Hz#)egn<b^olqgA*=7=S zLYX!Msyp Yy*En5WV5637yw^tN;egY6)Xe)2W3c4djJ3c literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-1024.png b/resources/ios/icon/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..be633f451ad30e396a638d97a013c4d93de43e1e GIT binary patch literal 61395 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�z4F9&yJ5kD;>v3nd&B2# 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 X%S$Y;{akD@00000NkvXXu0mjf0KcC9 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-20@3x.png b/resources/ios/icon/icon-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..00de715c2e2284ee55b47577fb55993893eff6c3 GIT binary patch literal 3417 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 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-24@2x.png b/resources/ios/icon/icon-24@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4b455d317a5be633643484260d0b46d393b13312 GIT binary patch literal 2597 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 IM6N<$f|6kPt^fc4 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-29.png b/resources/ios/icon/icon-29.png new file mode 100644 index 0000000000000000000000000000000000000000..8a55da53c19347340d87171598917b40107247fb GIT binary patch literal 1267 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 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-29@3x.png b/resources/ios/icon/icon-29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3393f844d61aaabdb5dd06f29ea37e9630460a8f GIT binary patch literal 5937 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 X%S$Y;{akD@00000NkvXXu0mjf0KcC9 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-40@2x.png b/resources/ios/icon/icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..61d82a739fbae4b3f046103e7c549aa2f4f821ef GIT binary patch literal 5253 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 LNkvXXu0mjfBL+7+ literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-40@3x.png b/resources/ios/icon/icon-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc349ded17a3c1e16602d48df3f9dfb69dfe1c67 GIT binary patch literal 8254 zcmV-EAi>{>P)~6Z_?!-y#O`Le+WH;IL-F0Hi zwybW;b|m-Sd#`enB~gV1jRkFHFoSmoLqZS;k|0QV<#&REV}m3#nE7z$wz+d}Mq-Gw<6RU?EX`&-dN-7rceJ=o!9kC!$;(L>@mnQX4Zwox`GInEr` zzXRQt0hUoF1W-l@cfbeBwzELj4*i{?+dDwG03t>R!F7lD%CZF3j@J+8cc5Dzpoel! zpgae38S9)xy<;&0T{4W~q6S)Zydx7pc^=Sk0Kb+b8Dk7^{MUh|jGrN>IYF3)Y3TmP zy7$)vdf^7BYI)nXbFz#u4u0Q3D~I44re)2{q;rxC^a34f?*VN}vI3F;E~n;Da3awJm3AdPee^=8sdapNl-G|^Ke7UL@t=naPzDI|f zJCDo9Z_3Y7DxbfW1`QVTn*RuYERv+8re@kZE?HJpO#=c2=m0=~F$7&l)SPAMG_Y$~ z(D(we4xq%~M3+kJ#6#!DV|d+eymTk}WDox77#X-iPd}pfrs$NyfSe86MUJZ#3?;8) z$Ayo1lTEAa!8AQHN(ZmfpO2Fbd+@Su^wBQ#{SkchzLPD^F>>aX$$x=(G>i*42A~{? zTSpWNb2QFqP$oN1zi!JRDVmLlKk_Ms_FW<$??Uf&*_%f2&^7X4ikhgNFf>5x(CZ09 z8@rEY=-%t(tNr|)eK?4^FOc!v90SLgN^;wP4(iJw-hh@Pg-}Nwp&Zn&TgRGt!b;Or zMu~2_NA5c7cJt}~^KpE2%rOxQNjJC|p3DiKHBj$F%i`vFa?=C-=D72plX!Wz{m~%W ze~T0>&hw!ga6hAMqh(*m0It1NkRoHyeey5;{rq|F*EpvCwPf+L-0TTbIQwwm7@!YP^h9cUe8(SAap#b7K8CBWJrK*4l3 zpCoT=wYQ%mFQzpr>`%&1);u>%W*M@|6TLsA6SG?HMe=5+4ewqpF*gxuS1fEC>`Zcs zu3+69U9$?29=YcL#GnJn-gxqPE)0{+*0z}7@J9%99?d&ruz#Pxf7xOW-z2Ou|Kg(T zI36wIP*0Kr?KcE^NG>Ng)I*@J#CshnnXTWAK;n&M%Opc6*E$x1uR~H)QeooI&kcLg z+5z<3>nH!-BYe0Z&fK6tq4cPpRZx~H9D~I%ePaO~w9!L8)mj{R&o%PLU#x?7oY41+ z&8g&zhZ7H+*M7BoE)rjsilbyRMQ7NVo2I_!vnd}#b3oVE`9$ZSXP@mwYx)pKziQsM z2)%c{Ap^_}Gb2kRN1IP_?#HN;&PqXV(Lw5Ck_HSYXy6#r!_zA~!046)|D zW=VjalZ|2xtb+2n$Ikz5w$DFt>Im`0?2l%i6oCUoH%LgS$S`3AgK0Xq{=w=Sx}^PS z3()(VvbeB7S7ak#&1Iu_;?Q;S=PmYFmipBF$~pc;d!ULe>9WCy*DaRKGk{yw-K<6) zj7gRa#ts3}7V7!SplDy`1BL~EvEv+hd%LabtUk(%9B9GlPCj%#8A29fxdH=bt?6#A zKpsy>X%*|X`(Vmh*^7ih+tidz2(%a{?-{j!IGA76OAO>TM0t?|Ejr(KiTvw0wlDxq zftGW5@?>1fsu-@pw3$-q>Ry!A*vkW2bZh5DXL&cuNh<$4<~Fph7C+Fy1HU_rOvL08 zNBQx%oKdl6xN?yKR~gSyP(q~A%L2OGr)$75ETCnK>`W$>Pj&ILj)&89X_r;9IA4A| zE@e~%C<6}xP6GVo)I;Zk0TfhJr}yF2W^4P&r)LE&3)JzBK>>0Z=%h6uMy zl+IVrr`iv0ajJZE1Cv>t7=+0lbxN-@NZN&;G2A*Sb`VqIJ9+&7M@Sr^J6%a z-JYbq7s=K$WaJi^R{7|50sW@dD{bggjRQ1soMK7m%hk{iRfB62 z-X6x{4@tuS&WBaPzfwMJ*JI7~^C>2R)yFa)>|pE|GP+`66U3o26Bt z#WN-(`evs+qp~`Ds=iOPx*v=&pWB+IDSKfEz=Z+W5FcnL454NCRYXa^Jzj{&T>JGM z?$w@8;ab2BKZ!FJprh#Qt!>vc066PyewsTrf_kwMgXRhfr z*AHR%_|q}ee?h-8s%9h}K5FUEc`Yl|>jvl{ld0+Z4@aRhAc5r?eP}!)7?7sTWVN?C zjk_-j#eyop;o-7gAa3aF01**7LCb*`4i`28uIg+)!Oc*(fREKT$3A)FGvGTmK9Npm z;Ss<<2tVdO8iNf&IJr>gehU9^#CmUsv8>DZYCoS+2XB*0&*+6w^ZX;@@^gCl4(U2i z{(b;2-)Sz{ZhU*lygiN_%Ksc}8yl0zK7gqSw&lcR3Z_?NAL5?^pPlFNcZV#24-aIJ zWQ$+X(9I24hiNJ;7I!EaU?I zrp-*`W)&kX>u>=d;Y%C4n&I9{vCcDOX%~9GA6Y|xU}u8a4kt{qRz@TM z0nzpD4&-|=n-+$mmj`Z>jlZE}%0{*EBKiTN1rZe32gdw3ifNSsa{!3<-*V(4kEYNq zrj{67!+4|u2R)TDCbK$Rz(@EJeu5iH7Qb25*^#@>GA~s3MXtPh>C=aZ`2>RqOc){U zL1L8UYSM8D8TQRVEOcskR?|R>XRqIl&Odfq1R5qR!0PdYIrT26^HpA|^T%K8o#%{Ed?TBagL88Z=*lel>yZ6nU%{|Q z!F0t6ztS?$0&BR(w8>|?^B)YLO2BTU>C0LS0Egpls?0r_U>(Gv#k`s+uoc}1w2oHz z25<}@mq_oOQ#OUrhP_xTp~n+)F7J49kG2jpG~z|QIHTioQAeO1emP?M53Tmzff1x8 z)j(JoG06vK)11H;Voy-vx9`rAWz_@;wR4aEkU-~HoJ zyytpCvs=6x-7p22gdG3kg-MyPjPg>l74rG4f=8jrukSm4RkqztAesTpVC34Sv{%@h(^pi0%gv8iedd4Y?)*ComG7Zh*ybPoCUqUn%6Zoi8ua+ z4_pPU+^KG$BWf1VZO7#wkJVi0jl-Z}ZdO}d@RL!}?o8nKx=?L}VUAx*#d%oQ0lE_N zDQ7fXjk4cz!Q`sc<)_%xwQ82g9oCYPkb8JQb)F?ZAC$c{^mssjGpr3Zl=;|Nc{L5ujH++HA~k5*{fr0{Vv^0Wf4ml zx*rc(_fknzj!JiRu?P~;mB;FPJIqL>q81OC)2{*j`4sKx%g*B{=~okL%U#)HoxZC? zj?S_ZvT0xO_@LhsW&*1NG^@;ll|A!z5jP7oh;PfXA}3e>1^vqrR4oSM@DN4k^vi+v z+@xG@E9)3I4$49#f}Z!o5!`vI6v-GtSxT0ihE?`;fn_9O@*4wfW0&h*MslZ}r!3=0 zaq-hJwEZlYV647dqZ;eS6B1yZH_H?a7xOf^VyxESp&%Ouuad71L_68JLK1I1Gg1Yx zJm~UK&~;S57JwL(Xx(lJ=*R^WIKCLc2k#Kjw4`{@`1~4dbYR3viB9KCz#6_Btwf2} z;mg$&Z6bF1k@M-^n#wC*^k`l*l|3HRUDj=<^YMVr7T7AjABH7cdf;I(s#dG7>vyAz zUiJt@=SxsAPhb=U%gt!$`IMH*8WZUvTx9bY=vr;E9k9Y~O|TDre_jNYsI7SN*7TtX zISOdQF#S{4O>CQEvnGfOtzcTFsRw?IdFr|`o6f+$k-x6#wJwaBIn|uXnn0WJPoUyi z*?KWkxIH>`>rrZawm2hMQ(2?AMzUsBF>gFC574X{AXtXbc`&t%<_B&XytUQ6)`Llt zAP#2m*N&2|`zL4%wxvIt(N}hxN*@vp z&WsMQPG(9sA5PwUloB6PO*R4#P0RYVr~1ksQ{}6~;Q_*!q4Rk_y7_^_0j;g>HSbRt z$mU=Me_b%vQG>gCiwQ|s2XF}xhQKj^Z;Van;X)}n$yf(y@oVd`4sAhLN2D-Z)|xPs zm72nE(=a~Nyf9RC=Iun2vKj%7F`YBO)P|1|_o=c3!f?Z$1rdhauLQzSYY22ez00?t z-l=NDDud|!k4I70`6kpm-}4DpNm@k(Q13jB5n3yV3$&-+?Y_qMq(rKBFdcaWKvMP2 zCN(wVng)y5vXR_ivF%8MrSF3N)&95!OUU!d_pa(?J(_b2y`E3Crn`gi)J|J#8!WP# zBvV^C8%a!q#Xmk8v>r?+H^B>BmKc#n>cvOevM$qi$u}@n!k*8t3Ept6pxOj4*)Avs zC+?_`qq7l8W`c{`U*tR!++mG@7EYzl_vmLvlRK3x%hqZ*l`=W?-EGFbR0F3{$n&XH zd~(%JrCL7KT5i&(Y4*-Gb8=RRbSeqeE3vQR`U|#hFrHIMxJkbr$+zMr<)J{bTFXuP z?ICm9SqI_TZqk6~Gw8*ya+B8csYXgdU|Ic_olV0v-K1Ww+$1X=0XJ#B34ip~WAabO zNn(l?vb#FG0opc8+Kn-^yqhOMlS_40S0g;1wH*Joe5w(A!(^*_@wvy?igNsmWWY4h zn8hD$JLmj#AfDr2EM*BoofI@L;EB~l>T^I1Rk zF6>i{QtZx-^4(OJaL-Y7&k;i6`@~CGn?~^P<#OSOcnU7wall%q&xWhuA)l%*8*|ZTqQ~|J zSUnMQlAMfhh!-;sD#rj$=VFH&hya@JkK%ndk_OOJmW2w%Vyyrg5z+EAO^aqZZ&6vt z2*hI~3!s6YW`!Q&VGWHJ3^pm#*M7A{qzWMs0W@AzSi*et;_V#0?|iu*qoyL2kfFg8 z`}_WuLc(}RiX=xSIuvd0x=P;bvO(nvdhzS5uEq@so1<$vS8!mW7&cqe$K!SCgoNdI zaf5_u7sPPBKZ5sMZzd#+2RRnhbe=8S2_{@}Htlh}Vu+}N8PVbR+i&QLVQg5Amr)04 zdfm{)_(6`PGF^|3%a-kYdkBBLYi`ePHPEJMMM{*W4lt)*aw z>pbzVT)59;K^1uzD|% z(HVe`JJiL7PNQl=Cn9di;#q!SLV)21FX`xgDwsr6AQBRf&gTn;Valx)2@!y(I)^Be zZ?vJaPK6`PlT*>3kJ-O+HqS(TrKIJJ_#z_E(PV0BHj@S73RO4~2lnbN!9(HSYtQjl zBlbJntQFlBsHnTHkkb$OM%o+CjqA_!JCp3pBeMG{Pj0cQ$9j94`Ngnx@d*}vb}H4N zLM4_wP0mbbvQsl@&dpjYQsq610X2Mmz~+4>^=edgR97SND;&wZvXb&}JpblaV{%s0 zH2zJ}3P*~_FLnRH=)`0S=o+pg>qCjUPH3UwJ$MA%*-v?u?1W=Br@g(+ zxbd`5DkuV+V2!EP(a0GftHd{^r z6LY8uQvI;GeSl7m&!nQ;jv7_vOvC4SIWD&?sear*vV=D}ZILpdDV;iqa;P6b;C%4; zLZIpuYZuVLU*Ue>6#l||i#4kJ3PrDPwWpQ#C9m?Sc<*(xZg+DjC4!mGYLy2m7E5ps zz{jF6N&s~5d%)4l^;Te%)$(;Ti?tX&n6f+1N38a>C&3^ns)z5!-5ow3<$4JQMRFR@ zcKq~ymFQB_V3W^$%+Yhqzi zX8IDK|1$Z+3tWp-^%7S&3bJX-vP4=bP*H$*0RoW@siJk5b6N*wJhzdJ`0oBn{$04i zpB9nXr4!ev5<~uS1b3dnwGe1$TH}v*p`90MrZt9eT%F z#zD_#i$K@nDsFTs)aJ~MrfO9A0|d$Rr!Ds7XAKnG_7_tC_2aE=cF`)Ei*ZnPUy))8 zZlFe0*`1Afxgn7aD_KRKmdb+wr(V&+)9g78@oS>Jy5&K_dWbD@YjMv1;UKU6=C)AL zCwajeA=v+Ol6)|L6-9AKtZb^U3Pt<5wF;W@$sY30!*SgY3s%C3k+1gU*ADQkXD)lS zOE`t5tZ-L-I%IFyooAGUlCHlbpvy0uIO&W8{{vkE4-wm5UfrT(A;yS^yLQ0-_Ami6 z2zZFdxRiLxCNHz+cr_mUXyUH(vrGMFCcb>uJY>%~FX7zol?eN}} zD;zb@muZF5jn2@eJM9g7%k?Zpnc~F*v`@$&_co27cXrr!Cd=k^9ep`*jjA|HSq(g& zky1r0U<2ZNu90`P+dIyYl4q>Ts%F|G8ANRX8ve*e$^k{5pMLxtIy5W zsEP&jT@nb)$;$$oRi4PNDV@oxd#-U`%|8y{ zOd+CBe4HarjjC8cS3IAdzKjy*8!QiCEJrtu;5WA#J1<~S(#6-PXgtJ|0Zr*VT@ys~ zz!maVr}5c7^f*o3`DL`4J?hk`YL23X^h=DgPfb3(+*`*6bsrkIOym;h9fiEgTCNZgsq^`P zD{+8!R4+M5;tEG~4oT7M3aEg~<5{}(4Eewd)dfC&^qw=8Wwp{cS4S$_-znmfurm3&7VO);1Z_DB9A(={zs<=RljVExnQsJnfK2O;kUxw?H!bWcK zePAC9pk>`?<1mI7u>Ur_I!2#od4#!5${T-uiiVHy$`qZ!ySes)9=Jn0&yp`j@Uk9W zjpfVzc;5|YTw-&JZ50v@7Mf|};nk>8;EYuJIzknWM1bX!XJf!L__}h^3P-ihP=zDO ztJVZmpqDgaY1rfim>#@P4_uZ1bx7VglwUunukE*2^w>+f?ByPUYkGMJClRj>U&2pt z1KjrcQ2wWb^2inW{+ODPG-UDyjS_Dh9sv)ku2I#-(~FiZWU^U+4hE=c;R02`5>CXS z6d^n{JtKBPU`$%5*%Wcssc;1R#IlJOSOBW53ylHuIl@#s-8|y&yt>q=sWf)hDlF#b=9Z8dwsv%SF6<{&SP~5 zAxz7Pf7@Z%P83DO`-dTMT~FSaZ-Fwp>y(y-v&K>e}or zaK<#P?D#!3u4akny-}$WLes_e0bMl1G;P}f5Oed3z{#?0+)V$}Yb&jn!F3p;W?&eL z26jws-?LZC)~#p8*@^nsSM0+h{(%v)Z-^ckq5Foyy#x4@?Hi^ChUuY^;LFR->08FN zC&psQavckov%q$28v|lkOm(fazP-6&QI=(6khz6L0AV|h(O70*?g>aOreY&xW3cpi=GE-#y6z9R0; z@{5zvw>KDIIy_2G-(^o%1Yw&rVwl@!4NXwBnv{vz^L;t?17M6XfD!SYv5>SE$ARw% z9<3Vj&-WOf`RC*G^3!O!##x8)z@?t&bz&Ugb^T@Z^))%v$=h^pL((zGM8qA1NLLi3 zj(|XPT$iz^8xWfP58lY@9A+}JTij(8?LFoQ& zAa1^l4vy0O!({x4t8bU>RuBa(9a|-OUnhZ_wJ*9KfJ@JHdYNPW2L`?8D^Ye;X@~9D z5n@w==s^}L{OBe3-~II0*HJowo>1rk2t6m7@JQ5!7xWa@O>tz59vY>yWkCanOBKDv z`g=8~L<4b5GVrW5BmUwF1TC0_Ytj&#YtC!mEDEV=D@qZmeUZwG+^W)>jZQ}&o+o$T z@Kjjl*zc`dmZ`9Ow!(K_q!31$C}`9)NuE3mpkQiE*~QrD+tOCi@*=UpGbrGI*vB(D zew_wX#0}|Xzbg}4O9#vZK>X`GS*pnaAYA*W*r_{g>}g~NvRAFX$r0NJLZtG-FjIY_ z|HspK|17yb%X32OUHTgOnd5l5%J&S=6F1mL7s#2rZ1hQV@;2M?3!8jx$AXBK!M8&Z zaRv)qtZ#hvd4z`m(Ga(&v3Kuu=_%cQ75&!_Va*Yg2~a4w<=%|_k27K2ja&J8`#@+O zsn$#^90t<4fQYgsDi)tvGDAYoPex#zR?V_~AR5#~zrAW7 zy-c$zJc;QV0XUzc!Zwbg~{l| zO$HZXy-sVc)M#*9;jK*0M@0nL)O3p@4Rk9Uz{QyrMKZRkK`?ZxdFd9$*7PtgIwbDq_ zBvlML^&`?r3T1IC*}=ZO!E#Tr2O#vrfKCRY+JY7x?TaS6GiPE4L4XJDdQIyQ86PPH zqE$Lb1aY}(qJyRmt*X+%s-gw6)q>8A1~z%R%(GbZ0EE5CU!z?x~c;vO!snA`S2uK5LsCA-ac4aKM^?`cHLj z;dq3Wkt6iQn&_^~nv5>SOeF}w9r)}LQ|KP5OS-kY1q3Q?AOp*$)twe{+);7Fzx!#b z{?*fJ2EtbJ)(!V4t(Ps!p@IGDjCXLzW1$1;&i3iluyQTlUcH%HU0YY$!Lc$O3=16` z!5}W2r}I|-1NYoiG@M=rfDvU;kpsOn zU#zUIRjM^AFXN2qVIwsrxBY0~A=%aMqkVsqTzV2sEr{vG@X?(2cu9;ujeeS-`v!xZ z7lNPfl8S}9bA7EIA2(oX^JR6lq_(4YRP4|zTB%37`a?AgHzYxkY@fci!Jnn7(9%Kl z5-Em)0JN?LNgo35TwH7HDO5WB;Wm3&5^fk%7Q<7-mx>vdsvaC9Ka??hpTzSU;^%vC z^C{fitO=kNAT18S?fKH^=plZshWPR-dpOT^7;Os~Q8y$Ir|z)J(^0Fh(p^C4T{0zy zxcbx7Av74Ky9Wq-*5w+fOxV7t*h#Cqaj6zAm%X|drzcGhh`^N=-`!;YdyXtt6b@YC z6R}*4{`&`eVn(}9B5Uk`A}rf2=)!9~dUAr@dBZt%DD4b{oIkO_nU|kN#eq-^wP|Ii z1{H|>A7|*}1zM_@Wi!H>t4<$%4J$u^Vv<4=#nH>`*#fYOL|Y&< zU=z=cR$r~Fm%(xm#C09Zi#|9fbp+%;x@;(E z(;0{p*KG7FP7zSIDPQO-pqX~}2QOBoy^vKCYW={1r94t?20{bWpaqf>uClWuR%&8r zKUuF>IT2{wTc)2D%9kI8dh$EK*9os4*DWNH{0$gA6bivx)?>j-BlJwMmt3-fv`nDKVDvN>FYnZOx-& zVU8lw)VzXv6q*rwv<(oVv5Rx~62;950^!4=48t5v!Ly!P;Bca9POOQ)wbk6%gmYoC zg_2XMhX7)+DTn?i~zlDHAp)3Bs(_>gi0nG+e?c**_GnRtaZv&iZ^GC`yJ(;5_?Y)%5lc`ZZI2 zchvbV4V`2Po*{dugM@*%Z_s}<=ap*S(uTLZRRb+dzgm0raz%ajyLVnHd#e@i)rz-g zz^_} zEt6~^sI{x8GG*>d)B~1L^~60$5b6=*_Z$Pc0NX3d=w|T8KWqMB>eq zszg}o2ynst+k?YYXZ-QTnO5~l%T`f}fPD>`Ogn2J&foK(IA~Y(S(7M8+tKnj)n~&W ziP{cj|B{Nm;lGF(6NUt29@hV;1vwdfXfaJhq?6dJP^mPIQQpz zFtGtdrtT$)M|^Z%nx~d0s-0-TpbeY4$;8HIcPs$z#}~-bdK(kFNZPc%1Pb_*VJD7x zHxv8pgmLj<4^9_YBh1*gTsd8*CdlbK5oLL&E9D5e?9NVC)@R>zx};etAbma`r!2HZ za~h>tEIV7T@$M}D;!Zh}(Vuo&EM8F$?DGDR)n2wK1m zZ}L;C4Im&XKfXw3)_CaIB17tMe+!zGNlMAX=;B@JhPMYokGxp2pg4+0EAO;?nc*M^bowovSD9lH=1?5#@q(~`)RUNM?i=#n847a{RH9{GLDoP6 z4$_J(CHfYHD>^_7#c^vU>WL^|&lu|3OeLWi zC?n@hnZN%t`Ducgp4_~`XT?$tptvzSPIyy5MDF*g^RV#=6<#O?9VR@sH&1KQ$j@ots1aQedzDSOYk)cOyaz2_Z zi@Eji^{P8xiKiB#v1#_j6}s~xfskrcq$K5zdIX)LR8b{((xNR`;;2xl$y^ZvH5|9A z$?VHk1L{gbXlWK$Py}gtmjv=PzHctd>9*reS4kCc$*RYja|+SFCGK zjBl^na3Z0}b`ONRF8cTaqJ=j#Hf1c8tccj5ZyU`c$fPva1JKW&&j1OP0b&-J84m%c>0-49k(pEys;bYng?pmiZmsQ+n&q|fTKmj1$q^PP zLgrr-%kR~bw*&F7^HghqUXsZg6%a{kdofQGphvQ0py-RGQGUDGn&nJOx0%)g!Q`76vEnGdZCKV z>Xf>;xhAu=RZXT|#cExAa9(d9_g>tlFMz!K=mIT{LfrCd2F=O2-Isz1r^(idN~25d zg`R3MH8~s{rFUneZ6=(im;K+b40P4WAI+kW13O(3)}Y{!@z&N!x1|US>jwdJ5LybN z5P7nV8#S4{T}`H*|CQ&_(U!cI?UX41)Sb%tZN;K(25_gObaeK7nI$Q;i|hKHuk+e` z-v>-8|C+*ib6rp zV9f#6>;aK#y{W+?IrPud|aA5zNh?bIACQec4VBQXZP4Pvq+=L}$wSZRL(?L*&qq_5IB- z-5U8*0iju7aEg3*)`qC*ViW(S0$3F+He*4L--y1xp41Q)VZV0(L^_jm_Zi$4BCQXT zHQp)pR#~H2Q^K;?H%z@Sjtdmo{@y@DjcWO?u2G#~ys1+Q*JKu~`xHt?B(g`}_}YtT z$1h}lV{@bQ-2;(UBX8IO&ilCsNjOiR)OKgVn#=-qpIjI%IzkUVw;}WW1|P9>Pf@(X z*CwQIi?}r-AIamzHuggCn#?VLkhIY97K*GM38{>=>={hrD0*MxcYTotSMfyMxon9~ zF451%We~8FXIQW%v#YO>SWUFkEYsIUye#ou{p6b)wC=?bNut;VqZq}35XrlGgzs7& ziBI2U|GKbgIJR|#Qd_IGRZV6q5Jf8qbEJXKtIuVi@tdpex*4S!7XU=c1!g*OM5kw!6lk+}c*@%|5FWeA9xq1Ot%D@) zBJ$CvHU+Sv&Fkv$Cmg>MH`(q1a`ukvhH>2d+NZb}7U`Ztk-`;GFIGvIBSKx8M?)zi z9xw4P#-;2yIl-PR@x)fTKL1tmpgJ<6Sz^SRw`BXP6HNg>(DtH zX(b_sAyhV{y=29sZn#BAW80V8ylXYGsJ8r|0)48}Sa_phz+{AUM#-xyqHP|yTvibq z#(H@}Et5BuJ2nYFoTXxQYw|7uHJIrd!<^EB*qw}6k{ygb}-Jda^o#4f%B># zQcAZ97w!OF(v76GGVlVFx4TnNn6a?fz4WKMzW>NRtV^aJtXQte%s!h#^Y3KDyxSYX@$k4sbHeF-kV2Fpbv27Xbl zB=`GzTfeBQeh85qzLJanhDh|wa4JFXBLg9aE$xhxg{hG`$K=DvN8)B!&K$Zx#zgk| zRQ+|6Tb42|zn>rgE+y2z=TXbP;fo`=d#0Wp$o7C_xji0*W%5{6oTW2ro*k&pSZDK} z{y)4`=>Exn(E$g>St%Q%^t3Uk+9A&@DzhxYeJp7ybl#UqrwhmSY5IIhIiH z4SW%#2P(Ht$pxYIC`hP)WrK+j2n3FpSm}qYJf2JyEb3r^pI+7%Z&2J#(-b=3mfMhX ztn`9=&9ZNqc{nqhJcxAQtjil?F=<`+zF!KPj$>1)Eo24^z?to_S%Kvr1JOQ};#fBm zNM4juwV9jP{z?e^g$h?vh?j8}n70kbTV*=+i3#t4eAk-@@VL=Pf2)~`yX4ioe+Z&T zNa2%PW_TF0qZ_*aRlPqKZ_gM8hc_+{8ZJ1)GAxd!aj)NZKjAA07Z1ubdvn4%BQ8Km zNosQ<=QUdxKoh77B>n9|wnjGdOJyxpKCMw0Lxzvz85{^}2v@(Ii+_LNpDx8&S6}vI zqr=X+X1{4C-!()+?J_tXd@cw>udNlaco5d~0`>kvVl6BNzr%cOu1|$m+-(?bDvBXE zA7#S6iqMJ$AbF^Po{XbuR+}VtmkR_cekOZ zsemIae9H&id6)imW6I=NK44|M2a*r&qoVr9$MkNZ2+u~b!8x8~gHZOy3E>7XpDN|5GXQT#`bU4*P zl1*j?e}|F0pD+x-+QG~Wr)m%oK!5sKCCtFhEWbe2bEjT`h5GSbgDt_b_q2L(K$xuL z=sbuFhik)jlmmzA4pU?TKqQ5L>uRMPj z%Mhd}V?H&dSA(*wyV<=Eysc5rvJ*j5ToNMjTUImW>$GthsDNUS-6# zxh;&iaQSAH%L{1DFGIdVZdr19=i~6Fp>uf*x`SjqRg;p-?>E)KRmtV0+z4yG38Ske zSSXRvb5;_>ytYJQ20#G zl1_b=HFG*Wy48dMhsCr`r-362um9vhk!umo0CssaO+`0kUf!n&{p{5g9zf^m3#oJ(V+*okECkqT5_AJ;fVkI zNKlQW^HdGj_C}n{Q#JH-AF7`|rJeCos$Q=j{lsZkpS1ZJETbkdLzP%r*tp8ws!d4L zDtP42Ulj5kTnCvLmCR@=9|9KJ!p2NfgNoo^UlgD#fx21w!e*UFONEV!l2Tz~@_s>~ zO8juCi)PhiOQ-8EY@KQQ2urOQLJYMV+!?`t(Kq1Ct3LCD{`^S3JGX^{?}VYGXgc+7 zup(CH7StauRc354m%F@cQqW7KB#Apiwo|9b_Nnh($_HbZyX*BQK?uG`Z~=Ew6d`tS zoqlYpofGl0&cHGUS1H^svn>lvQd|CqQPjQb5t0ijA9fQ!(Kjdb_5tz|FfD3e%$GVJ z*J7Xu=~TBEESI~~e?QV<_>uw0&?x}c#ufwVc=t?Yk2hopqL;_34H-PnR;OC~O-kFJ z5#l)3R5fI_dlO>Okh$&+U0oTOf5fX}HJF<1?JN38-%@(R+r3GW@AWL&SJzBCv)ER~ z)&*#XsLklO^h)Ji6u5o+THdAd!qL8de!P7xH~YVy=G`J5LkKBealP5M`QMrk?F~Uw zg!0;Nepc;4vmYhqRC7> z{qx6fBzaNeSUvf}7O`a~-U7?pPH++t`$9RB=^p^gV}k9T9jYL;I#VT6Y~7?Zg^$CU zJ16;uXI1{+3JYM;`9{)FTfaKVZRdAf3dem6mXEvgRt%Jk4(w%JA)6YvrE50TKO14? z`_T9+DOdnp08!-~^)j*wSdNF%Qrwj{z)>c=ZK&N-)(=!!4SK%7ZE^9eG*d`;m>Tdn zIMeS(t`oK2rP{Os4ia}1RQ0*QAKkG)9^59O_kpA|{>Dw~&`sftmRGzlk`v!Y`!q7V)H^XDJF`~A zZv1dpPS{(8`@L$v-%;})d6e5#``<{VH+DTx1pQ+?1sLNI&`0zsZ8yg$||)=r8>K@`CvVI>QPClROYLQ$cV_u&_JcC zMNt&Tu@Lx)gD|umH~E|V-@wK>H%zOK8+|`;U9XQD4a3AkEhf9V@}68zvsQ!Dg$fKrvxR06kz)NCA$4 z6ib{kP0RCqXY(k_wCt8wfljhFKPL=)-*a;(QA(BP;^&|&*Td%HWrMQPlLKM01wjDe z1>&EdU&Q;Nl;KRcvCa4WN<~ZmqB_r)J1Q0tD4eLBF>1Qes>x?7{OK~kH!rR|4X!-) zae%*b6|rJ)!;MfZy+uSM%+#hfFh{vk1q*Mm*{Be7qZ`KD{37rIEGZNNw&SSXvTe`x zG|hPVY7WO>TKuF}``AHNt7|2BU^|B8V2eUGj$9JBv#a)%$JT)h#;##~+mN+o$op_4 z+;y7%^(@`{9ozej|MzeFecv(s-F=$k5(;b^vUd#|`!5(jKC)(4Y~nkpDk3hbMdhZf z-(6WNq2(KCbJA}Q90m{o1pvubIFM%nLO{&84(8ts0l&_MsBfkepZH1q^;|SK9__sl zow>*F%*G3P9J0nXgnr;RuptU8YVqV;eCEE`cOe=)9ifurxA=5P%C%JQ(G6?kY#1fd z13QQ{cWEFe*!&;>wo(kHmh1+YPTgkP zM(C&K8CY8}M02rjHjoIqtj0btb*g8rQ&tgJH5P#WrD=Nige~GY<=uPp9It)nhYkAu!JIm-t}JrM8I98U{$kC@avH7y9mbSN64NL?bdCM)D0#BXQ@jdk zD$&tdj&=H^ERoVz#@^1opHn}vcaM^%^=2tle?i+&GG@|-=c{;y1Yv$=cd=l@OpcwK3S{u~U`+iwNTGZbeIPrgfpnn=7?;R&& zlMEd2VwHdYIC}dqIdL7$qoPP0_YYQ%AAy&;ShfXPFnWg-iqbd1>!1eW1&#m5f$(KX zUUYonhS0s)iv<&SJz5flOu8Yk*2hOmD^(r!FK7Y}yD=T9k-J%4dK17>D13c|LQv31 ztQtad;*uFXnbjSiU3?OK{tbC8U}X_|@XC7U2z|7~l_-5<{aLCLP-UiOx$O(xjVo3( zvtX1AW_t0f65l>b81LZx>k};X1{U@BH;2NXo|{rei8tE$r#b<(>+W3S5lK_ii+agq zK+W{TY=v(dA<^pqE0t4k9SR>VO5a?$qUFZNH;xUHe@Cyg!`B%h?CBhkqCl!-a>~S+ zdu;D_bo1Fz)W<$Z^y@Eb6C8#5#Kyt$d>HeaNm-CnZyhFA9+`|X&=>d-rJzZCaDvQ~ zcv@_eM?)|_tk(36HR}_7fF)kD4?d}%U4LQ$uY*_F{rTwOB8R;H&#%Jwj)jFtZ3rwy zr6+E&PtO++Eg?iJ!mC@#64Klc3GsYi`XC*rT&b>=%2wif^gJJzq~0j{1Pd0j9KHoB z+ws9`boXhpYn*&}iLRLf`qz=`Y%|$VRRrz){o^F0#k7F#BzW$l zpq;}mZEs{{`BB~5in1gej;q7SPP~!4sm4M!M4fnqZQJrj+sV!&G=tTE6lLpXEMFJ= zsXYWK>{GD`l%hck-7C3yf))YPtX%iZh8sU!NK6=sU!AeL5N(C;fw^M9JhV-#JdZX?K&nHz;FL zPA7r`RM6gUmvzPmf$!BPS=0IIHd`pC({=D27*m=0g%YiehZ@`9X?p7=Pqm_Au<%aO zT}Xw{H*H(UkpiqFc8rp#Ie^7!#Iq&a>`eM31VAsBtJo`*Dvp(0&zEEzhFL;xwLKuB z;>0s6!Sf}r>_7(==_TlqlyTPFjD+PS`&YG9XdIO)uv7HaWrL{{UHtyMbakQ2EHUBa zEUND(vkL1a2k>sXqeZ;zbl zbeyWLKYH?Pb*+q{7EkM`!MbS$o;5h;U4G<*KF-()>{S4gE!J*!=d<&5%ItGmNy8IW zutuSO6>1^I**~A6AD?BX??zK|{8gE2Fx+&1wd%rxn=SLZb9~}%^zm7WVqg8pR?M3F zDJK@dcX$xGr`6}OdY!(*cIOqxgL;!$RuVFfj!u0rX?9(2t839RQwm`HQoF1GXL!n z@_#?Dk|_w209CAHw?)+!x)(23g2j>q3x9D^T}3go};iBnXj2qOU8Z7$3orXwunx(SIEb zr)H&C*IiLIB|w_9z8e{^vgc6@NP*TsG%$w$`(Oyp#Y4&&eJa(nWGsi{_Q(zLcf}A} zhiSKL=m#MU-RV-iYn=2UtC%1v7UYRiiF@V5@u}$eO&&9^GgzQ361bn7 zkDjgcJPtyvYPz0t(J1nUW&if!aMc7s(dP?B)s8UO^#_*nqraFpDi$kQ;+@0c{e{}- zk#o@`QF*jiPQ*yE=L`b~en&QpSomti860O(@A?7+h3k3EUI(AV?;a(SvymT)suQp2 zWMv+%k0aG7}=$`QE;poRN`e7;ME2!NmFKo8`X>h z&Y(h6i~9e0QBshm=beAL-dmKZ>N2{2@qrzSwqU97j{V=8XYY$%!3yPTw6nG=MnliF zmJI>2Dq9=_Sv7-5sRdrGz>+j&f~E}o8ueSGs^QAtcaMe(TI@ON3UC?>qudfbfd%n; z;CsC0F2MR|)VMtxcMq0o7HlPD1Ew2HIT$EVyPuHNBu?a4?$K7S*a5Ks;!<4J+l zx~oZVCA&f1gWXVaxf(2$J)E4LhdxCWd$zmXkz#AEEZrn3?l2py4jEq`rn?MEmv?>s z4ZSzdb2tp-5JibEF0h`5Lfg(7VzsCU3t&;rfgFsDE_O?j5}jSKm#hB#nu7!A=%6nM z^^W(V7&FqMirDec#bLuky;~fbR!tcfBBvf~!x1ec#Fh{7o;l**#CL zY$=zkDsVhK8PQ;7CD?i@DCxmcC0Ooa2luU1!}&G$!Sm(&&zBcU-bz)TT<-4n)oQR~ zG)#sc_I(8I1E5-Q@iE3FtvYt;_dy$#{vGPm)h?T zpmMfd&MDWr;B%=F3P_pZ=vgZm&z`NuqTTy z31tJ)=D`SCT`Rd>x7|U<1#>???_YlG;UJ5{Cb6Ma%!WI=WTd}cg z4#!D-<7{Yd5*s!P_)q!}@O51#E8u+y_%SKq%`ODIH1sg`K|!^ml|;a&f71fp2zaF- zzIFk>A=N>uGDWJxh&S0ub&y(nV$Dn^`V?qHsSZ}4>>=p)yp=yEt2#V{>M&HGI)wGr zNWG~JXNpvZ99XNS472PF794l~Oebmh_hXiJVe8aX0#G z^OVwEP)aMElv2};wx06B-u$uaq@FW(zMazdOwcx9)qDwcuS>JJQ@4loN^5_i0_)TB zY~ogdxdXDwS@<21@=3g7#Mf-r8myX?M?W007xg|2X|vgoUMWjMdbV7wmnJmDa&}*{ zAzk-R6yv1?)}qS-xSOwRS}q5)+QLUJw|7TWtSv12z_ zvx`P~U79WALKjUNepD`+6SwF;FGke2axNOiA~n_2lfZhk6mM_uqDjFz(3kTMT3=3V zq1~QiE$ialV+13*o^k#upJx(fowtx%IsX#>Dw%HdN25YL5%9l12D`Vw`3HgJdS0(! zb>;k1Zsi{zSzmnLhg(@_dV}XEbt@mZOtGhK<*X+!kyBmH8`kW{EPYA0GK>Fxm9}&% z%iw{iSFq6i@9%eVE2{~Mm&?xJc*J|p>!2b}nkOuvI{fwsxi=Si$%I9vKI72OgoU?0 z-+`)7^Mi%xox`E!7fe`SjP8jC>v%zVV$(}qOjyXY2!Z?Yx#;<7&r@Mg;esGeGPOeLgELa$AbfeEn z)??jIva-;9z8VkqHGQw*{F8hfNV`*Q*u3DD#BB+&;_e?8k{yfxN3@R!(k8cSt{h{@HLuSdD8ucw~BgH z+-;o6m!Mz=QtuumUtN}y?}W<07!_>P3an}Z6N;fQ=<#1y=p5AyQpRz?!de5LX|Gp=!)n)d;0Bx<6XaEFmMH6Iypd z@zrJe{_*hmO*&WM0hNI<$$CJkSS*%<`86-G6Xi))y?f-C-B290!(D6Yw1~hSc2qpPZvVy^P|%!X%T|s{tk%ozWQj zBQn8I2QITe4$)7}v9ZbM{=5v6EZed2!B=b*z z1H&-vU0smBle2u!L>eaP6;KwQk?wdiu z(WA%DDwV2SpaTo7u}oDnUE7QTbERyYy{&ydp=~+oZW$&!M(OsE;KN~m=NR2`iu`%V z`+Pz_^OLq*GNVx5f*bXw$3a3>D%ztb&z4u#tfI%Y-_gO)Gk1=7KRmEP&p>@L@VQ(C zAlYIvGh4c=xIGn9s*J4dBjo-(O9Gxnwq)C#CxU|k_m#Dh%$CQL?BltTFin`svQv+D zqmk5FUn~bt7rlxT6PBSx8Lchjs|y~NFh1~ET3%7Xr7AC6mknmgaQbL5N<_O*Nrmu& zy(Do@wq%Dz19x6UyT)nn+G(U|I#>f$sQ_HkRyoWq3&>?=6P*?fsN^VWqBlqaN_j8& zhLlX$eVX2y>9lB|6RL@fSL`OGPEf$8yADkq)NXLGb(5c6LeTAtNpY5$5X&Y)r8av#)gibB5 zL6@2btnQc4)y6)#a>~rD`^uR+fU-S(sqR1{*@Pu@ab_Jk6rA=^ri!LmCRb3a#hEf~ zrDcI-Fg(+ufZ|q^#gc?+a$qv8LLs=mI8)(8TdvR|kWXaNNc})v)ZhNxyF< zWR!)3xjVP1%YIcw;KaXwTQD-J!KgV`P`9h^lf}}WF9DL72~E3HuB@(=RhB}vrW~#6 z#*bdOpuCX2(wWqQSBqEZZYWhjx=?fEc7yOrvgvA!6=YTF2-XG#d^cdF^p&-@RbR%Z zSR2pECM3b|i1c>fn6A;SLaJu>6){@(@ti#g_?{>$m;XyabNiJv=H0NRTVh!Z!@tcF; zqldd~?83 zEo40Yp9?arv+}Q|Eld{dx76=91Xdj>R`}kI-DI#uVLD_<>=y(pU5x#*#Q!)%lv`ai zX$jfP#MorCb%gAmpqC!lYU)6UxQ~y! zsDw5OukMmyB-8iudoz_PWi0OZn=&%>nG9x=Y`CQJ!`J1!*6z~;w*G8|*A=w_IOKPC zyxMnnT9F}*#9W1+o?@sF)gHP=7m^iRj%7xi_nqZL$*)SaisRyW!`%NcBr4}kuSpSF zXz=R+2hew(EJMlQA5B24urDsKiF^FPqFB^pH*6rT<_~_Lz>*$6Toh;S^Diz$xPA8o zJ9;C6y|w8d{7~N?vWr$J4gkXXF28YMnC7e5c@%a%FLSA%-LjpvQW*!fgJbzii6@vB z2Hwnyd+DM5^+jv&l(}ul**WU(nINB@qfl=D@jcu3t-tph{~tfdjH{oXr?@mY=5IUY z>>M_~`oX&Rz@AxlPzkDH#IxmtJj?OW`qi~^vJhn>%~l{-vvUi8Ub-aR^$G`qc;%SlB|mm{HjX> zSzgnM$ZrYmJu;VQqy$-!@ATSWAX*TfnK<;}pGIwY)8vblwp%Zb# zx7C^jeC?}h8*|b0x;e>*)lyj21$Ddn8!bYPrQ z#&S9cAqb^oPN%g7JXC-XfG4Dseh_G-B0|0ewAL8WUfOnGoKgc?*>gNT}2GI-bucRf1?~M!2d+#ZtJiPe1I5*=;$!#-@vOc3XYelW1H$4linETy(~T z2fLo%>2@(x{#+Iv0kCrA1{y(Z%Y?E8@X^%ibWw-ARc?_=b4HY8T4)u(+iy=J<-+vK}ff^n@R#~>IA!{ro!fph^3iUBoo zjT4Fd@e)`vyi<;5Lw%eEHM(qWhfS`ixm|f$*G$~CGcNeBdT<$^H}uDSIk_y~Z?S5d z_Qo8o6#x@htpL2F@fLJsby`|w&&2KEhD`slqn<62wKLA;pEN|F;;jqu{4;sCrF^1Y zx7$JVEn;VRiTB6=?XXIzpz>+liS=w;sAr$W_LY{LVtwtn=F;Q2Jl*ea9+W}~x?j=H zKJ(R6l?Wy2X~fsJy!$~re*zVEw+=4h@vlYsZc{R0?ju48{U$$6nFu4J9ztU2c79{Q)}X| zqUQJHKV}0zl8N}o1#KsWs}0W@^2wrT__v7v+KA|2RXTcd8NNO41j_S6c$>LhmD2U` zK)c?h8}ZM%z>8EG@m~wt4GUlSVNV4_os@%yCr@komsRmF(8=3BS(E{lj08fe@5DWN zKGct)fz@W{!S+=Aep@b=)X{8j8;-D-v5Cn-O87c@K+8WE_$VWKeVBF=Zc-mMM&Qpr)E z5%?e!1c`DdE*z`VnmW2slPlsb%gY9>`x-X0B@@%``xBMmPJ_nuku7MEsux92XZ;Rn z#I1V)bRO2}zCTXFt^12un`p@Wl7^3j!{;K4yGdz9qM@$_wAPLu4){tN(%{7-%1}w$ z0=fY@-W(%1mxqdHW8MH$=vSUEiFT;nQe=b15=uJ*Ts*q{y!dw zi-?zCRCl2`!Q(xtEf_({k(6QgTD{$r_7TIUZ$Z<30a4^M0uury;EawcfQ#1ykFC|~ z?$+2Gp$4L69iQ%8Q0V0!+wA?8scfComPhduIv7&xo?)!sXkM2qq(8#lV#XBo*iE zAzeIFuZs+gKP{7sIs`B5r~?0*tu_XUEVay>2mk|+2Ke{-nT#b#Pz``a4pOS=A(lA6;)Q^aoXfMz z7r*?%f8PiwS4}^zb#>D>7vz1@VwDy{#kJJzo1hya$kRn`ePYk$K||Px*y&(gHualz zVe&eC$9rIU7>sy$sknyV(-t`AvUhjo!(NvM=h#AV~#BAzg3m|&Yoen2jb%rr-#lPG8vi2b}mHqMQ*);)tV z!F^ZKXuPZj=wM#S)5x!Ouk?=v8mk^?tX?{H+y(umB$p0?<8J>jp~O zqmSkzxP^v)tH)`1JJ4-3S{XaUeW`0Nil2NU)i&uP(_t>?y=yprG634i{NtWPx<5)i zbbnm;*!Bg5KaLnM^+2a_qkhxo0F8>#ijGJSKfKoy`mtfI;eC>+q=}L&ag6u%RDV+4LH{tm6mP zBL{;8KCWv6DWQgA{IN}!4nZnR1gW$#u7mUD!FeO|Cp>~+3Ei04fGsj&2?GWv)?p77 zfPtr~w%ODws7Mc6T0P|TL(~Jj0#SNcJ&em!SGCCCYf`8O>@rh5R!)Z1BS)v}L+UZ6 zAr67wx?o^JX+vzJ{4qR6)oOydz41-l@%4})zT4zqQ-+wY(=f#MJ0inR!{z1B=yW(l zX?7{NTQ@R(H$l^jARXCuF0V!kHwS-&ihba2TB{pDCL?S~nD`n(#wUds#P>7ik- zCsl@MjED#wZKNUybUF>%-6ptU0}<6f6y*Ljj6MnDl;?)=w;ST_U=gn zAQk9|@s>uvkxLtXJh!U?s{F{>SymDNJw_6MAo}PNZ*{TIn%ivL?jHmrd8KV%Je0*# zk&y&g;SnZGx+QWcwIiq&G_$!hGUfQ)7E%%k?gqC2ca~1KaEr!+vVKvJzpYDQHrS;Z z!A83ASL?JGS>vz5)p@k;2Q=93wlH6nYn z#_e&rqd?=1vNYPY9p32a^UsGy&Z7eps~$fkPI^`fDlE=tPrKrp1^_a0wZ^?2B)6L5uQ`%1y0e!;fIG6`Si1Ni}gK@ip!>glAYDQ5xAe3$#jEUSACHf0pIkZg1b- zCIsIKx=&5x#RK(2L3E?u=|^%-lCrV;Ko5Dh^cNE=CHZ1W9NlOembnQf@_`5X_7ujR z>f9Y@%c!)@rTZ(lJ5%c0j*LeH+qmIIvI2${dQBmTq1kde9%@N@aY7qM->5H zF};qwMkmKhLt#Amu3#i+%ROW;DC1Edsgzsn%{qIvq7byM+xl+4llhSfU{yML=}3WX zPOq`c`u!iN^yALpM=I`s)o5)Hb~>J8xAxse79%-fJ_iC_InbMRv2iYt5Wq2kyV=Fbo6CN~CA;9wHYIaXpKx>w z+yP`0iqZS08lOU>>`G%g*4 z$K|l=N78<%g$H{dUX3>$l%!m_3H#rLO*pwi%r@=$GoQF+K9s2*J=NC_{w@#C1-3Z5 voJhza`JexoF!6&Ep6@%$`@i^X)8YOv_$cCiy!T;k00000NkvXXu0mjf_V<_} literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-60@2x.png b/resources/ios/icon/icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc349ded17a3c1e16602d48df3f9dfb69dfe1c67 GIT binary patch literal 8254 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 KMNUMnLSTZt%v5>+ literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-72@2x.png b/resources/ios/icon/icon-72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..391b4af13a2b8f878c1db28ff3cfc6ba708dfec0 GIT binary patch literal 11034 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 Bgqr{W literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-76@2x.png b/resources/ios/icon/icon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b538930a7d69623e8a3982bcc6a2afa05c09ccb6 GIT binary patch literal 11699 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 JPDHLkV1gAggF*lR literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-83.5@2x.png b/resources/ios/icon/icon-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8dbb2f66859e533d4ab0f71b380d87e6f7e647 GIT binary patch literal 12660 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�_{|bMW3WL>q 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 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-98@2x.png b/resources/ios/icon/icon-98@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebd9db699592f559fe1e2d5cfeda7b8d8097d48 GIT binary patch literal 16355 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 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-small.png b/resources/ios/icon/icon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..8a55da53c19347340d87171598917b40107247fb GIT binary patch literal 1267 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 literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon-small@3x.png b/resources/ios/icon/icon-small@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3393f844d61aaabdb5dd06f29ea37e9630460a8f GIT binary patch literal 5937 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 P00000NkvXXu0mjfD~DxF literal 0 HcmV?d00001 diff --git a/resources/ios/icon/icon@2x.png b/resources/ios/icon/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..946c6cefe08fad11f331c0cc5f411bb36f063c4e GIT binary patch literal 8226 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

)md&DEfqw6FjiABDa`W9Hf3L3 zpP+1Pc^ir#Z6cw@06h|MsCk`?ZwD+fCX&;ncWKl;q#5GSQ3Uo`nrBdU)ray)?DXXj zKX;9Kt$l!lBN@u)MBhIzFJy^ zYPvkJEA3YBLKOYA-1ZE!2T#$d;0zN6;{6GK75a;bIZWOUw$Ssn<6jv*&eUxV%%t#T6g!1s&rCY{lo+oyu-!TP$2?e6c2HZo_xY zLBDV~*U&b>y4lh>Ox<(tIP+))H43EjQAG08`D#N@hKeCJm>C6aD zDrRD>R$Xn9rVQc9lXOHe^aS>xB!wgX{${;->d>jw9I0NoS} za`v@H{cEM^@yFw0Q%s<&l<)UBTDN7=B6|ZYx50N{?mH+bE4FYw%zANnzx$zli@mMq z7wFw`<{v<&qABy=Jw2-kM)_4PC)B`H4f3#dx{}#Adw4MO`)@f4o)s@g$DsPczmflI z|83H7GyMyaYB(tGf-Y?kabx@(6S;9fWRrZlv^y3}*$Q%$VU-|sEF{CAAt0`lazYX+ zo4}G3=iU&II^uvj4r-vjh?JN*RJBdrOHb8E1!NOQZT_yl+q4r0H&&o>5D~tT70&&D zx)>9YMnAROCfk?*KCZ<;carmc?Q?D%72Os;1=hs)iMG>7Lh3Z~3byDLs0uXSbccs@ zwtX7;cux`k(|I)bVWkxUZ%H<2z=@tnhAJFDlh{FHL$zNUlJdKz9y(w_h%qqXJg>8N zQEnuU?V)KtaZv3BSd|oB<}wsNE}H%RVD{8NhX*uPC*C2>)4vm+<5BJ!D-{DW9h^C6 zW~saXf!d@-%e~F+Zr6@MsdZFA`iyBJ+GYH#ECS`; z{NiE+jil#n46y6&$Ck{^~2iyh_3Sg5e^*IEWWaV9i@UwWK-MJTW zD$vFiR6g?gfq1@e-saVglrr4HACUkp5O@K%xA+m)p6PkYzJX0pE(a&K3mTp79cXEH zYdmAc&T_Qdijbs2xbhR4JsUWw{CF#Gzf zS1GeEmUI~7d5HXQW#Tfd$|HhRTXA^J^&{g}qH&=4wJE{9rx>a)LqbZNg>81jn_h71 za;ijku>I!j1LHpO-y7#;sZ#bI{pQ|_0*H9yixF-O{dtYE3+}%&ghvkoGJ{~^GcOH` z+0uWuBVvPZMr<>hvGxQ|kw!}Q>{B~D!@}YwEsPq&mdOz50^1}0r)GD2)d!Pdd0+z9 zFL3#_J6{68+LZSzVCQ4$j94=BuoOSY45VK}kWq1{ZiiF0-s%0JnJG zq{7f`-#iCqu(1{hh`z9zTs1_8PbE&>IkQ3-atL5om5~!j2@;%tQf(AW*V?r;;}SnG zIg%joGAW{W>#%p8quDJGkdVb7(`CsFfR^3y=<)l; z)59QZ_hFiaT$mNlbzkPu`q*;#ih0$eeafJv4REr&m5aX z$=XyOi)7EVo+t7ex^8&UvKjP3(%-sB# zU7!%r&;UQtzu^p!5HH6uF@E!Y`!9jPjmK8XIH}E}hLUe-rc@&qo>AA*u%CvB4!h@# zK$#&_i1a+pwTzE|=Yr7$kff|1L)Ul}Eb^)I_NA+dTKkk(BpJyX8Sx)+^X1Q`q>L_% zuZn9Bkn>vFNTt2TldAKc(L*Tit$S;SGk-Jq`$y*FK<@k*KwMr##`?hcd}~6bKQ>C3 zHRe-y)Abwg^P*DOV60Jm;M47mmKF$~&eQMzM9dpCD zrT^!;ycxZn8q~3cVR|~?Wnjbrl+B`Ju$EC(25pK(o!1Q?{m~}Uvdu#faoo6Tr_{Q~ zoCUQQAT&ao0l>(w5r=kWo;Gkvtan;Bq6Na6y! ztaR2ss#p^CIjq|!qIk6L2%#R8lX}rD!J`_RwhFuS>CDG>#+Xz zIG+xjl^!E@Iu*1pm@`2dX_=YC2{IC-bFxn!t~NmBoOeVUU#<2kblPZ$>mC_jYdb22 zzHt)Re#&3Sc$n;34=+rk-8y9StFY(bg$tC*?#tR@tI|?2Wm5q`25pH+69cTcVPF3F zSVlPDj_lfB?4Al{nHQ+2{Sh6r;M87wCjxC4vWYKt;2_~k zhcqT;h<{Z>AdtHfIeA&*%8qV7epPmYB@`h;`7gK#JIpbJYfFrP>W9bsqlmfGAlM?S*+C#_=(9X-Rw7Ej1cfZJ1^!{fcPHvHuAQ6~58RJJ))imX0m-2(S0{s=3- zkaPPHrAKO&vA{`HsQzMfEBdyRTnMM7>TKobAk6i^m@K_(Kb*R|Lz)DnL zx5MJ=sBr0iy<*0B@N1s0A{paOP89sLVNWNNYMa^K&61v-ovA;&$NrskJ4Q`YvKlFY z#s&^)e0|l3uvQNz>Tw`UD#Q>6UQiY|e*XD@UgZIxaN zMmd38X2f=F48(g6cMr+!5}VvkXp`%l7^`ZP z&5RG1mSD65&HlnYqz9FGj7F68a;}&}kc@mB{;KlRNeODX7o1_d8hnBMqFB-#)-~;X zeG)xbHL|BlMf)*!==KFh&r@)QWfLfRsWXf1AXA-DR9y*jr>P(BQ9jEB~L5)2#J#rK^V}5~kS{OUNLGy0{CI69( z&2LOe3;vE#6{UZXF-w==9zX->0uTvf*>hNIV7kSR3G8~alc#Lh#=?c36<=S*WBFTb zT7c76s0KR9B9*ik8xBImf+x- zJ~gA+G@}sk*kMKYzCn~hkwu7!$?bfy6AFo{%#5}8u-4^AA`J`C!Cr+~p{NYtY^e8X zbSnDx)>UsyKDSTzvcYa?39sI@_I4z;Ce@++AM|Ye8x0t<`ST~Q&)jo)zeb2ma?K^K zVqonJDmmc`74yqd@=mFFW4Ni38%nuO4^bQVAveB4vQ_hrs-d(4J^}&8ufPY+06E0p zegfD4TFbjlqx~_jl1+p$b(3~l3gG>Kts6#uMKxRfVq4FX~0{6_Y{M-z`qCBe-&$0 zu{G;LAM(Inb*Xzvx^S7on}PQ$Xolfm0JcCdL%@U5@DPFM z2MvWVT^l(6g}whnVnHwg;(~Tv%Pr{N|HRmUH~?*edX1ThI3!)3`@ldk&He`Nvit2KH-q4QrM2L+gah#c^%wWI)z!xi{H&d1s< zfE52K4*t8wX2lNw2}EN6(q&ZtgGerieMnX)*8KZotwj=wQ2!N4h~wNa0RREI<{BgZ zQwIWn1q|-|TdDc4to_gZ1hV!G-jkhG$K+=9HIDgDgUsI;39Pe58BoMsyrm)Sc`8C- zi03_PU5ZBrp7#Jy@p36>0q{d$Drh#ISbw)R_~AbVY*jHpCg5+4V*kK>{}+*5oq3HU zkj(#{2mcLXKvT#&*Vb+S%2gmD@eqOVU6UXIg`qU_9~6t1u^`2G=HUg6HEZ$K6FhZzHs|>Z z0=XU6dsZs3wLZj+^$>5CO|trvwLS-tafMjWnExj7|72i5Fz|0RVgQ5yuwN4~{(pr( zP&CKpwNg7P(2?se%kJ>+8u&4= zlUt4r|9K?;H^hQW2@z?ZnRLy!USl$TBaZhUSq_;>sUFaR{e4UI=D=QrFe@{jHP z-!li4T9%_Y&*T1MVgc7nxiNvaE?3+CA*BG4^LPO{Hdh^P{sU+GKUZ-558eUt{vV^o zi)TC|LcYe+`#&8EAz(l&t*o_dx_?kYEXPU6VHL}~uj&*yqW+(cc% z9&1yRtmOtcv)S{b1yiRqGG-SxMb`wfT4jCxm^bC;i8jL_OO9sY{tFHZR3c|2SSx>N z+HAfzB$>G62>ff>xirisqIWLCrn{H(hT6*M)fw)M&YfvpYUNyBTIjW2=$nz@%=>XH ziK1xETrP)9t>er)q!C3!WI1ULVpP`5;U)FpM|IG;n4Obq6ju+$3X z^2nUonXBV)^9AI5;0RKlqvX6qAN5&iYD6|{yf@<^TA*ULG5QkU&iz}q=mcsGO?KN} zQ@1Q$ESV;$9?$MJi)JSn$oFLnC zqh%nxl;WLY&97slI7@rYnOrI$?=HOE5gKh7Y(F*lQfz5qp(gt?erazdRvM9^+T~gn z5=f<1JbK^ongLUqP)PS>-AsZ-@+rQ)^Bcd0dkR&mB7~tk4a@sV%w$<--L4FM+)FGT zCi)PxdWfHWm~$UfP&x;g=v;+#t-b45f{hQHnA4)T?%<-%+hw>J7USgUs-@ZJ`LbYE zj^;z+jA@AQlEai!Fg|F}!~KWYlEyrZ$m!AT)#21+&q=%?r<~MZn0arOmeOD2+sIi! zitpyc%=OXP{`4ix`~e}w5gXE%En7xx=K2=l%I}S)9uL&<16OfsPHM!*Mj!AMYrUx$ zU9_}Q@6`|Y!mmX!bDooLBsEV44uz^8v{8}IK)TB))7*2F4K%*~fGPTv-*l@)rcR$u z{A{Y7GC3M*8y##Lm6Zm=g>bG;Pg{v)G>k8_ zumR488U+Pu4Uvoko~C=2&!3-}$CifK%+>qynibL=9MFSZ|~Hy}%hJNk>u zo{f=!=cz%u1pMp?x4S{ar@;~pp zFDDF4WwvKu^p{fBC-&9KvJP>?{RMV{n-thY0@MJH(ebp8mBP9M5A>`0BRtIy-uo!< z8JTYjL|XOsvMtn0g5QG*ubD1f=-Fhi?8Qy5z-=j*V#BuT!8~2CCt()hdV#6n;-%PC z@Bk1_Qz#^*U?EWaJ0`pTMcY!0TasrtWAyU#A@k)#LUP%dld3&vnb(D^7MfytTp7LB ziqp7jWN+~@CFxNTFo(kEGo($m*C)kAN@k05?C7)h*BL)F-9p~Ikb}-70Clm?FER3W zjw`Eu$ZdNdLe6z;WW1~@_EDKr0xpGF_vc7QyW~qHy5*;i-xwR{ihn%r=jSTL0|~E~ zfBn`@nx}p1yK;w+J)c;X-xg2G6%^o_ntXtA!DN#3R(*#}l4XbqS}<42jpEs(d|b+P z)ODNn@&w*KCxx#JH*I#Hx|o{{H(AP#&tY>A;y`JtsG!}R@NCYfo~kutyRSRdAJ$ts z?G9Yi<(2Bz4o9u;m`aTw-}o-eao4ZM&!LhRkbqGgt9=`aj6$h|imN46Nm9`cK`L>9 z>v>m6shAzngk8?AmFDu2bjL@RCWCtHTY$?qUT)u!6$2H$eE}8esN^q70RS*ivB8L- zy*}o4ETa|8Qr(p|r*UNOd8j$U66U7blsnn*rhoC}mz(W;SQhdxn{BQK>0#C)?gBjBGkVveZFME0yFb-8{WtKZ z1+odaMrnlSh9+#-)mu(+J6=W3B(B(O;(@&FF4XU5X8CAX1>;wa3p7!1Pl28C)dUr3ebL08|-x+X1MT1F2l#1C$>*yOn ztF!Nk8|Q!8ijIzEr@~Z&gFfWeL6-~r`{I3%!!;*+(T@oRhS^Ev>Ds7AyyL=ieHaD8 zWe%aI#?~jb$H~7n9J(?~y1eP~K-iClZNv6yI+6%DWf;>d%`?nMH+EQHpo+ePG*gfJbJ7v4i zFgm(uM$bY#fWP&VUg96Ti>8VOum^WNkH)b7pj#38A2NjXo^FC}@k$yS7NAW~57P!w z<(Di3M|5!-Jl8Q{lS;i89x`7D56$CZse%Wg&5ER3wr4v_c`Bd+VWpPVGjO*H5DJWF zBV@P_BNlbad%=O6v=y3rM8MDsQ^DQJ{vFVd5$AX)&};1&H<+ZP>Xx3uBfVt9Us zJqT-08reclobXdb2gK=bhESYaI8`o_t5#Adn3t>8UzUnUO{H^VsrN=)4L(Q>kpZBk znGnCDu}d4AIWvQJ(JMRoRBT;z-8N5O9v5mYlYS1gG_z}Bc-RH*-|AT=3GfqW?ijnN zDSIyk_w~zSEu|=e?@)j>6sHyQ?WV$Ih8nxx37M!uw@0tO2Rp9Ol z%P6wfha7~g3(6Q$z}r(&tG#MijBEh#82BUk)NLuC*EQ}Nd+0v*eXtCom7drnYJX_A z>vY}nbGLK-nDwbsuu9J5E5yxG&`c8#Jlf?1&ou?aHIyADy4RiLKA}6u#9%X`RXi_B zgV(gFC503h&WwmWSEyF~LHd>Lk~QJSYcJ0R)w$`vfmFa}#soNyCF|&W9ST@l*kXZj z9X8hDE`qbdiTgVE<0CSv3yWm;anfiK+;v=Q;FHImp!a<*SB~1uibIO4c0>CTQrano zbX1glaD&7y_PT@jz8x@I{C?FJ)D^g>nTX!v)K!OjCKn`B_W;@K-QC4!$o1<9d+DGX%=Wp%o zZKZLCilC$$aZjlR@$O-|3-^;jrvUiN7);n*)M;Dd?;o@nYhU zee2GR<-PI7J+KtBVEW=avm`O7<>n|teOTy(?=LK;KzW-OI@Gt2*}BWww!GB*&G;;# zV%D7NoYnA*z&a6f)ejhnsqO@odJLnD$@!M_X^Jg<@4Zq>tI_D?)e{8iqu~?OJq4tc z@~6K;D8R)|VDl~WuE;-o+Q*)oHksR}M2!*54G051uZG8+@Ew=N(42yD z^`cZ)Mh4mKS31ECi^#V;4crWlMLMF4yUe8flZ)bnox!9IuF*0*717;tZJbqNnF7cG zT<$;k@_rO>?=0SUh?O0rwtiWS+ioPlfZ$Igjn%S?TY}CQ?g>JhEPB54#L8MhubR*Huy0v@{tRAK2HFF*`1TeOqonMW!|4O1 z=(K)r_NWc{azeM~qKRb`e)0FR&j1;Ln^}&nf+k&wi!*7V;9zR7Fau5}H%^idG*DX&#P_UqeS7m`W%1cQ`}AFzvSsg>I1sT2@An zWQ(nf2re$hZa~7fu>XloqXjoKbiarl4pWVa0@+;&r~( z83p!*cwAk+3t$-!`ox5VbpPNt)>PE{I6kPU1?VF!2byQHMY1KKkVL7elt-I3lnhfN zMZ|wkdBB|&E2QL-n@mlk`r1RIimsm_yLjqhzL*($3V`<`p--iJH&6~(^rI$Ra8W@U z6ai|nNNI3K!HqAiYUO&G_Gj?eFp{p1`$DWymMxPnz~=8b(z!fVMHf;PwP&b1 z^Z?h-z$3%6i?#-Z=HE2i#)DvTIjkiYeD(jg_QJ4u=sI!Hopsn%rRj=1U0 z15F#ChL33pOnX>7uci+&jo`N}zSv=x32B);vy^X>Bu6I{W`gtw24xm}$dTJO+TH{ysMY*2+w?aI>Of9_sPg( z9~lgH1%q&4yWhXh2l|YA@Gh2dcYsTrkX^k=*K7NtejK=Y5n8Fc2Pvm)=qi@o2x$x` zt=?uR9*wF{-lhQI=Q30=F6*ypt4W{N0wjTuPGdKhP+ZG=Vq(9j9P)$e=38~{lu{Sw zH1g|f=%^JKN3sXn7nqZhTMs|anyGMsx{qkDTlR_SbdIK(KyedTfkC=)+$&0jg<#7< z6TRB9o)RdQ=th4-I1Ygah*Vm&54hD_QR!0gxa%IreI&wI45UEqNOC~CSF*3RPU=VBtB{q! z@Fo-_RoimPP3Dmp&NXN^nhsgOKl~27CLj_ zZ#7B~xXBy+TbMtaA4iWRlkY6Ah|6`v*4SPixix4T4N+t;{JCD*k=mokWs$pG~oXBtK zR|Z>EHS$)5MGgDmtjT$eA_loB!E9*L>9>pGLh1cf9#$4YxdZtg2tKOl7n7EapA?%T zdp!j9L)HN)BrlL9g`8;MIOXZ|FG^E)G!iTro`O$ zUz`X%)s{2+>n=fJ<&@2`Hhi_Gl)haNtMYkPKGX9`pAgnC6lAA%u-!B*I*TFoKHMmQ z8!DiP9-f~6A|jUX7DNp4XxL@L;gj`!%YiI%h_A9y?-yGu)eoa4U?V!ze^%y9&ePIZS-s^VrI_=eJ8sB-tW;CpADlfE_Grs!`?FHbwbhY>ZMC?_C-U(W!PI7}cHJ z40MD6?=i?>&IN2|7n4L2R_2*`EtUMikbHGF&>O}W!N>Ezjc>a!EEo0XTV9A`#h$Z> zXtOQu@Ud3=RE%xNPXPv2;svT6%{(izxRxUhg&mMU-uyn@>IKcXg<#;O0?_LQ9Q7n; zH9L=$TJHD+HE4o1vIO4eLjP3`aTqP!2%ymY03Btb(R5GWP-ex9Lc_=xjz02W)HV1D zfBq7w(f`50psi*P`Q}Pvn@U%3Z=7_kPoYtH(;I65Ad@L$`~zS)cBxqg-e$!Brgr$$ zO6CSTO~AJuQPM^-B88vT^Og@XsRQg#6qR5i*}gvt&n!2TDf%n*OPuXL)5e${24sjEH;&jV=g;AuUx79}@KGRO z@(cX?27_#oO@P}O)WLlY7wPS~$8!NhtoGMS!X43SCz1dwW_`n05#KC0N0!`LHeh;v zd}CLw9JG6x>tIHUfZ^5w#O7Kj9;>i@#buwgD{(myeJB+ zVk6&WRiNUZyWoohjyDhC(8m*hpDm4sFa>@?+B}H$iDgWFx&xfa3LqNT=RG1?^;ong zqfNYLxWE|uuowqT&tJMqPr%aNeo4oBZ-5Q^;<6m+Z2JnN0N}x3Tmo+8$rWS;Rix#F z?CEf3BN-0ngTVIhp5G+!95OlD<-pbtf5zsBEDwGs;$1V|g-1$DCLtN2=3&FLPqvht zt^D-P?Q)B3|IjYL>3PBFdO|)$+ikC&0(~z$x zey(RwA7w4)sARQy=49{bC(^xrA1CSsZPG1JUWDaZ0Dm;{`sZXattNWl=)7=Zm!LW7 zP>YndYU2&dpp(X(1NKO@<3RR>iaH>^$nV}c=r?ek;%#l#1xX4s&2CnC z>fWS#3zts7aJ`q)#yYIiuN`COzwlqr(Xe&o#Gs!r2!l$<^_i&kV0%9lB!L#k9(Z^* zZFt%~xvXPYzo2m9Jz@@cKtnTspzjuT%3C0m-M97*OYJB|@P>lJ`*4q?t+*ed(@}K~ z^iR607AdAYh)fpT51isH%WBComN1F9osxAheM`B6Y|T;yQ@cw?2R|(&c@U;sZhd)% zi3Z(_Cr9@av}bfYJEATaXw&Oq*Ge;GYg+sl<^4ppX9&M%+5cc`*9(|89Ax(LORf1; zB6{%C(GZzn&y3TH2l~XacX6sR0%vGJ==FGR0vz2d`~UDjUHF57Mt8U*Bjr1@HZ`PbZLJB-W~6 z;G%m`ZxM6&r&SmXs^InxCE@Q~Uf9~A2ik$rGg#5eIl(NI#nZwm#5-VZ0A-+RcycV- z(=0W_{sQjJU5t@|Nbn(;mPl)d!9D$c=f_ui4+QdFWCTbJzG}r=wehq5fNYyb8fJvz z=|9tB6TWe3Q;P!M$nE)-kM{uUL5|9bl^noiqXh@L$8K@TTS(EBVWDoEW=rBp7_6$X zet*^2s4!L~UrWSxZxvEXsEn|Ce#eS?)w*GrJYKr8{JI7)~I zih*hzrTa^!f1OVv_360Dkk-Q3XfGA3?~jt#W@n79Y4ZcRK96hAhiyOYPPa4jJ#DVu zhnVi8bIznKU0g9j=Kf?&v(fZ7%!MqP z!EbhNQZ1500@5%=z;WL6#O{|V@~~Ff8v1@(MBCc_M20Bd)b}&xLRMj#I0IYtqF5*6 zTVDi1JvJx9&sForYxvo;K;+u_X_&8OVuDKQ1pVN<7~1E)Y)-tW;S#KaA(n5LHM5Dz zkj-cs6wcVWM*al!yVN|K>T$4e&uI21C`s zZ|B2;fT&El3jvk8S?*aO)2fSA?W#Z#T~Uy?+J>1qKVckENM^bm+zl%@o8_6D+lxz| zr0JxNW>f-Z+6-^>67ybd_F`xgyfu$c=5`|N&j*hCB<6p^WIMlUjBoASCTOv09H6<= zeWn{m@v8T)-CER_MhNu^`2*h5SlsOzEki=sQr1YD79bsMpw>FGxy4*F;S_u`yxTs1 zV_^B8b+1mLGA3m%bS2Umzt>$|^#m#=o8}+B;|b$~Ira%UeT(2g8e>N;eLZcX^-%Ds zwd4B!Sa{6lgV2+gLt?ZI-YJS@rK~cx%0Pe$J*X=GY(JfxFQQ z*XU1|`o__Ht6~CgCM!Cn)A+z&Fokcl0imvzG-!{U=Uw`ON|G={!*&1QuO`hlW`*7f z57I^DIERhSX5A%Uwq;yh8^oxXY3+&DR)vIZqWKj&g323o7lGM6_nEz0!&nx{zut7z z0!vj6EbrK=9m~+@Ie>WR*Bx|Zl@%;f#>a`Ypn!CXL9EQErda+=AyK{_xlli2xh;Wd z3$mZ*z_Xh4$oJ`P@mbAS{ZW>R!h-B<9gjNa_QawGUlcb6SH8bl+_CCrfJ00@)#*_% zXd4i!o5jFxm($eY^H{kyRTXe=$_rC0l2Pq~d{gwjuBY`AC*SdzIaF!fe)D@)KU1&P zf3+Q<40u79-I6M{-?((r49SRWP=~wekBza6OSv~gKpJIQvPc0%eUZLRI{RTk_!i@I z`$Lq0wLQ>t+Y`HX-~3ZlDoM1qs81X5%;|m#?-mB+$c#3-C7ptzc&SV0d|+)=2b90k zXxULm>{6D%GlLakwV7Xy_eosR9Ec7YK-MmpO&NCz7qzxl1g9=t7x?>x(LUB@1JdRp zH`PNA450n_23RygfOPh*g~1J%{S$K>^Nl3edasTxL)B-7t~)w^V3^LQVWtE3RD$i3 z&D$W{Yu>E#QSqT#*J@w_w&};n7IRwyY*RCCgvD^QP|`rGrcu5<-gCOAam{7BL(hS- zx3cWD@vnzY?9VSYOx;Y%w}G_$Fg> zQhvGJ+CYc0CO9ze+tk#B?>4B0`?r#E-kR2X=j~vxB{jk>r|BU%ZEDBkY4YWd-fF;h zL@SZHExZbNXJ@}^IpTr-TDlb!3h1N<+Lj(b+Vp?G@9>v~Rms@&S?s!h4|99@7!VjA z3j|-epSkQ3a}1Cp2)dXMajYYEylppFPD zc%7DxW9AeNi4)MpEv6a!k7viezQgvCV>!Pc2vPflxiYE`!>r)_ffYu*X~6e%(KA&Y7XlQy11 zNZs$4lT`-S9DmJf8){rNgX1{jP*avWziymMy1jb4$Q7LllD1BYOg? zu#q)9d4*GnjukEoxYoFX9sDl-#F}~A;nsfn2eB}d;3XX!(`gMvShRUIy{Grbl*TTN z;CFIsWgx-Dt>UMy-k6I*Q?FeybUQ)&;>#>}{{DggTK6Dk?;_gEOm2?z#NsoaFd7kI z;+;>)m__BJ%EN2kbdmfN-LP|Wc)rl6I^5>##!*l4YO@I~g`j3QOMbjI=ds9ZqVAe_ z1Ju{90NYyQ9C3>+pV&JP$LU3qJ~tWrk}3z*&KiLRUbF)zXO)YMkPEG4_v5L*GVqt>d+gk&d>?5`HnkpSE+Z)}EC`G}KEZXQfTS2jNVG)jUetgg1Tb zU1bs)a#fKj(2RDyF;|49+T?O3(jv}ktJSNnBHE1w4yQu><{h0G2a_sKPWDzw6$+dz z4?STXDxRUXc5#(q4DJKTJw?%AzJ3Q=RNLd)NTK2#Ok(9{2f3!zRFFxTBwf4IrO_o> zXcW~vKHEKB70T(5LtmZi`5X{;c&&k&;QQch<_-*@8^=vLT`EU0i`s9CkC}IM56cYE z{>I|{1mGyTv$W+(3=4n;6>wcl;wD zoz@q9!zsB+DQcB?z$<+kWIo>2e>*XNnA@nJwbOCmOU{?)RiwHbuW=u~Sgnp!^n^)l z8F5L&!1h^6_7Dpb5H>faFBW>AX|J7{6Hfw;bD}P+W-iC?2wVhDQf8ZHT40?c-#- zc^zU$?o8%>mQ7;_r>kY4d6bAlPWRf#>dfWM$@DH9>g{&53F=7PF>0W3o#8nd@b=5g zC1$}eO>>EJ@@~7suJ}5wsq5id)l>7#jDe64pXTu~A<+!YyDfCBr2RF|axdGZAS0-k zjuPLBWX<2Y(#V-_U!44+lq+^gYU=9jjQLOO*&`u=i%*;Pb4Cj$J>@y0I?bE~k*zVE z#HFhol+_}$U?iiipU8Ht&a6~0X(Du%sKR2h{AjHldd5=5+`Pv=&iJN%TeHpSve!-anlC(1DPn$%MhiLR*vTK8oe`J1N`LFn#+UPaSyw zvX|IQXWiWi%e(yqhK~{S_)EI3q)KS^xlVtvxvNTwb-iOb%=+8Yy(Mo8tfI4b*hCBB zo@Lk^PK=&JwUt^2eU|BF$LM~Y-gVriP2hvlrG=0M`rwRR@8H-^Ubj1#S)8<`GHkxJ zpS32HmPcl)uFGp2t&J|44J269W$z;j*f4Gq>TTR;M!w7q=q0hJUjNxk4Mu}ff9(v; z4NiC4B{^RAavgoqM(lRvj3V>lTz&r_iwxYcUhqQvIqj~6z)#%XYQ1>qTmQTI+|yof zol*iBszP@4s^mPGzT!@dKhV{GBo3)HY`rY8T?o#tt z&AP(6G_m@+@VMibG>$3l6B}vPJwT;<=B6>0Fd&?PY<4v4Z8rItAU(#GCam)L&F$2x zEw__h1KtD{d2j|kj7@IyfMJtNPLv;hlrDFu_9+*DFJhH1%4F zD;suSJbmG^u9kMopi+Pjt**DhAyZTUsC6>K6U>jBgpOvU7ntS3>Q9wkM?4(6_K4#J ztC7rODs-k(C9MC1tI3UGm%<9O9GUI*mvzxJLE3nh;6zEt%AdhVg%0B{`0fBXnc zRA!n}?EhV8@R)Ucc7!jk>a6X&UD;$p4>geLV?vghpu%4nUD#*ZA{9eKxHfcsZyVg# z0w*~ZPEbviVT*6`nMlSB#G%;w+C4Ca6m2x0@;&nO?EL{dWy|kJ-745>J!(ZVejmT4 zM@iB!yZ88%n=1UF7`T^qDWgNcRL!#7*IyH+r}L*V!NIW=o*ju^NUVb|-vuyaNZbG( zN(HzmFS^e*A0*hFO!F#{2(^{6BXp%WBRR&uA5R|{FD`X!xhYB%GAf?l47{4IjufDx z2Ru!PY=PS=7M%m$FWDm#+KB6x+jaZ;^S(Kqs`>*x{GU?TTK^wY*Bwvw_y0eA8d@l; ztQ0PpH`ksm`=VTud6n65^=c((k;l>ihf8 z!~49?c#Y?4p7&j(G5gU|ih@*=QFbr4uNd7<5v>HFUx<+H2BWMwURm`p~ISL*Lldr_ zo>|M_Tb4I>#Uu6lRl9-iXvdIP`#|~to%E29dN<9nRFo4Q6{oj#T%JW59e%s>f!-vy z4j@L#>|WcCJ&h4+^YKMLN)^72rWpN7tJzwtoI1VmW8w9UV=Gp?=5OuNsoZ>Tt_3Wq z*cJD?#)X80T<$o1G~|fjA>niTFJHKS?&PTh(`vFw&%+dxdwQ3Cq<)?8?IiME`h3~u z=VonmbH?>gqh4FyS9@ROeHWu>N;cpWgvxw%um|Af?~wMbXOB=Eh_R){_9_Xc@fF?f z?w^ME4#3Ar6SMtiFF!9?%3$jlsrs!lfaTcnX6=A9&a z9kN|m9@im4ebAaW(~wghkZ+Eqz5ki3*->lE0-Ou3|4dmZ#Xkpt$Ao zQ7|!A0LGwE?IA&2;GPbe%Mlm7LT14RESP+RQF=I%y|bM*#r6fuE71=ZSl=KkV8cxB z!$zF-k{TYVNK!%wgYzVrEyPiZY5N-^>&#cJT(H-r(#?;+%MKT(>{~y|B@Z7^jGnwb z6HL&xFc;73dV|E~tf6@>#ozn*l#N0@9@nIDU&1%RSVXyEf)hRt%ac~AY7i+>9ciy> zOE~rUy&kuDl5-jiEM>h;!%kR;M2puUy)<>)8b?b9Oz1E2Dyx^+(4}lfbPuDw$>Hj^ zj#=x35OkR`dKdNGq!-!Ho}f#dz4h#^8wb!yzJVh4rEZNWhr9Aev;S7P%>2O(ue{h%*6^f!v~6i{>KjK-b7M?@)^> z?M$86+vXhQm@#2+DwSyxRpRQ$%!FF+?lQNHp%1;BW!SKHQ6!2tmYTu?#G=p-qh`Fl z3lKRzs*)Cw{$We&Zm-Xsl$vv3k1q5_`7W(@Uh`Ais0BBd*oZ=#S>yzc({F(+o`*+? za(%k}RF6=T86!$(*N-!p{Z_CC;#z)IxnZ(*N~)0}<^dN)Qze?@#*MzRdpCH-w@Ukl z-DFyK6tr2z9nPMbf>-!bJua*aOu#5pqg1|}B!qqB@MU(ipsXErbqh0j*+wxGoU{zh zQwC?JrxF}q<}cXV)(X7z?&k(1rjV~ViynLBai*XKo!3_R{&t*2v8gBh7IgL*NO)p9 zuwv1Z=p8~?{!(x;xV)Jl_Rs%j5PDEHT7d_r)0aG>C$bGU9nJ6TXZ{cSO z)PJSOP>&tHOy2`o(IFC0jd8Ee!B*$kIGzD?*o(Z&Jfi@}_ccH-RL9K`X}ye+hS@F% zwjm$u6mlJFLV|_b`}O}z^4`kg$~gd!<&SgMw_?WwqRxgBn!bR~<1V2%v=BTBA}y6k zYj4kZ&~tggrWa9b%~E~MJU-QWEYHcO@b%EEC8jnzCz^-x3zxvzF+~K2r$Q+q6h-dU z8&}5{A18p-#z~&N!c3QqA}6{;>?6xJEWqJdkZV!X(2`FHP4V|m&I6LWdKYo}*)Q{s zZCr;?!6EvypgKmId?xZM^)W&BRk7(k)%#!-&M~u=nZSp{IY=?-QCxFMWR*rl>ccG*6boe*W)DLDaPf??Nxv~3$+t1q+&A#h;g+XICmj?k> z=Db2Don+@+(Tzjn&W9~9`8!`Nd~)Uy+cY2Jz4qh_o)``n+AKo;4!HclK~*5lD=xo- zro@>s*vkDM=iOMwKdDCYy~-m|geO_Cv~dQxrI;=OHoC0i4(oUu>E-?W z%!1+fAS)U$&UzvlA_?mSD^8b)u z3;73HHOwGxb)ePSkfzXA+$Dt;RK~kijRNp_ixhoIP2IRSyh5vPkAKS8Opc8U&DgEi zN&$$beGbtO!x+~coet0>cM)Y=SUGm7d6#5OJtT(Z$BZ7rFs-?HYS9FsiupXLHc`i+ z6){4@8#zlT3_59;g-r}>4xk{ayW#PmV}%Jrewdf8^8lJ3fV=C7w4VJ)s%kz`EAZK$vw*F`xDon)6_4`V zAlAa8X2d@Fd^t=27ri$ver*4&>hb6^y#T_V`%@2sBFO~bVb|zpqHW7 zLO%e31PTxO+DiBd=pilIf#;kEh1`8o9w%#2=^gJSLVX+C0Bz7m>ig%cum2WZx~aeN zgwSGSzAUvM%b==BEZ`Ux6CpFa)SMEO*6z&suS5PuWNEV!Q+OJ&2dsk2KT~5?Usf~5 znC!d=B8K3ws!+8lX#mL+JT~eU?LY`o!SoH%=1F_+B0~fto?`YB7ipRCxkH7qz@!0i zM0I1c+LIPhOvMh~+~|mXko=F6=+p*Dlm42_4gIwo1@1SuUou{IIEaAJLTA5Aq{KBN z`I~TK)vgRcl#?Z%{`LMmoGMxvBc4MnQ`c5v+IgXZ)mYM6>$8rm6No(yWQ92Ei&av;Ma$+He@K{ zp}uhU{Q|dFA4y-XJH{=%IewDC0yZ&YLxlh6Hvr8EjHZAT0{P@>I!&Tvp?KfTQ7m&J)IJ9M4Zu&6p7QNz8uv07kcm*dm6Lt0o!xStV=;`HwJjWp)cnptIW z#xkhuWKwT)aQS8q&rL)B?g$&vJ;d}?u_&T9?R{%{bdISA8~X_ zmj7g`gZP;6zSc`N|L4ULc`;7(L?VM}xmt z0`9wdiuoksRB&9a#j`cTjXc=SzAlAt#dwNb;u0gR8d>3P>d&d}wqekS>R@M^Wu~bi z)VWfA6@7IVD}*+{RVlL%wyV+hwU>Bz5U=m${uyocfMmw-CJ(@SWmwuOMuQE^kb3t` zIhe<=^=vzDJ%OQHhvv(TUlw-Tr&9-SJYXU?L8j|1G9hG{6>qPnI^uS-p}oI>AqK!h zZADK0u;`vJJEjPeiu5fqLPN%4oHX0gP-|eOCswln6HWFYmK)jvuLYW>K>^O`LW|9l z`!s;p_>X!*lDiQXmv#U=!RDwSO5kx<46BSJqS8+fmRK-UY8+I4h%MrmGX zyMCzZtDC17<57r`GezSLmn8O9Cxixab-PVJ_`Qe|aF@viee;dRCX?o#0daR2lqz>f z${G>n)YD6!ep}8pzuGPcO>+Q#^jS^3ZCkadX0>5l#U@|P_mZi_-vSr}>4%W{^3QS% z%>JE$kUcaJ;AFuf%C|#@*3x$NcB$mEX~>A&89$F;EMw@*ujQL9IdR4;64uQx$zZb!EDmI6y^4(V8*?L-vl19Y#)gsmk&V3t zmG9I#mHeWHf=Na;kqo|6Q#Ch3!;3Rftz0NL`8bFG7_x$_$-E*Ec=qYnbG6adU-&vp zOHAGLhhD597#nEmS>I(RXK|$>-U)d2j2C!okQil5U?U3=lIwRyW!KEa)31)H>tu{=-0HY?#s{Y#!n5 zq4}8aHlJ6>Oe5<3z^+3KdRicu2U>mmJTC2fHRySTtaIWww+R%v4n>)(2)#r1ld@tK zj%`W$Y@B3hG|!335_q@4Zjnw|6}V_4Z}xUEv4l2- zt09^vHglK!JgzuWTazx2{mro9b=0^BEYACM#Fw6aeo059a`oNQ4AxXU4ZB$4ID?l` zCzQc>Cm&xKn`X%1I1KooG!0m|pmNF-FO|D-kRny=P)dY_J219((&SKaX5~wo3KqeY zpZ!NQCUObOvf>^4>VD?-OOn}<8U$YGkW@fVB%gSWH$ZYj^=dtOM`? zqpaww@8U-D#CGIwk&PZtFcLP&7I1DY?pgcoA@v>pq+;b@eb4tf|JN0{V+?l5Pgb#XAgG;|Uqny8#uWcKB25gAnHubhl8B`D zMPJx>kH#js!OGLp;8W0fIf22<2aK`e|}YFWqTh zJXn7-M`ez5yOwTSBx=vmx!FuSC|SY?ld(A?4xU@5shy{tA5tU-T=;))m{1e1$Pv44 z$Xv);bOQOn|{@ecc4FYVwvAlW1ug`l3+qE3wts-;*=Br$kfbx}n0 z*eB{G;oZ-_JRr5?-g&emReRu^4xTq(gf3(sVySx05DyO=HB8kyOruy>^!^O@p=VkQ zr9cZ}bDnr#QL)o2CI8&-EQ<^}sJ0^&aqSts-p1J1XUSfsAXdH?b47eIlMz-PQ==lR9@mSt=LuRO_uv+H=TcjFxW>y zmgb$S1jT`Lr_4l)i9HOb)F<44W?nh@d74#{*|H>J?{B4~fGg6;?vJ}3;v0^4FO>b} zNQQ&U`D_%2y?Yz}-rsG=)fBsLF?l?I>F+or)kY$D8;&lM+n@gqS#@Y_t+CV>X+%X- zUjroEkIsE!fcKTE=1&c5xXoAj`RQ-CsY9BG=&{*c9QW%>Nmj<6-XYdQ1HahYdEaB~ z78d*DyZ_FbkFc{iSl`Afj%|99v0?7<@{Wx`_- zaZHS9oshj+O^)BvrJl&jLO=p7wTKFf?J#z}n>$o(qlb6@Soix0LX`M8^{NKZ+lfk@ z(fPtjQAMGx43pAaiPuh)0;*ramR*0>T(c4myG*i4U>Ln zzXR25Vp1R|)W3m>Ad*gpC%a|*ot8!wuE}Nz&_88TD<*Yy55$(Rc>S!#m9gp;^>N`4j&$9zKn;^}r<m_jHFF}Rynwme| zxJN~PxuP8?uRSEJ7{?HlKg^xMzhNQH^=TZo^B-)^zml7(U&~A--+3+57#Ic%XpS)P z(6^HOQ2&SWsIaA=*Zt323T!IiaSOA(QDB30NIVOdtfXOiNiex1#UIaL90OMmA-Cg6 z3EmP`o1!2vhgg?uXv};wYw(VWKtjT!|MBwzRV2dc4K2)J)?|Cv&cJ$9aiRCOFYi5H zwU){P`^>JojOeEq}F`WJHV0Apsujr9EOKjlL zs!?St2Ej8MUT7!V%-5f`yb<}~5eVUTwzY`zF}M67hu5%C@#a4No2FvyNJNkM5hVYq z|INvd*SE-sjm7*!+?h^J(vf|G6vZ+k^1m@Ec>S{v4k4&FmE0MF9JY@>o*{}qe#{d0 zmo(zXkl){-_V#P#2gx`vG%i;8nQ_fq=YkU&>cmoXd-)}XGYpXtj2%EwmS4XNH2nEp z@*Trc#`+Du*Do;zR|*K!lyJYl#}I>}4Z_+x8rMh=>Zut0twW(-aYeUN1Me;rmm`&kv&%F;CH|NOi6odj##^vbJC=CvGdkJz(WxJ zlg)Eio*Bj8yP>{A2FL;+il_RwgLX(2W*}pU%MdU6p6wrRz!LcUe{MSFB1gSWNMRLF^+@(rQ8TVTv z!|}$?=x=cU`V>h2V&t75FR4A8MBzzQ-yQsXd*Twqra8dzZmwAg2FsiN=&kU`-yv=t z(tY7k^JWdQb(%q$qASqGNa= zb%VrgkPF#_V^(vTe>7D4LJiWQFoQAF*8E$Vrv1o6iyfSSNcc?pB`G_7{jKS7Mt0A~ z?!W%(ABed2yw{E$kJSKQY?iAUZOZa4}?7%PEPErE(?vwsUojxr^5(xA~rC!I|75x0IhlN@T z2b5)_3d{Y!Bs((H2_mG3tW4RIHt%uz{M8cnnVsmT+_jf<{i((i$8keV2693t62eQ4 zIb-^q&hQ5N>EUj*GALrLdnB{|RmGP(8r_|a*Bcp0CrE_!CjGQ8sco3Qc(iSK)%6$y ztrT<~)idRqCx!w#LWDD)CQT4wmE6C#R}jM|Sh+DJ4av<8+JYYB;+{F?VU6kZ)3ia> z{MMbM>=s*l@f7wbFZbxc#Xkh+-@w`F-Ss)ac0q(YOy>B`Km<+mj*D$oSb^JbQ#?*; zf)YP>9Qw3crci5V8L|+XZX%uPT-|-wqVx|g#&-Bq9~feeeai`gupbPwluJe4TtB=| zh+ELxAPln^>O}n$v{$=HN2>wAqoS0kN=Vr$cAD6b`lYNa1#vDG2%{M7OcJBag zEQ`P1jJZlcwBFo{HPVz~atNe{jl}(me|iC6L-qLm%ETmPMTSsg!@S#(O~)Hig#L`Z z=Y_9YWS`i>@NCLCkrr|8DtGx12zjrFKUsxrO6J}Zk=J?C%P*L46VEWurNXxD!$9g_q5ul+R9UL>(AxA-F~k>ypFT`N76k` zI7}zQdmutCk&l_dww2)fZgDR)%m-r))_&tXNC6ZR02cDirnJPPy$6B~Y_7r}!sm=P zwXDz{Kig95j?0bq_YUHBthM*e!0 z!84LcKc6!PzV2pXhNQX2yg}D@MhY(&Xa6+m=l@FLV@6S= zL49MyANv7ncHT~5CZyI;h5!5~v4H!!IyLd?K7&li-Z)IxU(l6WL&=miByI5cTXo7Z zq|$WaqzKPp+UA_}%@`YJp<3O)0Oh`ls?|9{s+WjaEnb%Knb{F*6n}eoVS|_F5&M}N z*jOOi3=(Nt&VZt?(scZ+t8U(he<59?8N)a4o*Yqw8M@wVp81QWG->z)lD42>`>adR zq2Ho6tD({HDPPB!V=1hED7sVck5EZ1L&C>Lu@oA~GwZ)~HzXKxopUS1y6P$;M>b#b z3WG{6*uYWI8q;fGL3kb)FG2pcD)ll(mLm5|HCvJDUWa^Gw?Q`dZ*VcgQjcGhS3^El z@vwcyAZY8oH%9YxCsCqPHTWH0hAcJQh11`$Wrr}gM<4c?D!YXZXB^U0FSF~ZHpP|q z+K@pO{n!rbf%Nn+vNjFRG80%FZjcJ{u?*Jb;64Wx8O`4v;X=%RNcyePB?HLD?FGsD zGSP>yP=Rv{kV+81)J@Oej>#_#>i#)*pTAguP`SFMRZTgGu8raC0B`K9!VUty36V<;};k=^5qF-^mk2#ho3N-!fo12W?m z;3b_XUhC`06eEWDchpw2#tDc=gHOOdqxLM^^!xQEN$-vpcfu=aNOA8~e#FQ_qKNGw zGbCP{GPWX^15c#35QH(nkl_QU$LUrB&N=c0Pc_89uoVldfmAI*{U-!JGp1gB!1qOh#)-QXLFy#nKz*= zZ~g(O!?y4Aa`5qs#L&LVFBVlSm+qXNxzBJ@bWQAo3uXy8GuTqlSX6o)g8_SWL}P#K z|2khi)O+1KJ~b|Q7m&aLEv=q~jX;o~KXkWK7Q_CfA#+bG7G3>M_WZmQ8Z?J^9`S46 zXl=@>H~Y1}-rHN9kNhM1W5T^8I@9-I)Q5$(dtT@Gwx8<+Z(ob&B$GF%-M{^8vK9T+ zjU9CvJ4@!nW{lqmfBpKaRb<6C_PpxDTW96bhkSEtwm-fpxqMgX*2MjnGPE|2Xjbkb z-ydsC{^E;Clf4V9tdfuFxqj{6?f0u@`$-IqL-4?Zjqi7lXc`N? z?%XaddfjSK@GCP-<0hRo0{(K`$}L0Huk-t->FlRzTKE1-VmUdtG;GM%T>m2b;=jrn zA{(}X?w5{)(9U68`)1d$>V1<^FHgi=EPg^54EXuEOxo?`6x#cf&Ep=6wDvfRhks7> z3?YPdIeb#{@qL8;@u(m2Bn~ef<Pr*O?~ZVuJ~mBa(kwcu ztpDOfv?MlcDg~pmCZ65yz#Bo}bH@r*g{T)Lq)9?>j)|^2A1|fD-QGXPzV)n;>OZmh zR*hB0XBde<6S`^(8`F}Fy1FlJU)~n=YitZBJ6UFb+OWl?*|0u5@zl*Y{VJb?y0`yJ zggUHS;2x!CFUa^@6-p~rct-md0Ji4v25SBJ`mJc4L%N_6m73^?+m|-kEe5BaHrh@~ z{-^19khjiEtalAjZm-I9yUx{&l&#*}=TqjG7yJF_lsJtBShI2TtqSd(Tc+jzvmglzN-PHvB{H|~P%;g~6yBA zcs*a5m0F+OpMraf^tgs;_TYe5@nfEs2JIizWY{zsIrfm1^vxF+4_!5@MN+bKPznn*lr%ww`u@4mY$BpmtkjF36#_cIR11-H$$4ad` zq<9P&_?{Jo9_5_Btv5J9l9?75OmwWNI8|w{{E7RR`&J?*#c51eX zB+hi$1>>3fqml&)5~eB5`>@pcmbJWTG-SVw{6Gs={$51`>2Vk=?gxLTy=~TQWZ_u6 z9$SI*NduKqJ2R&9e2=1o?tk^md2&Q-td+{askCaJQhQn%BVKz}3J-$iL5EIRDRKEo z$RZ|*`(H0RFNIDLHd&WscPLe~IQ8H%Qi;RoO&Pz_^w}-rsgKiNiU}ff>J3YSnQ?uv z{)r>Y7G5%gL^~%;tFj-Z=TQr6IGvRTa-!u7&+@nNwx=3q$~GbATIB8%UFDw`H+Dgio84f{V1gvA`MsTM-ihJa3@ZD3 zCCSL32Ok=kzAKB;OI>%jWVYURu#sP+Z{#&16+ji$hi;D<_~4pZc}DmRl|_0kk9J#H;ShNSxsia>B(WB`5CcQzjFkc5f&*U{z9pYRdwxJR!g40h ztd%97>IwNz0O@t}>Jx&B5(k-bp3(E>er$}jV(fA9N74ZV^XJJq1DtTRnZmt^dxOp3 z2Ji}6yyJ+ngvcefuYtY2KGNh$RrKtK0k#jX%b{LGkZ_3A$yB{d_Wz}iiXk+Kf;P_6 zX8#FSop9vKD(~7C92@zr^a6{lbtX1P2;KVYx~0LT4t8ZLvUYl4?3a-73k9IPaz36^ zzr@y+ohWIW!0<8$5wu}v`39o(Tcm7knBXMmT8`Mh)voyKNyZwpDazO!6LeBY+z&5h zucK5HGpsbCq>}+ zEPio0E#lqx2@)_3H-@Hv#Fpt2SX=zG&Oc!*$vk3HyjBn9kS?sKs$gU{F?qgcuLWCD zYdv2KEmdvTSnGi6F2==Sl}zG9B<1`1dMr$ ze0GPlImLDfa7US%d1yr`HRAA3_0Il(6H=W6&-T>#>eCaKP@t2s!$@RPt3yI+f9yPO zY~lM!+B04#wdmQjPcGF4X-x0w*eSu2^}Id9=2@0#Zyk7w6Xvb?o%3B~z1?GsPA4c` z1>~cJB=yx|OI+iU1BS((9Yy}zakt`d5xHa+diEN*1)uUeIE)%`w!4Qx+Px+;v4dUZ zcH0Jt!}u%A$f+REAQgP^o}f4T4`PbRmqEvorbt}xA-WZ|o>2@Ym#ir+7n-+46Iun? zw-D_x(!tPNV4*BL#Z_dg`QvM~PN8SrH1!8s&F4JK8Gd@-M*N`8GW{cIxrJjGGPI9B8ni$xSM_A6(XYA#-c+U*ui7&OW%0@*w{Qg&o+my!WCMXufzqQstbp z#E_xR8}{-A?L%e;F+ydX9q z>uIkgw-5z$N2l*cYHMr1@oYa}Gn*dE|mQPt%oYzpOUam!Hg+ z^IV%3QOy~bv?H~-!0$sqZbJCiGb#UOMTzwKVTL!CSuez=Uw*m3WH|B+1T2`Z9v3=> z(!acn%YH9sp8MV84N^1UV8FT^!nBYl*L z^k{`^ITe#JgchZu*N%D@p>hG5mfA^^qCJU2&$195BJ)NJL||6h)!?0k4|hK2W3oh? z(~yz})p`^Z-XMja+3}cr3NezD@zG~Kc!l+R0chXX9J2u zof%A_E{x=TLX;dXss+*ru9#=-Xb9amy=L@z+gh})5NHH{hfr2%qV2^F#3(EW&G{BU ziGkG(k(sLGd4J_sJH!N#wwvP>uU$JusBGZlUY0j3BW3a|s8ej1CgfzGtq4<# zaDVI!os2umBoanq-2>to(}AB4%cBx~yk^ZdB%2boi$Rt>?AYD!4Vsh3G{77w>o}t| z-^}WxC4FEDyxu-@#DvS_`M9GAkzLdN_@f0s7eQh$XSVHp;lF;Bo?0!=T}@jj!%11u z3TVN&W3`r~fmcwm!)Fj_IjFnuQXp5R1?Vs+b=D~*epS6;6I!9R0JZHiJBWh}Q_*}i zOtD1FUA7;A78F%*?Yee`t)8J|N%YR;qbK5!nSSu7n6qs?A_#hTpKp6NbcCUTkTC!6 z^WQFer;(h-K(p#Iv<|bc476%L(#-vl_999qzEeT|W}W#dJ+>Owk?LnG;9>8N7oRmv z+OK^2G{-eJ3|dZNiPD0du3wfR-OE7Zj3maSgQ+mPSVEH&(UGQ@Q=imV2VGAXyi}#j z%T?tvHCV!h#PeMTDrLRxs>q*|1W7e`m3A=Ui!oAim9~fICi&~Ba9ClT>%uDJgBs@O z!IQPaJLaE2d45j&-4x9V6)lD;u4!e;9gqAn%=h>s5Ht#NXW4&!$&@&y=yJQ4GFdg{ zI55iP>+W#!YO=MCr@V!y&sMFLIgph+7G3Q~!<6IDdApD_Jx3v95yF!iG*3}G!h#Gp zIifl6F#SdOp>UuAE?TQJe4bumPScnHni*c~tiTJ8E$HZVtADo-KLxb8M+@#4hr9?T zm&uDoKYkC9gJ|D5inr+dG=(zbhvZ9vWw-}<~H_O=itD=Rn+ z`4%8;j|fd%U)ngdVtqMl)66zpCO<)`lL5tLWU0=spqf*(mRU18(^_@Kys{o3K)A;< zi(hLXKaHB9WU7bkw%4E?h07ze+%n$0V1_*g=k}x`*(YD0LmKv}?ICCLoIne%r=5V# z+lB<1EsDkLLi7gJJUKn3T5%)K5I_=WvzTXgRTVA&6jIK_4v(GBvAySG1|C#T!;lJ- zLRbtM(W}@Nzo4b+eG|b2%;^xWcblir{`fPfDS?jO!QCmEzG_j9N>`m)Jpq32isiD#+ETzm)UK}r* z1@}^-(4|4p8>G=@3R*D{9UZylS;%^R>6f6f0oQ)kX?^(GpfY|-*+r^0-}~h}0cf4- zsKt95IagHzAROrKPd`0Dg-tvrG;NNQdpZ-tRct!O019KN-vtz;E2XC!-l0^R_F==m zd^pf5W;4XFE;dUjg(^8a&#;%{F#grKG6T}#(g=5nSGS@-0;A_3g7fP1L)R6NgZ$<8 zwBztt3{Qwknl7X^>}XuHjt(B`fFs@3<6N0ae=1<1ojxM=2x6~C;*kShy z^t+92+PJ%#9jGz+VLpF`Zdy=G_2InE$jTrVrQ0+lH}RnbRd~1S{6FcZX9snFgN{0M zc0jjiN$i;ZY5Y{b!stP8Bj9`OrH&OIe;Kf25cauO3hYO_kcUoJl%~wW+uq9#y%wDP z$aq(^bIAKp9Y$j;&}6WpgLe{!aCCVF!36a-9CO92^$Gh7h!y>9v+NML&ww^#b9x0n3q1i037!;rd+kiF{~6%O<0jFxn{{?-K&zrErG7oNr_O!j1PxKBwzJdi&O}Q~ zW>#>OV&P=ZeQt0b>vde=x|7Ta&_XBDA~$%S#Nu8GTnSvaeS^0>tSUXCb1-rB>`*!A zh7xr2@$>9xDPkzfX2*i@5K}Fv@1Dylm(k&C9(b?6-F>DX`0zLh2mR7Hm6Xf4G2OiB zcXfb(eJ$5YY0;2*bq1~EyouI=Bde(MS#GLl>luv_%6}6<> zSl;N?bFL8%7PTP>6;Ph!1aCp9yeVHYPwI@HN@81ut=EgrdT{%s1zSox1(i2g{PpJU z`}hWMKO}^&+q6t=JwV!vfrVPWg#_XIJfhvM90#Z(t!erC?!C`j335jP36wvR2G;{b zu++i)A?KXazuss88spf_5pxP8sn)Yfi*&&KI~!8=uf@5tp!J^8>doDUxg5_l07e?ar=DL?0bXDTKy!{EqV@Cds)a z*?w0;GnkyQHmD^+(d2U7mq8;yW^O8)uzCvUG7?yVqmmd^4GH`~<O}pBRa(so+!L5Lb!bJ!6a{kO zB>Xi!Mbg?a@XKr!XFBujY*eqVcBBvz9OR6Be=7&#jsZ7FX2jH0Ao>CE0RdA#b zLVh#O_B(4HXH(vXR(AN&t)z&T!?U)KI8MN-giA|=q$KGf1c!5!pS9!_9OlC#MhRvh z3Rd<}aHzna8Yo~jbcvOs*;-9MIlm7wJoJ!5LROJFj%pLNgwkfbHmM)Uf5(Z@UDL+o zHy}799(_H3q;Q%Q$N@^*{&>PS16A-|G*+*cBVtMS7{!zyFG8L2WfX=an`p_TdK*C? zWTfQTYN_jDK~QN$8msr+SbQ>88Y?zbr8fVMrhJ0u+j+*;ED}LS*X!B2!bI(g^?#d@ znfbg&JaY-9!cZH=F^Vt>2fsq!kNXGAEUY~F=QMety#GgL$zH*Q?ihOb{$Y`Y9mkK7n%=KkgTvd1UmTwaPZMbkQ_cC3`GDCj!UY?3-TfD;L{t24_ga<^%Ii_ znH{JoNyO=mn&;g_LEZx&9+Z=PZO*GCxKl|{1l=m)hicGrL;{0fA^R)6w)Q_HaGkii zH!n~9kWT2jlH?-1*-_i*ev1OExaLh9my;0%V9OY`6s)0k48_liow2DC2_3i>NxSpu z5cmz8+pS1X{kgI|3ap=3fNiW|^e>d#gWI1`^JQ{vq@#4%xOU%sz{8Qete98MuVgzn zLm#??87nb&;cFYS^!c4Z-p&pW)iWc6E-0^ZcJH|KI4YaQ5YIyLqD|$e5NI=`koB&>m zr$$>?N&)wc_RF24uv14?%AG@4|Eu&VMtX! z@k49H-isH(iCo^G&?=OIh?8WPn**pr3v!m9s(+zqdlqz%qj+oLr$~6^kcOjh$3xd1 z&s&C7#u~T}FbdZD81D3k{WDeR??r1%F!aK7PGXO@4d&q2Oit1l5?%L5cut2n|cH(W4&Z><>I<_ zk>ah4yLu7~F?BSj8DfH*U5+|Vww-TR{V)MT*&I@~tqKHF4$i<*j8X!+WiI3|<1`+K zkM$5IzO6&0eo}aG&nUl7rScaQRKC|bkdxMq8S}>}UTW_d9uq})rdk%szaOoS)8zT; zc7M*aM5paeEX1~hl2wC>j_e3E=< zB0_DED_sF!FQ=GFv7GI7_6u$+IOzkoJYl2S$x~YZ(kWB%gz8{$8$rA% z)eiVyrcuAXP@}m|@PdqLjv=_ddjAJ|b84h0@YgDiPW>ko>YZ+v$_ZLALI|yIaMa?S zf~`Aia@OF*;k}uPW6qYt5aFItGItM14^xFa0>p0StIE+(2#X6)Bb0s}is_iDZr+uP zR8T{4i#rQcsbC4mA_JV3!LOhzdWu}+hqOk<+vzb33RgYOto~3_N~G^_LLcZ}%Jkpt zWE`K=hYf4QHZa36j-wtd6$k_~FQY3W;#y8w|4o_qJvK)c*)U$tazhMDY&i)tGMl(h z_++jyZ@&D<&yeLYAbS!o5?m29Qp8=k8S;d%|Keqe<|k!~IAQK6mDNDC+r3DCufbks zf|H<0Fat-EwkFzh$9-yI<2%!7&6S{OHoJ&mJRKhc-9_tRfiEqx-F}1gl7xI zdd{|gfi#YmzZ6tV{(3(%Z&|$h33zLUFLnDUWX=acz-6PXTziUt2^YD(D$#uV-T4zB zkZ0x{XobX`h*)~ZW+|=_ZGOe1(M=gGxJJfz!@*C0VspTUIwlHC*+l2pa0^=l=kO0< zApQSe8iWq*;V}C|i@~Yy?X!FEzd(;S>e6xobZ=OBoTL;TiqVsb`5I2{K@QY>IByn0 z0Jsc32*t2>Cic`bW#o1$-aYEf>7Wiic&z_~pHu5yaJiGjh1KJo*3Tobp>n_ta8cVb z8b8v~D9f_46ttpa^d$$%E*2KdSixerCSj<4d5!t)HVBN~AZrD5vl~qWGD(mYZD6MP zM)3yqgOJwJK#q{SCs{&3UsB47o;MAEOmtAStr4IE?hv{ac}BKRxL_4G!=0O8pp%v4 z1eyK8lJ4tHnAtqBRu>z5)jt3o1}SpW1JD-<=Fv%5Y}oWGRIt)0!VLf=UJJ*5kQ+?s|md8xfdb~BlLKNE7T<>6mVEr9BNJ!FUk&@1d z^3}61^J_p>Fvny|B@K!zBWi?$@MiGwbu~-|VVT*5JD}Y_g#XMHIX8%Y_Th$@5?WxI zQCLeI`22+~JWhS}dc}eVIC1GPGAubmjiNdD85Xn}O(j)9*>~_Dw+`8uMYi_$(n;Gb zHvLHiE$HK~XH>y|3A&Y;zYebWZ=xTBkl!H@{w=dA7k+910kM;?0uPNEaMrn?VfzGO zHz>**(tiDnwX=_ez7GD%PM7_CR9)rbP4Dh>t+wB!kyN~*<>Ca?BMYLBV8VwSJh=;5 zefklY9GCMBYDYx3Dv7N|8UMf(gK zcWjW*7XxSkQW%=@6n_mde(R2(Uu4jN*)h%oK1q5vFn(TyYcgmN(47N zR)oT#D^YTV3RzvrHJq7)lMOp2mXK(jn`W>Ql?Se~Q{+kx$3$dxbh^5O9;es}xzqvf zISA@R;M5%I`#3QDyC(`-S%J1$+)Zz>IjU%yyngk+?RAd4c^i=!q z^k@10&PNtnhTQh^YD!JWjsU%qhVSOQ((jZ9wJDlOE@zp7yRzm*!CDIb)Q#QRX_;DR z+P$~#ZoDnzcCHUli7yFU;zO2>e>Mv*n_z;+YUAd46^6;NP{6JYcWgZIm`{Lq5KgyK z`|2=sF{|qa$Y#yKr0fmpw*u08J)A9Zp@b*yyP@w*xUJ%TjLRv89Vn?oe%~OnlndLv zxO*?OjtlMCi`06+B)um9p)+!iaT`Ri8yi-EBiDl>=zy}u&|MISDbr!#9-kfgOqmg= zz|c&|7pP6WYk6YyvxcQdnvc*C%q@6Fa+yr~n5I=EEzf?RTg*CLw0%m^y z%g9Ua^Em?P$TZ1a;gC>+INZ_R!zQxXyucBN8VeRQNfxZ&$atEQk?g4$f^P8A&uf!H zkf|JpUHG()N_#6@AlPjg984Je3bT)tuAgl1FrEs3=DACj(LoqH4}KL#;^p;Ak{h_g zBdf8OJ9;Z(#e(o+8>k2YwTQUMqSNRA>cY>HXf!=Q#0Svu(O9`k?xUX zyyu!;o0tF$w8O<1^`|@lE6WqNLkPHGq&g7e_RC3)DU|q;)BIj1y zj1oUJc))AZ?dR3W+aCm)>(*_>laH9XvRvSc+4pn&+WWEmK{%#uuaaTg0EnEIy2Q}p zBgj)k#f<9*vnGG>Yc<8O$Ve&c>s|~~Q-(9u&;N>E*vc4x%3dCn<^h_VDrvl+6H6Wb zL@;11H`%6%RsAd8YDpc~Lb_O=^Ge`IJHMVTqF-SA!|hpMM0$~!2%+Jp!Axoq9Pz5 zHBz$*0TF?vi9kX`dW{4Tsi7u>7D56^NPDlW&;R#+^n)b1@9Ua5bLPyM>;aPB2CeAR zShayw+ZN?4sO?mc+s;GEPhu*sN^IGb(0zm(g(xF>HK2Do&E$V4m#uF^Aw})6gkkoE zf&xMkKO>r{T3oXj;VT+lK|5GjIK1LZSbU6xlt;7+`f`;!lJ@E=B`bTZ>qm<6n;O^ z@(gsfpRQ_gp`k1yI8=H)@<9~BH{_AVP3KcI_4bU>UUaq_$?p=+=;y}SR9(?Z>?_GF z3fhQx{07ae`du96-mNcQZG#ZE-)2t{7k++#?N3-0y^5zQ-e7Dwn?kmoX(?VtyA{c? zHkuv^ZS+r{ys5}}EW25u>J$FyA=ZVwf${s*ba(a+Ws?KhCw6{4^m0Z)LA@_zu}tc# zt2srqg79CC7h04`3a4~j5m3_>{$v{-okJ0{4GN@D1ERuWK^*eH=t})ueQ@;PnBw>& z+m#fa1-aIwfr0Q}*tCgj%WWzX9ZMxVYAI=iA%{d|z8k)#gQoQ9aY$q*j(JBEiRPhD z*B=qQ!n`LDWQHMr=hG9t1-1_j4d14-tuaUUv#?oP^In?2D=9nVxSWxO zaCVHSFK>*MFSr}^M!B^(Y4DL-`gOsfhks(bE=p|aGLhUFvc#F#|{ zdf^E>LAZJMtud%8wQ|ZR>gB@+Hx9zI_}|dGM-GkbYAvYQ*Zi2ZpgwKiupk<#Zmfr{ zlOH8OaojI^DbwV20%Kt%!J>&5#7%_BK^D|4!aCj#G`D-cIoG0#v6R`;8mF9OTea?Z zUnb#hxnsa1Ri^_gLYgu-U zQ3X~pR}LO*e%zgO*jfiUvJpZGnEw{PX<%G-t$DWE=lIBlBkF1NXu`-|)Zz__z#;$m z9D?h_tgFNy_t~*LqG(oO;3$7i8P<{2x~6(yDrURU)H@*CW7sq1FrA_gWgWhsDX$O7 zhcHqkp7Pk|$lQl3rEz#Psud^rBUGB=TB=`Tt{{m&>RETXSAWT}c=F+BS$dV;_KAnv zO|C!^^$yCvyfpZaB0l&1_wX<9^bn0J-{8S7#r?x$nO8`DQ1|LRPyg+0bkZ>gE!E7r zD<_crzalo+f?$N3aLSI^>fci|DB&=!WLgK)pWK)VBw49-NUb&245KvUZDk?0KN`N* zLCslT@fLYd(Gf#Y!Nfy34r<+qSsK?(K=p`v?2{k~aW9ODd7BS@saP+L2frvpxlXtVX9DPV$*Y^MgeU&l5`(!) zNV5-;SmOL)N`0T(V}S**959k3mU@bpk-CsNnaMc%s?(F*xoY?1T{QbVb#y@SrJs8XCcPcX40w*eKs3SN(IG$Wo@2#Qh&F1nHp7$YA$j(EJDZNZ!#u72uK6YD8vd#%wQS zU-DaF6K|@^SCSlA9@;`1?;x-Fh8mWT|FM$s&9Br`P0AbPVy!gV&dauRxY%x?3NN-( z@ym->tqDjSsk{Kn$7aZ3)IAMHw#I}i`W;cyXJC3-^-iP40apJXQ{rKZpioO^TiOmM z3U~vg1oxba#h~kURP^seVfL#;+un#Zv{0h-1XNfRObQedmEt!L7mf~G9U6FeiEa0` zAj0ytX2ix==^Q`nsRQ;}drv4#2jN2qnLK{BT%~C)J{kh8OGDsFaV(Ue7183+bE8)mvJs0S zFW)z%Yo?qmAln*M4KNzv3Fp12-eJHtMLa7u1Xcl*OC+Y*G~a;XG5E0aY_Mx7j(a{X- zO{mUq2HCBJ5re3)AzE*xtLWN^Qg_U|dthf*4rz4FjkCU^XMw0M3aBP5T-51}`J5&b z2O}0wF0JG;l2h*fZCwWag`u;;VtUXo2LOADkofiHAJ)`;YW5jyocO*VK&wDSz9;k^&wH+EgVW?1~wfg4hDXQPxq|5lSE`@GTfKp8c@M*=<3--Y<=*;&}Y%Y z3+Rh*&UG^@4>$lw75AQ?fBrVgzr|s_eQyvuyT&u?^Ti~X`;~}D{oO@mCg#TWw*Iv5 zO>mnq%i(LaAAe}Mw7{EXpnK1XJ+wZqB%h?||MNI1Z|9j$>&dT9uW^l~Y&^i5*A)G` z{>6^O2Et=0*RT)4fHanWqA$5ywD+L+hojndJ)LbL!0sg0>!^#{eLtkD?(pO*Dz%QNyyiLa+Po-M?yY}qBhc41N#JnG07 zM!e{!s+BlnmTCQ=hlyz6U!`Q@k-+S22<=5U!>%xIGe!+=KB0QY z)}y>Gv$XYB5UlYI(Yfqp9ea0Ey7wSUBEuu=iw*sX}~V$Zz0^X2u@`OTES66+BjJ#Jiu7ZTNgy zXL(gjy-~=J=eRs<>sL<5NdvCkg18qHrlJ(0A2#xwqU^dxA5m0vjK!GlheghD7QS8L zFOi=?IjP+5fvwV0Q?8R(sSD17f&QHTru5F)tdJfVl4S6Hc7A`oe25@bubBdoC6tD1 zvt~y_&09=F1=Xa<6pynF(Ej!pDa~7;dpSn4;k4lv5$}}0X!*YTeh3YFN@=Fr^rbJy zg@ZB=T&nMAX~M39z;QY1 z1a}Ced(Kjgtpzx7IJ#dYZ;oQJ8MvSgt0SCE+8c}>1+dC}xlq^`e=SWMZeS7dqNK7? z{P^Rf&;fZ0*nnM(lD`L1MUKrUk0yrMGMJuIabD3V-uM@pw;TA7tR-i^B#B~xVzhh! zuCw8`S{aA1(_AuFz-?GD$Gf_t!fQsZ56I{^O{sbg^lNpULCqwhxFMXkW%&=nmNG6R z%oGz(l$kc&WTi}uyYz_!nWAL-o*rpVzZGCsqLtB!5ud?S^#V5jpsx6e{in#(uqMN8 z@Q7B{xB>kV@yU|tc{*x;e5Oi@Btl2cWezGCUT%H`sVs?OG#z?n<|-BOZjmpjWOTu% z1E{@6i=&AuoC!#9TupUnxr%H#DkWR5kkDrrtcHqX^vE{5^+s zn#l}qenfgv`C9}~@?>BwH6I%7>JWYnMjmY7^p6uFT42MrpTvyb*Y{U#|6XhWR83D| z$Y&c62A-i0uJ;3O`_)hLRmkMe>U zSo}bW1>NwGqxk8HSwg&Q+v88V`=={?LM=V^*m4moA9TA1k*X^fzlP-c_O)x;+aqLJ zyJNA{o6?Y5JBW}SWWNS(7LgYTZG`72rWKqzQ_&?2{9nW`?8v8Z%dGQYa>!tD=MSJ6 zdDV87cmWj@!%ZwJoPU#L5)VXKLh+yk=piruGW?FNcmV;AhMO<+DW9u-}nLS$4*x+wJ z9`A)3VcvCs?5W=YDkbp90P?d;{@1SR2I7*ZERvhhx5GvshSJpB0bb~Q=rg=Nly)GE zv{u2p$j{X6u^?zjblMu=E{Sb=Rn*g}@V_FEIK(w;Lp?L1quDLKgm2k=7Xmd+zqTsL zD(yPzeH(nJ+YZ$knSL)e0#76>;g-GqrvgPWPptyJkv8mw~n;_E7KV@!lU%SZKtXdL9q7#7S!#S z2yG-N%IpVAAO#M86+EG8om1l$`rUca7m^bHHaSFr-Ddf3(zVmAg(2m-#;z~qt~#i= z++;l;iE_Z)_CcPA@_L1?J9Q%MlN>N~+}Hu0uI7rJ@(p8|iafNNqZ*-eE`8I~Cv??P zOmcwyPcNdLf$w!N@TEh0^r#`I>91z%?tFn%uUvGAJu0a zzlMIhJds>r~oQ?UbK^bAJzg5K2r00=Y(FI>SupN)zYIkSRF_7h! z8q@ueYv@J`!fheIggJ5M5brV1_1yiPDzr7IV^QqOfoafVHr*a!+i@Q1Rm<7L*Q7vCQx z8$o$7v0RwP3$kD@JBJIFGv*pS^5T#(*+RjD{U8@qckIl{ZWC=idc)6l$g+w4h;#<9 z!TxFv?>{Fu5wmbE48#8f`!<^tQl#7C`zg+>2ZR&xVZKw3-jba$#z>ZX)uKelf9F$* zHh^Q`opj3`4?NDrEQhFYCgk|RE^gy~2xC_j3U_&I5*#~wiD{3-=J15(=LxCab1fR?2{Tve z<(nA8Ce3g?!ZT3HgUeZ7*wlN;{IV5p43{$7=;(6Vlmho`i-A@0{+c=%A zwjh1v>8MWQpj=sR<7B(SwwB+~D2dxY2!ayd)&%TEqTWQkZcn5EOr_CXNwC_Zn6 z-f(|BtRZx$h!W+>k}hezlFIbnp*e8#s2%J%ov+W&OTpcMIP)%o@wF`lLwuP{oBju6 zBms~)Yk*754#JBl%x)+I_V&OHyqhzuE8o$$D)S~Pn3D_d_UdH`8OKEM;Ag~=W(f!V z!af%C@Q-q2L=*k1v}=lR0u}a&jm2!PmugG0@vz28Hd?+=B~X%0H#AKB4TWFQgk)Fu zEr?fWV;L>(moMU3>T~*Gp3QF$fkx#r_HvttZ~d2u#Ty#iGLO*@(`Pu>KgC?%mWVNy z-LV%iVszIsMp>P5$ohSi_MtQ_{EcsL+IGA$_HI{}p_N_1TpS4uzPY28H9p~&AXk(D;);U2e1bp#xUo`Cqd2#xHf&AUD; zgPBCWqjd#ykZ+W>6aT!1mLi*P$PSg|z8sG%=L+!~uf=u~&-8YAZW}^@Ucn;v<6l|= zNO?c};hv?_Y zxCnNLu6c0EU?ZdJkG>zo?mZ9$G5Y;t3IX;bPO9u&eejVK{`07=K0jD0dGVTiN#6IQ z5cmDCDgz|hT?n^bgGJ&oO4$X_-*WD3%;z*N5ZBisO~Cs(JJ9r}6-X0D)b--#RU>2n z-Zg@2e*5Sryo+XK6F}X=sMpqa7#-$o9n7(*UGJT{=J94Q+tUZ7GWNi8tpCy~ukq;5 zEcDksOa;f-KV`y$vTt^7pY3qHZnE~G(Z8#&E~dz%qB>NX4j&}o7xnyyC2u1-akrsk z0Vpx;Fo@bag$3zY3^LlcQ6ZqZiP4+FV%-_ZsMSC*Do`4N81Rrf`&D3^9Fclqc$vva z{nBJrRZ~Ib1s*zK#1b|3*bKptizUCzS@$_98F>GEyR2wP6%^c|R6+aTsYyq# z$kxifo(d9yKAX;G*6BMXT8MviO5|ZC082?*Wd5Wv;l)i8O|EOM;prX+au9ZVO>?d{ zF?bMH~EO(Md z0YQ`uE^tq-vQBahPUUAeqp|IY)jo(75{h&IeC7GaF2@Vvq7+v9;r zwY-e?kKp!g)Bh$~BTjF+3VU z^ywvNY<+iCE8a?nW?+WP#8GAZ`)pqw4F-M7#O1(W+=U7l#TNs9)pWsU{_dk}p{3$vpNaTBVO>@FyxPol8<|Ts<`QSCE<}?dG=xl!xCFa_SBJ z4w%t!oG&p`P#no$p8L8dVH4uP zA!quN!uc4ND4I7i=3%Of+T#s)h)A1Ggsu?+9V#(?tQw4guMzp?8gl}yRt1C+{CJdN zu50ojxP}TcDQso>yt?!=dVM!;@}~cNRqtKtY|}mX=`*4NUXLLVqQtz;Y%4ywz*w>K z&r6?PQ#z8crCdGipyh_Q)blJeSA7C2-o!%O+*(Xhll<58C19Dk#a-YHRyBOpYiTgp zhy021rmBYa!}e4!*TW)@x}*iquQh_$qclWzJF68EzLr5rUAQn^9`oBC@WaM;X1Ib` zuJi0-cVx`ZQ*RQ0oq=gx*0;2p%|zbkV3CjO=c^*&nGHokmvQdkEwaYwF4H)67v1-!usZdJ0|D}}szGlA`OzK8Yr`_hq&^cvB{ianl<)4P1P1j`8 z1q-K;M0l(9_1r^gZES{2dBCkNK))ub5_<>S$A=p8(G?nqWK zK38TC)%Ki1O*~bL(k?oDdq0r(4}CerxX{!nHcz>?K>)FJhb`PCQSRgs|3Ubjzon6V z{AskHsn|MHqjp2CF^i~6t~VJaR9Qx@m|56Yecbu=K*5_oFV;)@Iz7E9bO?nP&10ER}SJZ8(#9J6>m}vXn4csr{ zVksqZZ~m#B?I#PZjoa3W)xqcu5EdBDfo8-Wbn;#N38oDE3BzvbwwY2n34W3(mZ7{{ z1vIDu{lP8i>yeuh6<>-#``LGJ!&Wg?eQMa+G^cW!;coaEsWt=fh--6#$LfPsiK_85%Bl z)KKE>;g}fg_Ryek{DceSGqt%hd>-osgiiazmvU|k5TxB*X7%qt=h#IM$CA9P(!NyQ zXa~Z1^M@x-3|6;@TZ8c`JM#o>XTUhb0ozI~7YSUzLQ@}#_l7-IfAEbf$zWxqFt6$i zo4x7n#YwDLZPL0GpW1NuYvFxcmo=qz==pH}Pcb>H+JZ&cG;}N}j5b2>1V;b7^>cs) z3+}Te8SI)+jc(g=x;@PF4jTPlJpr9*wkccyreQw0>w#`VIL#yR0*VuJ4@gl#`r6?d zQV~ql?Q2Yn$w4Qy@N9l=*WmReP2V`YX7MEC9xpa@^}G}?7uD#$L_Dr^Z8$hUkWCuT zW7K_(T!rDerc9_SqfJsPx*iqG`f86Ojy*-+gvhIOJV1fw=Qa7A)|fEqkfMwyaM}15 zQGG9&iH@m;31(OLuRVj?@GP?VJs+;%gdj={7citXxx;*RjG%6u8tyrm#Bqe04tFhR zE5u3U-TL9F%5|_+d<7ZK((x7rJh+7Bmt5$w*W{)^IR(sa*v)~z(G`hDhx{L{JWc7L z`n19m)OY4l)Bhj>I{WsmiF7dkM>*97uNc)Wj#MU0-e0MhNmF4wAiE;g3}tN^_-gsP??U^Vvy(Gkp;(v{ z&tS|XLa2^gSWbwXE-C#nEY#Fuw_TyXgCrtCVrzp3w;`NYRC7Z?Q<>dQdx~G6ucHX+ zhW}=#ejY0cqtOX7s>rbYUcw377)Oge%gOscyyshqyLNAm{VO)p=AmaVZhSa15a@a~jQr^Z(9#2%E>EK6keB zz(ewwQ9jVtc$YWxPevRn8Tr6(e@xTes3)%^!(K_gbl()UcUo7+@sKG&kDkn`%H@2S z=BnOtx{$ZKE46-wPb!hlCqmC#n-T&-uhZXx)~K1hr&MXa_?EN~Q}Kf(5!D7c9zxoD zYp!e9`nQSA7$B4I0m72VCIHn7LTFp8A`_a<5TTE^QsDb9NTh%LeU0(bIwtR<_kB!1 z$sIZ-yvV{Oh8v9Tal2c&1sA}uZGsthgx_}!xPNNgKYyktb={4ytX2R0Gj6~j$IG1a zymfxsjN^T%y&2xCzLiui{(I+NB=%e59X7u2X@g7VJSjFy44Z2H#M+W7x%3QO%6n)$ z=i^2gHc^Tn4|-C|DQv7%Uv}`K9v>?U(h#n@G~R%oa1h{X1?Zr*DJ&cr`|EaH@_hzw z7fm_>Y@;d4cy?RQDhmD5dfIcnci+ zu1E0(mSYhCvBB~@s1Z#67Qy)r`O6`f1cO^|%@GfdSSGi>mjxm6E3#V3LSo}gD&h0@ zi0MJeMTcTUU9iK(7Mq4%a^UAvOgNe>gA<(b7tr6mz@?7X9}ipDOfj%MKmB6gpUK0m zTZ$t=x^$8M4<^Kint{2BIz~V@KbeP+*#zLcKhVkyb3XQ#PYj1&6i#~yL3uf)`nJ7J z(v7Vkiqz@fXX%fN^(`N$v0;VgZ3@8kf>wjwZ$bXLL{H(85)B(ke2^wunij8i^H2>eKP?pp3ZnRC2ZXmlp3 z{)gNLy#VFA5uL#T_D%2QuW*<9&m_PU`$uDSGv8)$p857g6~I4`Nv}emAGW<{xPUE` zZlM#t@~H;=+1r~Cq;jDxWGgxJiu3AiKeO>=Wkxw7?opP6{6gg09h# zF9eHkUsPX@Z15N<><@qukq;b7s>iFZ3(`sV@2olqB3Hf2blEu_alM$CLOJiF_<12vB_l zjAqTPdE`n7nNdenv&9cbtdID+Yeqp+A)78$NbO0lKtN^RRLl)Do@D|iuo zg`~wo!~@}MxLK;KYXHINm~80!8fCMuu1DMKXhKvP1IfRypXu%}mdqcW?K4N-0dF+(at#slR~7)WRaX{Nv3`&|{EvQJ@n9Lo8SE(G^{#@gkv(z1xel3Q#p@-(~N>?vh2!)A@IiF`xHQ&`%R1 zpLrsw((lNj{`}R%mMh8Z_P^O=bJSFESDn9y#jIOzP}ho$wpmown5*FfKN{aKoJmb- z!<*L4r~g!mv{}Fj;2pZ9aiYes7#bj`#4U{``ReaXxPQWy$LihC&Eu=7B6I}Rjb%Z< zC|opS{Pa1R%GTRrTgjIuE5QT@n0+QG?m7?u#N6MG;Lnl6ms8L0Qk>3}e3y{hgkm-*`2)wp1G^*-C2but+O6F4({*+h?iOScuf ziI^k*lT+-TH`|3f7dFqQP~|{ zNwnJlpIQmM_XTkve$A#wu0a>Iez1q<3q_Hqhjl%-%zjL9T?&8cDx&$t($Hl(2IS1_ zy4Pm<$96jPt_x5X+Q#CoigKJd>v{Yhsb)YQ1&UEF`KD|Gcj@DD3%`8~Fb zuRu!0+Gvjj`EF$S>d}RAV_I@h$s-{0ifK%{V8?+r5D5+ERKxF8Y_@MlkkY;+Sz;cS z)J~<81LlBT)g=p|E7I*Q*zR58+ljrqic3@s+A2lq6bayv3S zX59vJV7;Z>wwWS_tgh0Nz8tI73}5UKg~tgWEDr_TgPH{j-`tU=wlO!1RDq6brQF*$ zJ*Lfve{(h5AVdA85`J~MgG#sYc-&BSAUD~v^kqUvK6$Bc#}Ed09N8;L88vKyM=?kW z(A|SFZ85*NZzTR)KH2>c23=~8^;-M8p1S~ zaHUau%tTt{Uno1s8F4{2E=RpkXrgkCH60c?1D3*YX*-JeVdRXK)=R6tgizP8wZddr zga!XI+TxG%T!zJ!QZi#=jvP(w{1YaTkt-&U4jj-*cMfU)41*NAuFPr1=e@_X4@0?&qeqd{lJb9+AD6w%4Fns%Ev6Dj zPZE~K1AH@K5vAFWlLy}-WDW^tZfX+{Z|()d-gFYe1cfQo@%u`sP!-wQ`E1N7cTW)%W?DT=1u+! z!Ts+te|nneEW3KJFbnDB=e2#;M^y+^b=oWnV@j*0RCx9Hj_neyXLYC5G}G&~LfcAa z6RMa%PTqV+iWPjYN`e-ssPRf5c+% zT9oG`S(3XGZ9E8~8p?BnwnB?qB?+9~>n9rj1vqf+`71IWl)rHKDaWL9taDf9=c+Lm zb$IzUBVNQ;C+l|lMxJrh%Xe~?p)O0<|4u44S8@%qW-TuC=$2}^5`-^W7Ce1Fb9h~g zA{DD-GJlpgRfE#lz31K#GW+A6$n>I3Iy94w_CYF4P%-x-{0{H#NKGvIK5`p4+aO&} zSw*{;4|QZ1DL`A8{A$cg3^Kl!**5zVH=t2)$|F6&;;M1tG-n4ppN@Yh3=ZxVvBnrX z$nv6^;7k!!v2Ta3K8jz;0muP-G&j0IU&Qn6Rljm<`DfA-#crJ;HLI>P7ery^d64U^iQ7Qj;pO#nS zSm$VrVO1dyBRF165x;ZpZZM)kV;^F>xgS_Ld&6h6d+FGe6-lrE z&J_4@Yc#B7#t?4$-PLCwCsi+*@9c!Db-1#NI1Xj{WKQ|@GM~+G=ZUwcz32KZRxdr= zwrbeX>$=}Utw^NOb+Gi-VGG;nO0Y4VFs>|DL2hWo&6zRs!sQVMu2%g70vGTBNq}}5 zPz;IrOu-&KMn#i+as}%6up*^Yl)z%hzEp28LM^wY$M$6P6YSagAa39A_yZ@YTkuM& z)mh&j%JY+a%n!BAj>fnA|my zA@BKMGn=oXbwEoKaa+SP{JDn#;@F3xzgs)>Vply}AR=z~y%Z;0;>QpTPW$E~=$QX6 ziC}zz>ugU=NlBjC#IP%W)7ehgh?)V>j7n(9mOrK6a`i6lePntB%dT9n>-)qYzgW5z z0C=1zC{#4m;PX3lGbHi@Vi@sD)GAIPQ`z8+)DXLFGCi60&{Mv`o1}Jra`qYHPI^Jm zMKsXh7r!Z#pr)g8V2o4X0%RS*KukIRLyF)8G#`d~QsdEEfL&{~t+jAUy2ZBPtEpd* z!w80{*I|R`Nlhr1)8Zw;RXgi~8w3;7@F_|f#MXxX@bdApuzMObCAc80 zNX;Jf_uX!aTJ?I#3@q2))ngnraF+5$cI#-B)u98$Q@gU9>9? z4KhvNQ2fST#@@lNO4l`9k)rz&ibj_@&DDdfR_wkc>0g)FwEdpv6X20yu^Jl+l1cDFlZbj%#C9qt)p6)opBsH_*q zJZ_%Br$bLdaAS^=|7ES0c^>x!w{*qd_4RY~{JoRb_9h$oGfju^S7~#3t{Bl*uRMbA z)<nuhd)9qcDPoJ) z#)B3cxF=80`vh3UHiBq<2FAB$HI^y)sa+jdk{1>>%My!j@Who_0wV&_ni=T=fY zxX#sj;{Pj#qK7Zom>cb`e&9cLS!U`D`lkH$6eT?CTkWDM#0E*(OW9O|cI#x{)dqcUoLZb6?JD|D_i(8ihZPOmG#ZBuk%Nw<|x2 z%*ioL;rCc1yViB`n{sryM1Q%~PXV9LrUwBj@)u$bggV4O2#dvpjx9=$=kiAcmVs9p zq;K|PUk%U+z<2Gx163X4cVu}f9#onAa2-}EGiB}FCN>CY?wt@rMKeLBIENrnP6Jw( z6ilF_tYouG9fSzjM!Z)tCh}SUj}3q5v(bJGvHcXO?$W{f2w=wr%rQEFM))h-EZoyr zYe#Rz@uQD_08#H)Fg;~wKYX_1R@Zdo@-hourcdyz=FTZz;kMk&3r-Hl&F}2)AVaakpd7W8gTYBte|U zKJb?Fuw>biZ7`e%%pGMh=KN|qwG7?D7hVWb9Hkf1gPNA?n@0GIuVX_s^QIqU0cQ`^ zBsLNZ@}A2!Hd?y(O5EJ|g?D~5CG(r!D^yU~=6d0b=&k|xPXLRbBtB<0HFB{d%hnjy z@Z4r!`0{6m16)1r;}*7`_DcfM-G4NJIMm63aQk2^!3ZX?jIBF>DF5e*u)TJs1rqz* z3KiUD+S6H^I$o3H-wdDa`?uf6m3Mn1|9Cf@a7uXHY2t8yjA3ZFh1k;N#Xe65>3tEu zrse%!q8GPcx%7Is1zx48einba{WpBRF8p!C<9|!fiY$7mP;NcP1F;)FXGZz{+)86$ zdKEX0Pj$#5Ua&+CXw4>ZqiV8zVXyb0mG*JBYG&LE@to*0TVBs82dC``_of5-=j~(Q z$x4M-ZqW|n=uqG6k^l;>%VU#SQMy*pZ7GWv&4y}J>^)MJVJR-Wp&1Q_Oc7has9DNA z^G8%e`}Z>Ry!@vWkJVyW8vmlS3S{`8Lg6hUzmtKSH`>gZZ9N(lqW7ke$-X0*o7n!U52mKmt0Kvzd)ae zzxp$_hID-j`!>`PaR(W1Ce>ExMwfMs`u55t;7YuxoDVA6%{x&m>vNyz#JC4PRBu7u2+(~V>2btOf8yIs$Odf1Rntk>jX9_7N$NKDxMcSsaKY>G8SDy zCA;PNrG+kMy{kc%X*&bt)?Ar32~p?^?V6Tzz>JrL_p7EW%4V@xgxS}93}w!z9T!r`$<8> zaT~)a>_%Y<`PDl<3I`K%2j5UfccCWMXBG{~jKcm^X^Xw`ZSW`Ohe>&#CV}w-`>IJ) zOV_5~q{M5QpD9eMrq4(=!ofbfW&5$vm}os68X1J+dB9P+>>XoqXJ#@!YH$8=VTh5A ztKwgu6~XZ6$eDy0r$GxsKpMBH24EzEPl1S2U9ywd3IFeRfD^&5RK%HAjma+6?AY-W zz7KAZE=8{B*BYr}G0B#q`Av+n2JPg*8-zCz^hxhrt;M8#cl@)0hP%^<&Wby=o#ZGF zCZYbWaMU2f6?bH#KR8P|@}Uy(pifoeF)-r)hthAqW(%B(Yg5bPvg6Er;I{4Mh}a{_ zqCK`ln`zhw80=>T(ZS>1J3~=-4FxKE#Lqwe&f})X_+u|WdeNd#H!ef|u)UL|FEuo? z0GH3ZG|(bI`f1nG1J?V>h$vAB1BJZCddF^t@Q3+}KYz4%O+NTm;mHHuEoWjQDpq$x zs<#2^NIPIp&}CyVKhdEDy`~D;dH2fHM__jN_Cv^P#D{gK*c)FTc}nx1t6vckgA1X& z`>T~@dH}zOtEa?Kr|VOnHnqoH8rpDKoWr`S(ZUVE!(Au$gM=8`c%z4i8-1B-9!BM} z5QwX3&CDO>d6B>aOC$eiOk$XVEHr66uSKb1UQN8+voyrAE|iPU{$~`Y-Wz6Vu-#-n z_bB7LSni#CeMAZS(q{1H8w#2Kc$Hu-0~21O!0?(If||@=WGE8gfsVGtPi1?{KZVqJ zdO>H=Q&heRn$2XGP*EGpoNZ_en1D2wNR}su+4AQQK@5+MVZobqEpY9gNM68d^&}WZ z1A4%Wms=)wo7)Q=s_g$**=2G#GPKC&Z0I-btt9_aTYU4~C zJ72Vv!yvl&Aer$LuJ1{@;L>UaDhsARyxOy9NRU0$5+wli*zSsgV=^u4zDtH`^QiT{ER+3IlGv2|HAGleF9#u z{6^mJ=^MU~*~XIC)_zW-Zihrera7^0)_{B;;C;;iz+g;gHM}0>=COpjL(eT`dJ-eL zHM&SNHyzBv#Q+A3dd+NGXiL$GH*(b~jIKO1;%i+hyt;aDFx8Y-aOf`3PXx5bqohS5p+a_q8Z}Bcev4zet*$2C3hh^ zIWqPyT&kbjMc4Ak+MRjo7J|(T+`|jXya02?>REjTe{|eiFE^w8;`B6$RukgRoDudj zrAL)qc^RBwvP@j2cD+9G#~K3^tb`S3<}0tBK+zibHRgxJEWm0vEC@r7eLF_2*yr1nlNz37Q$S_AeY5k4pZ#8VLEo$gE2#3aOyJ96 zH?TE$^s=m4=T-4B&`q1pn-3YQU&uRIwuGRrcdDDOvBUEiZl*>soxHwO<)-4c zK`#EjsZ*p(=Vz_t{y@FVN1yp&meB_C@UA^(kMv;<$d}6vM8C|V$LL3U-f>;nEf8KE zcd@4XxVb*BSXvDw9OnRfkc#Uw<;7EC$`X(p?f`fp8if5_@i;Nie!On55e;LmRz%c( zz9?+q7t4(+h}NQ~Ml_9v*_zr~?Ms{ssJg0O z%fdxkcP1dA&SPLK?!dv7sez_0DT|h+0nDr3v`ta+7WdGD+wR^$jNol@Y*}xKEyrVR zFo|vbhLnkwd77$GcNMK;7z7=H$g&MV#{z?O+K7vn$5y|{o z?nAO|!>VA$3uZ-Njj`S`GhAHd?0!a`9-0u2s@w0cWv97rFO2jW~Z3oLy(@)66g0V zFtkf4i8HM1o})1jJTxY{Y|GFPbJ{cY{Yw^Bd$?wI2?|y{hSJbs zMC8U_a6Vb~Pua>hc;($1zLGut32O-(>2YXHX~mA{F>@MPqMdd2;)s(A#5SeC6aPe- zaRe0o?t#^jynz>~ifmWE@b{7BxgpiiJ!c;f-=W9Ld4s^+K&&yp9%>oZI548KYw9VO z1iWtk(wF^g@+J3gRb3_Y*@uG9E6H@kG416py=m6E>g*+olbZ*Kr{}WcrOvUd-vRhi zJF7a@nxME146$qv?^aYu*Y4HaEE0$>9|jiXQ=sg(%k@ujmY8)patUB z1t$%miFZaa+0P8=*a{mtdn+GyM0tc2uizuYZa?_IUY(Plg3L%Z!_*XY;J2;h={B=- zbnvt|yr-joKuTmtWx%(~wN$GSt{oh{56);HZiQ~1#y<7P;4_l(@^wEB+yh-Dt6FmN z?f-^mK?UFW|A@NsK&ap6->n0EMC2}K&aEYKS90#6+~-y-Syy4*M@1#%TF17|k7H>G zxx=bN*pRH7$bA!=BXsTfb~2eoJ%e+ zSN!E!j{qj4nknyHPnDV(VxZswP~OO_Jff}M8)`N`Ll#m=8&!>Pln7@)QO{Y%HW(F` zl-D$gppH`!ho|_z@`j3R?BDjnOM}W+b|(e$zSZM4A(MB8IQ}eb=_q*fVRR1%a+H+& zKiv;|GB4aRNjtOF@9G3x8s7Wp9peN*!g9}p2kl;4IXxE#6elobwo3fjc;^Az6v%6eE^9Qj*glS-2H9MtoRzh+thSCvOSeYPUN5?ZV{X5cg+=>v*5w zpK+kXUv7`Sf7q5Jj=}@ipf5}+E}VEg$e~O3q;L4zGEx0|EpUcRX5rT!SUy-&*M5h( z_ESZZ>o~7w@plt4@XnrQ}7|V6ex-sxoM?$W-dXU=%f8f{?}xu&a=SC3HAde zLw{n~UzfLoLhHZ@=B~5F(9%7nVX6ODcL)ICIHK~NYiFNVb-E46i;G0ruIc=u8Q#>N z;#SD0I>QsY)O5$H>ZC8m5tUDAgnwsNgYgC>FG2O_v8k8!HM1!6hM0s+C(;#>WyfE-Z$NtK*)*X1dg?JkPSFsq>3$N`&D zFhbfee(3!Mx;%^#8(JF8$)P8mFIJZi3)%r{_EbY8A>boCyo@CO7GVGKoF9LJkND{6 zBa>e1T&(7dK5`Pq)QdO_iadu8H#=0Whdse-KlsoARz_<>xFabH;{^O#wbIscHuif5 z5hj<&!wjCjm^Uc#^MAkm5haGU7Tz5M(*JfUq3rXSGFv(^K#Pgoq`a%oz;p4l0rr8W z6NmhZ%WjO2%ky-PYW_{oE{REtIgfA1h8_5*4P6Eh48Gez*M^qD3 z^&^ecCjF=+0cRF2*Wn;|Wr(wvA&n|aT?Y|X%Qr#Wl;S$1AGPQO3zVI113O)LrOega z?{T>A1Tkw+1*vJr({`k!d-MfVUQ!sYch)GIKfcI$aLx`qizec|LBk;E2rUWM_LUOa zU&?7JgKA+5WG~nArH_S;Od6bNH$XW>tQaAejq{#(l(O%0yf(fhyWLUIW_|P`5SL|t z5?3#B(k%M)Y70W+lEeqS1>TrD2!jjI&mMx#Ql7IiV5%VpnZ(TLc?VXoy}UZK!T806 zNrlkjyp4&X_`?MbfmgX+N_0DyD#=DXy;(^;`ZIZY;Z}nq$iD^Ri?h31) zfyZn6vuXEK_pn2EkCQ7BxGJO1vX&v0g06V%;~uaF^~F9LN;N4>(<={JZ{lR%Hm5f~ zzC26ZW-(-*n>KfPg@w8!rQpJqutUW9&s?C^d!1|=--BCx^wk;1xOiuP@`iS>o?8)O zx$CUW!bx0`yr4=YbsC-3@>4EDKNPCk*kDxUA`>$#4Y91RE~n#B%lU`~4e}3M^tl(d zmi$mF_91l>XnBHNj|>0GMY#Rx?5;Zp&Rb-8(!}aoe~m4qL6(JWx*La8$FqSQWpnZ3gvt&t#Os7Dt|=`9$x`*?{p^l{m6BkgZFZYmfL0VQ*y%`|602rvqZW+f zi`WU)AN6|OJr9R!k;^IStXYUici5HWxH^PZf~qkojtq6o>yS``FhvB;4L2sT+KJGp zFcfa-^iwy7PptM!H!RF5LFF^`^JyoI+pK~v5u=I~LAga4*nq|;SnT03Vb1+XkuooR z$7?)mxXKpz{D)r*MrvibeNxt*K z7ysrc5BE9Y8J-AlRqQN)7Fk3lO2U;~bpts}*Pw3==u_cV`o|0O3&HWDA|^^}$2XM0 zOYrnb^jW2uqZ}Oa#HfJkW6)&N==`eEDO#N`a!I}_I{`MV5|0@_6gTf7)yY}o+vAw|C0MhHjNQO7!9qhhmlxRl< zfJ`yPVV>Ff+l2Qm9;pDEe{gKbY6W8L4AK8=>j(Go3jA87X~DM-I+6<4p&GttyQF!2 z3ZT=7jn(51hu;07uo9t|L!-p;aovYky8~WjSa{56GJvu5;xLYa0ho%xCg5FP^4ZS~ zd%pYqO_S8eV?^5@DOP`?i?GiZy2~#>OTl4oXf)Mg-hjnd+YSDUgU;n2zi@|yL!f|u z-{6Nvkun-*4RoyvGU zA-Xz@@Y>;a8e=GYI&&5@d_g&dA{84?zCc<|XL2`zyE6aRU3<_d3;YErcvt*IVIbg? zp9XL7sLHn#bO;je02d>nb>cz@Ue4u> zQDGZ5)pd@jhvEI52~8D)9AjGZ5>Ef+NJV);&8BjQjqY$R*FZRM1%qqoc+zCtLjY1| zQF_mmGoQU&Hu+NkD!gqeVswLOJsE}*{5ItZywHQrn%G=yS3FeY^e?#)r+n%;2yaD* zJvZ_5dc@HD4Ju|S6)%=L7Mx_SXt?O&0X%7@RxL}PB%ygS@HtzR@~xIO1P|`)hIuGCLyUe?6%YUa2Lqv*7fT{ zm&T*-h^=0Oj-;1{$h&(XEf?{sH9HvxU~wBY`K!J)9}n_^zirJ5^W71+>PKPr?7|QT zG3ba1{|sTZ5s1q+ahUn-lY6pgS-9)f(E`ozU2r`>IR1yv#Z20Mbjo zwjXW@ql>xaV9e_Kxm&fc_{zt1%F)k2YJR(2%{pr(#OXPrWGhw&^<{_@f5%Tp-=UgE zF}SFPMUqk+Y!eQxG>Q1c?@yE@QDc6}6{r-$F#8!ql|?d0K*r%w)ESlBu6^>`LZR!p z^nMSGpQYjkRp^pLGv!)FpdRPbkwaeIL3ebxv)<-@1d^E@P%+Uo;60%UxI_lQ+w&gq z)y*y65Il2K(Iu}3uSRcPf;8^gE_U?>KKUbn<4=wV6}YXqKDc@R3`iJ6%@??xtVi(P zXk6uOf=~w?UG(l5=`FHe8AuNsm#V8wD1pzpMXZ&>z?BGe<%Xe3MFd{^HVS8CIcR^E zGP&LcCCmrKQ|2s0KH|ufU?o#fNAkOgj|DJCS8&ZJ@x@QVO0$`|e8)Z^*57=p&&>RY zGk}^CqC8@epNpPVvhUm}(K{mYBD z;=Fu2swCimH++|uk)qKw712MnAGDB2)f@H$7Od=b*lGJG(m;qW)Ct|KNF9;>y1+y? zYpU-bsgY~VVZ9Z-SOg}T7~XcN>@tUHVZ5uGY#HAlg16+_nJ+tJk+i;}pCm_Q8WV(c z6-&nDYa&v-mFvAAJO9n_Xr4dpcJm{sKQdTeP3nlm)<5L#`4-d&GUiDTzGM=F8zB+6 znmh6>+X&&jfXyn1O@r<<~%LuIBmc29~NL1 z^wSZ}Yw5oCQF-`>UJ*7AGDl@k4+r{f(q|10(8*XGJtlH0A0P3jGNzkAT$#QH(J=z4 zLVMrNR0^IGt}mhHGn=CB$+?mg!8-vu@)~hw_!z}Tce34ns1el)H5omBSc;nN*f2g= z@eq_C^*O|4;S5zv+XTEq7X*?DtIi2Fy2Ivz9%-_lc6m&^kUs`J5DpUjU(9rhXbiG5 zfX1ZZvhG^9FRHqr={Dsiin?Fggr@x-01~(wdD%#1N>>>op^Ly;*vRH$ain_=XvXf@ z-~*Mso#*Dc3tdfh`0_qbMpUSK7uipcFDntbD5ACyhr21VkUM1WkcHAXITW6<_!W^I3tPM_9p0j$>D^ zZPnEG1gki(YRJZ!R~d8GmsGdkef>SE!G~dqCc~XY(sbpkd2`HW~*r}1HXL11O zWwC!?r@bR|-daw`4A(4TOVd}-?#m5C7^MDW2+8Qs^3yfH%Xjh^Py)5` z99@|1(He*~A65-b?A4~;<3{U@jpaMMGmK0mz20$3gRS{unBbR8(bj_zsLDEE^~5B- z9!paIyg%Lyo`W4{fY4v{r5HBP9`#tTay*?huFU^s!yb}Gja-}6vu0Iw)aJKqF`(Pl znYr#oTXGXS57+}64sVXrdO9V%bJnQb%jPz~i*mSu{|9-nz!{GYTqypRXq{8ILVOI0 z?kGXMXk02=gursfd?_0eK)w#ra7$<4uFYN8vaVnf)>pM0QXj(nl=9)929`&DSMd$& zG$PQ=4mb2OFT0f%f_SCac^GDuU#>{FVHKCY(M2N9Ftwly#+caXXGb?zYQw(Nz&$|* z5iC{v9)ZTsHq@nzr~{i4a|K1!x0g-6@bNl8c|;(mngSP6w<3t=zL`Q@YK-6}Wk~1r z8PYOhVVKJcv_qR?S{i=;l>0c?&NX29KF&JNHyz~(N5ba%9q$=@{$=N;W|l(Ly#@bz z0;+EEje=eLmf(HG@*svaP#HY21{5s^b5`Y`qRwB)-A$gshhToPNu??9DG9|>?5}_X zv&j)8lRjb4TdnC(IBh^+spmJ~m6$B-G$4-px}g`1|82|?wT=2E6r8Uaw619^26Jn$ zI#2B^N?@q+lm#N?ImCy5@oN^*>S50xKVAYJ0}GKf3#ULGd5G_%V$XgY#(N(kxC2OC zDIzB*Ha;(^2CBn-cvg7s!epC+4j*SOK4N~uQ%|I}1IH-KT67d_IfPO#Fo7_q?HmGB ztSzrP2Hnd0{YfuPg()weg(8oD5C` zbEA$AApAY5Ha`MsRtpi{y4o~Ba~DyCr1hF`{0L_!fq3D?BYaD5_S>YSo8UFe_6lGA z?r$kpg=IV*B~>pAO4b zHDq3}-9Z4zya1SLIEum*!@fQFFb;rPrRJ6KYB|J?R%sv@ROY)(zwT3i^=5 z{X6sn3&;E(gQ~F{*u*{Od%1n(=_sg+**9<(^UV}8AAl69j<5CWVep%v3YXC0EWEpN zh_1hYb1d)0pajJL^dsoJoAemDkUFC)vUQQc$`!Iz?imbsyPdlKE4Lg4waF@Vm|X0Y zu3h>8z{UU>FLdzPMr9!A5XK_O8UO0rtrl}#c^6I*sEGlM1F`WVt=NwcpbHvR^)9#K zI$uVn$w6HEhVb9H`j%yO~m7#Xq~&TFZy`D+_ea17SK@EiLkcFH_F>Qcg%N!9x=EzqIDC3=F(+!W4{8bH4G? zvt?*_y+C|=3$)+9-uwMS4dE)dC^7$_KEXNFXG;&YTtBc%tq)47td%Y2KGS^xD$E^| zWmaRI=TYIdd3qj@Is7q}|6Bx8J`$2vt_VD~;CO&1Gc4{Oa!$_*7pIaq0WGAMT1ek3 z`nq{P%a|{RWDnX9J0^Sz8Tw^l61q9mS8=?WIoX{;Eq4xaCgZV2gLa6pd$KJ>cMG20 zH`otm_yKB&_OB8cdMGtRG6+U&Y>D_U(Kd0xIw?FKCvk|D)3KONI2`(Z$1{5n4&zoo0;~ zzyhvV{BbLD>$hSC7g@fOjqm9WwZ8~Zj8c3JUBbSYV+f5W#FtBtZr5D^MXmU`?-#Cp zS$z*>N$>a5+0^2vF|UH>{eT{(*&Clz^h5;j=nLYZz&Z{Ca$g}Wv12yH4;*?x^iPLR zG>-gC_u0~eW=+B$SNbR<8uU3?c|07?1*Csr=Y+?Tr<>jUU|#0vzmt{=KU1;Zw}4Ps zE2%(yO~tRRGTJdVXS{(bUG)i?mFwzGc-4SEfx7vAHh9CLisg58DNrAo(kz37uI!y& z(BqF-??-x>ZfhG6etDUA9O3?MCZBPlyx@z^srOHyv-?-SG>-2^Rrb*KM!suN^)z@%tuJuMpkbMERxYJCf?Zh=uf9Jaco`kI7ik^7ph~gwZkf0V23bKmT z-L371A$gc3e$c;2sd9)22Z#zc-LQMAAG#|1M(9m`MoK^<+`66EnzbZrs5enuXy;b{ zTYX0GyCd_$wdg=D4dg|Z8FKk!;VNa=chOcj=gom_*4*aP*CBnfv!7V`)n1IX8es67 zrfTk^Aqp`saJJsD;@Rvv0MxJS4cHt`d25-*t$K7k8t?z=Y1P~0@>Da}$zjOi`X2Ky zx20pfj=Y)tWy3%F!TffW1Fybn*MS5FFac9HLc?VJT+2mP;Gnpa^!1il{)9Mhudfda z5Vh{Qgz`Ia1x>3{ucV<4fuT|U0Ul}z^CzfttB zlfe+-76%L9(eTOj!0OZE2f#5L@L5{;Oi+ zPEEDW)4QhncMzD%$U|$@w*Y57Fl9-m@rb%%H=tiIUr@NuZN=_<$EXO!vhF^+S5ekl z{yWzEN3nmIp>yS`6`3u0i(`a$1(?TcodAt^>!(vvx!-TkCp5GK%jdh`Ul9JKS!9$07g>0;rSkzE^yJ%q< zx)O5U=1!tx-%_8@9|Y=~Ky_?{pd-SuGeExYqrVaL*%sVKTq4 znro0$Vf-gE(wP&+64lG3H=aRsW=U(l7P=QM270eN#V6^8 zo!so#oyjvJ@I|~$KLZ(;Lz}S_zXC&?jNe0Z;O_{4x-7Xb@qmGk!EC7fUC4Mja?Yg% zhG-)3Vvy7G&I)AROK4f`?*ha@v17?XH|5mBz7j3y&VJoEcg68XT1rRry#45Cdz({r zTfD#QYI6`U6W}a&(_QtK9iggAMLqmNY%PLX!$&cbQpGE&6XyD63iqmg7ZBzd_D-ot zUrbA!gpIU(pFY&QV}<(XL{HjwqR>8A53zw@G03rV)Tjs)njE`n5m}v54RO48Cz>E- z0xvL&{WLapP4!By4%9_cJ=!~2pMGCF#xsZC))`5}CInvb#cX<#@}D-JUC_Qnd18bPygh>4~SayXwORJ zn`P{!SNbcJilDNEFD1^11yaJPm!)^w-|FtC6JL&Ru4d!axz$!g)0sM{_SLVhFTs1$ z&90Nv9X}bB9~iMu}JDe%hbbz3VJUUwAZ+ zx3LkDF<_NiQ{r4K2HFsa<}cW-`?F0h2I~MFA#_Vme;@BbJ&~#NQBsM?f?Y)#O#ri+ zB~dbEi>TF$aDN(q7$1}sj+p&CdXp1KP(iA zV+~KBlNU=9rBGa!*hm@tf(v~Orc9mX>h@AfC`+wAOGO@u3O0q;A^TN6cfn-}X`r1G zb=#2oq}O9(wvcJV2>AG%(w6`#>PTPW^q0we#jn+kJwLEc6l$f4M2JBKcJJnnteFN+|wm{AK;G&Cqr48@}+^^-ds=AzLXX2p$cYrZ^ipQQ5-a>mB*(tRo84!*M%TtW+*#pnhP2-bF zzOqMw2p@wLUOL{XC1`#q27jJ+8L{U6pgvS}6{hYqT&we^(O>NS5dXndToSpeUwggboK`_iC28Sdvw^N5}`B&l}C%nrO zZv}=$;jP!$kPj~+yPj^BcyPC7oOCZL5H_pI0Eq>Tt9RaMKBOPFOJUXo*IA~ZAGaZh zE}QR){Pw?*%jz~NvmoIvUHc%cdW*Fua(UiBk7L-q<3sZ+BVau|;pM!JxjTQe0K&wg z2G6eRD+PKVT*F<|ENML3zB&5?;Y}K`_L(L*#o<#fyOys@p`2W=Ck`Z!<`x}8ea~z> z#&aA(^}ZCnl2wqcQZoe__Ce!#U>02Ui?xi=C!jrX>U#!;tm34by5^nMQ7V-;aS0cq z?f$B|eXA2{wvHzA{H4jfRAmW>7r>k1hfMCo&1nPdx;4>eVC8C}^X;;Jub*dVrK zjz8#*J~Bmg3cQ8-zI`?-^^B#t!Jk6Y@L1ODX;zeFyU<}A&qWoiC4)77YSzxqBh`#w zgUlvQU}guf(yN-PwkBaQR-o!IxC<)7H#Qgf`SbDEU<@Wh_%*N%m$-`~HFNUtM%N_9 zKKYea$x};gtcwOyoU5Pl9i9ro8*5p6cMcT)LIkzUMjWpkY_TK@cB(#(uWz80(fHJfyG4_-(HAP*-Ar2hEW{ zlkQvIm=gYdacU+p!_sVE?wV4XR%yI;3H$y&^(q@6JqJYMxpanx>`p|p@@Kb)ZaI?W+22ml0Y8qOV)x1BG~l|PfM8{dCxDgNe^;FWEh@jF7Fveln(b%xgycMn^a%f=vBj?=;Y`_W4>Z9V=k@w zd+5~3)+3bsG1UbV6?4w_lz;rzIzq86IxE^>2X%Z-Dq9tKlHqR?pjfk|^fF5=HD?QhtfL zj>0{Iw2WJ465lDjlUE8-Rd~mdR(&BxaJ3`wo~*={3@1qV%lj-$^Z7&sp5BkeM!`M) zP6dCWBjt@cE>*9R+9$P?g6=GT&TA@2bk0omPg616evsAi!5yi*Y}J~Cu}$IXFlfan zpw@rq&2E15C#UsJP~LxB;6JC=)xW|P|E*K++~UCHvKX?wrY*RKM zP+cixd1Gu;LgEB1@m;UP+9$22pMs)3Nj4v3@C9T*&V*E7XX7|KqV<)$-^~4x5-EW^^|2BHU!Oi_+Q{&gA~}@#i?sXR^P8m z_e=#5p7{(HxMI}JgTTWY*zqDD^{s+!@`C*t^O_tB`h^D|RTKSJ>V%{`ZO}Xyw|d)h z&$-%xwq0880@2aRzv;j6aQnx> zZ0f4WW(gbrr43*fK;AR(%ynQr7 zjoi{omFDIx#HB9bgnH!ei_Y>~ysO9yTMu?bB!QUiupc-pAbSJkd4^bs@C)!dvmLHD z1wqh2ALa4Oar(c%RHnaqBrL`IHvhlnjwj=t;5RRJ3>-}gA?wozU}|>rb!wU*Fu zM@Qc1n0NUucQ3l9_6G$sW_THxN0=>^(Psz6hMZwy1i9^@DK0FIX!@_Ltm;~&5r{as*bo^YhJtT>02GW(gN^h1%X2+9 zt@|Y)haw0O%Sp_kPyIP?OY3#{Fde@FQ5qFMG8g~5kDxevKg?4Qig}Q`En00CFFzH_ z^)5lT6$xtmkJ2RbHXsqjOQy2C#uiYUQtPdqz0KMkYvIRLIVN8@fb44q=w zliQ!m#E>AuVE9_4`mQLEstTfM<59L^Zud=~ls7=pxP4^f3$5MQ`9$9ao@#fAGP1TzugqyU_}E zK{Ao~-p@08;(e?M@ln`nfI8!rX07%LQ3DfcaLkEI{=R#(MxOS*`X*F7uSoIm!+z?p!L$hYOQJ0(^5 zxiXec^t^0tOqk;M>NN;R13tU{befnY{`bP9zywwNlZj^g6-Z8S91S7Jn6`apQ*&*& zUxRj508j-@kA4W2DBZ?wTWA^NqQe}VoSXWXJ`SwOlO)Y}rn@VN9g&vAOs5LeNP!uL zarBg=HGGO~sN_?wr0@Dbzofv;*wS-Cd0m)hV*&dXwuV!nJQg6MgA}X0#-n zI0w+7|F~@!??@_if=&{2A?7T_M?7kW>(t&UxgG@x!U`@UZi4lf?Rfrs^>JS@#*^sx*J<14s$2SBo zEo}6#;q=aP**-StXJY@h#NirFBbOjNl7r0NDi6VU&vrFd_*7WQm=`t1XCA)9N2kfy zbxT3ZgIqa`ApG!Xq^#c5+141Dmns1E0EQ2J<`#3ib;|GS zdrTbGjz@fjj&z2SLkqP;zHi!7Lwrq$^it2Lk6Sp0KP?BT(kwGGoxxC*m~0hjey8HH@;C(tONITUV4F z+5bn#)8He&x0ixQJIx^E31;Sslvdq%g7n^a$205eu1y>SoWhzJQz?A^2p`_z8v^1!G$#kN2(? zFkn0qwb+`|5cHZZZ(OslJNVSKtmcm+N^X_?{ohc7XkDHMNfDRdv6o|U(%Cp!<~2FJ*|gHtGgKU z$fX$`i)8X+VHmgLe+0%vKK)1vB9zZo_gO6fjdFd(uuL!<$((zl3^`)bK)=H2yAq6G zo#HR|&LC4|r=IUB6aUnNPxU-eBDQ%WC6nvJlK+iKxdqqZkoX?sNiBTO2VZF|M2D9);6~==ql{WLa4_<+bkHOEQr1 z0ucaZo5hy`-+wAST}6uhPwtfnizlgbXGNn~t#Ui=v(q(AOUc8FX{T*oL(csN4s^W& zF%~#gZIXT**&VG^m|*Fe8w7*!vyi-kAhba)&#snhnRdOKz92BYaUomi1RX>KX(m7$ zCjEjPIK?b6+MM6Up-T%TkvJtt1zh48ug5$wt zx*rePZbibpMQ+*=wFqIq!voQ~YXJ@1s|TAW=Da&nq!XD>zWdLx1sExju8k>vZ2Qr@ zWlpm;uX<0>*7%wC@9qtv4+9#P+rSLs6InxT_l>44>PMFD&QAX7ND zTT`^MUF9kACK~v44i3Vhx>|Iy&*PBI(NCNt4_E6c)45uW%w3Im;&+hrlx|=`J6F&b z84?WLCC*$ZQme2+risz}iR^ze)vZ8?=3y~e$0%&kwMR}&KU`_zJiHanwMYlN?Q(>l zu+ah6>2oPDR`qBLr@OBNRB)tJ`%?6$$jJCVI_W3Z9{x|-gW@oxU+O5l_4q4#Tp@0R z8&m{f>#Ojg)jR!9MCXgWsQkD5@7SGEnqYI+-TgI=)$Y}KIL*D~{`Fw>GWr7u+J;w# z@+}v8iEP0jiblH_eSQ!?J(p?uq8YSUp&ywLy#F~P)Mm?VXaZ0wIJ_v9T@1tB?oU^! zz?AhRos>*eDYezfupbWuKMI#)fvxl3F|1%QQV{6W%#;QhzEJ5Az&4^=Ru#;Pb0pbn zV7KoZM!qurr*MUjv@j@7zBgS>qoFaZq3bT;1&CKc|3_3U0ik&2oeW%kZ}9(CRntt( zyz6U&PGzNA3)i>nalib#Yij-HF^-Vic5g=J_yx^pTCTbhX0jlV0fvh!GIG@oc>W}x zU70Td6e{2QF8XBx$AXJ)ZF!=U=Z^=;z&XN#wgsVHXt5YBL{{4H zy9DXVO7wAW(35>n=$%**@xvWx_G$XRwd2j5Dn;Hfwv>%+JP;-Nnk_3 z7cu#(o&VdAcZ8enkZ;-%5Xxhyx@p1>)(I^P{Tfs`;$*TViNv#W&Xm(5S#hqVovH{c z#@6{kRbcMW=YsTjyKr$yw`P3~vCu^fPS>UaDR(I4VMKqlT$(rm7n{7>ViS@!PVuRA z&vzlj%E46sJA8XgZGYWe|6ZV#{lt%J$$Mf0UC%l;LL?P{*09}WO8Bc7qQB9g^gcmk z>H20->ca8qiBbM7-2FB>*ZT}7LI4y%NgQEdh41T0`^h!H4LU0Ajzp7C zY!FlnDVO>EHf-SeD&4{km;AU~CR^z>@6R8e+tZ7D8{Pju5gmS=P_v@{5&&hue+h7u z7$-9O*f%;*WGh1D{#rWyZ+R!OT9kbD14KfyCd)2)m{behbZZ-0M6CQl+7MkMXt$v9 zKlyRb{YiCN=m$swz=}gj0JqXVRdx5Cn>`;dl-&W%HR%>+d>3HhQNPv zT~7MyddMp%B=8fBdym~hLNFaWL$%TcN$mtAV-!q5OY z0(#(*B~C-fd^13PZ@jZf$e0~TS9#@%v`^h9{$DPdZFLkc`4znVdc2!K7safoAL`jztZ-s=z4^fM$Ky{(pGmiaT>gD>DuGm9ZGAKXYzUYa^E~% z2q85V{oYWTm+;Pty95M8z?#GYB|)g5IHg)hCv7nEz<;O0^2avrYNVF)O0?6yJ;6MH zSdPb(kTUwA;{Z{^{TqU6>nKLvR|K;P3*QwJ!x!ed9~=iJ^I|h&N*n7tPyTm)%8NOA zSt6}%@0Jp70?4B0C{Aa+ma^(nvU;2Xd9L;FxZzH%K=p*|ZUpFkQZw*l! zl>`L>z|#CUflq}w_kDvuS{&<|o_gx{hQZ#7k1Pn!J;dJUndc(+ptH8=nv4>2lpCPl zSHI-+S<#*dXa@Si{MlIGxn?rRMgoD9}WDWDt}Kh`>(I~|R7)<_SE=G=Oft)RLkx+;sUX^N4vTegV{Wis9)_|6RbbS?f)lWx} zYYA&T^eu}6KDQdSdtiM^(8v#&=NAj#o{tDP_usc;zB>Aa^UP`ckA1XF3Xh<3N0_5T zD9YgUq2|1P&`mbpK!mz0ync)JSpL|8F}islx3)})XN z>{x7$dM88Dd#WycPfjVPB|p9*pt8sGCtW(13ws(Ms3Ta8kTFc^o^_^DPW(hmBM4_h z3zXcFy>00tcsYfzrR+TSW=~9j=Z9+FayTpTvH!O-!^KBHEiU>9b$3YOyv#{*+%lA_ zUE#S&(R!6xe9^@^dYZ3o?+AOII7?3}^D&y?6}O%(MEwRsU_B@GZG&RHpRnKj%Xe0{*41z6ksFYxdVwZD#LX zO--_soXag&F6-`oFQ0~VXkY$8j}d~6GQ#G{ae-Gk7dQ?NyV(K#235LZFS-8UThqRq zp9NI#Tw<+z6m0Z?QCi+EbA^!mceyNvlq_K^?qPYIs=s}G*W!pf7ogL;)>D28lZvE# z*_FZhqX=qOS&#Zq=xx`|Niy!+ZYf;=>{}FAB1KR8%pGkhDSWBYqFy~kzrdYTJ_s#M z`#F$89hvw8tS%0?1u*Ri_=q3Hlrdw0wJ_>cyGZj!Wy78tagtvw>uz?u9F?X0)U*=2 z*klJG$)O_=3<^*BZ;5(5ZF89F(p{_Cm7YUMEvxDh3O~JAo<+%h-LrzmBk_}|eR^$E zwI-)O;7*nVl+EGYB zl^S1!^-lnJJaDA5Ah1i)FLkOa5@nZcqvW*vPY16i&pZxtMlMce%V^KLlO_jzQ(57Zx7z$nEQ0 zXaOgCX$x|asaUPJPJx#+ZuU`y(@L$fOrBI9d(RWh=SS(1a^~mE7g=3mf2v)rx_Lug~i+dx2dN~hcDc`3} z;eZbujvrgxwHlnxuD2P!|0t`@6KoHE)g3ZHlu0=rNl;mt^!xe{KcvSSfVZOa|&&QDS4GN=J-qQ<)>B)BKj^Hq-ju6hA z0aPj%Ok$KlTxI;XYd$J3jg$9;te;V86on7%lgwqG|4nbmy@c*$O{%GkfY0WQh~|7sx@g<3I6sSi3e&}8 zw=%()A|Qtno#u+{2+23#J7&WQaksj6uAdd?Q4uZ&7rjo8zZP3$5!N_rU}VXD0P!gp zez5yy!1{ta9lQx$uYh;ZQhPUn{mVhRvLI&a=p?IR_7OP~n!fZN|28e&fH>$9&-?8Y z1~zcR6X% zJrU)4~^>` zCv54bMou+|%NNb_wCYH|yYs*bVuqnFe?*`FUYGPJP8!AKk}3t>sbECKLx?uXF{0+% zgjB5$IRkC8)<$gM$(JkW^d8ajr&#KGFS+;Lt_p|BD~Qs=Aaepqv(I(PP?lWtHj+ww z8b@O32I;RTRU#%}b^dZ7XsAhlOi*cXWmQ&c7CxV)uy-iU^sdd3RQghu1t_XfoXz1y5=rc(OU?{1 z7U6gm*3>rz;PRt>sYA;Xc|FTAu+v1RmUOPN8}W?S(U(7fl4;<_9(uYP3c_Vo@`Ltj zz|5=^F{*$Wb^I0t0u{PJ1v#mVCOUbj{3FX85;4wRVxMN|s*vaMAYnLkXB_E^?>m7K zD2js)-k3k-%)um3@`C>0jFWGc)9iz~EpQ4#j%DFpuw zP$XhWv;I2Y!S-`@E>SQFQXDRLgQKrIrJz$lLWof`O2|K4ZY?|pDKs2u_7MUK65I6q zTYZg6%`I<}WDzBozY^ihowbf{bi=k<&?UjCYO1q60jsYw_&zw}Wg}wpJbc|No)@gK z9)Qg)vapvy6%B-XgGUj?4QrLO9A($^jIKLO1?n=_8f!Wp6)||RVySs*&vf@by9$}*WeX$FABPpvv0K$oXT^Q>CoU_a9Q zIjW`JO(CZ&?PFjNbc%LsoRB9*bDrqqp>X*!P+XHQ*Wl36quwBw8!M(BG*JFwSSTW8 zDV(jjWwOmU%=;t;O1$^riT~u7R#NlwdD)L1-|$yjxyw-Q09p1Z?Bhjqfsp``X?$wO z0Z~q+Pg8cz=2P8|A@2*1*Vjp+$@j^9nl}|Pg=WHAt1Q7oHVo-qub~CNh4j1(;7EJy z4n+FxpSa8QgwpC>uZ2YW(!1}mTed5G)*4;&)&_T9{n2+hylG0BHPtJ8B`jX1hQ zl)J7i*A{+kTZua~OZ4~65fln4*C`V7JFH;4i*yWdL!8Lv{;V7NFOs%=Vq|J~tuactqIx~pxQlOLl0tIiH zg)1||L9{4o=VYN8%C!i$N&$zAZBi6cNSt@FN39^Sq_x(=Fs(=buH&r~fF{XDQzX9X_~vIVc- zB_t0+ni!-dmdlnkx(oYahWEb=dM}p0FgK9Wi&@FO2*&2Qi?e>Jc$yq&WOrGq0FYUU zkemh?4It5~#~jp82MOX4sx0ROZ&p9cdKq}$7B0pg5nG^hnPtS21rV(|@Zu*0i;JY- z?h7bM0xz}h3drfj%&ep6FGA9DX4)cLIr@A(qBgo8i@%%ZPNg-D*;qioWVhijDAVy4 zi{t#fZ4SI;x}o&PENuv&^shg$0O1i6qvYw<51 zVBG!#nwm1KlVkor2#CuUrW+;J9l z^hwY^0kug-4+hcSAaDJ3N`&4SGR2G%^=ndvA_RuFO{G;7bSTG{+m|cH{2mL7awU~ zat{aB$;ke4irM89NCKaMsy9H{OJ`8FMwTIXo-<^Jnwadp->6Lmh!qh+l3@arMV4leiPI??$YS%Yt9m6K&JNmm^0$=N|Mmyl`n3X3Ew>$jXX;(n zW}p52YH~+gx4tqZBL|~q3wVqvkdLM4aBFm86$gAyJoEzzcgjLtNAjRFBR*e%LDw2K z0kcM5(HJux($Rc>6TL`w_Yu?wL-+Ot^E7)z%wMbZug!_Ayw`+41301&ox?=|5C}8H z=Me0P>_+0-{33)jgEd3;_Um|6{%?Gcd)0D(j&jGMn_aG|l-Ez`2Lhr}hnGPpJ{%;9 zx&UDX#bt&QOuwsmzB!6I4u>~#)SR(HE9ZLyR5<0{q}pLQOtNWqe-qb!un_6PhSGV2 z)RUH#SDlpyWnQOlC#apI8P_8ovmxkunbw0?1l*(kE5K1RNKqBGEk9qTs&nhx@IADr zC|UMC40BE^ZLC{7+CO*hyH{Zvk4_CAh;^$&g(JY752^-%vLo+-5(}*`sxFMLt57q8 z=~&(T_7leMTRPwt3C56x^`r>SVT=sy=HFPOh_Tb2!^r0aAhTjWPN$44xQ*-0f+Wv!%;VhNfpz5e(Jmw=n zx<1CI{(vs%wL75mO2bl4U}@_{R$bjH&2tM8xd|uB^1uc-b3XQ#_@5pMVKP!sS#!U9 z_>?9X;MLi#%o*s$b@QVnG4sm+GMpMdAKkGxGlWf0#()OOG`A#0Jsc)KlU25tVwnwwa%DNn%vtoUP@Bx z#J|?GDUK0` zk6H3{urjXtY~nzAiVN~X7O2po-Kzd$dl{L=bd_k zry-2^&F2oRIrcH!Qa$?n`us`lvGST}(9Hd@?B&K{ZXR;^P@LpFue2|veLQi6bwXOj z;=G^F0Sc6-hjzf`dJQZuoGmg`J8g7wJmti=&3{;c1p*UqV@JWuocX@@bvYHI3;1Cp z=eU|Pq55k*45m8=hIl2jrWBLpuR7Vi1B&OUh02#cqnnn2cqKg^i$$hx+N zQ++Et*9&?-Hr$PWLK2yf;b^l9C?V+aE2zPI^iuUUo2I+Bs(&>lqs4D+ccV=G zgSpgd@a^qu|5x32KsA+hZI9!qV}nstP?`;p8tEOziWrIliXa350YQq=10Z*4m}cSB0-6E`1~ooL@0_Tp?;j0J6>#duMU)-G>4Q5ZMHdENy~3fe6cOo# z42`LR(v$KzjHJQ79Pjg8U1w~@o^1*>5 zhW)#bzfKBdOj>f*NAG;KX#J_nKUZ(x)NLmoQ?bwT2@x*RVYCMy?M;UBL=fn78wA(g zy26ri#P^^Sbwy?T#63%BtsI_b|={9}(X5kgN7o5|zw*0oXQ}W~T)KPW! zBcX_+>a)6yg5G`6GVcfvCAetsl8;?q{yZ+5N>w%?iOx02;-0%pXrY~&H5wbJ+<^)~ z_pvpDqCqD&Z$`20-c@_x*7R3PBe$l9VG~gU#tTW~rPbsIq%Sy4{+(efI?dsVuUqQQ z9gsI0&Rm#I7f7DbvazoBB7JBz{2oDP6cNuj)ZIjg4A(f>pZh?T0iNI&T^5M|*B6!@4-=ZxOn z8)kyecjBCc&egwNp;eTw5Z~Wa2wm7){fc5EOw@(5JUGRD+Ya;jnods`{Umn5Q_m8{zNbg>F*7YtEQ zjS6MNm76iUd`_ezhx#wQT)r)Ib-FgK@$>F5trjVg=egL28%6g(=}GOL3(TnH;OVBt zU0YJGyUP>gdm#n-C`jf=2hunAJuYzZ&@Yj_!)#y?z zkN2kg!R%7v5p3Pd6V*SKhrYf-kB&|*{&XrN_l+_(jiY$clGgEQ7d9kq4@d`EH_YCA z{0{XQtI(^49*-T8i&b7t6sOhnYYaLd{d5n}ayN2mdk6A?6O})?rX{gRI3eyd!x|`&m_wRN$giwG}b^so` z-Xc*?gqt{}k=LE_K0O23xZ2U3K9Ok&Mt1qy&?~=H9|5;fh`dnTE3Z3FnISk(kY2xN z9Fz3F`x}ycS+?~0zKz(HGxYAhdjHzR@&--KHJwmJ*OQ?UR?14eFY9s}amapOC~GRQ z88(up)X5#*zB3!w;`Cy_&#(E47kZcYQiS3gFY@dnc!e13H@p7KMbGcA?7WeQ!Vz!; zi4p4QkN4ChB^OVTGc_fo_{{Wn<>23tqf2B?NyXo$-9ha|fCB#b3S=)~d#G?(6f%yt z@F6}s#g>oX38zqYA`;X-j_MTv1!-y};nhjyrCRc8?)?`j_^=Le>}i|tlvh+PW$a``g0#t6TL9?=qC=YJw%0G`;_cb-q10)n??mX?5|BLfXm0ez8&8elpSn_x%=%4}# z`q+!WoKA_=^6z^df-9zsWT(5Rn~W5wJ)yPRM6;#$m@Yo7LjsNVB7jnwGv5hj^2U;g z8A8d=krH%*qzKXdR_2VDsf||uy4K#)~VHG{_(B z5;W(JcO68{Pc=P2bK;ip5BAFWZD9}@JZdI`wCfoXIw>FRJX^Ur&}%UG|4>u2mXV~}s{+r8pPx)c@VqqUDyZp+I9no?}8l!&k8Lt~k$!*Sp z3=en*iO(Rnz7HP_(S84E2IKR#`7QZ4Dg5TevsjtU&tu6t4jUK+Ock$%Ht#B4$)gvw zh+N8wW{XVeC7ez%GY|Ga)Qckh)VqDGc5PJD<%#W-yJ&~Pjtb=y%gxDIGDi?r=tx_w z6ycYJjT;Q>dR~gR#HjbTlWE?ODRjbdeZ{)mC0S!7pKQyc8%33WZvZlk@3;5Vld<>A zhWbecqgJ)bB}IU5-lf2ZdPnY=7}HZEe%~Q)S<$972KEv*sLtLo zI-}iO<)c*ku8FgDfY9fhNbu2`wouuq1V7J56rL^k;FR!!6oY)b@XeWPIim}4bK364 zZ#L*KS)zzD{n|5`VUMPH%96^j=8uX=H6nq_GQBn?32*U6y*+$7>;3G$ZZ(c^y-M=6 z$il^PnHty*%u=Mu7Db%I*qvORw>N7hPsR(4gjs4PWW=^F{;`p5qJ2FhVTAHj%@j>= zh=sH!~O*|LNmhJPqYeV$ls($>Wj5+G*v3Ko5w?80s!)a zTK5yUx;T)yPKgumWzq`BK_%g}Dn&N5q}p-z23PQD^R>uBay=SpG33+R^d$?DIK1|uO`EeY5bZ8zEV|p1P;`z?&c!4baOKO zdRy0+OwDeR41je3H+;!Dp}n{VY~HU6JUJJ);%DO*swE%irf#z0A7EKEi1fov(TZE% z{7^2x=y`|H;9^0vr&$Zq?N2}Ht=ffs&y^RB?k-TOa}_}F63seMx9$e`%v(H}Crdrp zSbDIWJRmkBw&bs6Xu8~U2&E);>~+bvi+>byjM=%B?3~yL7B;9+%yi_Jnul8DRi_QF z-(2iPy|9TS{{2Rw7B%ti2mW%sp{pVdZ)k=vXW@e#xASc|Gs|z1}%A3M@&H z(i`V?Mh|=^q}aO1ci%>ty+%arocJu6{&j6wIgTpgi5w4p$ZsoE1x;$-M`d`^BU7sXVOf59p`9o=^MF--Wk%fm)t=iuT>zwRDh3z@ES#C7zXpnW`vkn2B zbBl|!QBH4iaOO4>WSLh6A6>Ugt+SaN?#}GoB`T zqkTo`Nt$A-TjT~w*ij;M--2yo+B2iYl!O(r=7S`ISFR11NbEQvfiAW|LGdo+loY8Z z!AMEz(tuG)nx}9=p2}9O!J6o8DZMLtPZpc9SKAJ<3#R3a$*BEphN)x1B8-^$0!Q<4bUA z3==w>c-%$&28XBg9Kac7@Wo3#2z-_YP=oa5cK4Vd)^3gO#^9f_KEIy^$BGadXF< z&y}Wi&~lF>g0enUeaQ}9A_=E z3~DBaG0~-83DHDfkKTY|PPcZh#FhU1%er>r<;c4?g+(u9-aD|cghlIC7T|FTEy&84 zoHiR;hu@Ir-lWq*>WR1D@tiqx+~S!wx)8M)e`?n1ZBx~sT4u3t68i}zUwinr&NG%A za4I`%)`iKLCihq`M}2Pe7A9prq1_&BR`;f59qO9aL0x&E#dwBZ?%VQsT}_$Wh#;N) z-$(it=Y}4j*>M$mT{*d5>&CiNvx2Vv@nvFdI3vF!O_s;I4d|pacV{G`h2;t2*V?;# z>O=(v{5UT)tqTyqAUhV+Nh2LPy0{}nqMbt+qu#c;uCvRIX6BNJxtsC7ty4Y*kGIg_ z-WKASQT5tY-J{dzbc%Y{{fV(nk;d0vY%8po>2UkD!OrJVkJ2#pV;tM>{?1s8%SJSp zYh06h8N5FMk#}sPgO~s#@00$rU_|NJC&k++6+b}un3C(Q+x_iQL4c6tWA{@jFLXCZ z5r8iuBE=|!yOF6+XiX>)q#yT(l`(^=OHl}^4aG>{Vwoki(Hf_Y&o1Lvq*Mc6^-GbO z6KdT8eHmvraIC*X#;21VDO5jEFd9mGYLO-uVtzuMnpMzYFE>})x9$=&Z(7oBXIIxJ z;y2rQywkqt?CYC#AB`l0u@BAlZYXE_*{#D|BWUN8dkDji#7Gz89hsYJe~U1~ zS$$NQsb8B;XcMC7cyEW#ie^)P`NV5U*5Cx1?_(lMDPAQt$Z@^l1aQk6v?771#i5`_ zLT%qav0SjwGE|Y|K*7`Asv^}7a?}k?xs`-Gj)KM}Xyq}k^39jJ^(D1=5pU)+o!){^ zs3C!}YDo1-J-)s$tubK$6FkEhJSDGkKJZlq(&k9>eWBh#RIT%=>Dhyv11tea$4zl; zWA2LfsCmU`PntbSWFkt<$!4f1V^9OI67G&B;^)hr`ZsBE!jl$K% zz^fGUr!3bfpHh;t;ckF zD++K|MEvwZ4_7pzImOmAN(j;zc*nfCWK_SaUYJ|3ON0!QfM1Dj=6_~V-i!dt&$oTw*Jy#ymKVbq9ZUk!)0r1V3NdqVm!`ixK+KKZKV zN+(24Jx~UTXo)`6oQr-&3p1^P)`yVB9#_7du<>U&&-V<~0*gpb>!GC=?K({CNOv8W z`1cA3SIrf94>o0<1_q5Oz>iPdFC7I76P}Clw^-nUyA;y0m_CAJc2KTG7I(tY+p*hQWR@FTQnjh#Tl*c9qbx+K-CFHZTay7eFyT80nV{p)9 zdm!Eu+(w{O|JQtHpctytMsd3+lbHT^8LGvd6NyooMI(!w4};#wBm=he;-aG$7o%ce zn(sx}qAPh2)?N-Be38pV@82{cNx8ox1fq)^xy$Cvy`^;XSx}2_N0wP+b4r)A3}uUA z0lUPTkyEqt<-GCG@(*5#30`Y0QBh}?u0aM50*sK;dWsbz7DG?KC0`w!YY;@U_hC@? zIaf&UUc3jTcFyR<^YIcJI*x`hJ+uNDW7{!|B;Mz=q_`3JK-)z-5mcF@HTzanMn%Hb z=9jH+^$N{tFO;hRe<%U?Y=zHNd*qitc$T4;E1~rjFfCcjcSKEnwsg7fKHig7N(vt> zXtC43`YpJR$e|4j4S=#GM>Jn7m-WPdLBSECD_(C>QAmQbOz9)bH5s8PiZ7=M_c)M5 zEGA1^D*gbCjgZ1y7Pb^SdOxVV!U`CSP#ycS?$)UyM`vTWC1*!Q5g#?e349<9{&xj( zepb8;Nswu{V@%5r;GO`2=i#$eKJGKqY;}|D7z6i}F@pif516tJp1Y=+k(>BN?Ifg) zOxze{)FZY*5Z~zX3~mm<1wMgXb2w7LAOBXOYr6T1Oc)g6mM`nKI=I{yyxA+zv>6Ie zV5gzM;(KlLMeSytp(yCbkM_^4;;y9?Vcc=Rn>=ap zy-(uoV!p;+Wx2@#nLAVHO(@b^A?Hniyn7Mx^CLkBqDexl)&vD69q^PKteJcRU8+)_ z?=@slTKPTAyY_1KA)obO&xV9ns@o^3D@ql+-P>_v98jLj-_;~J@x>lBs&-azmAjKU z1rtOpAH~g-RGg{~#iCw(GX6h(^s2jw0zo3TQ9FkHgAdcIHQ=68%@EA zL#R*2AJiO4{p`k=#xXEp>xAi_{JRPwd+csOl=uUM^`z8m0GU&s?S+r`~{-0KfbXUtG?^NU4`KL^LBYOWNFQzQTC$<^C+D!@cC3Tj${ zkfJ~wyw|6FW(|LFrx(ptS`wpIjmJU_VG%!WUX&QUWt{6r9)?UwW8Sp2#Ibo_^};z61=_2FVaui$In>{* zy_r&ycrF7j=mqRi*f?O_EHRaEVU=YEt{T4PvGN(?d)Qh5WSI;g(c+zFX1Mw?L<0ccAsIFTs5dn&88d#|9DlgQ;q0X zh%IDSAqPgQS%$CM;rtHHOlUz1dt}NnLiQ{2{8-z_683c+)P8~3)h9(TCM zfvqH0dPs898FMY2agiwHvfq3mNK#IE)9C~G@a6zy+HsZ6-;jlJ5mX<@X>A|5yp}qh zVVK@<)W&($pxUU5bY+uG!BF*qPv%o3E~4CL94-c~slZQq=$t1B#!SOfe2Vhh*;BVC>_L2HdOwFkjl z-g=+pq#H%fdY|Ie*H?gQU?`N`U0ZNl#rCP-W@s}B3R{T%dbOqzwS?uXy;R8ctzOt( zqe~~sPi%#t2Jt90ms0v^?o8mH3BN%?8JETk6$%P9gBdmyw=pWcOB0&6pVx4_gN)!| z(2Y_#T$xg>EPznF8*!+``}S%sfEvUc0C_`#TT!nw2NKKXr=8Bh@BHC`!v+H<5R!U4S9aR+qu#u7zb)Lqg zXv%I$)YEPRS4cBSKA^{!XF2=G^A!YijQFeIHsq_$O0DmO(HF2@zx8vQr%<7C!sMc1@~3WKJDy9xI59^rI;JSoF4-Cul)|Q8c;#z zRqNs>C$TxUhUwa*?=I)I>A?|$ zVtG0VF$)ilJ1b^N%`nTh5n4JcUisl$DFv*47#<*f+}E7wV)6@!OVYcL+DR zU%x&o5A0sU`c0M?I+Jw!5ZCg9ai#*D^6`+;xjeF!GolEtYh#$_t3vH0`TFTybQ?6f z-3>z=sZYriZv7DODoISO^v$0MEWBL144qmXs`W$`gy*gTa{xbVcbs{V;#pDPgucFJ z?M6Mvl<=J4knl^e6t0|h?bQ_m1@@0dEjlD@>I5P0g9fxF(T>JaiNW6xrs;pdt&MmL zMH_yjMzV$qa=dq%iPua~H2J9CA((Kb(nzFrIDPj($wzU>vOsN`w`HAYhY_#|_&06X zBtzG}!m@N-7@bTYOr7EvEjX4YtLvO!$aerA`uUU_&l$aHUZIP^Rbe8)A8WTgDD{I~ zDLy5|>sNnV)sf=`31I6D>dShVa6^x$(PEc>rZg(DP`bzcc8@YsE}yeCLG{}dsCx)v zgreA4;+naGlf$p?soEosdV;2zk`y$VQY7-&&^y+t6vx+Lvym@zp{#h5Gl zyUwS#2(n$q;OYY2K_dwW>3%4Y^seEZVKJl;$L!Xi0QjK?b-$P2&I-SV<=Ts01z_$3 zqcl>BEL8L4@fha{*LrlsqBp(p5nMX;j)-0RCxY>U`KIx76auU-pm5$2_%b0%+_6S;O%-MrlTQqnUz!O9dWSLscoT75Y$JouI&bU?7dQr`{kY*Lr1RAMNr zs-78Z{pH{ox!HtCF7Xy5gHQOjVlE@KUy+bK#4E_eWfZNK;Ml%3dR$gN-=OT%O*|x; zr)J%R9!WVSC8KU<~qh?#SbPK@WIf_bJ@iBEJ<)2DjMmqiG#!i_Eknu z)v%JwgM@8v=2x0hVI}5mQlbhb23}}1HMwEFWX9XWZiXV8koF-0Ju7aP?xMslz8CAF z=$wEXN!CpX#PBFjSOl7AA(p2mgJfBa-$hi?pT69+ytmA`#IZN;GEwYHRnxWFQ;;E! z$A7|>H8pEX)>Bgo3hyrPjVFK;7Qo9~`IIZ|rBKd=w}7dGkC-}h0PYPeg3Ki)gYGJn_DM<&s>oIk&9?p#26k2; zxlJ<_Ca(fV5!+fZpQ-j5L}%a64 z*LB}c^YGz?Fmd?uOTWB7KBw?bDi{5YVUn5(@{AHZH_{%PNTe(S4N8PMOmn>flo6M zEl?C96rbSyC3sY)Iaj?K6$#CD!F&&FPT1_)qSH~-X3^C^5*`gKHMy?x9cjSN|-J$bN8!6 z;wD+fFjrN!OIZY~DkTKZmJ?*2&&lyPA7gr19{=c(MgHB|dzWDh(xqu`>_v9TMX{$9 zBV5yRsBj2ogpM>Kljf>RzYoZS7l-hCmC-uo%Wfy0Sq%lb0_^_E;$!ENJ&%W3T&NGS zayb}_G&87Y!biiFOcuxcYG|E`5p;6#B65EJ6DFDIN@ZAa?dScscZ3xYJ5Y0_NS0|x zlb?0Y6rQc{Jd+w#+<&uj<^dEqBrcmqr;G@4mNz^4SQndCiF+cWOa@5eT!}|_AU8`djwLGw2$_-soU45m|-hymK{8lam z%(S%Wf)&-bv@`gVikg~Gn1w;~KuZ}*doWn%ESCC+bjmf*jjy2JqKH@WGMkSAE1B!1 zy{u{D6&L5Qydd$jT3gROCKvW1mRtqH2jhoiy%jl(GyR4yIqw!#Rt7aF*9!^PNu*-O z*ulrn4Zd7Fz370%xVq0<*818jo!lyZm!CgzJbr(3Qu!|bc%WCL(bDAcpzy>59=R|F zn|a!H=CmEWQu|adEO=g0wN~_wMY~Lr=pD%IXrh@ted#VPLT$6rom~!}4F}nge=?@_Bv8bt>H-3bSmr#wsxRE?Je)PJjKG4mB2j&$C3Y^{e)iCx!EDLC14 z>8Mg#&`^cKeciQ0`cUHqH;+F_{I+RGkdz1dh1%!F7syea_qg#z2G7>?H{aU=_OfK! zg5`QE=ca><3W$vkH%HCEM-X7=^2ZCxloL7UNQI559ri^eGt&2|$=e6@WkDa?Kiu-{ z_Y!BE7ah&ZN6E()@anj@KpTueKTY4tg>f=Baxy~K?bWzvc;Z3gCZ#dkDj{e(;J7Kd zwU>8a_urnlN^cSC8^OW4bLZ<4X-f3$H7TRDbS=kugPj>&^z*ufDD=|U0yR%<6TI(s z>@YRL&$pXefKcL^VzV$c)xC?K(^UhXrKX-)C-Aa^;d|i^cw~hD7%{k1e5UZa zW7|oO{lN-VpE44&qs*%QTJ|;M2LfQ|JHH4lyWqb(ml)&CoT#oIoGPj@#9|OXL3Nq2 z%I2X6{n*SL%{$s?xjfZpp<3OAv(Xdm&S-;a(6pw?_{+@boA8h;E_6myaX5Q(6XH0ueJFahRjfPCWM1z%jE(#(V#dsR-mwX;v}{7_ZXj zg_j2|1@6?~?;kw)V%COOiDw5U&Rk}jduStUc9}nZx}Jy|Sl!JAYu@_X9)CuAe!Bj2 zD1P#8MQtq21^IkYml`>5sy3bENh6YEmOr<)p1C_qcQ`jy8CHi*4H#D!sO*!Zy78jH z_4dG{K``hscwKMh7o;|k`@2e&M})yy>ghqnbBzb@s0|f9xM5KL6m46I0vFhhOD-SS z7E5ouF*S9`c3-fUjxEVLUY--de0RYhOQokjAtYrF5sF?;c+SMmC)PI1XL6q(KHq@( zxnvh22!Fl)3e8zL$vLl6y}SBV03Uy%b7*|UVbij|G z9gKyWC4Nhz)ahc4;37LS45?UTe$?>slDq5;$96z0`H`&o1bl6DbZg5VHC(@QhtrDQ z+>F-@nk&=AGuP#^YHYaBh??IeANgJ!x_rqF+G)phBl&rcsOX?o)SXne^PwX7ZOS!CkfY5DrBHIW}XxFRlb=x>=tdeJhi+;Cc`pR|xUrKvD_Y#Fh9oToSb+b-t`3cQ z;GG+YevI|xB={k`z+Uqh=KP7pZ)QMa1q%=tq0k7mzzUO4xMlqemw{KUtcOq}Tph8Q zU9Zkx;P}cMrAYl~XxAUSI))pETZSsG_Xu7y{uhK?QwnYt>JGHUhpYBv>H*s`bz|n-zYvmRGb9n*3^c<2S7iACuOF%~ z30)KQp2VMr9e~zbzy@CctXK2*EP1nhT~Q>=J8T z|7d(zfK}r&Ee4u`d;?yXz_m8`#*h9CtHv}7DDy86hM<6(g>k4rf;SM5(yUHkiQu1M zBv?)gPi&ap1oy*&XN{xqii-&$OYgM-lBK~vVcY-B!jM7!30g3m{~Rq?wlzgyNdEWH zuYXJZM&kaPSr}>_!rZg^cLiw>Q(^ca^R8JBHZ^4Xb%cKO9Dp~IaI5TOMvPUw*TVn5 z*Hu>M&M+DO7p|fOzhq@H95lo72o{G}B0~??2+CA<-6Pf`=syq|`X>_@7KH1=8?%>n zsaZ|}*tvne@Iy4;k8TSOs2d~hS_t}=LP9OW@~m2THC+4~g#5=4&GIqW=U1)tPvH7N zc%T{#JBvP2^6*|elX=X5^Zy|W`-L|q>#i~4Ke$Q_^YuGSIEXGVh^x_b-EwOL{jY>< zDZz~=TGnFQI_+S%SpdU*tpN=EzzovNjv(4?@B!GI{{tbJ0dOry!!1A*SsNeVpI5v7 zF$6LBy~oWvX2vB*Z>Y8Z zcJxDUn%F>G2sWV5zm0`AufaR@>j?c%#RST+6ooAfoA<{d4dxcJ49qQ7ow1wGWgGl@GsovKc8W zUn#7jwZ<^k;JZ;|7_BwF{wOlbq|hv4-6MYR?*F!hAuofQ1z^Bptabfk@cxfz0oY)) zSQPsaEtaP6!_^1|GIjF1NBMhKRQ7CS)gh$t<3jCbwTiGWZr8yMFCYo4Grc#riZTAF z622o*!|D|)mBDb*#wy8ZjY#3jumetm3hivIebgf&151n?$t8AKG?dN=TL8j&ME7EB zxZdLHgbQ9=ywB%bM6i`HKNcAH(q8>it*cC!khC&?XA;?G*k739fy>+2$^k*b?4ZUp zdiGm1Z+Z;|N~c*HaR83<%hm=o{-&@F9>%%6(%S|C1A@xmeX)r&(rSJgVd)DB61*R^e=)Gwg!Ci zq%0!nQ*Pa0$zn+CGeO|x%y9vTs(tyQW~s`80TRihJQCF-RwXcH|ns|JUJFa zdI_<3r1;CLmcsGFx5n=fyHBunnHFRuEL3F}0C!$xFy_idMr)wCTq|RF8gr3zhTKy} zp&DgDZ}?w*4V}5Yktjv+;V3q}_Hc{^!a0ASXK$J9VMMD!Q{@SXnHJVm3ZM}R<9u{?1a_oe{qMCj*aFzifd~ zV!5_!Vc+S%IJb^AVsXQ!-X1}monq{?*8`NwPKtQVS4%YF@8Vr zzwzF^aPp=tu?jp|zieS|_PjTJPTN63jn5~h5>6Xi-)lJ^Zh_Y+A!~pQx`ccteTE%Ib;2 z*l)dkKa>p9bNmp4{7V-5hwp+=8byJJ1`vr@9+bJmltJP`ElsB4NIGp?*x*7a9N-f8s%XspDzB_ zKp(-(uSI%CT#U)@$JmGqtauLD$@VC!R@iITcSdUUPp^%43x)T7mBnN34}g!$${$W( znE0qv?A7=?RxIU*L&`FjgHJih7&;Y63=9>|srj)_ERpMIDGrpS0^9b|vZ3}v8+A_# z@%f@DY;#Of_wfn&L1HI~Jg~^dNq@-*05#gD*pg)Q9{Nh&XmgxXA8~=gn zn1@cl(< zGbqk?*et(IHm}&(N?^SxgDgaCxM13PMYz(WXmnu#$T~8ZdFcG3QP*FE!Y3wkMT+GJ zv8CIg^HQvcV*CPMtD-p2)Nxa9#LLT2uSglu(s#E|S$x#-kd8cNL2JWld+{cuq&yp^ zgPcQG3)yXR*nzAt@LGD#?YHiQ@_WC%rlIzpX zY@|sW*~(2~i0b;VK*^nod!TG)mY3xIgs42ZUn4SHFVN72)RTyhyhPg7y9e5;h1O6w4Uju`7E3*N77xL;7a5uAK4vEur}3EL;b#?#gm8@j*C;v;mRg;f8w#f zrnU}0icJaP)E|poxAMRUfy>s#j~v%f6;jDjiR@0mPbw~`yxg7Lu>Z#ckF}ciJZGJa zV<*1oN+bi#wY3@TO6~Ous5|Rj%3u&wgZ!7&EW4PV^GgbkuYrymO-RprAM8iuaqZ~K z!nb-=sh50OBUy^P2RQ5~Soq|OinFG)iy^9LRx~rgv6enL?yAqTQ&kZJCm0|`sNhL6 z%u;w6k$MRcJl;P>zS0wpcsuxXa{hC)HZy?v<5k#;D3V9jKRYEPwiX8IH5zJPLes1* zEl|On2yKtXwFM64(nY_#ct4FmLSe^u|Am%Ec!_TW#&N-AS=8TFFFX5bf=#U94IIs* zo^RxmiyZ)?N>ldEMki>|Mo9AnUwl{=@jmYKoHb(r=iWLu*U^pH(0*i%W4l1E)4mde zmhjfV0gASE^Ax76d&PO_IXq^9qUlt@zuzWDU2&9iz)J9E7I0lxi$;NLFzr_4R0Jiz zoR*UPb;$*zt-p4t?yPX7daav>Ly5VXZ+KR-Ff4|qH|fSl8!`^59IeQqf7|0@)A^Z;*YQOSAj=)gR(im-a&oCJ2}!Kj$NU zj0Rq6^E85e8BFPBoF>9wAy%LEj9r$XYPef;6o(Gomd|0+6`bl=uP{k zy|?ng-L=Yp6M%9rNk%Q@b8)PmHse6{@xNFoia*xG zP;#Zs6m4z-j*u-%WMbqeoqGBeIU)ZB#}J@XZGl@0ADuzJwU9Pn9z-u&q>)j?-Q^$ez>8m){T zVpM#N!IM-#d$LUQKBtw^QOg~8J(0S5AmON_-KHC0H`7a)CkCYHHOowib51PAm1lo-=nym8 zygV3Q--?EJXKn}2iZl={L!||Uzs*fdDD~`fVe95yjU%oN1#^FD#%9;pbFUan{8Yr) z|2vS!W0;WS9Gp{bELyJp*Vi@olQ6t%H@=w&{)_53By8GQgb#B^0)oTfTq{b=nxw38kdZ+0;!3Zf>1oOY*{x}ve5$)5P| zOU0VMmRRYLTr9JKoNm>}S8?B{`pfP-zY=r?fh^y(Sj;H3O`7a|k@LL}F%3PHqL(^m24mhZ3i z{}l*S29J9MO6rmsdyN7Ln`5D!fyT~{FA&<6{P3Y$XdH>0A$Ia+9OoJR@Gg0a4)eg+ z;_%Eux5xh3!JGr#9;=2K=rH%qna8BoR$^tqiPj1vr(g4IVDs$pJkFn1!E+I=itNt( z+jg{n$05k}MeQmn!R7*^cVBF72qlhCSqm;(&7jc_YVBH7;>ZUmC6_>NYMFPwepBBs zfy>vrfD_&^g;Yga=}}yy(w^)zqHx0}IcWp;KhnLV3VF~Zc1w{<+m2mVWEuoyB4{70 z>^!!$igZA*%h4?ixKsIM?h5*4aEyO+2r>MgGTp z2gSt?xP4Vt-PDm6@q2X=4nieCeCG!j zDt8s3VWW@bcp>-JlGh*g+rZcg{P4Xnk z^ASugY>$D*1y3kzx1wyoQHSYSAYE>I*!a+r$qp5v&2N*r=vrH$!kU@oR$8GT9PgYS zx)!b6W6T~7aSWW*`x5)?^S4W=3{KtAzCL}^qtCv- z`r4=i{Q|@*a$xW{Lx+72)l?H5&YyXAP#At5Z(QZ{a7G$5*sR(p}DPWRMk zJ@-b#L-=|ZJZW;(RGV6&M|Mpm>#O8%j(;i1JQM(uHW}Q7C<8OYw?Uk^K-0NB&pEe4 zz|&$ls(TiftvOJ}t*Y@cDgKG14rM6&6a1+_8cOUlkSL&^_ikpdY`V5B4t||#D^mGT zCBOOB#ORW#cuqOwD*&aU$05BB;BYYiD)ZF zgz40kWv-qoay@bwI8EVQ3sZ^&Tb|WQaMz)H&>UD)zZI?;>0BWauN$i^+T~LnQ_m%M z!4Lv+#DBbCm6WV@KEe4U#?(zX$YA8+J9u}6eA;)RCt1I~+`^~n-1Jc7>ut*7H(x{S zf#Nh6Q;S6hLr{i4H4%ofD{np?{R;Ob&|z!#-IXLT;)(c`Nm7vOXE38uzq7qMwkDFI zJnvo19|dtCxphM4qdBs3s=1lYn{E|S;`n%Q4XafCZI%~=x4mtpmh~xc1%o5J%7Y>B zP&hxFwTHT-BblT4@}ZL0p*_{1g)bkj+GW1^q?F0ckZrG3zEEX{Y>)pAPpN48ly~bF zWdDxV_XvAG>WPXx*#^D}0`tL>mUQ2^Fv?tFlfmu zME$fIxgC>L25zGvnd6pnbRk=Vxd;a$BK+EEQDrcC1XNOXj$#FsI5mt+-xgTR|O=Dw$OO)ACn$}<&kOS3BP0YRmX zJ&$2hYSxYE5$Aa|9xZ+o=VOSxNZ;L}Y#q-!baL4RoV&U!!6%6g@<2c8eH|sQ28UJX ztPVf1WZyB_yO*BVy&8Dr{x-SJH1;qYfKslRI%G=dW4|_wutlONm4@ny%=atgK+?W5 zOFbgREwjJ>7Hl%*J-Uy%v-P6#DdVATq3wB|i+zK-igwWP0ibv`s#a2^tCC^yeh+q6 za<*}Kfb<2J%Czvd7Kv5`5ko5(^tGV5s}e>iV(ke$u?$5jWs;VhObWk0F>C&n7S4hITV+`%Szr{X(0nO7-j!NbF6F)$W>AUc9Fu$Hbdr_1iRnTQ)qvRz%=Vjhf)rn&2O&fvK*#8&w+ZuvVcR<~2^a$SmQJZ_)h^0#| zMI+&l+NIxnd*&e95-RcBiac_syp%X1FA{Ogu>;I{C#~DtgAp2O%7bdEyMvt- zFLJkF&Q1HNtUzkZ?AaGopkDjnU~kC%YbsT($2}<1ft<&|mH-rfjZ5*5t@+TIE^}|( zP7H8PxeuCX9u+!Dz2i3bJEY;sx^g$7a zsjA05-33{B16GoO>nLje*2wt6B*Fi23PRDN#%~Eqe0S|lKgw4a=dlzxPy$XqIH~_# zSR?GnLYw5e_gNLbI@ck#IJ|#xfKq2!n{c_j{E83I++%TkWFouE^I(5asN0?x9wjJ$ zS<}~Za>~<*eQu8BU~MwLcn)Ru zWR9!Mq$8iVEGqZ_jj!Z=2jlv&rqXuj7^XYyMST3kn7TlXoFra)(NOJ0QQ2KG@zEPQ zuZEp;nxCu0lEBSwUJK6-mGuvyh)%lCs?y!_+CLdOtBg<5I_Q^&|EvNU0n>p*d)~9W z@d=Nr3f#lf>?UTpIGV4hJRZShdc2WOYR|`@IS`Z#d@Zq|?8;}^xnbFf>2nd81wK5K zr<}ozx~Xpw-*>ZabOa=pwxH@1YuLn9ao;U9)%|`eCyim7&TzZWD6360`V#JuhN^YI zyU<%qB97w*hUMpn1A4x-gm%v}+LArVCmyaQ0@y}V556dBFrb7CWc;nxUOPZJ=)TBS zSTI@~9CaBtuJB~^F)19^QLf&N3-9oBr^N;HrQ(9SmVJC$oy!K24Bt_RQq`+DKFNs5 zkvW2=eU~U=(c2?tc|nY+)uL~VuqxbH#iy-!>TiDhpG@^vCZ`JK3L1~7E|2i5N{=S&@+qc#xXh>|d1Gt* z53i+k#Fy!hnAJWI7?M-a2u@nK{+Q1yw7Z|Z3w3gO#4>Mw&^TK`q&isrNSlqZH%e92 zX?Y^o2s4UXz8JH3QD>=lA|&AGfT|TZ;I4f!FDq;18>7bKrX;k11C1SkiQs74ye66~ z_)!*RFh8N;qsnMcZ{38&@(q+vNYh)&R+^XSnGQK@k{M+)vHh4+sW|G~uT2%|h#6Bb gs{tpsOP6r1!_sUTs#i|@1pd=Jr*oEg`o_Kg15>WnX8-^I literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-568h@2x~iphone.png b/resources/ios/splash/Default-568h@2x~iphone.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9edf63f78efda73ddce7d6a2bb85af5ed3197f GIT binary patch literal 40249 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%0DI4XMlGe{%N}LB{S#=`@q& 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 z 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�d}w83T`X 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 NWnpu=?Bw;>{|9DL4(|W} literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-Landscape-2436h.png b/resources/ios/splash/Default-Landscape-2436h.png new file mode 100644 index 0000000000000000000000000000000000000000..763ae78df0e19e52fa4a475542d2cc04acbdd02c GIT binary patch literal 115885 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%0Dy5ketibg{N2y2`RT7|_^ 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 Jvd$@?2>?7|1Hb?P literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-Landscape-736h.png b/resources/ios/splash/Default-Landscape-736h.png new file mode 100644 index 0000000000000000000000000000000000000000..9c069f7cc4794d992eb57d91fbc3f96a0c8b2e27 GIT binary patch literal 119640 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ʠ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

dDu@%w(Gs0}ayi~r-0mH@;f3BF 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 NOWToimRFDFAH@Si?UX}e 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 _R3ZZ(uJE@lK%kx^(?esym&giQB^O9ri?v*I zsCx#DhfHQ)Qd4X2wqRUIPTN~?R7*1zaO_8}sJ1?Dc(apWbaJfI{Y;zqjYkx>rqE8D|l)%+ruP^Jf;ghMgAIDx5-`^humjz7X|ZtvEKiB z$+yAVd zt9aIswSvuJH+7n6uR>jYK$>^*?$-ohw_)WjfZK;^;~Nv5V-)%9C&tp4yh4NW&ySBg zp|49z)yB3!MT|^zY+bf(sFfXfSlLemF0dh>7^5+Qhsjg#drmYo#~iL)zH}qZEuqfT znQcxe|4CcYqATDd zFhE&1sK2HRf$+ZvQAh9m*(m7P8Sn&)IHuw83Y;UWO#(D~>B<0n$>v zm7{4&#RQ?(g3pbV%{0d4RfO}@pys5cuz|)J*FM@v&q`= z*;`>c)C}9=l0TU9wmLOCVMvbg(O_C5UBDkYubJZ&;=Y(t4@qsEW=2!IX7f3`fGIKwhbfluh2sU zGD7}X_rh?7q#q z39N^>m3Gm5xCD>+R-KMA0 z99-B?STzBT>ck$LB-x4g7&wV@ZL{n$x)l~8Ty<^F z2KGk8fJv`X4p-Qd12C@BoUm-^)`9oF@2Fqxm)8yA-$KthX{7<|YHA;GpYx!n#h7;O5}G4okomE0sD%{Lb~xE&e!ncG)okxQ$a&gPkOM z17EUA&8D5(L^DmdIgcZ>m{Zap)g|ug)5;UH{P?i?qW+gC$BfY%N4mg0E5SlC8y56X zb-u{Mpr?1}jn{10sTQU*4Rg)F#HZIM;TOT-Ub|V#ygh$j6v6M|Arn(e#wH(Qd zziU$Ae7k&?VbUWZPKl#_yLryv(e0nOW^Sl^?*6iBq~V(fkhqFhbI|SwATN7*g)KAd zgsJhHuegZNUAD;NxfM$IaChdVLH#{RTu)+Dfp&(c<;VL1r<(#D*xKM$szd3iMgHuh zWV5f2Njb^RG^)MG?a4drw3u2aGDQ~xrVeYHdn@GH*r>(CgkViDNWK+3WL4(|Tcu-7 zX#0d|NJVlYsMt8N$^+jb>d=N8@9Q*H=?me>)<##!KC;!25wE!bgtvoHt&fwKA+kLaOrTvLHXEANeh6^1lZzIk=iKz2S)On}WZPQv;G@OlV74sO z3l~lpDn10LeP9~2@+pBR!P$=D5O-pv2&x`;yDPlllcL zNZ(P0!@T}`aV+3Id%KwqO!2!A?|>luvM#Wjo9RAqn`)QGKSVVp$~mtihqDTA3B>(_ z%~ot=V~~Dhl`B2;f#5`4Q*iIqV+Ws?g?NY(vh0VGFK>EzYh>ahtHyr(nVt^}qOEai z)3D3X=NN!JKK^QxqufM~!0&L?;qFv@T8}T)20_H=DCbw*5y`>5o~T0oQQRV!u<}QM zLP-sA#os5bG>_+S+&*sPMb;H5aY2iz9+c@0E)?n&8EfgPY&j8~rp-w|5SDtE-% z!A88-IY43X3UpWGi*>%qkgXl??*|~xO$1V4ym_&`imet`%J_{yLPr@a#?l1so-o&9 z$r-P+Mx`wxsLNw=WH~xu+?Y8RcV0Th-q%qTIFO*ZUlB)ZhWyYO3EvXi+JNMII@k`Y5rM^=t*zz za>5|%e7y!_mh6XG7@(F9X$kXQ2aS-ek9a@xHSqxSoEj!?MZpN5&G1StB&wQfW~@;< zp58>K-8gY5{hbBZnu0g()~0H%PZkYxbcLlP+gamWx@86r&A zQEDPYSP{Xmmr6$`(mYiep|P|@N66k9+H1-U4I%~swXJWva4PUZo$M*!25#{_QM-R9 zx=zQ1KKUfaMHe=8zM9e18RZUA>{#EtQL;16`Ny6?<4(#B7ZKN(Sdia3egTTEjw~R< z^Usqjg}^LD-m>(2e^fNJpmgP>cR@lh0A0rH-=uQ3|D5A0C8N^4Ah~H~LQh8s?%rwh zOVPq4goHy;?HnOIWJ%n+$c(tOBt{oZb(?$mOb||x9%_}~u;=4q-CXuFXrA@oCs%`C z%6gf5eODck+1bHI_>>x_)>?$iqUr$Xy`Nha4Mk?Ge4FkZwsdvd{ zKz`bqveg>dt=ANPz56xIJ!^{&mBfU6OIDRb`R9m^M6lobfCa`+Ucn&IEN-(9*a(pV}tZ?Dn5VOEW$0d|9g z->6fGf#7M?^0-q!q=`~=BD)Q@o73-5L>P=4Tn|jU+j9FCgzZ!% zs<5WcKgj4mH#fzF7yqc(kLQr7EnU%QfElbZC4O(Z0~00Ee&L z?gd;30_U>12(%fpaD+%&TLm)?PyBjm9g8Vo80|>e&%bJ z?@$zJ&s!aq!Cw&mtOA)u=GTwarUGzneI-=YQ7{MC8u{f=iV1jSm*=LvGB%>XPV`Gt z3|N|Y5CSs3ypp&exsX*TDgEzeY&Mc{YjezZ+}EldanB{yv!?)Hwh6{EH6A#@>%o2m zd}#{v2B2{3OaI%ewDjppgw)dkQdM|vf;4Vi2=E763l(rlOu^EP=XmhW{D0E#fo+|f zf`~(0R~ZQ|QZ?c?%>$0x+%c9$t>UpKMVnvV#DfCE2_6`?GHpmlIT})olpE8=iS(e` zo(c;XvqhjjDkPcBCvFp&|AU5adYZMf5(xYdTt9#C@_19e7D&`h$I6@xD zLyrOf65M=ccY9^!i(DgZa^vyN-$`P0B1i1`yU6MyMiuqK9Ak0cuhWA?{BNz=!|F_z zJgRm2LZ|%a^)e~9Mn~s4kZf0CTfHy;BsAjfT;G90KT=y?epW1XAGp-8mB?(^vGgFQ|W+V66H6k{7Gko7B=fQD=s zed8qJPlvz+Ry(jw`1TFrz5i~2?M^>^Lr#iQL)~1nnC=GUaqtYHplVwcPd)Rg-b;5# zMf$W*hl%HJJNp`XU{38=fb?Zg9*F*I)e?f?(TJ%BGu;RCTXA`RJfc*_+b5o-u--e) zOxdegIonR`Ul|%=15pg@gl`x!%?XgR4rB_|Mz0=?0Mni^9*pG8bWm=P zGXaoWZHRlTf$`-+Boh#n1w9J@qW)>Q0QS-yNH1FWb-2jhUgf0lXbXk$+6mk{f{tX@6?NXm9I+n( z{r~QJueo(*!X1Nm>mBqT{8jftJSBKJLcOR2EPF@zg7u~GcEDzgCH#HFw>{dr%q^>@ zb#Hk6#BlFgo~(V{2|GL0L*A25ii~hS^`}e*Tsp@RxqM052yeTYm7U_mn5H4F?l72N zaHu=*bT0QC{^BOy6PQi)4T%cBi-upL>^`FqZmV49q8dIa9K9WS^8KTnrc%MU17QUT zT+a^dmjdj1@l2P;GG!l8C}SPy+1AfSzNjNq^>?GIC}tda)ErOUps{ORM8`CR`}&+t z7sQQK(x#@3m!nzafY~{zgs00Ji8@$GJi^r_$|&z z$2q$sAh^eZK_160QTXDk@Xnw@VnVc<*TwA((A9E0M8od#HNw=pV(|NA2eGG_i*t)B zp&`c4r~jf#Gg88Hr>;}UCrT#iuYblJa8FO3v1q6kx|1iK z;&>aa*q1?KPT*iTP*P->vyW@UfBgu!o|5*$&YiZ2ZkD~4=z7ej-8i$b84>)ll_53xy T_bS2V^E6jsU6k007n*=JW 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

QBO(e+0_{i}~<4lW8hEkN5cVxeQ*kp9G1 z^D~_*V-td?rzL8qaIB&9fOO7<5QW0%K|vqYn->xz+C-04cEg`T&~jV5$V@T*vFEj! z4_`?rZF3*Fv4a9V_Q}b^gCwLxw^w(bo`Ek?RXF(tZyF`!uyxg0sohEI?L}= zV;@ol;0ghx%A$T~s)ve5GysQ{e@SQk&;wv@*ChZqbgm=rem5aN3!Gj-HB;p8$_<3a*I2J&vK zywI;=>~n@K#ydOVGK4Xy2*WykIr29E{w->prYo)$zm4Mt@a#JUBDIJeWu3b|z#3O% z8Orywi(85?{p~TA49bF=>9Hn63Me4g5MR|7C=WmFH2e86cS3J0G=L#hASz=Svuii! zGipF0r6MyNL7pQ{!BrHo`~tVd3v$cVC_NDL{79v-Knq$j+rwiK9YP)j0X{pL{Vv-%iqkP;y%0Nv*tB?z3V9D?>Xc_nkVvjc!vQj?2AjGo&Zh@t2(2WyLvQ92#EtR z1}x-G1cmpn-9%AX78Qb~^mL>OvR8WmI8}l1`g1klELtLl;y&4VN$L@iD{lxoLEK2n zLb)eU1gh;&w|?@5Fb=Re2FlO!Ie(GFAFDM^cPgaR$=OodWL-mHHdSZOOz;k^+RQ0T z98FncPNhS2Vm&B;a!*)}9p;%a;{jEm9_F*}T#dhJOyUAJbp^#rm<2prq^cS0!?7j%bYPdK`sHE*$>pB0J0jV0hY&Vgh< zNQ}@I^cT6}#0<>@HK~zojWcJ=4z@Pe1oNnVQ%8rW2n!L|AthnlUG8Qh+Nu4yb7@6VEzrf*+Cl`S{TM2>*|KZf! znXT~%ZDlK%9iffj-|x1OKCT=pjz?=NCWRx_h0K!2dX(#AG4u!Kg#J^r5?>@kl__M# zUVDx~i~;-am_LI~V?4xDKL1s1DA8SevKe(oVC?Gc3-3f)UErR=cut%qWOQ!r9b*6@ zhchW)!uDtkvG4HX!Lk2}bT*CByb6!%X)!Z;S zw*CC9@w1-v&E3hMoU_m&gQX*GxbWE@SQg_Xa9hQ($tY^i9H5RGFq+mL~3s3aEoR0O{edqZD#lyKJGYi@HsORgPOmRYJ!`ciUr7# zOvtf-m1PxAf5C<>aUr(1AiICiDMru^g8?*0-J*zMo}oH?yg0cptz`y6kGa031Kp^n zFz;!1FVbt>vZ=3kWl4_0?o|M-Cn!JvTxhQ&)L zyppXzTCDdtSHB^Uo`p7iLw47aKt0^0pgDc>?_gSCDKm>qQpU|J#RQ9qG~2xRNTQAR zH31y${R_h^X9X=&s(0L%x%&JW4rB-jcfD(iCeZ8Dq0WFh&H2f55Uurt=rrsgRokfg zfQX>G3{3MHjLtLz&Bf^%eYJ(Arl?2Zx(SHZ|AT1JA0DvArfhl%)b85BD>-nyYbm6# zGt;abMBc&t#~cQyqDhv$TX$>!WPlQkUXL^RqVh&!YdLNw_>>vZ_dGzu^hG9k(fF1e zrpj*c_%($#oHo00LXTseS7bR~0w)dzR*;>q!*1KVHYrV0zfrY6e7t>bH1aPwI7p5{ z4h~1oiB}dsyITfVG|5~Fnj#94UVBpY+gDOVnpN-He08WqRyxh0;+a3bcjPjxo7YA! zNt4i!Ag=_ULS^yxWZL+i?cWMIygs`UK+%8nm&_{q@`gk-6Dp5#q3R>2PQQNb0*5A7 z3k?Yn+b)nAlEDYaqEb{=bo&-tK*R2Teqb^B1BL7#$l%mba*WCEJSZXv15pSq)yVoC zgi4kVzcb3I(|Mnwe__C24BOGPaRKMc`7Ub5x!kJ+yZo za`?Zdq7JgaSxp8x({cZy9SY4S0A8a$dvOBVUR|0C8NHmmBx}IJ$Qs@M9-iAn*3Ly2 zB94!T3WC3FwK1Q}y3UCUjFV`G17&_1i0&?_I50&(e?bWGH8q* zfl|UqmW1^b$be{HAf6l^0vz}a^{k)F{(?K}7tEEAu>*;hzA6=H}xI3szGepjzu zO&vSFZ^{s=AueC zDL*WC#+sE|`M^t5Y@T8UoqG zTF2-}X#tC~9@40VoV_t%>Gm&AyZPXqVJM3F6llNxk4wa0i-0_g3qOO&?;(ap3qxzU2S_ literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-Landscape@~ipadpro.png b/resources/ios/splash/Default-Landscape@~ipadpro.png new file mode 100644 index 0000000000000000000000000000000000000000..75de9e0edd50b429723dd533f9a488e2b3e3a2e2 GIT binary patch literal 95354 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 z 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

f%r(cmDNkkEb6NI!k_h7}9?SHHu2NhHvbc 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 B-LC)u literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-Landscape~ipad.png b/resources/ios/splash/Default-Landscape~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..b74bbf69b22bcdf9ee3694bd8e4da7f0afc4ee9b GIT binary patch literal 44293 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 UxMsN7AEQ7=!{A8HA?wTk1H%Zn>i_@% literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-Portrait@2x~ipad.png b/resources/ios/splash/Default-Portrait@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c33f786048f4b2bd960de67a872c32ec8e7a8c GIT binary patch literal 150631 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 bg;@OOWd{~27dgYg-_E}rw-;?aeD41M+au*r literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-Portrait@~ipadpro.png b/resources/ios/splash/Default-Portrait@~ipadpro.png new file mode 100644 index 0000000000000000000000000000000000000000..363dd1c82d2242dcb4c41846dec34b643b815e0d GIT binary patch literal 101584 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 z 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%0A!XcXHLP) z4ATx+kGZ51O3!dv;x1z#_Fu>!+*X}@NtxLxO<#=NCKPV3zzyOFDdSl_qTrAP4b)Xy zrWu8tEXLlWwwHfOBqkr4Q4%H9Z|z1q@s5&B9S~s%FJr@&lfRqS%gGi2q|hyoQ<_E@ zwCt)B_V)}J23AhQD`WEwmqYucp<6E#QvdQ>w2<9{mh%1#%T z_tKc`r~bZ->$l_A%a{_w%dbMAj-x`2#=CxaMVT;oEpmkc)s0B!f0m6dUD9zF?3(k! z^uCQE(K7fm|Ll+|YUYdb+PXY8^)F0_VingRDfs)XqF;XOc764Va)%bqC&1wMuWe%+ zd1KcnwoX8+eJx6BlH=5mpZWaUrmu?_8ty%)#m+zV<@E@#Abq7l^7l=?Fr+esvQpRlDH7?=`v7s@6R5_lg#CEr3Nox5dS z4!@%8TxGYHpPu7nhW4m|$2=#(}< zV(SlxgbG9=ijvy=`Dgx?b!PkFf(ES8d3gDG{qHOt_1!-Pkw8t-P;zt;;BZ&5QL zO>|Na6LZu4c#GJ?*^N;Qk*p5rFVncm=jC7v)?)53?7PN7I<6ceb83A%AkVO~6US2L z)+0X;pVjaL4`Dnb2*q6UIo6U<)_43k+@OWy-1`8}ME_CIQNGVenxrrIiOFXKGXBHu zm!uQ@t{c-B?20ZM5xpWXUD8$oVV`%7GLcx3UhY#n8&e~lrQ;NpXj4+7+Vkrx2{b1 zMLf3uFkBqG|0&eA=mkmdvDkv0Nggs&uS}lwJlwDHLG7^+Hwxy_}SCC;uv z>Sr|$z$uwYuWC;J9&+A;6h*p=?b3DLNKwNDMalYo2cEG3B5cwvlheJ2JnQzePMYq~ zCc;6*RtCfu|49Qz^xCyG(Wzsbv#TQGqCg<72r9-H5WjmQc#4|g(M_!%xZFFrz4?I# zy9?+$7}mQi-AZV0EM$7j3SciVQ%V(Gi+kswT;nI!x^(-Uxh;b$olyj%mzUJ}l627R zd1Wn=1asFI@;=pYxRM5zEM6=q)1%An1&G{-M4tP-6wC)hs*sMXCJ`zfQ8BT>B!95nB?CK~bw0bpx%@-SvoJubq@9l-y&hd%zyzCQhE~ zyH{W<(>2h{krs)o){k@z6&Y~~gPNuWi9ckOzG zZ;@8c^!iWh_cOF|?Iv&GQ+;b@aDhQ)7~I{c@q4TPVTEBOtRq<=QxvC1{L~Tv%w&BI zdT}_;yRxWP)A1=|A4$-RM|E~*4FDz)PGrH)+*BT3-qJHDI=2s1{GCrG!9x$^8~k24 z;W{~)rMf7d@3P^41R(A#cJhb@B9HEy&6^mrE6$f6Mgp|#hLFE9i zs=V4)zzaQE`hM5o^JT!RWhsN#2ro#tuOKgUU2$^glIoIpN^U7?f@8M{DqCf`KL0cY zQTrNPtWXHPsj;#2v}>EQkm(qMNA9I@P+ZfR3pEA>$|iiq-iG=gd-Llo9Nb>d$=l)D zHDN*gG;*gC7(2`o_=D5KgswBUNP13t>dWVBbbWW|?oh(L=iwT__0amU2G2c$r2xC! z-`HV!RBIl=EW-h_jML?wPTyOkv5A`uKEr{8C2w;e0rU_cUQ0sfjBCseD~8K)O9n*| zFOq;1?_n-qKK)5$O+00TFW>a3Is5JZSXV$WN^OHQ4nlQ0HJ5SQxLSmEj*b=2j16fl znZr)5^uLcrOPzmi%fEGQj@qw>nH+n_b?RGIvNI&^kG7j>FCcW@{s@HLgGNFJ`=#Ui z$V;`h{pn@@*y`jgKUfi;)i{mHMLMUlIi3;~c^fk)`Q2lco06%)68;6{FnCp9+36nkw+T({u7abkp<2AM7k?6eUGPT zH2Y#04!1^yqathkJWIpo!r@BHehIxG3H`kHXElT__d#w~J=yM5_G;dViQBY-VX=4~ zY~_ZVSL>H>{eWVt6!<3Cxk|O>b~Y4Pt{YBsxvP}3Ajtwrq zO^P4%`nFtq&Td(_WGCQ=)kBX#Cr{X^=l*~k=u{iZ)X6;zc2a5&2AwQnr*&WZl|U!* zi@8oG_=N9v_HY~1u!6E}$I~Ql!7;?i^>t-!ujbWNiF5XNhRFP z3cq`!+tYpIEz}FAyac4@QrIVp9u7#$rOgP?g642K`B1;ES97goiv8w25XWyv0thNA zE!W5mV4sd#B9KzxdDql^KS9o2P%Vx z`pjwV#GqpHM`@C-aO#xm<94T^SM#+0^wRqE5b=xhv7Wj!M6Ki4)p}a&z#Cy4raGPz z{I6HDBj()_no=wbqj#c)%5u~@7KuR$Ge>n`kgEHkzZF|R_mrCeuD4cWg^Bj z6JAsDgFXGbgdmnaOS}KQO|mXg_IN|jRDjevxn$~Vk-P1Fppy&ilykHz4Rq?W_IUK{ zAk+^~629xJrh?V)4qu$aeG%ro3l?|ScVy%13|h~DQZ>3%1Qof5?=A#MNQ#38AMrfU zq5erOdAPDgCx48b?ZHRKLA#7Fc~Q%RcRx)K$PRv)SRr^5|E1A= zueVJEJ|OH=lr|GWYv>vi`9d6BrIzY{w@>nP9fAbA`M9LU zZ_=A`E~{99c#TkB!;f{O7o z)@y=fZ$7OLXinHbKOFBcjy4Ky&vIpX;~>JCFKH*k~_LcEj*sm zJ}K_kQ6^6ZvRL4{)KuvKo^WIRB<=*5O4Mgtc0LBZ-f!_MtNLe-UL3YVakAt9&mr^8 zX_68!bq_aZ{0z853XBXH4=sN|hfi2ejx_sP1l!bow7&?gQaA98xzpFHdDhKbYK)r= z%?Hl{vSdbNf#b!sse!q@EYv}AcJ1S@HGb8dUt8U7KcLT2Y=evQfU7Sb{wHqkI3Xl| zcaNK^l&eOj2PjvZL#~}L8H!5`Qkp!5?Jq*BW7`TeblhE~1k~~~9&?~+Tn}T7?P!(S zD09&FdbM{doMLf*j=iIzMAEzw%t5?&c*Qr2@m*Aoh2vUI4Ce#$~zohV*2}MJUsSO?-CV+2x zC7E&$Q7zs2?|D5;0(R8R4zp3F7^id1y`gKj)n*uQG~bo_6M!K3K5Zm_U*&6om*2ul zN9c;2YZb(v+A*~U6)>&|=PD(q-cNb92;RFW?<6LV_;jY)1N;sSaheGUApiRFT`JQd z?;%Md*QdlH0h~W030WLMP`;4w_lyQye(GHG^UHG(szG2DyGel*Jk zl$FQ6l<%Irq9_Nv?7cgf{eMCNZX^gdXtYaTiPEBGE`Os2$I*%}$+LO+SWxBvWk_&| zVyrq2#Byx2eDR=`$~Ea8T%J$_2iosRatno@_c(Tay3yzCz|rA{s1?$T=(290(sA^FihTY@Oh@k7lOWQ1-K@GqD zx9elu9+E49T0c#*4 z?faAm4wTi}0$bmW!8TI^19_ZV$J2|H&{A>{g_jVK^CUHEhiB^N0V2|43`DG*9q97w zDaOH0Wu#r~o1d%O!A^tpPKEcQR&t@BIqN+m07oc0abze*Ug#kRB%&AJC5n*XY9);x zx=e4&-mixeO-_6r_byukB@&6IOSGpv%L=V=w%PO=;RD#Go*2)G8})?HU!X(J7V1JB zS^XIm`{$Xk6a7H|(Q0e@C>wBet`mQEGrh;bF!Ng2W4Kp|K6q+J(-FVy=8`|QaqESP z@DP*RB1dHAhBCxcJ>%UE<73eqAf8=xJf#m+E@Fq9(RT{=t)ciFLg{7KrspM%>O#o` z=9rqgkQz|qT-+ogBJ8}pU}Sr4>Zm&G(rrL@h#OsWxz5|)Ap{UUr23`SJ$?}K31t36 zKRQf?$~{-nlJyfOz~Q!px8u!2$w}(_0oaz`q2$AYh%KLOua zXHvF>t~N2QQl8vj7nV>AMC1TTZI*iok?!fU2-CmK@hFB5)ZbP>y?TXomr}P$ z4lbvAG333N!Q1Pvb5yOEbkfO76Ka#m(5AA9zpkji z!6*<`cu<$WeY?Ll&Wt@s!gFTJT#O|C?pkD=Xw;DI`1W!N&N}ir(RjQR5tw|t_ACJZ zUl;9J&x-C(@KE3~1AJ9-TTW%`uz&8VdeK+7X%Dto{D2s+L3b^2C~`AC7-Hefz@l$f z(|z##WM`0N&F=E-LnD+aDcS&ae2A9WUFv_Cz^^KxmX>?U-D@or|JrYvnmwDRzK_hR z?)rCSkIJFfW3gr$zIvDmeqrYb@H(@`6HjTD{`$k7X?ZU-x2v92(aWqA)uQE<7JRxY z)bk^zFjZ6VIAu+R6Q=tCySnyn@a^rN_7)6WD0s#bmQ*K%uuBZwNV10eGXq};-im01t zO}NUU!^K68AMFOque6tk6DXtIdi_&3w!<>m2KtjRjLe(xfLmJZEXKTj8ZfP z*&Uvn(S)1F_v<;pmrEJ3Z1yHoCfejVa@iTXC2Uy1XJ%Cb0igoO^0Y?3+*uDk42%l; zS{NvrUa!m!*Kqq1U2!c`wcr32ww93XRSeP+p7nSk+Y6Ab5)wPKA_GSm5@mxKfxZ)j zkqLQ|WXGlL$c4C`Y|n39K-d`&u6}?)@{VW7X3+FySg=^%3b6QPjcA8I8*CpeFyeu! zl~JiAkroY}jaZIU`=3(tpU;&$iLAsP3m%zWp?E&Qf%X{7V!GII{|HPqC?MZtoc4AB z*J^JATLc`~Xus_qc)yTqD>&3%0p>UrX6}OvFg6>yEsi7sp)6%`eE%X;q&RYDIpXB8 zG{@yHt)b!wDClys=gsl@ORJbN;;-HC^ zay|+Kfc^Z&6LH>c^IdLN|0!FpLa@xCo{Z*dUf9}V#Rcz@Xr>&p{)^){Y-Mj(S2c&T8wlU~4u2O&USM0bqkjDzKT=d8XdQ7&^ zpCnZ6{TNiHAco$UM`&oVw#`Ohz^cR0WBj_)!Vgb@YG+%-(6x^j^+VP#^B!XE+aQLQ zTCSt+&)Ucyf%$p{F?6Wmbz4Z*8t?>-_9fTd7dC!~z#O$k49{lqdM<2~1w2n9hBisp zQS4ZG20p}mwL%O}$MOCJgU*K-Q7eRidvF~!7weZsfTtxw@V(Ca7lhtMV4m6`1TVkq zs3}>$T=EbD>Zb|rmrOer+T_PpcJOqqbWhovGMIXLf0yoQ6L<9=vg0B=z-Yg>u>q^b z1mSAGKlwYb{$`>unKm@*rn=U>O={E!=;`xwCm^KO>;ViI{pP@h|vcfTEU2 z>dfjlzZU9Ja)yf#fGPa8k@)j3;)aPA{uDr#nQMabF)$XfN_55+(NjiD+y;r47Mi>0 zAqJc&SbhqYt@sO5JFe9A>;dD)Zy#L9Gy~M`FBL}=-kp&{6Ar7U$09J`{J`?r`0BQW zbT@&=jzM{LxxzAe827C3I&QK>Kq-=m^)sUPLV3%#u$u&93fao{bS$*#iBR!E5dq{$ z%HpiQ&^>I6jEEya=F(r#B*y|$YxZa4iZXI7XXjBg^Rg-ft|aWSMTA|?t^Z4qzEWlf znb`+2#xQ@*^T$?QA%_@XM`R z*m+72=`u6JzvQXATiCCCK%|SYh7$|F90gy#M=Yru45udAj_|OCnmo|c5>fKvUGGnE zl;>atA@MWvTp5Y@kLEzz6wDef;Su7n9H{mYu=O+Hd3u1yaEXYeeoxM9hUgU*(9IXy zB5#)?2haLs(892+;kmIy!16|g&9C-oa^ZY-#su-gN$z~FX4#dk3mKMeWnV7wzM@mI zesH0r#!=#hL=Fc@as)TPe7^qbpOJkfLo^y+Y)_~A?w0XgKBDvG>I@Or9~W}o(Z-4q{I{H8SBo?16u?9 zn6j(i-KNr$*;)B*P0?}lQJpLkh;37DrcU=XTeO|KU{Ez*mFN$`9JtwTP2gI~2O zLX#(&73NtjVO)O;d*)QLW~-iKv|Ce{`+S?nj&F8S^iw^DYXKd`0}^g6lp^m}aKvEq z|7livpZDv0)T-3Cu&6;iuD{WMqg&&3zH@BO^e^x-wDcT{_WG0gW+Lukm` zRW!Uy#o%ibzFo|D_-x*m&j?8?Z1AZ0DR&=fRztCyISMETL<*fzTWM0x#H&7j7RqAl`L-pwZ1=1Gv5V|qJWnGt{MwU;V%~UF=Sgj0RVT1M zeyMS7=|xG`A)N(QI7_Viwd+KX<7%?(M^=QZz0)4}a842(0$DvU!Y| z5v_Zgob-Li{l4Vp`Qa2$&%e1%Aok+k6HVGZnOi&-x=0w|99MO2Sd!Os0lzPO~fQ+{Oe|i%#!Ld{J)#`uWezL z(0Ugl!=2Xp<#-gvb@s*d#jK%Biyhg_c}9Upx+|dm#5XhLfL4#brYCJ4W5->Ym7wzo zFWjIUfXV1RF_JLAZ0y(4JiJ)Jvw3Hl^=XY8v~1{kDw>@>rh}^`sFAvh^iHC7|AS*=?%t6{y6*p>c%yVT zy#E4(+z<(VK-O(be#Hj2;k~)gVPh!-7f=NYZ%_o(Z*(XVu@y z32JQMtt@skeCcriF>;LqO)8EH!8bLK>Ebd^ z_aw!dbMu8fDYR?14#-og=704XP5o0Pv84v{*ClLoihT3 zbi*@GSL3f6iA^{7KkaY1!DPVaW2r`2yw5Y22iyW`;$^pj!BqQ8NO3SG4qrdQB&#gd~WzXUg zw<4Z?&;QclL!!^FyiMe5Os0ipfjp{bHTIePy7CR2mi z(;IAyG>Q0)Ql9*+LsjLbUm#0t^1nCZR^rHIIe&TB`@Mg54E!Jou+M-6DH3DC@LGmy z-*$SAN#M9r_d4KZ8>auF#Bu!=Rqhzf1uLJ<$>4l(@cha=cg*L{r~o&tPJI5T;`87y zB4l=sYPd9t7cNWPxY?rPFCuKt^tvwP0z|OC9@#+tiwH)KPPTDJVJ^f?$9*cvV-f+> zR-yJ0Jnwl)>LOQa$+@dnjVG8WFa_QNzkh)YPnSHhsArOaDR|4LRRB)dm9E*(cd)0z zwe;^oF|bviCMo5X_grWzd*gGmb^||nuY{hhsxaUj0VIiC#9+|Jkqi9XSOn&R%Sy|_ zx?H-XL{+dqXCn!EXmD41=lbnr*Np8`4!GDcw#r?84lidxaONTm&KIh^)vsEVRXxUB zc>6?aa;JZzF83d=+Xwc=F-c-mF5)va2LT>N(L?v8J~D(2=|J!CgONc)s_cH1O}&8S zN}BIF>IO-=ta5RU35;3*g3G@Wztb%B`oS5)=bw>xMO7ZtiXHgj9f}L42V6J_PMG7X zJnD@WjOPbu6wbHmJJtbl7EZ?^#&_M%d)&&W**0Pz&Z^6<{w>``|N5%s)%oT-8mJC< zoSpB!DjTUSLtq|XuhvmCR9^wkWPi```LCdZMERKqC)zN|0ZI1x;hD!E7Qd(S3Ov#5 zaGaE=&mJ1oU~ilb_KBmoLNFLn_VEe=JJcn4);76urMexMaNYrav6N|=!-;`5={F>|fl!cc_|G3^tetj;BozIwSx&)ob7#wX-xY3pxgK zJ_eHk>`;M@N1xfdtLG|RtsP(>GcR;v$FG#TQrhC5pmU}Ne__xrq}t}vKMZbh@>i+P{S7r=hfSC076~uc=vHGL(zA?N(1SMc zcA|KJl$;KxidwG=sFyFUdmR17)oi{uVVYA~eI2A|DNPnNzwX<7ov+2BcH8t%wUk-h zH_abkjKYro@%TA21*p|str{N070e1gOHfE*a(Ft*NXCnbn67@Bvya}>gywf2Gz?ft z?CKw>X(;#*7Fp%ub34B2r{p2hi+NI-;qiE)(fNLmmNlA<_+S4)YHor&+|#*ue0V2& zBe>n<+dMB~%&IN7!lH^&Q0?3vqQWv4HV{Msk9 zWcd*dThS|lJoJrr>$&xoM>BPu4Tj+6e!p+qd~k0LfU`RAsFngEg2%7eWamC_yK@+O zEA*)X@@B)>vz49f%(*{yoDJa1mx@$h-uK6#T=db6!kt0e4zxcWD>Q#cQc*O6W@Cap z4bNM-ph+-;_P_+Wzhb?(-HrK}1y5VATme4(8tS^;E|yiyR(H)wi@TiK^5QvP=MTjb z&J>FWoZ8#_yzAyS{R5gJIJLW{?w&4InYYo~+NzZxe;9l?vUmyZl3o5hhTd&bGdouE zy+!_2C<*ttwVZWsdE#@*?78=Bv6+*P2j(AcY|NS+`oI>O-#)vbsT?Hf61LceVqO*3 zD8?FWZc^^p9aDC&7kn5RQLeFso7EDwV@0%R1;m@Tv1k6~`;G@qw08=~x9jzT3!3mv zv`PhVVJ4PGnK&Pt=hQ6%m%)eAd~c?e1Lkcit4PiC;5oHj7C#S|Z>HPb6ETX*kd})v zobwJ;tG(H?W_uzz5nNULCfQH(4v5Vh2WZL3JvTWKTDtv~vyv<)&){&YCy+K{iz)me z{+;!RmpjShUK1|*4PrU=)QR<2Ij}zG!=P4*2{P=gp7hXgfjB#8A!(`xrpR#foAkI5 z4(5YnK=rZ^bu5$*JzGG9OYwXqhJbTRoWT^+sua#aK_OTQ_P>R;^lwT!>a%0D%Fp$Xb4cq#qL*_;~@(I$U5Aj+Ba67E0$R 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 literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default-Portrait~ipad.png b/resources/ios/splash/Default-Portrait~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..aad1debb106d1619da52f5dfbd1eac4263ed25fb GIT binary patch literal 44140 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

mah%xbk)J`Hp^eHkpjd(}VKvbQysk@Zu z%=+t#;lK^ z*zRSiT6vgMwKATCheiV$uZ3coI}$#p#XYrEd^h2AZ^x&LUAN%%aqnii=%wKs)5-cy zwGy-xI01WS-(*(sfr{rYt2D)UtjgqC@h1?s|K=I8E0^I#HHX-J?*3j?etS4q#}6Dm zjvPf9^nh>s{B&Yf7PG&Pg9kY?MB15;QScHPM#}eX9ikMch+xGEG8Un*0_J12-kr#h z=BJxS)k(=y^$jRT;>I15oyAvb@Q-5!7F%gLyakA(MqO{n4UnbkT)A`Vq$bmI^qaqh zjUPr{%b9!&6F2wG^4`mxfv{827+8sl$q%4HzKL6x8!vj{7GG^hWm8k))>oJ5x>c3t zrsHtbr!*@g;P?t%ZQ&*tS6B#I<>rLq<|ab z^Z1oR$$^5ur6@>EPMzur{Imyr=!t1RBO0Hh7ElEeoM))ixMrdkSOqM^)G7v6S|T6P-lM@v&E|%30_<`=XAMjim#==p;GSS& zgx$p6NN~+G_of5F)8KTW8jbsy4;Z{U(P-6zo*tIyaKR{?ZkfktBNYB6@cN27+cmA# zQN5TBjo|uJ=;c%NOw_o^&mEhC9^dzn0k2Xws8>+VZi>OWqwW~E@O71eX<^(%hRKM9 z)8+vF0yhSi*c(l@*c!YS6zHE}LG$pT&MNRC(@4fsRJi+^0pq6EZd3BGkW#nCv2X^? zee(zRd+{_56i(qC{1Fbxdv5-=)=N0aC&BLc5P z{rrSs#!qeu-0-K45Wn#sJn%@%^!DxN0<8Xf;*OGI zW5E$Pi+T-MImcRm*k^yB7@cReIsR5Fg|HPj(RJJ)4|tqbHQX=u6dqQBODK@iVrYUH ze|q^BIxmosqgg9!ispGCh`TG;$b~AT^}Kij-BeMM;aVX-AOvfwOQ#g|C~$N>=K!1{ zOfV!E2baaBi@bh@ZaTwf4Nmw0k8`TapV;89C6tnTM=erf8+560mryZ;^=X6qnxvEt znH45%yZxuCs^_oaouzT$L+F&p!>s}%hxz+dIJ(q*K%I<-0VN3)+Ev(@GB;UVLZNVs zg?S&&l52gYZf^Y8NzhZ2?V^go-RE!C08D#vdZVJcsrzQ+(Z7Uo!x_9v0w>|H=t43m((@u5d;XPDJl^67WPn$U>LL#c z_c2A05_=X|Os7ejpQr0Oh8vu_JzpG0Xb&d`JT?s>3IiU;O=xiQNk5*gQeZXWdc@jM z5meYkL6fl~xbvuBYHUc+9=CP1P*l(8;&f7oo(Co11ZRgaIJ({!Y~aH(@%6Rv0WE#X zU{p) zT`P}e2h=y8jJiG=Cm?v2SpCbk%P8KfGD|Y3t50FTkzi`beX&-rPg{0N(D}tfk3z=P zq1v8pmllQQ*%zkE?9sBtwP~v7KkIk7)a_mUQLkI)eo{xj?3+);%CVt`9d#MxS7}f7 z9!WKklat2L4EUW$*Ij5>?mo#pL|Na=t5fKm%0DxAI^lRT7WNjmEQ^g2O5_LJRV{pk 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 Wxu|r3@2e2_9XBvNnx}v6`u_l_2!Edd literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default@2x~iphone.png b/resources/ios/splash/Default@2x~iphone.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f16ef9bb0d47254cc9a84e83b1b28a0cdc9145 GIT binary patch literal 36620 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 literal 0 HcmV?d00001 diff --git a/resources/ios/splash/Default@2x~universal~anyany.png b/resources/ios/splash/Default@2x~universal~anyany.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fcc8f1d5969b5763db10a01d92e186d88a58fd GIT binary patch literal 123242 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�`pMA8-xVAqwg;tMAi^emr^ul%iSenM+L(#tVHPktNZ_XWF# zdcH5?+_l7pNbMWAf%PZZ-bx-cRd=>mdEP#9xT7?4`P=GD;SbdqcFDG^gGj5TC~0Us zwN)+39Zkl@M6n$vF0Uw3m?qw1{1-m@#akF;D85yWG06{I2qD=ppPq!a@7p4Y`2~+@ zkL|s6vz1(ormJ&}kr2;=$sV~>sbg-i5K2+jSa>&FX$Oh5{Or8EzR@(tCidT4C;Rj` z+s9xoLh$lO%+_k#^XGo)Su=k&wr4xK$4N5fZT;h^ZFKPU@W8;iy@I^jN7+mofUek^ zr(9^N$Y_-%YvAMnrV9BG_w|*1s;Yr>B14f@s3ZO-3(Z*wNvX6d5iqn2xIjMY-tc>hd2t;DRBIX@gAY?wHBi*8Hd zmdGzycHL{3tViJvnA1dC@i3 zF&cIH0BkpXus>!xLYwn zMDNm*>BX>Wls|8MOb(Xf@H9}qtMSr9Sc%xL=0Qfn3pT>@#^WMZozE2;1l;2;ws|D? zkt%$2f62o4+yB_`mY#uCSgp-vZi~T$E5V!^|2i>|zmU};9VVjZ+h?{Sh3b1mbh4V) zg97=SOjLL6`_B`jCLkFV5iB)RvSmv%-axc?jrvdCfe@vwTay4X=z{YdV;-#zJOWW?PNKUwr! zIPdsyd>;R}!P(AV-2&cKOq{d=4*EKeK2#ye6?;HO!3NeIoQ0vkN(@_=7;=jw>%qE;+rVNYN&bwWYaFAymTC zF*>0f!#la?KcJEWLcP9Qs&ZPCkC<_S>($_d3gwb4SQ@dW=ieEtMo+{~0VYyYKydcx z$qYqH*x68@nrw;Q{WZlfrH@sD&K?FkP2ffeOojJ(9=wvIiJg}u9D67@A?4j|inlO& z+(0ag@RNVPrcil|Zbp9mPvy^`@r*ZbD#irl;JLS1P-i^d>bzs zQHgnMtnGcHzR#_7!jER4opaZ3TJ<;2d^~!(<_n&kxPi-fGxGhWCT8daChGm2z>@Nc zWqEIR_IjrY#cwo!ms*&Ub~Lbkm=XO|dp-B)CsDy;OciA_6W?=g%>5MIhZD=2>TSah zF%qurvsFvdD_6kRq6Zbt=n*arAyM~?PrXb>06e1@9xyY zEmJ05H&DGsAGQwZ74rz6og(D|d8~Qp%gCs^lpUkyEM+@>xTFdtuHBu_|3gm3`r+MR z*=)iY%AahrE=C82Xh#^z5B+Atimo07E;ZsVcLxq~RXrLndaV+pA}{hMlXkRI+leOU zwNU;`!K8b?n~TI*QY@=pm`4*^l9VU2U^`hwo#gNAHzSj|e`w+uXc23T+I-@&7Yh%} zeB{!+*J$@j?cJLVrv}+h;)kgIt{*$K^OHWoA9txdGI}GRX5w5*C6?n*@ohKv@0P?r zyZ%i>XIDZ!R~po2fBpIus-(2B%6(&_eV`OjdxxC;gy$`mh#fbw5S;_unpYY;g`D3dSsclYT4UhL!tQq z_KPf^bKlWFv$i?b^1ANq@1I_f58o3QIIm=tr%)U%@G? z*WVom+`vl&x1yr{lhxI!WoCW{XsuL<)l7&soQQTytOa|1&7Nt3Xee*ELWy-}3yfYCAY~ zyvbwF)fM*^4V3HH+(?f7&$y0i)AD`Sm|@uP^PrM!U4E>7*dyukvi$CZLj~z!tP#7+ zxBWt)K7`r6QD!Bs9p3Y#}E~%1qg_tnBQ~cRdGnPVe`=|Mk0E_qFGJKc}>4zZ>RGl}|qP zJLqM^c!>JPe$MMs89Ix`v;3iwZbtTS3m@YwBOxc9F9f-fM8&%gG5Ikt__1-MEo|?o zGMTJcM+=&E_?O;Xw?HFsTE5mt0va9;oaBRt&Vt(x6)^U-r`B8l)q%(c^ zJbA5Tl3|>K@PntYwTF$M%8cI-eI(dPoFVzX!NjvwX;KTi#g8c<_5$FcWzVlIy5%ryr_JDjop^)nlT~ObB4r)Myy#*AU12>Ox{Pj|s(B z_WiDKAhSQ#QCYa#m5U)PQsEiIiiHR}84qTiM8>T=q`HJ%XS$D2z<9+*IaX4Oy4P~l5;gb&0H$Z2ImJQojw1qQiyP2P@e}Df_Ku?MR}408Cl4I zo0Mh?64zfY z=2IB{q)qMz!{(_2OyCA4x#@HjLWB{{j5~0%V$;ChT_>MJ%wiMBo$G+iS-V?6#G0$$ zoW^yb{2D~M)w#rk(hlC3EEORqxLKGH5{I?X8F7sI*|~EXR3?L7X5U7%vf8^SM0+C; z%%5oIr@a+Il|4@KLiG&|PB{lt!{ZcQEprx?y<~zFJ-)WEE|pE$eyi0hzsLDkBwmqw zpVbplu%}6@*uDO0$SBJ4w}C^ZwL9FllhfuB6*`5a&YRL~Qy^sW#6zJ@{6H&_3N~U= zyVH%20yNQN>kvuq)UVE-fI{`d_qWvW(BR-awd$|Bem4r|bIIP5Jj%NrDE-j0$98)N z(mm<$o+gD?rGR;QcPzOacOTs2YL7+0NE8>GWB|~p4n`?Wf~PtybV^$%3MgDP^762} z>sAH`k|KMKJS`VO%=n1=?sj!o1Wt?XFrc9Jy<$S;A~Ohn?D94c{CS&mmQ*HVFHIVJ za_zhdl-m;yL;Q!S(*7f?qYZP3jq>s!E^&J^F=wFG#t8}Bl6X@ueW9E}MenXho-sdx zgD7=$*PakWJ5f7lqc zYetQZk%yqHN;H_)H7a)i9N|#8;UloJ%pd#n1SrLqha4do9rZqkOWSH0i z)b!u6F-`nGgryIahYg8B1lt9}D1a-;*vK1NY2t(VFT(FWm{tpVyg^LTVF3JOdXT%vdivw>3*iU|A%jc zN*Q+^(v1N>@dI6?r;}j9gEn;vYv(q2hqG|>q=j+IhkB^;6GAd?WFx<3x0LtA3G>a{ zYmwXhXufzecH`&?dI-8H3B&SR3_c4Hs`}4?Ink}J^X&gV?e_E(x!l`^zR#UEGV2fD{YV6@wXKU5tu~m>0xYs=le6)Z(q{% zr?tofiRZL~WV<;MHIAIJ-uL#F8sh9!5Cu)$$>gA|eWRp=%E-Ur`08DNo*0KXgF0(zfyhIYlg8z4Y#vumEhwtZHvbkJp>yum?`R z*o@hfQ+SPk_m7e`CIp3iJEJO&xvrK6Xd9JisOHB$*ECQhBEn5ShMS7-P#O&V4$4~5 z6B!WVWxA|g;g*64yWgOfWDpzF5X)x5Etc;0BdyK%_WEtBAswM#)leWb3 zY0Z?lJ*TJrzN?)ESryAw2@&%3sp#GmpP_~Mz@xKyF}fY`oc}SrNJ6*#0$fjlYLN~gB5SWO{l!`b74^?H=DLaEraRzJYs-)ll3o7 z0C(R&eGJNNkBbU>2j(b3*mAIOAOEEZ)Sg~XqLx+ixh%I$Sw=E>RY3B3qOza-0ZaO* z@1q=WI8|mhVM&}o4i(`P*@bFCfIUeLOy*+EZ8f;C%KCx6hxm@iY;7XBc{LfsAW$+> zLjIR8#G6toWQ=d$(eB?grm<66B(2;i2k+}KEe{A-Rfj_EyWH+A@kow7$llT+K zJZNb-*5XWgcyd;oB@5(3yxKSWM9u&hPvVdm`A&<y3e&+*Ut|I2ts$=Y$(=n<7*g9ufV@yM@6O*CJ)M>BsS2hx%qC50cvm zzj#G&t}}uP_H8#%`=y1G$cEYQLE?CV!TcD7$6PujZ*NZ`cYlKIBhFx$2Eb=K_l6ls zG%`%gy*j7GPOdG->cKM0Aq-l;{A#qK7Z8^HUzN} zJ<$?_NnGE4v)*drTioz>iu4nj8$|O&G!9T_H=N+rFGf*|fQ5@a47R+mcep%^+#C4J zB2%pbg*Jke?Ym_|ke|>W$zkf5pWQE(?p>e+HTF)u5-7wCpp7OMz{++aq0QT%kml&U z%|f9$rGzqPHyjD4uxvqAI83+Eu|8eP?s5y&AYbzH-&v}qJ|!vnt+AOnCUys!J7N;* z7joPsS}52Od-7mUo+ZqCvL(}I?stjmQ)!+yAj+`wFl4POwM)r`Qx(o3iyhd9B{p`YBMrXcaz)qml-2!;D#vo=ca=>)|(NI#od z=(GV5Tn7>S@?9T6jPs_52n7xL>8|=DBmdC3|;! zxIkd()08$J)Pq$?3y!!aVQR>RC=l9~Qs0`MhUmh!tucR9r_vNKw-pf|PTB`8dsNL9 zqqqQoU%w&h9%~A3VRfLa+O2|0GS~Eq5VXg(cej3d0ZIw8QBb=z04fYcBt0Jpiv>r7 z=nS%)AS;)=ZUZ>JWEs2+|DlIX`9aOATk`mw`)6WJ?4}}rocKtl@G7xRmM2u=7HD8I zsUFC?D@KG>B0chrgWl?5i(KE)n@Z|r+`cuVe(6d#Co;}K96!V$j`@DpX)iA(ace9W zo5GEOu=o8+Hk>PC9>$#eHNN+Q4nuZ(G+5@bgBDnNge1U8W);M2b-0! zQjM+K2pKe-MNw{pNs4Z42n?#Aek%4tIP=ecW}KOoD0~5>XK(k8VQfD%)j3q)U)FK& zmj2Qq=&rB$`o}Go(z+if1?UOzoh1-+lJ4*jrb&?PqjJ+dt-mbN(ORG5WuDYrE#0p{~|`xq8J zTEmA6?4U-nYH>1Usb^lRguFdd-#4}ugU*;>W$s0Nac_n;$7p`rgTpYnqaM~aTsYIk zraW@!b~OzwkzQr%lhbq1+Ac`Ev#CG?=)qLI(ybIiY8dhIA0m=lbF6~<U1M9V(tslLg_v}nk1eVn$Z1i@fWC+4834x(8uy2kSNv*sJTi-t#reEUeV#x;^ znJ9%f57m%s8=={$IsewP6TFuXS+S7-qPV?whYDX$|JXL@OEs+@Ww~VJP*+{N8|MoW z6cx`o@2Zsi`n32T_@9pqTh-|usfRES`M7?R!vVJ8EF_qfN60EbhwXZR&_auM|Z`)u&A5}VAZR$k4<~i7wVRSlXcK#dkN7`xk&)G6M5{JLP z00W$q**rYH*Mgqtfh7)nxF^y0B~^C5> zQi=XA@-MzM83BhEpOcV(|FA_IGk)%@lRS&Ab;|Tyjnm%Kk&t^=t>i`Z9v1_#&Yd|p zi1F7ShvdEMhpM-W32Z9n#q8~c%JF=3w*jtBM;|UdABnJz>bK>h7Gkn@4aBlshABh7 z6yA&FvI!khiGMvo^@u>@_H!j#E_0|NQ=&Q?uGB#j&8x$Aj|Y-s@`$uX{JXe2q@94GHf+5JP__p=?KoZd}`}8t@2e7V05J7h_(@TPtp{%IwZ>&F?_o)A~ z5TeG4Sg*ytJFIrJX3DZaaO)~&72{m(k17#TTT#?_@t@2g$hlNF~&Mcfj=;S_OJ5alu;=adWX$EHPy8ihzm~}c^O_sy3pv)iS{7rR4m59AE zBzFn2xUYt^^tbJB0FRMBAF23!R(x3bk~sDMD^Of|xQ64R^rlOHgmLNtN4kok z=p~fB-*3)4q1bE?SLVpmX81a;roO-eNBWad66^L_5?7=bh?+3k>t7Cof(@ckBY_{k0Rn z{~#~9*@m!M)#57AcpyawBQAnlIkRB~HuJ#zf}ahpCd;yI)6GAW*LS|uO=fUZ@Nn@rGJEw6h`FTM6{uTibkIXxDJqDQym4CAly-e2ak(gQFSqO>`^j z4IBFQnZmFAw#2@dVsRT}UFScr-(&C{25dc&+6B{jcSeKB6*>$yWFs~l1@ z9vAEpOh-lWR%6l7Zv@uQ~UVC*hX((n2g?`K)lWZ9MZx_^Q{{Vv&Nb8(fjX8t=hCj?XVIe(0Te^ z`r&8egvLPM5PaSbHYBpnM;Nv*CCAp*gqZYhY9fjH2?HyesK71#OxKBHEU^loou@uJ z1LikWp%-QqU3MI*(Q&Y0^CM9lhY0@2Z*)VHODtKS_%PZCHwFj?d=3p)VSIv|PP8_Q zW4kycpNsd9=!l{6qAooo$YG1obW+am{WvGCXhn~#gDU*8_Th<|@v%a+_AVYMnf4zs z$vwty4tN>-nWsjldHDR~DJm=G^Q2Yc%gA9{e5JyJfUzz(YY~<(P!vJpV=>zrL|#`27tVKW`{8 zbr!=zQ-eKCW(#hfaKfVAx+?)Aex}(C1p5ViH@EauI%UAF8?a0hKxn~tM(du}~ zRoy)(86K52!Ls_Oi%JqczwGwRkUBVF(4-wFAa{7V?h^gs6@FuVCrZR+m7U@k3s+kc zV;bG}Uas*mCUBL}`-R`?*zZmyDh%3MsQtzXp}X(Op4JC_#P9)goxXh?=jRn4FH3@s ze#3Q@<3%2$;K_Kam^C4YRB#8Jr0Ehe0!O?k0Bc86{ebK zmkpccA#o-RWw3`sg7L|}ul4j8gw8%(nZ*hgj+Qm5mpnE&PvWiY^M-xR;1j{S2y!n= z0@Jr0oX}{o7m@nI+h?zE;alA(Z#*h?;uzSSn)K7?e!1@E8*}k=Ti6xD7dSvKl*iTp(DXxsweM-VB^=0nVCV%)OS6-nv3_;ps&)VL@Y^-n;j~CJQgaRpxGh z+%|#g8(FSDdGJnepSc8CsdB- zpF*Rxq-}Ky&qdgaZ!F-EI*Q3Wu)!l%amOa<9jjUv3JlOnhC((Pryh1G>CQ$d6GU$y zyH&%CuL$1hQ=1A{pS+5dg=dLTuED1cJ)hHaTAvF4Tvh^E^RV@yDEm1ZERM3HL0j02X2RX9YKyU zh462+W!oj2GVcViXS zhaX^TP}ufv{cHEpI$F{`=+Y>_mOYPEj2Ieul(WLwT^bgZ%jVB$TYsC<5WlJ&fM==1wmuzhg5CwroM;p_Qrl!fkL>2c%d>Z#bTGZ$*KuLyveD{V7cOc=uIm(+UZ@=059M(aANp<)C-hsQSV2ZwEyt zZLV_Z?NH!~_di)0A35{k(I4<@_kR>W3n=<+<^w)`JNS$!)L+ipO2YE(2~$r@z6r$p zyEh%tfo!+Dfw`Ty1ND=#rZk9cQgl1OoM)I*c+V+ZHvgvSs($W#4uil7C01r)Kc>%@ zTzG%`P%p-e`_069l$gvbks>U=GI>+m4@|tl-|hON#LsaPo~ROoa@R-Wq{0_O-_!$} zcCX#lUGUp~rSa|>em1L{lW((LxneDh1l9{|;jdfcw{(jq^ZFUE>{d@2u)bzoJ+l~B zT-~);#oFYIz2|92T8H=XpA&37Q0)10?9sUK$K#0^_3&~;M#59w4bLap;@)?u??&3- zj+-R^I!y@B<;Dwd894ZI9CirmU69382uJa=8}s!KOsu`o)L^Dc$_#+`?gZ@SHdP)u z#v(~i+z0A*dvDxBudR}SGYJOR%Plp7EK6TdCxDWsvs8)A>v2H6R$w)jq0*|>U;t1H zZa5I5@@pS9v`u;9&0^EAW%dj9@6&W0Ft~jt ze_26K7=CSF`?LhFTXTg@Iw?nAE#Ku!r%xqN^{^zJPQkRzi#Fb$j{CdQit4p6t|~vL z`F9J_Ol}5NpS_1o5#9*Qn%2LBTlO@6T-~KBF}s$fr|cc@y}zAK?x`$*ZquBuy+jQ@ z^Cs9y_^?U#_S6z=&EZ&~vyb7zI%+9T7`E{|JSN61=$(8I<#Rmzlj!F=&_)%C`Kmvt zO6n`eN6pgZ+H1JJUWMmmbDIHDx~2qx6wmjrKuR!>QoQCv6OeK%#F%sI-W5{b1WcC# zlf7veV6ymO*1pZ`A;_KVirptw5;7jF=ZjT5l~`5HD@O`bF;ri?K8z?Csc;P`LXl?r zGgW0XEad3k?%QRc66qv+#l3HHU8YPayn9%tyo7I=lJY5DpybN?D?mvxP;z5ozV*Yi zS(Dszj5k;9H9&TY-_p)?7r&kCNP3XW7FMRCZAuNv-csj?u!hO00i*4juAMDis_&Rq zkRRcA=$+;!&kPUJEHArRb~;nBah`p`pe7*#l=P2Asobj2V~d66v4YjfbsYV5`1 znj6f$z#zZY9TnExcD_4CSkv`%Bl2lROm#(?odMG|Zm_3zDJ+|#{alBO5k?OX4ML=E z4&f$mFxTKd$rf=NA7244TLE|MKJ7%{^7aJtdOuombE9a`&-rwtEvNaz4N3=Rc@M9E z#|G@1?<**$F;dCS%z<(<;3PgXboDL(=jU^N?SSCZwa=FsZZS6NQ^)%YH+6h8=36m; z0YS@2|HrJw$6tXeINn3UjDJrZJ9I$lm5yz!;>L^R(S25&q|@Zj@Lt+XqFDUtqe z8b~z7avfwvTc#5^)XJ&1p5B+zl}Va!D3gm-)Xk~qcJ?5J>n9AMybry*rRS3y;rUbR ziNcXK(V4KQ`tVC{4sR021ekxj`0&=nLuQ$n8l2ly%@oUNQqtGeWo(WzMD1SNg)J#TqpT@!i^brv7(Aw~9mbkF~Hm!;n4oz1Jmpa#Z zM0GiGTkPI)a{~PLWs~SOg{b*)DjZ~y7RIRHr5^8*Q!F*OyLRov=Fl~fK16IGwxwcm z=Q@=>GmmQQ_gyYPPoL0JjXk<5_ZN^xCC2~@7^^K_iEb|Z2wgZFZ|aeKdZhYv>%GD4hi6?T`0+#|YX zyoK5En|GgQW5Pl2y`i-C&y{u@dBVyDU%Rx8*Kr~~z51b)`V`bL3{4x??R+VIVI7@K zf}-wY>nsfVI5_xImX6K`FY4Wb-yIpdll)Uzmq zfLvmd{Kb@yz!#`zHbjjRM73~hAe0zg#y>Im*guU+Ki=5gY=-PT;i;-oX-~ty)kW|< zd|I>-UK|}S=WboENl-&VAGw=lUiapiA%=vkEt&Bt5^NzK@uwHIEIK>wgCx2Tvy zGeYTd_|80@D0qFcEhBQL^nv0p(mKk(W{R9WH|eF-=b=V;LxUIg(tdiePJSB;f7yCe zfT2&_%{GK2aU&@SvjT@IT4+h5{OWw%#!>$~I(qmTZMAe}-tEy&L4!}@e1u)VY~!&C zYNp=WGqo0)xw8TW6-yD@bC^g2Ua!VE|EJNnKsw{S0{v|V9R~tT@1;z=VgstO6LxAG zcpWA!r~ISO^Sd1XgnSH0zcDt)ytU1AEy%wr(UU+eK^4OPew?(ZzToop=sg)b@?~8D!o=#{$`p)p%l;kL} zkofo>dYZ(BI^jDOx{Hx*5gjXmvJwXa8-BLk zeY-boq29(?a6CxqQJiAH82=5@b2sU;!m22EdDFM=by^XUQlf5jP;m8`TjgE7)qW`c z_cPTA_wa(BDkNI6f-X|A12Iv0<<1AXMpP0Cz2Wi;aUb*b-FYg@bX(oDu$`TfEW1T| zR`xn;U8Qs#J!lzUYixlv)A=8a#1-%@6XC)jNB3lU zQV|eme+Q=4Z?D_tsohHHimMj11!CH!x+|}knxPE^uglQ(-<3~MD{6n0!Q^(PD^6wb zn0E=#6b>}S%dF6(cxkY2nFCzp3kIHfM)VKPyyBkA{IdC0sM*)WFlM0XYhQUf^Ue_c zTC;%kS>*~2(TfX#81xu3aW*zqE8XU4+IK0V`vmdsO`6}}*3o$5@6cvJ{DtjiCAzKx zJw7?CB;9uNz@;tkE3Ovb<#({GyB8$01=4l5J^sm)GrhFPKs*S4aEBfT6}stbY~Hj* zpi?qKjM>qw>!?clZIe26esN6Ijb5XB-X@F^J~Aa|0QJ}4Y;)#8sbi$T!@rd^u5KJOAGz96m)};STx|SO%thkoRMm zC;bclar~Q3KTo~YUW2nTY}hh7$SWCb7C6~}4vp}WxJ)_2 z+cyy6YcMAB?Bh4Bvvs?(?x8=wQ(WkBJ}CIhF{~HQ2Aj^b;naOn^{tqsz^lOiTZu*~ zr2ZXqn!aZW98>XL9@E>H4%hy*?SFC5$yp?6L^?g~y8FKMT82@~?hqt}v6>cd%@nV7 z=PW2?-^AkeU8N)F?@;+^YaRabW&VYfa*5!PVZ}w&(hiRjTLzfd5$*?!9jezSY-gv^ z<}Z=M@hTOpsi{I=4nEvppj_fE&$Q64CRWLCQG1&WjLBx*Zz4^3$%?WFUI#>FZSBsx zQ9B%HvNXeZr(8P>Y9}3@kd)eKp?QL-Qz5VpN>a=Opb-#A~r#6 z8xyNleQKiXk{!Go7Z9Qc6(Ua9>tpFd&7{a=RWT_&^FXUcFa!%PL?+_YBko0?)8-QB ztTJ0W*G&`BgYDOgkd|`+OHmZ9BQ%umVwAq42?Fyni00qtpE2Hw_hebF zeJ_%Qhfd%WuWc)ah3?^~Oz&0XUYQ2lbI6gemceTziOANUagD%2`N|_TnLYb`(A|BC zeu(|!)KY7QQYX>ddQ4(xD9qO({tQf=EBQu{?&>~CJip}I@_23<{V#mBKT*jos^-)3 zf3GUpe$_0M7cG7J7F6A~^!v$DcgfQ4v?Xi91+Q1CKUSYMnSCbx&PGStD7FL{bl?$ZWAGsZj1d1 zOWnp2W53TA9A5aX)bm4We!ReOdbo0Nj>c`tpJk~AebS}E9ON)XWBT?<2e$)sfK^BE zdRH3g-nZ@==UExwpwX{8D5CDXq~{k8cr-?MQ7Y|Eb-V6S2G>B+!AcCNl|V1ATj8(u z$|ZTd`OeM*mC>(lDNajc)(NVX?^`cYATtVykS&wU%bsr)b^$<_$+6+{PVAC)u0~5( z=l-wO%hLw*;S7(irqd9H$jWTm4tLz!KRnkkb$@f{@)*`xt(pQ%3kB1-M|a$k9;rxb zYQ_@WyDojDbxxoJ({}Qc{IRPG3y-A`r!|T7WBc-zU&P?eFE}wT56#erHP{_$m1;)W zT3R>N*7<>79sfOCPOSg`I}&8eX>Wh`VPY8&J3#^F zih_NLzJ|jQu6<_oLx%go`LE zZYR0~wlL*R;5M&?k6R$^kZ9?E8Q#2{0^9y$ zaP4KWnw&&24!Snj(V>xddD}sy!Yrg#`DUBOoxNp{Ykr-vxWcl#Gu6k*J^vO3ri0=N65+jC z5;t?%iec77nr|@xw?dEWUH=7BK;o@Jsm8LYk#!u7 z=QvK~Tgg+$Lgpb|bwbnsL)0!Nj!2^;wlaer5b3_;W@gOa8{f($&o1}M?Tlt~yxjny zTVV~e**T+TlarfMvR+eI*um(Yr@KF1`(S>u5TiN(<0AdueC#TV@VR?nl^ zv)3Jlg@pA93gv4shIzbHry)TvPw1$dr-{mgQa|2P#BgEh>Ko>m!KrJRn{K z{`!IUhXJwo&u!T-e^Tl|cqp*YAbjuN4*o^6xUt80k za=%GX83O$8F499%R;#Fsy^dq*_2(?GNG*gWnQ6oOSDkge8-j_gg;V54ygdjc>h*IQ zwG7yl-D@gorLeZtMCW22Ahgxc)|E^G#wZ&lkFCQ;bQzoKK+`%tNR zRzG=PYCPEuuRrP`Bi9c&i^T9&Tdy_Zry@7K{klI=OB6ap9$#u2#XN^(gsj)8Vy!ukY4- zLXoqw3T3s@bV_qvDod@OGdPSkVJXZ-3}tq7VHNZg))ZJhw)mLlu{{>~3EC@6DoQ^( zn@GIAPnq&C>1HhcS~`!JGHlwEKh!)kIvS|iU`wDpuM}=NYVKbL5LGnKoe`Tmfi;5U zu8E7zdbnBd13fIXk)L)NQ^>~DhC4i47!UrVkDa(IU#5p?Yv^F}o;>{iaubl#}|A_r~N@SzV`Y0&c(JcmCZ1m!JWXLmw5!k5d z2@vLkzxa?Vn=bsIqcp@@KeIU=5a2pC;Zc6A0`l&dKEoTke^`HR`Kz=|a!(LJAEaC= z!DhZCRU*%elhRljOMFajdN(j3M_{>^GGAC&3U+pUGr64+s+~Xjm_W&&2giLVl}M^X zfhhShXPZLyTCc&xfq-)A9&n`$xBNd4r_uZau!K;ajehBjyt70D2!&r94aeDcaC@VC zF(e$FLR{)H5By`OfqT{ub@b%g4I$`RwT3SnWWMX!9+jX}YKVvZ*QDxxS_IvS>pEYk zxgt-kv2_D^%2n>=?J=+k{Ph-t&_G72HPp35)td8>QmwBXI1CiCZXn7`5ZNbvlWS1< zNKnd09-fz+-@zKGhG?2y>E$CxeE-8ddLst)=dnGKleehe1IaWTA@F={I~w)LQV}j% z*8kF_^Fpj}$4xU$FBhkY53Ks3mY)5OQXg75==ZAG#2_Dm<_(4in+2uLT78DG=ie-f ziw+5?`zoEL*`vQq39A9gfMHW*Ziw z{bf@6pSk-{Jsoq@q&P~4Rp;LnB7-H-A+M50QQ*qM)Q|N#nnuR2^w1a z3Y~zdKTbi9@#4{R+U&TQS2D2m$N}g=m2=O8$e8DY2qES3tbB)nPA+QP$eKmqJI9av zQs~6RM&I??yhZtzDF&@)D!4j;8%XMU#Of>#JZ zqK3J?pG^OBL!Nq-sbViQ|DuPn55B?rfU1(53$VQ(`){%|laWnIVx}eTNStCI*5T+~E@^@H^{=w%-G6Mxj{1Uf-s6>7af z^y8wHlutj2=0CC_cwdXVJl@JvXo!v1mcD`NwwCcdA3=>;-2%40jDa}w?=X;N)sY`sS*1VsP`^cAU20~;uZ3`?+@ExTg?I(? zI)xhHd3x6Mx7~iSb5x+cFv*v8fqx}@6U89>zDbJCx$J%iqUO*ncP0US%Zf{HM+nDusQ!`3nrFKM7Wm%qRW~T9skXnRD_Nn73A9Bh#pn(A|npTJE3y50+i!Q%K%p z+;JdfW2WN9=Klk7(NM!#n#tt@NThz3k=$Q?n^8+n;t13EhI~3p1x;MBC>aUdRA74( z&&RHDwF`ijFO-IM{S|}d0kGb5Ln=cJEYAgcMDjXk8kq=|MP2$n;VK~uBtX0NQg8?B zFEmCUsEIFTf*4cfboF~H_Sa-GAF^AQ3ZeB)n|SxA39;azYC*F??713}=}#2K&qmMZ zZkxe~r&1%noX57iN@QW$|I)Fn4jLVE7NR+VyZ}_UnKGo`h5a8?r((xznrRWq03ih5 zssCi5DTfImW0xdxi3eP56=n!>3B*C`pXpc-^?wjme_o_%0Yu?|X#VBH5&5?ih?eE{ z@XH*p!i2M}fT$Wme1ws$%ez=?^_RPBG!&nc$nbSWWDvqp5K_yl4ZHsnr z>1-nV(cT7J0v%eIlfM z?!v6I^4FvA*Ny1eVWht%3>~O=-(ztG?a>IeriD#cqqeFc$}f(V`hxlVf)sK?(K~?) z9bBawZf!k|Wdc#ZRX=A0rl&k5*i$9P7mt2y29s15ob^pv7RavgtO)-5=V6}?)GQOW zw<#N!GV*axRWK-`C_8QXQXZ-Z6pO$gB+bDJ1c9ZEn5z2#R7ssT5cpr9Pi8Y)9SbnX zz(snbUWQs?TGAX#w4|#dCGq$xd_ax?uF7d%Hxt(`ixBREw&Z)-<05;^kUb=M*z>Zo zoXLedICMDyp0yqCJu1gQtN8%;&&82-JpGOXzXy#BUbDaR125#rvu23BgHWgNcuPaQSd4Z zsCtv%S$@|Fk`J#21X5z|xBPmyat1gJ1y1*WO7!HPSdrS_xLf74X5{PP1#7niCOifx zZx)#u?7U0_x3WPe7SFDoL33Ty#KvFkd<5Wb7r^}5+5d6=|G^9ml3?}#%=p=vUiK^h z#S_~3kp!a%FdjSmF9h$xlkA_IBJ~NV=xC7u4-nF)5A(ZEa;ETjBjiEML}7zNJ?g}l zK_y3a8~q;u?NJY|k`gu~;A+|bIU=!>MmoR`5~S~~|3uM!_Ddd(HOMIl|1UYi1~DXi zB&RRYrU27^VnazGV83*6aq;)?d4vB5Ot<65{qf4BuR$0OhyzXO(sdSuu7V9= zwLf-q!M%--(7{TPAd^1n;@b8#VUbNh5;gAwf0xEA97KLftJ(SG@NoDb2DyNmR>h}J zN`3!_?(CrtO-4YsI?!!VH1aBP?EeT#-*Q$VO#u;rT&JA)d3xO2<^RyVRewIfoCUd4 z40M}_zMH21e{>(d?NXS9L%blGkUY=%|(2BOU zBk4!vAaJ)I^4jEyq9Ubwa_+L=QGgduI-i6(YK*69< zqW94q18&d$W8ANP7R+VfkTN5BBy>+V?b5p&sFAGtTgUC?6u15JXl)%IA{hiZqSp7x z&(gOFghpHw*428N5WK1Ga!O2geUIN8+QJGh^7y{wtotk4ghnn z{mz~#c%;L-iI=1|&&nSw1%*yKgHC=4*hW8SCZssA(M^ZsDdZ6a%HiLmweJc6$_Jo& zJ|!|21e@2BRc_1dsTk-b$6yR0G;K`tW7cy$X7{fERIW}()bb$~Xctj7-#BQU{a*o? zhh&{ z{^lGsQDc&_ZnLzCGg{mNz82E^w6c6U{(BPqD^~w9^jN#&XG<0)*&b*8hhle~N*b5< ze8_LGkoKCFSFpr9vi@SF&C0WR-Kq!OXfjyHVtD#>#AUB}&PB2cce$0KZ%vJOcTt?? z_Y=T1<8`fi*R#EU+Z;4XRyi>`6gZ8%&0!~EL5_hV-(OxiZu_s!HvBfSEvc~YZM0 z1aV(5f}Bq@I71c{mm3J}^P6<8ib7OmQ3DSeO==YA|10O^_N%qJzk{tD&w@-t6j`Gu zgZS!`og#})Ao`PX_ZS|l?1+}K08(y?71gFbD2@KdSWWUX^F$2X;tUu}O4*Qfz5`5p zF?!?#Er%I%nc*Y$1{NVyPGB6a#+pUJoOS;VSw>@aHp5r!MWO`NkSZHQ`ubxVUa;02 zbc+iW+Hzm;q}=%{9Y_~a7yfNYvIzDOB8xWq4BH?HrEioi z*E72KZ*q}+!bCXerYcVJ9hA~n8P+Wp_-2_P=n+=9|3a($R!Jm;iUD-;5vMVx{aPvc zhG)pxb*u4zxsLtvXyA6>Ed>NU?KEG`b!6kCm6!$%a`#&Jc%?0ploe%Y|3rTPqihz8 zL=BW&!3s>Y*L3<oL^iImaZQeSRIn3#fJhs#{m9ztfXVOYWuiA+{^1V3IP+U) zi$22|$CK2>N zR;T$?4DsWLf`ga(JxV^aS}PChXVHnPmPDg{rE)XpS6bx2?Ua)JyM+It?&2anQcU|f znm_=!D$LjEL*7?ged#EDXh#ErR}I%^KtuN68O+b|W zwQBm~OB0&#B6aV7z(xzcD7gOs*(!rURUspmC~TQ-(ZNrc{%Lpz=3Wj za~M%K@-5wq(7XSD#Vi_U)2BRCK##FdnW` zQdEVl-VeyO1yQWONr(pc3UL^|>;HQA-er7{Nxu$(DZs9G7QLQV(IY(-| zMsLHxC=~4l0^UqqM*^_9*DT=>$JO}{`8YE{IK;G+m*34nzT=)M=&9M0H_6kXV(E>d;{N}V9rsz zxje<`^R;6q5X~S3B=i%I$vJ!-(Yz_j&1SWZZ@~2&h15H1$FRsFV-`dhvUi8EJeE_V zIJN(zZ0q}0Trj!Dz04H25h;l5MiALOaR8W9oaz(!xPf_6F^z&9qyB|Fm$Aaf%mWzs zL^OLkJnTzd_%hB>YLKY z70LQ+0`l4KTwZ;KY;Z;Wr=8akVv&Vip2!;Ol&Q7d%ukouimYDsBfN>g=^OW)q zjFV_NiL~>mA-_j{8SU~sk=vbIyfgoOYpV_K@`3;z|GEby^+Y0sb)X=6U??r8oE8b^ z`+76W|0~m^;&*aw;?JVSxd+VHB^-)2p(Lut@Rot8EHbE_&vlkR|6mv=QaK z7;xf%_o=k7nKef0SBs_V7YP(cJEBJ${l3WQ2gW&!lMbO0o(MV1G&vbXZbD_I3QTl? zU~8~8Ats0b)1n){OK}Z2l~HKXqSfjB7gcMKb`g+bPjAT`T2m*D-1o1CD30XRcr}5? zI3vGdHtC=kJ+p=0hvm>LbFDqa{NHzUOraV=%CLM06(1Pn)}Br0H(j{$sb&5M*FgWD zoedg&+uwR;>78Q%1ZtQmAh6?EiR=+wSZSw)Su$;~Uzx#n+-~0scjYHkbKSBMC-6c* z0JLS(bx|P1+NqZQ&FfNPRySd2kJ7H?wve$Q36~r8HJV@!;#S)I*xxTDdSa2QE`5vW z&>s?DZM0|Tqn>CIj$5xfngB?%8xTTE%hW~vZ%J=&^p(rbM8AV^(>$ ztFW8aMgC2%rfxI&ip@=Kv;yEJnQcW(U=|rc{Z67##{AVzSB6~j%-^0I;WU>CfU01* zP@q*J=QmuKi@W;$2gAlza(rz=OY}$*?krbrbd;DHlKyUPE{e{XH?k;QY@lz25wweT zKhdUfRpHLJOmP~8vs6*Tu5C&DnRBu0hM&}JM-m6fAfF{!C%;VR^XfYv;&EFPQ)PeA zS{k3buKd?l3|@!42xtkvxh{G_;2cLTJ4~(!ep60a&U8QZl^U@G1M;$U+_H=JQLQH- zf8bOV%v2g%x>|k-`t1FY`OkW9jkxZ~i!+?>*;xmV57W@43_S+p34ZXeck^ zlJ!gERT9oAzNa{{EWWw$r{)`TtG;5_e3Dx9gKn{V=xHST{|&4#JawO@3bF6#w6lxX0IYA=qrumpuu4N!Y~OtLF+WR``K$ug~0F;Svzt zZ_EulE_xYn)!E(m$7BDGz!j@b=ee$nC*@SLMX6DdLs^dL?mKRJA4!l9!LNMQq*wO_ zycJ!SMotk5Jk3Q5zVc}`}U)Bk9&5BNbE{j zRn2XY6<`0l6HwuuF~S{uWu+`ZuT7!(rRX}#x_|D6hjFBp+~xSYwmDxjx)wC;4D+FC z5rPnD+k5?+$OFT@c_)kG+2-ObWes|=DB11KdNL$F5uY0)z8wfv&Ktc=dVa#GSD{UG ze)Y}dHzHjX*>I!pr%soam+N(^7HpIDc>44Y@g+I-53>-*`F&Zl52DStm3awHLK~VM zeT)&8ry?!tj8QAnqLnHIYHc1kQ0PB-tK94SMl>)rGDT?J87}(A*yX0bqjt;ZkICDZ zFIYaWSOoJ&JW2ABtlXj%$BE)yWuJUirOS)UcB{T$j$cCu>|wlDH6-7xH8JA;2HbzK zyQOQd_xuUlv{Y&detGXZ8a;*3E4)99tO&khBufbBEp7TLB6OkimBFKQUVLTY+&HjZ z1jg>&Cb#IuF`{_&jZaD{&nheLvTB$P__g#7#gp(@P?y$NjUQDDK9m>O8}-ZZ{rk>g zGN-tRG)Fx8agzOR)15mowvt%z6(JbAHLgiQ*RRrs#fV4A0~h|=a@_x z8Qf!W*}zujI-D7owXGAYiE<00iS$m7i7_AHEy_Jqf5~ifmUM-S-gM7@MO;vSAN#JW zuZr3cD>YT(;IECZZiA;MQ6KU49+X?O34GLZwWVvN;<@49v3g1y@jg<}^I9%%NH(mE zGvX#Dv1^w07wBwlFYm2pP1GhW7+(50Mrh56AgY#P5OQ64)mS)3ykS;h>i5jWctXRE zbZos<;q5ab7kmXab^KNe150_+F1tU}X67tFRM9XkJD*`(=2AMy*Q(DCMf24DU0IP@ zxq0&2+EO1p#@D3gf3psO;P4R;gq2<#uHl4{zcc-${rsejVJCeUvEfewlmqQ;KN{8zPMN(!=3SY8J_UK z%1+4}6>N@bBZT23c1H1vf)NGljTW0Zs@d@0s1MLaRw0IDi_7(PGF329)NqKKexM)O z5&-W>;v9Wo2gURTvuxab5mR)*;JH(1lsh9H^`gey6|dMCX*cqv-_2Q5Z!xZZ}62xfM~(oG)(Z@aY_DKx+LBun+GOXhUC$9s}6kySl1jWR9&wDaHErL z?{44{FTJw~eb0`Q2QEv~KMDhnJBM0X00<4ju;hiJYEa_9hCRe9n%-#B$ zoxzmJ?;|PmJ<8hL6ODKDjSdes#t%U5NPkAnSqI3)C!7PG>DIuuo|*%;&r`~Re!)~>g5pKYvl0z#jtr}1UBYzassFr zd#y2^&*WRng$&6dE{>OFgdxtFrB+FZHz>FKcLxu*G9wTa46TWy=D-&dVYP}7A|d~A z_0htjWq86jO0*bXtzdhaL_&9V!Ybv$>>zfgIVxQaPk3uTw{{odL{FOBA~-WLtI{;* zXBUA(KD=7@A64=hlB--NF3Y4qaWa3pA{o?rVH$>Y~}1{+^lx zTd2{C=P{uJqxi7vw}p}(mwhK)NCXyA3L9r=h^eU9Vu{W>(djD8p?EU!SG*H8vTwe7AVg_pHYB67<%fNs;vWT@0INB^mAS7Kn=UmAPmp)MQa}41g0m%}p{u zT%8bp>5%_eG@i6Gi&gU~AIgG~$LGTf=9IQzoGQ zWUAAG&!k*m+dSh*eSJHvWm0Hd^!(J11(1A=hv!#Ga4r`9isq2-fJ#|d*EGWPGQBlW zcm*MUjYo-}C_g?ZMSg(llccNE93^;3leTu#R!}`dSd1cruQ$pOPlo6Xy0DCdDrU6} zfx~L`hvJmY3uNwrOo2a7Fp-L!U6L%(p!~6nYk+orayrsj5TD9l4>Y0vR37+ky}0Qt z7eoA%8ZL0jVr-Lt|=)(aOPy8 z>J}maP-iF4xqQK^HFmuOO1fE&L0(LIo`7cl=UiznWxh?9qb5BnoS1k?XLrAMgs358 znVJ%VuIcr+avfYb@{>re zVB;M4V>*D2e6?+Lh7!B#cU zVk^`6nqANCox&+#<#hN~$_G3veD5qM^dWzR;AmkgvWT?UU_C%}+LR~n!$Tmv8k6cV8rhv*(L|W)tBRs;ga;Ya_3vq z!zD0kAE8tKKQk`zq7*Y>bX4Y{&b=?-xOw(;S6M202-!{9YkYH5me3NiwD1YUxRJ;{ zivDGoMvI!Ud6ZdQTFnnwop(F+*=bzjIZPda=VTNA=>_&XAR(B zz4c7uVEGX|>f%Av8Lxhy>(c*tnoGRL%}fmxFe?iG+4uS-So1M=_O=tB3sfc_H3#FH za4^Qcns47Tut!$(@Ck}1806u?o&f5+iEbxi+n10tq>Jy%p=-u07Gg>6}?injlM~EQD-l~a5T5+;^Z?UnHI8y zkD*+*U%==eA0A(vNNiVEgJ+W?bFl-YSoODKlQ1V-tz?9-~j?MNbjkygC*%xcJ$XM0Y-xtyrfd_!>1YugGtYIt%FZVP?0cS z%t!&%u=7DYa+=yx9yFnrrTo?(L>B*3;_m{mO)q!nODb`-c^5V zfu~B8n@4|n_PG(1mA9oFK5&N1tck5IWHF>cep~GWG@)@ZU|zCSo#oxOm=QbZo&F0h z3!SCZ?oR_BSf6S!-m+(b7Bsc5^a{3TAK}jqgOI0cKY7zpIjc_N!Q6$QGJNuo)aR2) z3OC^ID@!g9%0c+w4t1Bx++XhQ^hJDbRjuJ}*#DJ5QB9+I9DStSXc-bKPpS>P!*tVdkjCEJO_mo$gm0ftf2)Sh5w{{Uj}x5+%!c(>fy?ddyPp5V!Kxjd?##yYe4q2#cmy_D{<>%6lR!_+ zk<8U`I+=Ib=S*riStXk8xDlnaly=2d#^V@qv{Isa;sU0FRNe&*9y%l^))HZD^Cser z#fcy@ zG((`2UMecITs7~d_KVH_XSq;T6-6?cz7uk2R}*@#`2EG-!zJwVDpD-#Z!JZ=-md2T zHj}tN7|C$wz~pR3hjZt7*S54-cJdlrkJqemjvK5^f#-dA(fw$tyK6emmwNgPu^a(g zC|!?e$?ud}9A@pMi`S0);eD>cJIDAQse#iQp}7PJEjdT&{hS$uTtv|J9|9gN;NVS_ zBha=(2&rCK7qsf1Sre`}nlemvcg=SHdBu8P2wHsv?%IR>AOd%f!GPHUL; zOqAV7H3tLBZuoF@<@iAq#`?5!oJ)SfJ9aZRxHte^6dF4+ED@FYjw{7T9@NQ5BI(mT zrEdLMmXO*J`@r|`bS%~gcCJ7~8q<2SVnzBTsN^&8*PivBE%QCYmQM*=MV{&ug!{6D zzFtC7ReXBEtWugI?ur$z^0H|66x6&^c{4&=_8m!cJ$h^&sXRAR34IJ5k|P0JmFFz<@=@qMgS6r8&J~i# zD!7pW*E>&WjJS5pXn!Z*l`Y4h;C?KojFT-o!I&`~Yhn-MvRaf(upb%k8Apo^I%#oyo#9`Hp@@2|SWIQ}XiGGzUQc3|kcAbXfav zgxPEmMonyZB$zQBGz+D=Pu-)>6rwDZ4;gyOlyw|!ry>V9F+*QE8ouJ6GeFpuA5DzY zA}$8ZmL2mRHSONwz5Lg#0XOb)U>Ti2P@Z;I@0kyux2kGRu5zP_=NHiHqyvlV0$G*<#qoN60eC#m|n#;Bt>_??mGtF4Ket8zjxYf%M>ecFP zmS{I6PGAHf9tTKYMfuBv;m6i#BLX@J>(mGqk7o}_qXA#bUA0uevleVZ>uTl6lSNxj z%_Ihjnv;8wR^-o)rR;lR(6!Um<-AyA1k{F7=r^!Rjv|sS`BM^E2`wFL*JgM(GudO} zHZ)Q>1%3yAULp%6M+zlll>l8;kPnD>?RM9Le{Df~ZQ=dq#OV}4BDnM5*1X%hUaabDE%dTMF+B@RRP2fsSMl zB|y+E9UMkDu!4ZD=fvVvBr>NDNMM2z{t~+PvqdGd#(^vddzW2w`-zaPzFLZ_$F<6(AHr@U&JI& zeS4lPIz?jxUo9Hz^4D}AGC2;%pZ}t4le=61Q&2OYxsZ{cPsip1G?u(~s%Q)>-x0qE zY%%=tQK`j4Zruz$%Czuu@f))G| z-(}sL-T>_@+t;AQ(KSSMN^{I82v(%hzR>=f zZtL-@rIo~nZXe{HTW-`bAw@+vTskIuf(F0)aSk3Pkg^Vo@bLyrQV}z;!kq;j&RKJe$2z6 zi6UHFJy#(+#lNoU86EsJh2y}NGJTv6-NO95qm6Zq6G~g$9Q&3GUT)F)#k&LxHqBze z)tvsGeS<~12G0z8l{~x6<+P!ji=>(Gr2cMfVP#EhAgqtk#Dte=l_evlHIMx^YlqGK z1;r%)DeRg#neOBFo8Xq|u~S8ih`FjIW3sIO3HjzC^^M~q37xY4RL5?-hBc)kZuYir zQ*mQ1{cg4v>{yHzIM?L1Sbp@-EbP4t=XNfxo@3wSv4(A=p{Z=(Q*&!qqVN6Ob+h_9 z+k96W;o9;+L$Lw0IO?F2#xc_sMhN(Di$YI~)m`tqZ&qQuo=NBQcWe9pyl2mg(0AuM zI`rVG>11B-mh1|6ry`z&u<1V66;n0M7NZtNVl|abh1N+JYEt@sE1d|+jPH>ptv9H= z08hR`{Z;r}4g>ho?mdy2Ri@h2A@j}&A*b0D{DN{>$a(<-PTX0>EeUaaf>IHG&{rdo=}vE z<@fePs+%goa&6`%lGvP+qaE@Dp2>j8%9S}?`>!mIjPzvnYP^lRcr%t|DmJ-?H4!#7 z#Zn*o!WyC?E`*ZBXnPxS$bG1P5P8&cISN4#i@iIw4vi-f(47GG!M?epacp>C`^fi_ zsv=fpP2@@C(Ovb}=WjHf#WdtMX2C*g#-}3vA&!%9UFX1L;%m>#)7jG#tRo(eJ*O6v otQI+$U?EFiA-{IonPW<$xUpWAGkr-XjEU^sbzoC!~$HS`WqKspFWks3rg zLKNxkJ-)y9{S)3imnXU1*`3*$+1a_>&&52}R3ax~A^`w^Tt!(y2LQl_&=*GpgGx-d zZ(fCdh~1QpJpq7}`tl2o&V`%;z%@WcK~~Ri`u7}h!mqj{4*cnP_EYPdcWm$2+Svxb zx}SWf<=t)Lx~FqW^)5v-8_7?Lc>D!=QWUQHqX8n^ecLle#xetMI!Zw1CqgsxVnkHK zTs*Vqlk-e*vENRPLC%<{P*z?ji??V;&X5VEl6Invv0>7=SzOikY>z`tfBu)d{)aQm z4HrXxv)M{#FONMX)}Ctw-up=qE9qb3NysYCF!6lMxu-P~NTnC#a{elR#?N&_Z)qg8 z@H>3;35(`-;?tNS$+D0q-)PsTk2Tk{f=k-!Kn64=rQf?uCRG6i^D5~*XC-0_6`$Rj z*e>ua`G+1k76=l=K63F%`XnirgzzKvDIq0`)gr+HysUyTdDAPwf9f5U?wC2CCtrLV z7pTbDu;^?h0N`#cmA1nA7c=7Id1Tr0Ko*@-#H<>|Hd214)2Qs5IKodS+`uyb zg?6wo3W19vol=l$sI8pr|%%!&?IBHpQneT)|XUj3!wVy=uKR9Al5&_-g+xXo!~{ zZ3D}qDRX#7ycy03_}G7KNTa<6Ncc3qUrGDklJF7myZ-vUt{bG0-#M}sf%8_=^2pK> z(S)Z+EU?AEl)xkm*zxm?Wz6_+T>}`<_vPfZ!mV0bk)V;G7n1FFz(YU~2#ktk%jot< z5T`hNzioS2f{aASTCM+S(!j#!o_&~+L_(&(mw)S7=<|Mo_BNm7nSdC63Xe>Ki3qlF zVUN$~uPgv$*h*ly*p&~Ey8ksRkpK&@&|_SA2H=FH^qo_T521Q4pt}#{a#irPdu+{h z2FSYHSX-vpHj4A>pwbfrD;kuzi~Hl`+?g9Fjg3*g3AOMCy7{Eph%qjd%2b)q{XLLU zrJQtaN17W~na8cK022i45G;8L{s6Y-ht~$xHHd~6{hHcac`FvdB9>2r1`plP-pYvA z*Jy|(4l^OCf*xbR+s|Uqdm_JH-2xCOV)X0T{-W0=ET}%eT_s2=3=1|>2y-Eb?tYbG z*GmDBXrozq-su3IHZ4&1@4(F~Y%U*?h*E!H1a=`c^U}H5IZ0n56%71J3UyC}oiwfl zu-uRSir<9`0_;p~z6%fMJYZ~hp7xmhVuJ*_f^I%>h#@CMO?T#6n9kFpA!W`zKN~g7 zpu}UsjJWJfNg$71g5@iyF;^@DrE;?7s{3NEA>K+b^>v>q{c07`)ORakVuuJ6@PGtG z!oFa9g+qWLkss;^lpw?ng-Unz{^=e3hD1RfDWJX0B&ektJ2!t-{zt%t6Pldm*UT1! z2WQd!S8^BU5IDCGVBrPyJT@CK~S2pV2wrU1LR|%gbeDF>Z~RhNDhLK04O@_?yLRpM_S#N;-L7k z)+h_IEZB+=C1#s8fj=S#>4#*K)*7{(d8g(Kroe2o)A#b~6|NrBfLP%UwzwFtF z1hsIc{NFz!T!=;~`hLXaO)9J4?P^`SEeeXuF-8H>xs?wDD=|{gH24gp6K{#$i%`1) zSr;xyinBD046t;h73jDWdI0A4EikD@GZxqap`drEpW!{9Sol3L@=J0zTdZTuMvaf8 zniu4{a5qhCGL3hYnh}}%f0{*1Wo2llb7UeVp`L+Nu*GP{o3O?9KMjZg^WSG02Ohm= zhHQYqeMhtEj`W&GPy}DL)Fhd@Pn_9;dQ1S#Ubvei)?$5?1_i%V-c@j4Lz-iu|1l?k zzYdhF!EkWUz;}&Vq2TL5;b!x0BX7y0UpZEVoNDudoF(Vce|ULT1$Y9K3S}aPmmd>j zPYXkJp0Kpd4xIN&|8wY{UKMM3p_nN%(fFK#mh0Wv@42~q*M4Mtp+52E+Rc*QF`L)vbE1k>OZJ$0+xFf!{?-rQ){-*A2DvjBy81p6fB9{b zIC5Tq(J(KUfC-aD2bh}DZ3t~P>qSl9zI%_ka*cw{b-2C_fpz>WC)k#~7wNiG0ADq)`DKDz zj;tDPApY>aD0e(H`KrW(GH<}!y}3Ze&znj_xGtvT=+?KlzDG3zB~jbmYGkek8w8r~ zVR82ot48&0k`-=1T!IxkS8Vrd{amO8$BzfN*}uwFBr&g_K3e|Ro2EAfno>u8m?L&r zH{tL20i^5C_IAK9&;r7->$^Y>uPY!io{1Gs&JzI)iZsME2o-373jKEp2qppCV8PXT z89~Ez10AenH%5jY2n4eTT|L#%tASiBaKV&C1$2=^U*!-2Yl*IS(bPtc<=-?RCLGX7 zj-xQLBi*J1v4KD!txq`I=Q|I*TSx~LsLMq1fe3p77N9a1F^0nNq!QJOoaonH3DPUT zRKb<+Y=myuSE7w*Po{a|)GzMQD`KXa(4OI7zv_OO5~%u7=T+t zcT14iWgy**YBvG&E&~O;R7uvO6^bk!C1P+KPS1-B%Sd(tV|!$y=YGNlN^qg76@JsY z7lAu52OWT>IlB*1T~;jIgoon>DDhz}@rJ0d((zlsmupp80+xT^`|%$M_6Oj*^q3>1 zTOBFUCmg8+o4uXBiy@w}w@WrkgyC3kZ@fln5lE?`zZ6P*Ma zx7m-gVPH3(+Aug)bHcv_Vq4JN-D$R6RG?BtG%K^4LdPA{C!OygULHO>_~^-3SjLSI zN=k`jOY5skKGD*V`m%r#5w0>nfN_V4(CuSSD`f!Tet=Xm9K8%obgjF~Png&a z%oE{UeAAPUyDZNvht9e|BPJC0TUy0Nq}wP(&kWcyCg>b8Q^^MKUJ;Cl3}{5|C?$z% zx{|o1S{~Crs|Qek1?g+F_pWehs=p&Tc(bGFXf_Pn-~jQOSad9j`yjmQz1ovO3LHA4?>N=oSX!Mm3O-xF!f>o z2lNwz8c;x!mwWM!E_NPCVD!e`T#W=Gv&@mbZCCz#ot*$>ey_4d4T_z}@W?pf^0G2l zc6_dbWf>emgHz(7$?puhD*3j5!z^}$-sclTl2&{(dR3b5&@X&Z*C0;f$53kN;Mt~1 z_dkJSxJ<6V&|_lK1EkVWNnB1Pqs9tDAfWlt*9D5nQ@2G~mN;j0I_o7fG5g2D`Bz~W zHG4nBZ-TDGW5li51-s6~EKws+M4pkej?VacFtn_>W+=OHlH;p`6=(`RHsbFOkySZv zUW$^lG}0;fXb4P3O%Egx#*IBo|BcsP*PK(^th=xZo!+Nji+OGnty|}pbKCptxkbC+ z&ef+?@r>KAU&hb3`+ejSYki=oO{>U=kEO^CQR&@nl(}CPLhTm$#3Ex|+Kk=%fIIpp zVb8MO@#9tYxMvOV$28oXL&1f6-HnB7pSBl+_;-f#&U^8V7w359Joh@eCpIB_XYAf0 z8{B4ZKgQAfa=Z26yu5u4JISx?ev*3>p@kKA$s@N@>hZ1ro#R8Z(Hk`ZH@FE#XLM5# z-dXGV;rR;=k=8*1G&N+BnY&+KeybV9XVG!>-O@&G*D-CE%z-&WSdnY|{3t#HyH^T4 z4y;oRYs^uRR4Dz;p#9`^5wwkpC!-(={yGHC!596k}6b<}6|95RpZLgvlilVi@VQ0ZP8o7_odAVN}0g zFAAEoXHlQvV)_zo?S9Q~m8;6bo1>i1qf>t+SBiIO3Fr+B%#i(Ul zkK-`!qR-0_U2LRO_4Ijngn&3or$4__e_&Yg4YwZq>8nmZqzGViPR^P71TY72fGqW6 zHf4SZ)el5V)GOcAZ?0-TQ}8iU z*LI}V_(sNlOCP-jIGpAG@@4E~?>;pAXTtY83_h{$ZO3^O>8XR2y1H)(bTjR;RQj}X zu;_jYe$2bzH_z56=iOnHbFj!;Pi z&MfwY{^#p!sqeN-Ghi4g6sygHegy==6@jgJ*Xax!s#f36QlB5e+rDK+w?a!-!9ln) z9X8DH9)OcxiuX+(6?boiwncG=fPP!Mb9A5~%)}p>pq*2<{KnG#nn+W~Hf# zZ8GfeExirwAWJ(0x5E<#ibjGf)N|0g6(ww>_*|_~$00bdLm*9zHHzGYZ=X)jM}W4( z6`W{#Qi^Rz=?Ax#lV~k(GT5rb*JLeT2dkYNtJpDlQ%e#P)aVzW>7)Lgg~K>P%uND! zbi#I5Dh1wFqKN^46U3%3)>W%SkYf71yTFxcMmG-BLCWnrBAtX=4EBL537+6Kf3Q$D z*kWfZauap%BX0j#5IBMDlT_je#~DD^xX5@y32zcjaOxnd%##h6g1dFb)00kBKD$FG zXt>WzCgD`|-Ncv)JqJcb=o@+15zIQ1Z(Jcr6;FLW**WdmNTX}V2E%2ViXsLamNnD% zK%m;GvrTDfNU?bJNDyeg_3CVs=ZG%XADnSe1_!2sXb}>9sNon(U|zjV`+1Le`45ni zaxNNiS#_moWR=az(w81fH7WKl;GqweE>8zo%{Xpecsk2!@fDJN22i48xo%prMfQ{m z%@yDW?_qW8bndH=|De(uP~KcqmqaL`coH2rngUE&aaRVBya8P|Y{@k9NE#=(gF$2Wz9pk9V%@ap~FrTX0^p4#{!2)2>#a z;XS<3AVt4HJ@P`4)h1Mr!r_z0k;%re)v=dWeZp|jADQCC)C;pY*^c1CT;s%H_ig#6MyiMG7=NVzdaa2r7R%Gcsl~*DE21+2K!9;Fp|!VTIxI`L}St5RL&f zpS-#PICM2aO-(W)cTR}I>BULl{sCM!?DjQ})k6`WP9z>8%pO4dcgr-xhdi@)Yc|s< z#{%v+I{l^m^xAjkQ=e(V?!M9MQmtGxlVZ!hdCQa2( zoa%VQBY?e^{)0DW$|`j_%^dd5msgZ_2R<>;(l8 ztuS-%Y|EErUr(4tkedVAfreECrA>>wi%nCCX*APJ$%DVE%~%g#86c`44gTb7IIAQw zKi!ul^F1RzBm5zD@@~-<`iCLb1I%cDg@YN@TN5%Q>mn!KtXDmHdOq?Xf#)T`EJMdi zHJpy&##JnD1w+dI)cqMdRX{rQk#^a)*f#=#jT`eCY*@McD<(j7XWD%uIuRa$jxF>g z+c!;78C(p>+oQoe>OQ#9(3Q2jSYFc%6Tq}M*5ZUx1UAo;KES{q8`vT^iN^bfM|GaHr`97t%Ej&%) z!=03yNo1)!U8Mt&dxfuO$g2mC`_IbETKEIKdI(Cp$5;Bphy@MLSBO$8-$;Il?J9YY z!RTi6q$7ie9yO2z8x5ufvwWdcEK(9)sYhjyPgHZ0?+n;Y+#k!{kh9sS}=Y$AZEw^kymA;k8vI+8^nlg&vZu%Bs}0~f8XVvfc4j-O5UOPZcNdG9h7=R*3rEwmy;K(H==1gS2SwM<|} z;`Dq1?QhyM_8XxPFxiyy{f%vx1)*;h`mp%dnW@lIir4W0wl}FTl96Tp@B`%jgYUK5 zLxeWRqZHnTHNJP2?!THDpKx&b6!7P#`l>jkcTv7pCb!Q_-CMiuI1Z`q4(E*G6-l%1_B?oM;;sqN@*48Lh}ZVQ=za8~4hY<>2tdw(Qh zWw3j%f5$NN6mxv+FY;@-jN5dRd8?j+O;w+Z!u#*}u;uRu<;pp%14Z_C@E?+5U?D;n zqB0A5;n*A8w{@le?33JLT^r5zmzFVqn3Qqx*Lb(tH@#bHrsTPiRIi$m?* zzsSAe)qbsMUhz_;)2ay(wKQ_^@6Xp7YK+1qF)u0hzO3c4)fhJuVAqFaR-DdmpSw?< zZIm6iRxnlHQP(Nw7$c{}E$%Fwemh-p-E+(qyV$kd-D1Bxo;fy{nQy@Y%)`uV;bx@B z0cNeGtb-!(p!e?#d-27ouc~gih`r12EPl6pAah{IRd&M1 zS4ZRJe72r&yr;#yM{;-~QOXvH{w7#N`!iLSgOZ!{0T%{;;KMd9vF5 znj3iIzvDF|FF!uFKT0`k=6mt}taUil;bJqhNo`h3jXWC$7y{}$-o0p27i>%kgY#L3 z0C~|EWpTI3Mh?@DSJjGZCxQf@!y+qFDla8s55zIzdKiUtKDT0 zzRIWH>;a=Qq0#0FZw+Cay|#FW=0;eYHJtxyo**bCFS$7N*tR(Ta4zFIQT*yGz5b;A z^!WGj=4#59{h;J80*WPV$xTT{Ut;xzaT#hG-=Bl^TYI~pThhPNP(Rn}h(hz@lAV&! zW8Jd?tqp;8!ym2}N5}rVLn(VQ?H27vg&S&PlhM(;CF~`x1_|PFTVl6DuvW~K9&kG5 zE7U+i;Aib)!%;noS@U}7F_~7*=Fot$1R5Yj0PaJ!MYS(WjJ~GjJvxg*Be+q^4-FLS}FVDNio670R6Er%B|72CSbQ*J?e> zJAfubZ2LjvxYC&-6Cf3bokg~S-=8rwn8`?O*mjNtU~`F_urlp zxxPII%lFvLg$td~y{(@{OiS48Alo#sZ7&L%bMnG{ z>(If%^4fYW2M;}6My1Ucl1uxBwL&*IZmku8qG_^6r+YJd^)hB2=G<~6rG9`}iHtrM z6c9G+AMAwIyX4!29G$5~unc-C3tP1R${6_8ttRtU)4u6v!f{^{Wr$?-rdeMJ*?=>pz`bso~h$bQ$`<34c;p}kypt#l9 za`o{T$Doz<--`M2g|lMuQW48)iqeqt3RgXW$g~evRRmt{Q|^r0cLqqHM_xZA&CZ=u zev_?N5!y8S`rmlopx&LH)>E-@`G%{0*ICMBNw?MsOoaT` z-(9V}Kc*LPCLUTctTY(2dM_e4#}{yT$iTdc2|Ap zqv1EjZ`z&pY3rMLRs3yI&rcS`2btfDYTCvFerxBQM)m`bJp9Hu_y`}1oh{Fm_xT?<7s<9NgL0JP2F^2^;-gUj#9x)x5+LKa3z~ELo|p8vPj51iuaTa zbxbG6;pdj?17J&EugrPf#hmc6a*-ukBjyOJ1CTz^SzR&w^c6ZX93sjVI!JWI26oHQN?(8aZl%2nt9Q$u@!p9qe`8+@(w+)q zk-3y9kiO7nzV^j?G>p#Zs$;cYlBY%~qC{u9gQKH3ajv0ms6fj^Kj!RDS6*820&P*_ ztFZ+TP~%_N+GPS+Nb!tyt@hZT56;RiW3w=gO8ZNb@Wl)&w1$h15)_ z?Ht7J6v~8NxSVY$Eq~hSv#de__p#IA*W$28ugkhjsKj)iBLzjVg9G5tc19 zvFXc$=bs2FZmBI3&gIhzNe;Xhv=*s&iq&iEAu(D>L}f+^K1xda^HsHWNa^t_#-GVW{VVmqYMgOGT+*gNiT9Zn~mm}c(~lU|BWa9M-4-F zo?t~^UGFRMfX%!5{cV1Q=2B5csNW0~2HE&ISOu+}2FD|8zBulDa6%7GFAZ&_P+?q@ z6Ue5Ve)kik*5~;`d1rJkz!LApdpkM<9b6$1Lr9GFCRViPulRRR0XDHdk+i9C`}TAV+X@6gTC&_`lqo1VpZMZV+VO#)0HnX}F?f-tXZRbq0iji+@QLbO_#UTpW?U@+7YSa0mjm@RCeQ+1{kqSjIle#qRtmS!rqSAK!&i9^ zGRWPg9twRW5fs5`j+P=waZUp7_twM9H?}m5fM!>h8e0iURR7Ibm^3lD54JX5r>1pM zT`^z2gA`N>DJzK1v%t7mgzgQ{~bK5N(EdTh6-yP^DW|G25r{PQA-ouwwewAQG zePo_E6c^6`F~M$a8G4fKS8cJGsX|HVOXYO*vC2rl(5wnZJ5&1U56!W&oo)!MjRW%t z7ZNY6kB8G$eVx05BfH6?>s0o!ekza2<6|b{+6fhpf^9H_M;J^pUIwyEmyx`;yv%~~ zhr-941*UfbMYnjBq^!Sj7G|m#2&9_PD83|~mt@x@Nv)%=%C^v?&Rjsqpi~>8fDB3T z53)ll!wV&wW3r#rCUgDimhfKN1N-pTkx4Fml z@>vf-zRZqq8S7uf*EdaJyNzClCXI(gCo*Ri6~2VawlP^Fv-T-$X>6-O{6l9WJEDOG z?s~-x>+&zoOnlBDN`b4XP04OMtdUS~OeQ#_C?e<2b)(dLvPX8Ap_ zBW{&gb9N+`KgFv*>%r!ON5x%UruzC=Vr#mb+v-kkuAfv#-rsczOYw0kDqIh@;1drZ z|K((^H2U&e?6Mt~H%=2P>}$ch^wqv8xYZRQm?`r!g5i^t!AUhQc5CcK@UDLM_^lQu zZD5K*;^%pX#Yi{B6onE2E-ug~M*zo3xPElr3OH#oXa^((6+~CT=cij9AyDPy8qa07 zUriqI5&}N{)jOgr@js#cK3AhFsQDiemiM0Fr#{u51%gv~_H_lktoYa#G~9r66`ZZ4 zC?VsgM&2Uohq~P|swWX)+5fUk=ybqED!50-LW*%EisWksv5wj+A?v89S7>noK2o>t z7S=#omcFrLEu7c51n&Nh#GSQ z2<5?Mg$A$8FYrBGU2Q0*1(2(96W)Bjdu*PdkFkcz4OH@ZuJT#a_;i(1T*)Jtn^9R` z+nxEL$2Q;=r|u1$rM;K80yeg{=ROGHvuxkiVi&R*F@TS{7&Yi?JW-(n`enTeI@lq^ zp|HD6+bcTI9zmdH*;}N<#SogRqOe00bzuR_!>2@9w9P}X+g!4oIQ}J%4K54D4X0I4 zDom&Vv_q_}q)kJWE++!t7v`dOTX~zL4b}&YlU5`mvD&~UZK%~;5>|to5|A(;RS3a0 z9eu7pp+XNb7oUYJ1o^O9>~bwnMgp;oX?+oIBG`OnDqf71IbqF{xl{vz=8jMPYL0JU*tSZU$buz_ zGHj3pB@Uwy0-X~I6iB1z4tD0$Re-IeD)W8OH}5Fz0G6N_YhWmzc-2fNYT|PigaMLz z)Ed}~qUm4+kSP=ta0%}e9qf^>rYED%S)-~tumziPOz+~1)P>Jq-H8HO9zRtjkszs4 z(S%`ru!%+o_4c-=u^jS4UbnDw+i5>4zX+9!GICa_;OwM$jDY`J&H>iV zju=2Gt=tnrNs)~5qZ2m9lTQ7YCOQa8`v+8{u9*#G6JcDDzkUOn+VS%Q8I~bcZJkpl zy4|eu0W??z!ziCDHiiD%IzU{lNzZlAmv~~f5z^JyD1Ab% zgv_uyN_hdsS;W_cJJi+6(g`SZz2=ND5=Jr6H2M`wJD!=6DIr;e6j>SEW}p9K!evOk zG5vX0)rI#8eoE%M%<=TSD(8tx1NOMK?7+_IODc>JL59D1`Cz~H&hobc>Ua5yV7^*I z4e83Pvz-uoT+;)KUtmNxVpj24UphR0vG2!Ui-m&-ez)RwKR)peiqv^oi@cbD8Joe~ z#c1>=nf^tv+eFL;CgJ@?JF$2q^?I|aErE2i{*c0sqXZp}CT0VVmdYLkS;6YHIbAF9 zXYa&%)4+@2_xBzv*2Z}Y_+(!zI2cX?$D z#6_z=ex!G~f7-&N`ek<^@6QZ@T9yux<2jWq-bDoH`#_hqoCARH zT{ChW!QW)-%8p#Fx~;Zfg+ZtOYW58bZ0VU&z&!Jx2@q9O1mbp?G&7Nm88*GY_J0NAfx5^qFA&m< zWtC$75CjiG2Y8j}ugrf!68P!tu-ZoH*+(F7XXsUxSjRu{>4Ys)&uSZ*d7%LW+Ls={ z>(`J&zbvgTQ2;`sTY1X^kwSD#);ZwRP0@^QIm3ICRc&{%+tmN8OrX)F=Pb42308o#~-F%Pi;pH`0dlapu({Vo))m?QHe5{-4pfLNIN zrh~7LkFBy{GSotQwDm{y^86GLww`2a!26R^*}EP*G;37)qzB?_=4fJAt)2B2g8p(0|P`;RrB%+So1Bh zvQMzMwxF2cYe;7b#3hUQ4Jvv!vyLc&j2k(wah)F}G|9=(BJhd1s7kq;)r(7@W@4Xt zq|SzgEC8X4;slmy(AMKoln4oPYF~EJOnx2&&I#>M6=wZRouDCBXmwE;osjQZ(Mx9i zPYKE!GmwJL#T&I6#!Xg}L-#15^I=JM1VjHfN?11v?*gBY*{w zO6}hCG=bf1bvFMth2W;xYyHt(-4V_E3nsY$MgX}^Jj1cq5(iq+N&xdg`B44yV zbq$=N!tj45OBtfFX=#o!d2VxVx6gy^H<$Buv5_cAo_&Wc1Q0 z_G1shY}v3s4#_L)%3uG0Ru$;0{avRDZQaD#utWUto*Tk&gs_Xn(wZtdyQjjOL5{ z0mP2Zus#hO$xOWsWJy2o-+^Je1SwJ1_vSmmy2N|6c4{WWl&RZFvEz4PO}gE?a7^BV z0l?_P{5Fm`h*@)Bpe#qeM3cZMYQ~LnccyU9Je-ges8Bp^aCEMJkQS?HnmCw zJVHk|n>Tz2)bfVEdVK4syFs}T@cqwrNXD~^rR{PpxkuWn-*R+Rgl3tSwD*;2m#DU5 z$6}F+`-hE^FF$U`*m(0t$;AHMp1p`aH@w(9+n`}g6{ENFI<5K3Ou4ff&JV3 zWTJ}4l7zWx|G_{BrhNIbbRT}a#L_~*-(YA5Tj$m#mb3uECX{Lfk|@VP@d(JE!2~`C znkM__Z}J}{1SZ{GOsIf>@({ciKGlWqH59mPWe0C@IHZXuxP-()Pg#M%(9QXO5MK@m zF?_#F_u)_YC8q)OsIo~ zbs&A>Be?x4`15}Zs8A_Zp4U)k0i6BZ4lqI#5Q0XlE%(VpYg!8B@PB1ygqqY77~P)! z$O#V-a+7O+`Dzd}y&U>hs@3nz)<2*wt6y~j1e|9;*Z=(zQb;)SPSOkMQDp_$Sss{R ztoYNe?r1eq8$m$+pFZ@6o!|RBk4EBi1%XR>_TAW?2V}W48s_PVzm@zAt+wp+f}k-O zfoy+Y(;FD%FCo{^;w5QS6A`whw2%_i;9H~Lc-$=y{Bnc!fBUrM^92jGA;l&f; zS?&H$1rA}z1JMVsRHa9^!)v}9e7psrxii@D=NapMGqENHt&s0S@Oh^6%8L<-Mj5x# zCIQXW>S1Z>x+~iO2qA;;5t;4i{AVbeZm=qEFEsy z?Lt7^5((1M>WaN!Wfx4+vX|`4%HoE|qS4m0l5R%VyE&y=z~1;qfk{&`SZ| zR<#Qulg3dq6=S8JHly#iS&+7EO9tk$m^Qj38Ex3bMx*6H}9}VGo5Y zB@N!Y@xAab1eCE*GX*4u6%MwtNuqXZO=t*rM(ZFfC?0e6q&+Nk;PqYbkUOhT!^%P) zvIfG4^7do*pHo+fv0I>aTG+ex76L3aFs4ja9sKJGa}XR~L)Fht4)#v-fd-GE}Omw%Wqal#_%~%Kg|cSJnlQ455G6|?A!dxRZ`rbBEt0ZS2qBb`B4HMWj6#UAZ;7#H zDN4ptDOqjS|V(xRa$PTaHRKo7pA^*?|56is0V{}c_)PG5I(WB}6WteTUL zmyCn6kE4ssWiMZ#MMHD^#AROxCr_6EAx9TicW(`m@0B$oLhjBQA{I(Uaz?(|E^h8; zLi}9JLe7~xg?KutI*Xjp6gqxc4LI;}32+d)>~+!GU+uDn2-&Y1_%|e$6%it<1bAwQ zXh8vmkVYm#+CF|RLP|2q(oXV<$AnZ=W#pAqk0~5IBBUTEuPiI4Dl30fT25X~PE}1# zUWocf1Vr<5zMytqM~@l{e5E1c77*a8CMz2p94r&8DC6VjDl4z5swyj|AgiDt4K$?v zuXqPIT$c9s7v1up4d312}2@KE>0hv-t@bWb>+IH;iPX!7i9SXdbxN9=<8^RfG0A}?#^mTDvB=h7nF`kJ1SpLls>AgDldJ^#n}=1OHNhs zn3IZ%s_K@X|IJ=rPwS|>f{K=|ik`N-ysomUvYd*RqP*@YIk{6x$5iCEZ1uhU101}a zT()AngVD}e~RezFa>1k`}bd!Ii z^|dK6ucm@^-#NM>p@EH8)|xuX^_E>d*O#ikWT$tAU;8pYIog^PuHw3~HYuOA`8`q~ zUq5T7c7cRsID%_Z_iWsA`-PSdeDMP9;kP!^Rqj`b9>G?4={C2W{_+bG!l(xnF1-F; z)R${_>iCcIzsG;&ersF`FYEcS9JE*zlm7DhItDpe>m_AyfdIqBx_9*)Sz2GjO${$i zs`ubOwa-mW`wM(5%RZC|cZUOC4OQQ#SKIPtR@aK&E3Lh@47ZmzU0H2^>w7QD3zAaS8uNXgT%TaYk<|)8syM zDeSqf8PDA6eg|=8<->^0g@s~N|7Wu0Rf;9k)zO+}_*v^nr-jsCo;jQdUDNaZ6uX~u zm1_8}wH}q{9N-*csaOMyBkCyUWOaB9deG|4?&3kTBa%~B{}Sc{`aYM@Ld|!*GtoqD zw*~%JUb_0`RB7e+27_qg%Nm-;J73}?VqD=U&hG4j#ig)Y&w9h(uwe_={Eq0hF=4VL z3LGfUZZ6rx>f%xLSn+T#dk`2-2}~TT{ys7ixc*SfA+XXixO(9x-1J^gF$K5wRhAzL zoCxEjg%96-N*0!-43K2J(Ia75mrpZdgiC&f9fPn;qhQH2y2R{PCjl((2X+@7hMr_l zo)`=V+dr@Ka4D%nOBj$W$zDinVW(H5&G9HWR>gUN|A2w6zB;A6%vaxk6qz{?j#~Cz ztAbEc!jVx5{8qhLE_NI|;j%2M`HhFgCZj2M51!yHf5e1Qst>V*iVLLZ6Cx#y!+rN7 z#E+ZAbVfGXnI<<=da!DpJYVfV7;JvkCW!#Fc6XzIgge*1su+t$5e9dU7W0CH3@Hg| z1d`_6_93H*#MX|*hjYg_Vv}_!fl-m9lwcP;6Q)ykb*lL1@{s-|UYWe08)RB?^0x{t zF=Lo9HW&6`o|@k~T1H{Jtn2YjgbcQhbhCBDH~IKR(0K~39)jj7RjiS4MQl6pD$DDD1|g;R&cU|=#{deuPv}Q&zpXzg&w%nJx^G( z76t}STLq>$q1XT|Fli4k1vvrN;Yf{Z18=VrO<)EUj)`3Cgb^Wh4?PAy_`AfZnw;qd$h2GJN`}X(I}4Dnm5kqjklX=~G>V&W zL$5R*1NkSmvV4Vus4@0XRJQ5@nXFL|wMs^P9~AXa6gld*=OJOfZ(-P=*E15f5DW*% z&K(|-mSdQK^Oces09qz17-Hb0q@d$_8tBKWUCrU+6ra}$#EulPJ1hwjo7o2abZrCT2(tK|4=f!L zzpxD&5N`+KY>L+79k)a0~@ z?ySeLb?Ex#4M`!-Zxre7%N;eFntaG;c>TFMME8vjwMlJ;)rva^qt<2f1=l{XjZt?h zPn37aQ1d=zx-e3v zjW2nPqbZuXtHrjfnH)eG3+^!N!qncBs&{*KNvYkQTf=2;6XpbpK_ih> z!%Q^;Eh}Jma&~{%kgHk#DnM2b{AItav!9GL{M>w;D`+IV7+>L|#34q8n#pW|sLlqJ zSVwB{TXv_JjD#*AhH;{68$(wpc|`ttDnY&!`7N$hho1w?;oO69Rn{>jpQ&Gt!Bt*! z-hd>FeG-P#eb3h^x>hl(2U0NFRDbR%iAQsE+Bn!?7_}SJP zvyh3YD6(en2v4XmxmcF)DA2QiQaYc7W~@<#8iPa*zf}3P{sTr!X6uw57*~J^tdQE; zI%os{aE#VFFz9jbz$7$!_US`s+x)XE)t z9F5UjBVXqD*X~OEls-lQK1M9#^DT?8Me_Oo{|=4+pAZ~{D}e)-RN^$e_`ZhNGO76= zq;6)4Pilji_42K*gl!)EZ&TP7{lOLF-@L_%T zny>RQQ^@c@xpie9bSx=wLi+~L;}wZIL&sOhc5v%J%HD{|4E-O-p3@-X#c4s^2@b9T z|IKLF6+;w6>>_um9!@2w36))ZzDg@um86`<2x$Da%YF^8L;soYygs5SK6yL9-@iaHnVAcbxVd@w?ae)% z=u&jX>DJ-Vba12bz~e)XFCn?5>!biw6ocy zPoRj;eluep-%9YB>_Sg>0EZQNhPR)A3(UW24raUv2co?Lr-cTzkqk-s1{EDB&VtA#C#^e5VY_bWIq zTMTuGVjZiuW&P^_*&2R41foN#+wO<;06~U57?BUq21M%^_VZJ+~(8S zEMVR&|n=r$Dc8$3IIYMl&;;+AsGH}ttEe+ptfp}H$aOXf5@Za8{BqLo3xe?^v;rtMJTE(Cti#*n|1WH97xi2atpA36K=p9Ds z)n-yv-@zjtL8IaoU$qq>ILVEAa$)GhL}F^F-N#+E=B9ro)egXZd*R1L zyb)z=ql>1GLg1l}Me@C-s!Ct8v3U224^nly@MEUm){;wJTHsEb{aVBT5In{2XqPo3(@I_>eRkrP%bK6Yaq-9{?u}&0}3YNtF1j zkNO=K!(nQP&)Gb59W_2o*!|!0D7pUaJlrOD1|%-m7oJ07#PYZqxQuVFQrk7 z9)H4mD_bE4rx+3oJ*f_6n^?#cm{PdBI4nXj4+^U}d({GpZ`(Q6bvcd_pU-xH65o`e zv)7PnUc8`E{{8R^z_v=B;~}#9DFt*Ys_%s`c-}NN@R2&`UIaBVE)AVy1J`a*Tn>#4 zxRXn|%5YYR;?j|tqU7WUDUXdZ=s`0QEyQNz7 zYA?fru-)Dp2;ym;8F5UM9L2LmV=csMQY}arz6<0qxRW6?Sa2^XHWLvP#u!4md4lVi2W#ni zb2)ikgos315($7>1jfOQ%|CAma?l)9oQPa^PTf*9$J89$OYZrQA^@ll8gBu&ReB4` z)=1&G=vN4iMYP8IMJXJG9E}S7cE&T*1i~-*k{jvWZZAmdivyjUy-_yWTlDfRx!#7o ziz)Ce2d=2~rK@DfhSNbWD-fVJp z1R67}?z+BJfz7(VJ{hbzo@DuQs?SkRVtB3-7=#NGTkEn7ZU&AaN4}E!C~Ih~hCcD) zjs~>U%S_xGL`{5{1DeQ%hxWCfsfiT5Md!4FHPMHHGgMNYPcwYUp@H&Puy@8&)2Q+` zxz+};Tm~Ipv%(46s<}n$N_h*gxA@22lTjA~nSaswYaV2x$@B*3)nM&vrZ^?G%t>43 zmj8sOniD1dnqQ-upTLgR3~(OaGEdktNB%VrWuQc_-}~3xm1=I+n^oP+d1%YLkZew> zLi`gwkAY|dve*2C@76)+#~9D`1u;IMym1OIIy{-*JY?l+1aFS5$uFF~B#!K(*L-!vA8yZytz) z>Zt#x=q@c{FS+Py>G7!(-&EzGH@MIzvni3hsYS978iRdTUt0+5OrcD%rdoc9tOXSE zCdb{{!<2Ck3o+3pKy?Q@U*D@t^)Ma@DKB#Dao-%BWj7m(8?Vz&9AHsPq zQl%;k@L6)k!=Qfe~onTMXl^amii$>dN9CR?*ZC402kG)bl(ulGn z)!#k&;11O$FmQ3ZHhG5BvrugdZMNI-Srqck$?+4pT#hV{{t)-3W~;@Z#Fl9fdJ%HL z)EQ4rppnNM!;Uro3Ag+$Xt*t9>&QBzRkY1&t4JTdU-P;G_?#+j3`;T#NIizo-O=p);*1Q=|TEIWNn_1vn#$VHm9Ha&WYGILJFety&M zpi3XlaUH{CWpfsP5Gz??fVgBo^E%tnD;1Kp7j4VlWS^qQ&i$3W%N8Na!e~;)XJo&5 z^>SE>VUEcKIhvjx+y50^he(g~Wb};1Cd2s;sF&u8&h7GtJ77ku?+>j^TuD*VMKr@$ z?qph;_fiU$ZX4VxI6)fLOfF92-L|Yl8rDdb8NJ??vB<#c$ub++I+m^Q0jB#in&8p6 zYsSr&h}?@C9@GrV^F==~K^as^6h~5{AGGZmlRBahl_GTl@3ft3Rermm^%qb;u!6_7 zusR=C)&ksmi}h@Wx@O8pMqs!#ZyTwI?6LtEfVyI(ay!pL36Df2KdAUqe%9;EuZyXT z^_C#@``v^(+kUryt9ThnkIy_@l8w%^hqfDN6|43&(;>;j%4XidPaR3^o{}zZU0w?G zTIt4_ZJ~xPt`rW*B2I71bainr$g)ViZJCiSt}@XY-tY0QhJV(c${q_&0?Et|NJ&A$ zWm_N(BYToZQ{RHxM_io;E|hM|5j_z#_aXUnIma!WDhuq z`q3dt)1Y^w&S^V?cwL*z(ope-EC^dZZ7h3SmXZPa;{D*;ikZ4L0rHUIk$)6XJz^>; zK#|%1uOd#@##aeaJo=BKRnJr~q-aB`rr^0y60h+(-+vYgv(AuoaQgjrLob;&7TmfI zh5yGZQTL#@fFlIyzWrM{nGU?=*!nC$KT($;=$OQIrcC%R43+sgtNY>t`bnBPGh67U za}&dE>+%Yfd+EH}4jF3tebf|kPK0l_VTpTTP7ETTlMQi8aq)WgNM$b6utLl>u^yZB zsQ2B2Pzd^qf@o~W`eTS~&4t_a4b?L(vNeao4E_znDoG+dggE_J<`saZ%?NzwqXE&Q z|G62+ZdRhVIjyRzfqM*vuJ{{Tz`Q4A9#U-hM^Rr_BR318PuMAuvaD@;ecgkd)?@@n z{zmVFkuI;XK?Aw+Po7BA#+-Dh171Sg7%k$nTV#sQh=^)MZBNN#gn6GB*KX%SG5fZ9 z(mx)nmI3r0T!C?V;{sqH?n9zlO&i+d)|rgwWg#TeZMYsVxxy$`## zmxD%0eum+Z4Ec!RQ_t^#@>ORqzC;x^pmL`SI$yjifJ7Hq} zsm|N9#>Tb~=GTZ2{im~I+1JXetl<+0xC<43L2uSw4+twqHyyNM4*c8PoVY)qHvHg8 z>SY-u^xw3&7rxVfMT-PqROFORr`x)T*bi=-6Wq44OarP?(1Q27%{{SUWr*xhbI;7E+6)z-QE!zRrxit@>ZNH zAK>Aetr$d{*hTLW(iOR~?A~&Z`R`x$>-!Szt+vNpqcVR}hNAB8^_Sw`vah{{ zR9@(w;TOHVR8mb0C4u!?sg?om2^A6>@9 z@O6?;&sHF*>d|VTOf#-w~;3z_zf*t_IEXym>Tbvu;MI4*<-c| zHOaB?>{QqD*XOTd9>+pN2&6dmkK!3q*%-2-_g_US!nAqR+frp5?8G~fgSTfQ=^j!K>OvXx`o6e(LM6;>Zd=aE^MA4Y{FIp%quMRE z)DKgjHq^$t=Rr+Ci!7e4FvIO{`Jr)YeX;{+U*gHXthBM}83<}dL}R`V{2lw=?2cf= zGFZ3uLQrkre_%SY{t4iG=`YTeFY+;Sa!^BD{sxkYtC(YX0e=uNq1!p{_%|3h#qX&f zIp5giVIZ_sd|h?}bS&#}nMItTvTBJ_X_6(5L!l&%?c`Ra)FVA9_uiN(m5*M!HrH;k z`cwqC-Y_V90YA2-ip{4#QS{wn$1aQb;=dDYqbt2%zYJ!rRR4E=!Byjo=m7d?CCQ7Z zQUc!8w&-wLWc?D&C$#WCb>`>iy57ebh{sGn{wVg3JTL!}EAkmnveJE_t;Cdc+tuHS z5bqwTrMta#%aZgMwo1g2CUm9JK4{2RG2jWJ6W0CtKI`xQx(f-J2$UV&XJg z312piEW$Urvrc(!8XhYgq#3cJHcXtG^Tz{IL95iu78+lxcWvjy9-ZU{<5ATVY!1qjA zF4%9msLxNWzSOK@xgRn6yEH^D?+px@y3@tju?Mww3*pYco?8Fdf>jyU!;F|^bop-I z6T*G~m+XI@@t@R~ay}T@XY=cqXL9O~b0Fz4eotn2?zE`fh$-}{EcvWG+8q1j5)(E8 zu4=MKr>D{T=#9*dyQ1fRHTG^-_u4dWWHZ1k74Nai*tacxW!id55GAHwsEQ-iZq+fE ze{bh~iN2|CA;@QU%qx0DSOYS!G@3U88w zs9BsEggFq)IKOSX{E)w3$%;EK`$3AY=LzFO1c?E&7+KP%;E}izhiERyKlo4hj{MiZ z(j^=ag}J(KwjjT68Z#+t`sJ`xCCB+pu9eSJ3{3Sj79Z4rT6daa&i~#*T)??UFIdCI zN(?)QJ)m))T0!Fh0_WIMcu5Va3oXzliDyE5IXR$xr$ysh3|m$-Y+S^8tNyzDiShLO z3;wCIFmz1Z#jVO{as>Di?6_&0wDNV0w)?oG;?XGexDdyN@H(Hm?RPkSFlG8ZY`{X= z4bJ+Nn(c_*gKC|r&XbeBM3B!pDP8P!WArG=|J zF3W82i_epvH1yp_lH3ZVk|Q8_vnY;cVvOA~SKuOwLi{-w^MpN_P+814Gr&#?X@eDD zd+Gs(i6ZXsZQ+u9%ZykZnww43WUDF}y$4k~N)Pj$VT(^ew<+;Y^DQ(fh1$>wF+R@s zTd?1X&zO@uJPwFC^F$6X-bjklnAv!RkQh9vzUfTLRz>Beda|a(MakWs*S^(mMFI>s zpI{4sG8KR3@fVW*{72l!AO`T7z1*(J+tVE3p^b5#jCzm$EA+V6Y#0Uq?yQ%5mKs|+ zUg1j2#fMh)dy=?C008CZ?;fZk#G4J zrWPE7_i*uWZrW0;lkn%pou5S{J;*EAFTCY)CvZt8+?a7d@qiPxl?f_Lm>t0-#u5Lx zyv64-v!NUWTzXxk+j4o(>t1mjq97z?SG!MflHit0yeX3N_T8OEkHlZgQ+d$H8x7C8 z@|L|sTjs-GC|Q(RdNl4==pYGdDj&9^A8qN;#hBMuk8peJa5s?TPQ{ z#gtt6vK2#|XuGEG?qceCfIq{O2|gR(c;vG=sbUm;Z91#w+GgOg?B<_%&do`cRjmPM zDVLk@KTFJt?6#vj?URdk&Rt`E@_IUeRa!87b9rI%#QLV-{A5=3+Rg6pkCoOt_wD=@ zrGH!`SiA7IJ$JPcM#EvjLQ^{H_wp^F%@s~(?Ul(Q+3-cP=j#&)Jo@4|UB*8B_GW=L ziEfXaiYzwL3zdfly(DU`{~EqkB6v@O2ctmZfA|FcM}S|gJF*MyPPjTe>i%PPTB@!2 z;_}rGFSBH=z`0PQ>Bke8fOv2cNvLLwOK>N644)W5Uc-;ADX*>OdscbSV*-x)@kAq< zFSzwamb;*Eh$Xv6O9y`;Rv!`PU+{uD_mseL&>uxk*#&Ccw|h>61%^*nOnw)!Sbs|M z<@6=6j?=Sc^}ukm^Df$h&p)=?E~(sA--uWtov1~x*Kduep-Bk4{P6JqK*oQM8=)6-lp)(aW#N_N9`mv9li$~TCihnsGcRK9@a z6yDbhqJ{s4{2Q4sNuL_pgUCCDz#E+2nQof5vmI84?hC>HxQ{UF3Cn5;iXyr;L5J|g zF$E@Evh@23M*ogdUaKW;j>?63Upr*{fS<|hZzWLwIo(Ya7-sU!S!l6{miF6MDnRC)$;L_#IbZ*2$tG$RRw~wHl4+YVU z=%rBn@_j@+Y2#Ub@93U;{D@JUjL~&Y><3zm0#oT-ZG)ErZKu0o)pL43=n$(REM$Z^ zCqyj+)w)pc(TDj_!Nw-^7^5mi(0wl+_(7927wZ5lZ%^cx)9eZ8N|pQw;&V?LN@J{> zXmedzFFZfYZ?eRAXkjDiiT%P9>fSDU3P!O!mYL&^`w2hpsqby&K$q$EJoNRnfcc3PO*PBhn$JzQx_Y z6B~37t6b#O7SgUJ@PFoX+7lyGBmd5D}-Eor)9atDxefL0(}dT5-Q z)wJb6ABOvdyOV&cW{f>C-^DzR&QGRM!HI~_Kt{bGeVV(^VqQzKu?MZSa{;YAP-o^8 zA{Sgs5+1zA5tmAfFqVcP>(O_3zsOiR?YfCj`V?DXTottwW9XglWJ`}ZES-a*PuyK8 zE06FRjC9$B)f6V4SCB@CAT?|q@UejZE=`x58wA=M@qYpp&z?iuD}SNaq>Sum6CFC|v(AXo7}yG$LSKvNZi{cj%GJB6OHpW$lioodpl=+B5i?54InkMlCja|IUtp(#=F&aGO|P=@)zr+d!t8 zD)Z6j-QMA7%BC_K^^6HoOY%v~jI;Q4?Z6p_p6dc_QB_97&R zQ33U?!0V-1{qO_y-e;DOUG<+Mxl}aYZ#uJr>qB_>%+VqX|DdWphMqD*-T~@*9Bi@4 z1RwE3aPZVlBZ$S;XyA9@5vevNQp4GPSNUR6zJPVI@?7TlZ*|}6aQq)q@#e*>s-m6F zGgs0Rge3Ni-96Lx*{OM;JXo_~vx67hXR5Ew%-R(lzIdgtx7)ew)3<905)y1;F4O1E zfKTybABW9UT~V@YtbCOwB!!h#bV!VTht>}DZSJpJ(k0G<+pjiu_<%*X(re6~nBtQx zyWi=YON(j`H9IfO*UOAxw5*(+CSF{hn-|GwFXN}Di>cdTIv@C5+BC4UqLy^bbLkz? zd3Np((<$s5hW4lh?){jA@3mq!t0OS&yqa)6fKW^0$j`U5eu0&IdCXDt0cZHX&X+h( zk6L987$=GX6s843EBi178N->mikV(&v1i!m8=fBW9IL$RF&ruj6pD^7UMR9qT&S>O z=dzEkHn*=E+;bZ)K2r}pl zagPLnn`FpJ@zRy5jJ)n)e!RWXB5?;h9;REGmRxYl=lzPz-JRePtRfJa-dSSM{cTQ$ z>-8y&^UuRGwPL31c7kxjw5$bYgm}r~`T}}6&mN9f8wj~eh_r8Z3!GIGOt0bJ1IRMm zI6`BQQd+*+N{7f9m6vlM=DtOzEQ}>Tk1zW8BRQ-|1)14CNc7n`@y(CckgiaORrNyK zK%`-s=HvbFS{RZ!WQK4_NjD`9DJU9JrzcEhM-(Uc7-vU+q+!CjYJ2+~nyR}1*!V`8tyZbfpm*6Sw8PSY;$pD-l=&FqrdLtgMsi^bCSJ{sa$%AU!Xy}Z;a5dZPR!)Gup104FmW|3xuj#55KOe zm%b^lu`qvkA;R8eHK>}Ypuvv@JjNxw+(YQ?n zE$n{f2Dmteb;}xKwFeI|?n%)Ekfs$$P*wv@9ls;l`E&h9|R2);6c7ZLFJ?VpsMJ=(R z_p6FLeM=+_3T*#^nBB5}a-rl6({0A95Mi0Kjz7f$W0WN`c?C4O2D-(`m9?hZ&{_=f zK5V?{ac?!y1>8A3FZ&)XUD2*7?1Xnl3Z#Wp0pMmz=Ea>KdYC zwVIy!!wNUZGYE^WC87GnBRqHGN#;cPPw^^QU{?-<-x3S9s9YIPxblgE-%s)>%+m0; z|B`h+@2^E>#N?yMi>y13zIYKh$TX83Zx*7c6q21;MTyHQtKq$!-@6IX*gIG)Ia+!QpKG@jI zg^_#_r(!bI()2CnoWKe4$Z1s1?0q%Z(1bADjZood6q)d3Lg40VyP75_XzWf46R@aU z?)N*G#3AQL`xJ&U{C#PK+;xvwm#hZjVdXMgor2+~aR#Ru^o&c3sm~HzZaJBVnAMWf zbc9Y7-n1ujfyQ3l5JES+4vU0O3hgf}lPf+r|4G94=)RoaIky;3v*(;>L@R!x!>Td5 zvuHE24v7dLl@baMniHQU3Y?>4+g>{3#F%{}de)RhuQumWyWFp^eDROQF&^kl>dQU@XPEq zGEFo51}YQJcr6X)bKcyc|6zoLfTjU?m}bi5izb4?3>GGgqNrb|==(&~D@T-p8P*&TIU z<9kwJk#W<7lVDGMwOK6NY1UV+tRDOOIboU}9{w?>Wb*sv_^U5i!IJvwGP-#64%~8l zzIeBZ{wE&1T7Km;_v0A{i2hPXLOXLX@G#HSFGb69A8m9uRlC>&ZNkgtB*g_mtrM*y zmjYUXq}oo8`ni6`uOSHpLe$-Bn~mZJuLARK+0b zhC{k!=1b=e4h;qe&5XCOavRC(aK?-2=Pwzq&BR@}L1b#Ry?PrKG<_TMMEuRfDXqZb zwEU^H>1%!$-qK?12@NIbntM#}R<0LyBaFY5WUuY>j7jdTk#T$*bse6Nv?4*A?iIG8 z#gqix{(%gPBIxLT&$NlPXf74mw>1CsD50BsLaOw@LvFTbi zI&k`a@pZT~uIi^^=|P_| zTC0D@BV5YD2CXNK5pDSLZ)yufpBk&!#mv3~Og#%K-eE}7TL!;dlfXT6C$TgwKV=8^ z`hCYT@YG|##V**N(3Vr-pm~8o6_u+5n3*mK|MCkB%JwRrY1OPpHc;-hy1CMw;i*Xi^UFFD}uy;lMoVrA&u8QHl}IrxhigylZ4QrAxG z8R~GBw}(e5a~;5xq^+Hv^^c32Pj>{^l-)?`4FBr!)hloQz-zkayyI+PmWJ0*>pg?s z3wh9WP)}}t;2|dFWoE0>8#G;@^pim=!)FOm#`I42_ksEH@A3#33{ptEVd%>wU9d5K z`s>-{cNfS-Ww2P}be6q%aOb3WjTEhteVOPbiPx`FxL!bcy*Rqo*40)q8*n%>jRtPv z9?hSRgDI#~9E9r_=l%(;N{;A9M&iu*? zib|84AH0Qh`50vIkQVc~Tj_d+qjZuYPg>Ly0O;3GJ&4DwPojo8uITSgwTBy@&xUzQ zp2Bp>NM;x*fvbm&!$kCp44)zWFb1rFu?3As0zs$Y;^p}wrH39MxuLqIUp4glFK4lu zk@v21nw*ae*|+=cr*fBDP`3#C3iax}@|1WB3K^H}jCiM;(pf|;IYCmrTFVm;jLK$T z>+QVv1g@=Rq~uwkD43Ye{xX5pArice@#;NRFDoz0?00)tv2t?LBaNU_cJ=b>5ir|e ztGpvh5N6xX?L@eUs}kirW1MM!e(Mai4FiKccu?>01Ma&Mjdg6Eco69%_s z8#2lKnJpBUFwORwOgM*!sSU-%z%31PMT3JSyOsv`fV^ns=D*QR4g~pOwDf5(Hgq47 z3Fg_vP^oey0asA2_?xE4(fDTrK|vT=Ofvft=0-1D%&E^EywD!RqclfF*UP#?na@NZ z*-VTs>P+azBw?Xj7{_#VaB|8;^_srhLGdToJtlNcXWU=@wz(v50eH=G9?LvU>vys8 zdY}EFyJ9rNwsSgZkCyE(ktfY75|b1>#M!1-Hcj`{LYq-7nXdi}0=mDQr@I!At$49A zYT)Fd`(m3tJqVqIXP3WkE-dYYa(%GGn7HFme-QJF{d1@;1MPP{k1<`OEW>ZBx-Ce1wvxq*<}rQ6U& z8lvAzKB^jPo77!bf0wnsVn(KB(3z*;#5(foA8zvdwS#Z1la3u&`L#Ri?NH&k@@EaW z;>QEe1UVk)VQQ+bwmonJ$uZV74Y6Mf8j7A_z%sRK&O5++&;J-(|3ivILi9+IoBw)8 za5zY;^2TXjjPasrB7x%>(av^F+5I+n8#%aJwB`hpuisEEFmE~gtmwIw;Ul9vS(shq z9e4d%BHd8o7nN_jdhw9fDu(4+!6(J2DwcVjK z$@;*`mBB=>%8b$LqD@4x6^TZa!3R=}>{Y(WdVm+p%_Kp_jh?brvBSvJ`x17=X_2nq zho&3e#7RSFzikS4-FRO%&BLO+!zRLbs!0pAKItM}0tJ1cu{LTJeqo57`EX z>ID6SrHn&c80f@_?^Mmk=(ET5e-iy`!6 z6Hip{0p}AOydiAP(w@7|s-=IZ9@Wv&m*qfC54@}_KSPRKfIaf5TS?7Wy4i3 zd1`{T?B0X;euXZL29x5KtP@Lkbg($sA6#A`XD+3K6V>UZogevLG7IXSh(;O;qry%^ zgT*d(1Ze|)Q|;sqEK7|34#{4>%PpEs;Map8Z`@rT4eCCwtez~q|b}5t}M%+e1DU`@swDZ_yp`);POvL z)>ZlOke}dt6wZo2wTjcc#)CFz*(f+xllb0(d4B$#6;=Neo2!h|Y~rWnU-X>l{euP} z{Gb`mTY48ED8@obfxFwIlFvrOE;5!B@!80GH!AGD3dNVLA!eP8ZBMT88IudXf%!5x z%?%6c6N60V?_Zm)9<2M(GFF&P6xWpAPr+6e*+hqkK80`l2$M$XVmj%lg>rxJXw935 zs^${D?Bd<`o@DlvTIhu#c|oT8JXS=)>7x1u|9`~>i9aem)XQYwHN5bd0NXbeZ@<7K z>)wVwxhvxVDp!Ax+rrdUFwT%%1m(3_kl?uKvpA>I9OHbePEKrOGxPiVH@PZ9gbTUP zzRT6>w2eJ~c073_S>;yLNQ|d(9#OhGTKf(9!%mFr@05zHlL?V;c)F9#)E**Kj{7iz ziGLSCG*dJ9CC9g0n3sKFPXpeU^$cU+t0GYv5hs}DgK#L#2J z-+N5?2&*g~WcL$)tdWX%8TM2KV9mA%k=X6wj?mSjiFavM%{0L9op=lGK#w_xdaB12D_dqG=bqQ8%zwnLb$O)cW zkNM`?gZiEi3J$+ahZY|crORVonuTG9d-Gl?R#fXd@LB&dHcFgZ7wjWzcOev6_1ey% zTFrIKXLeCD;1ei53cc=iC$GS{O4F{m2a?~*pg_BDW%uLkm1eDVW}Xq+;Hj0+fdOUB z=tgK{VWg!cm1_(qC{58(9cyL4LR&;Mc zlGUi&!kadlfAo9rr>bT4hMSEyZHW_3%VgT}xoxORW6!mP+()=Td-b4`b3YEGU8iI# z));sc{GtYEZ-P8Of;&c}F}f$l!lL8Ov7>&+=&&#ie8o!Ae%v6ofT=$jn0QEct0^Y5 z@w3ok3|O%Vv!Jl_I?@M~04$nt_9{0g<4u-Z*WtO0h(;*QrXXQ9P;-I2(`L`7eR%Zm zH>7^3Vri_5&CW(Ns`aCaX>sTbrMZC@M?bOd@aj{bb(i-4qp;X8WM%^&o))Rd= zlBnDNjBxe}E2lam>)$9(o{kqYV^JVA_J&uFe9fSrtOKs@+=u`Dt?W7M;<%ZgbEwB9 z%b!`!Q1OAjw*8|=uxc~-lh;MHzrD+w#FJ!DV4xt>X%Svp7<q!6?LNLXi&~smB z@)_ZyZB%jK29?A6Fll*!S|e=tIY7=2ybm~y(|o3Y(`AYbJs&{~Nnv}K((C6#-%z&u zov=N8>IN|qi+TiHUuBnem*%rnvfbSO0PI?L<1yJ8xR>~$*fGAuWG5@t{f@1BslH4R zI3vu-H^svKpSw~l1NUr|LWhtx0wumFmQa29!ZL8@mV7S)cNTNzP5CE3$1dhe^&ZnQ zu{;1S?b*xylP^IpcLlTafnKHyI?eJ^L%c70D|mDlB3p<39Tabv##?qX8LX|VU9IW(U;at34nrc2oGb0-EFSU(O< zET|i4I=)NrHGqYgZYNWwV? zPOEi^o6>#p4iZNaQ6FBAq_*fVz>ep|MG$*_vB#(MCXZE1J~lo?W&VuXnwI^!tL8WY z|A^_k?j&lTl5B3B*wrR4&Z%C-{@6IqRWXKAxM(Fy_}%WepUqnz<-J~%dc0TcA3wec zDg`}1GtDpjybPnDu@HceUO4P>a%}nTv7cXAnvPF1Qp@IT!fJ!|y*KhS!lMZsj>KCh zAXbC@!);Wf5Xph%eRk|oX_~kg7k8f&Wdq9YXj2e;$%GKjY&zq~(>*o5+Dy$>3Q1rA z{Xf(AV1haEoG(_(VDy4Bq>kT?8DLdkAxFy`0jL zs(^XU`}y`noiB!dQKC{(nw{d57`Dy#R@^x`+*Zu|BI;pwBOT~VpE`S^z|7H$3cjr_ zo7BnF*^hTJ^t)-%8E;$)Z7(qJNgB6KH1T})LEE>+E$#d1phJdo)*;Zo6EG`i_sJWj zX+zQnzPoZjyQA+Q;`Ac_#*@B!5@ zx>;W%Sq}~3!cC&E(1Q#xiLaat{9?1@6dKl)?1{SI3aG{;Y8HNoM&|uOv5NecM#Ds{ zb9R7|(0h_^D@Y*txc)%mrH_lk8+&2oDDv0@Z`C!eg#A~{{EQQ>K0k8JnDRgt%i;qb z(8zL2-341fG4Z7-IXEGjSS%_#dz~JmYab|SUfI#DS|*vhtb~C&P*siRjohpoWA#fA z-|G_xPkWsLcUm6Z1+e+x$t3zR;L#W>EaCE={h8RT^Y2$?!soBgi)Sk?XiuG=O<9vP z`>eT|9lo(LS!pM@xiDsYRKCX;F4VnNJD>Lk-PdjMMcnJ!mE#R3q)L8Yjlhhx(tI{5 z`s22?Ffcke=^T)(U5fXU1H6N$vsV)PZ0PF@rhUBGj~d3nFBV;eQO<4g}*xy zUrCxtyAx=z*Dmy=8+Iyw_|g7naommx!Cp+#aB%$yrW1y~ab<0n?%ctHDlRZoVd}i? z@6)J{H}dnIeNrTBlr!No3O;>g4|1OAe2(r-d=(?;GobIleZT#0T_vI4z zFSm{|Pd>+sIz%eN`(L>(*Cpr8`#$4-?&mq@9ml)X-lV5Ss7-D{71n=Zx|Rrs z6W(JRJBR2nvsRHas|FI&_ecI-nCZ7JS_@iq^2^j8KYg0ioPDxPC_3p)^VOWU#hp&6 z5Q0`~H4>rU)qhWjn7ZF`;3V)1d%gu4uhnd2boGA6xq2nE9 z`t_UBFJ2t8|FQ1H)03|_mjJn`ewc-1&%9h;0N|tWBU0eSclq$O-GyZ zAG3f4G9WjH@8B_Oa?@AY@MEe81NzD%9h6qnyWip#G#K+|7j27Q`GVZ>pDNM&=}k5D zTmj26;ls9jbMj*3I1}*p0lWYAEI;Vcqc54&Rz>Le9G=5&Dfaa_jJC5*6I=mogv6@z zU|X|h`)t1oyETJ zq93n(2Ypd$6E$Y51iudUgvP4VVpZhNf){`7V@1sY6^OK?+|E%3L}Gd-XxUvV)VIK& zZ~UYUBZWDCe2`26mQbw)-*EEq(B>L@dT2g|D-BX+WVsNLU*rA8vwfvIU6zHu4=;H{ zD(bNPOq@nzV2={`>8*TM)ko&(*5>=pq~BPtVFNV5g<#=SyLCvdvBA@8@$cPLkT9MZ znOg>?37&mhP~f{(_%R#rLIE%X;#Wr)U{k)HG#U>B@7drey1&d!C1w9%6Lgot2NW7G zt!94%s4?eh7KCk6uRmoy! zk$cw?fwgCb=I2!W`B7^0$t2{lfK|ljoK)MQ9z4RS_Rqe!`U8z?FYagrNOA?6KS68hK9h@uSg~SO3fn z$ir%@!hcgk%Zyf)dq0^z9X_e_EuZIxQvXFls=8pt6KwlGaNmhTn(77MBea-(-vx=(^t0}1kCj3a&36i$N=&!8k70cW+5-SFk~PJAm)NHhE9w# zB=5;&efWfOKg5ObgMhq|Qa>{4?lN%#Lf_uHfP@7Ti(3NXAYAMm z2NqRjNKXf^1e^_XXm3w4%i&nhy#$ZzJLP zw>j0b1?#pn?uQnkyld`wO|5Jh>M4cyD`B$4{R0Gdlr)!;!@0X(9U*f?`*s?ol3FzXaTEN-sMCQtj zwpMqSUaZ^nFF$miEhmk;4i-%-&Wyn5eXj$jsU07vQ9Ci-8CWQ?mUsIy6o99dzWbnn z6JYrAPNL;5B*$L6LJxfUf4MI2&3?#73g*dbBVY;}O zQ_x`U{dOsA@-g<;5QituG&7mgO+v$#63X@f=QRDf933`S2JKr%e$B|u*)EjUKp zh>VIKER(_(CIMT?TL&@}wK!^wiVBLGzZ>jmM%F-zm*Lf)I~*|c50FQBM9*Hp4 zDnJFStlqZ|v0{f?e!G_UMqTnqM0X=a>Owb;8tilBG@8(Aj?Id-$glwf2Tb25UzB72 z_5X=tKmPfrRK%P~1siM=Jjj;Xgd00=>XW}ne*n)BK$8Ja-{LX9_(E~-eaqr$LbJ=UVTiT0jc)qCtOFY>?!-&J@hy=VrIIi$+$1 z9t5GxYA53n?%d4z=)O8#iwrv%&@FYnh`r{1vGE+}8TCgGB8S>vCyNixerr%3mH-hT zauaheLB>63c}QNsM? z??DLAtS9#Q)0LFpO&_Uz;TBf;yhp0N(dX*bOuD|FoCO%z0!gh6K@5C(W7VQtR`Ll_ zR3ySpR7a$Uzvgd|8BrY&Xiol?*>xiwe8c%tL}fHEZfUJy-Cr>aiI+j|7a+Nz>Pejq z9AuQmb#%(z6EKarqm0QWBlr|r93TUHLTSV`&Gv9&4pz=n>*z&uW=2q#<_qCcVQUvc zg86QK9~nTKg>B=xbm9T1YY=ga$3_}2?c$189$6}!lR{%~a;8CV-}%a_j6!qr1KXv( zU^O+}7Hzqpt?VaCIj=2vwayqZzY=FxeFyIfMKnO}+Q#4*&1xTz1Kr5o%Q}wbd-bQP z86-eAUbU6+KB^(kU=D50NK{508rhrUku=$ z*yP_CFsJfzAKZz<-)?;JB$C;#>f{%JF8z1Yp8ORmjB7A$=W3Bmljx z^v%1)+XZtQ9yRzcT91={MMGK>zH>-I?9Z-WCkNFL_a9-hWBb}L49&?ywM%`&D%@~8 zQ{q~P@^{LHc8!A*fe1p)LSY|{q3Y{<4X%hh!Gzvu2nO5qY|{mj3GHJ3uSMHJavzR8 z{f|}_1ID$8L?nwGI>+c?Xp#mMDy0UMd;d^l=KX^_y$R1bv~+z2`418kMCui;AZ3|; zmsNO-R7mf?ejYgZye)*lzBX{6 zazP(sUa4VBUoooc8E0md;k?MNgZPVBYZZh?kj&H9SOTN<+|>Ijnh(e)1+KegN;42Rj7S0m`v13 zp%q93YP$TN*Gfoj1>!W#$k~YD6C(4>Rk@Iau}ox zr)T+rh)Bs+>5|6b3w=A7z_}@NoM27}&xVw$1FFIh8RB+Bg`8-ZY=1eSI@v?bPrmv+ z?_=uPQ*f$}Kx0(oaj3n24rONQCISYtkn*z8zUN~dDupav*+74W3S)o3v0zkNj_bQg z3aYra=oG?^7_w{&>W4WebdwwZ-&%kbFvXA~`@Uuiy#H>$a@78pzsrVb6RxjL!R&}J z<~hzfSmc$sIyx;S4%L>-`EY9Bo=9^t)RN&nap2?yAdT#rl;lUO`e?r3M+=%aE-8(h z?^x~GYG6v;sY?VB7zd3X=7uS6YF<>_D|+p2<|M{Oa5}w(^GMKC@JI5m8{|+9T|Vh0 z3GnbTZDm0{hgT=^zM^m7_wGT;r+o-N8s$JxhT=B&UXyI3aquX9nQx%SY`HhfM1U4V zOC}JKZ2g~G?1Iyx7^h&3gIW?(=NsSdw)cjty9{I1P2$a|q9OaY;xmV@k*sZxf-b@{ zwkoERVXjGxM<~ofL)xWC-WYvmfKKsFOQp>Wo{W@*Ep{XOCVx#yk?ZwO(_{QSavcRg z?|q7-gUM9lqz!3^fG$}urnaLtRM-ga0_AJhH~ko-D}UfO`Q32JU|1;CTnap-h^iGflJdA=HVbJ&an?aARm%ek`N z6iR6G1%2GPxxW_-lhL+uA4l|PyvKT`3RI8+f`4$4K4xiOJnTt8c+mP!RNx3}%Vz-$ z{|FQqNG}LgrEU8;FZ1zo9N&QpC@U&q0aTdXmMxen1(jP;*Ph#7ee4MKuMgwZf9w?1 zMh+gtj#cm93~91|v)k;2g@|#(7MY;;LN#>Bq1lmCu-ex+hvy_9Djt0;(Fer(%Skaz zWbuR{HC;XLVio7Ddu|qSZNYbm+19H~^XE6@*vHRZ%Cb_u@)QiDHi#D8jXT{YbuMJJ zOT}Kq090xfXRu50pH`A^nF+-(s}KXH{nCPV+Cr2tLp>jClV_gx;g2UT0(q!FqTsyZ zS-9g}2E0m1a#bVhT;RXV?moA2AgG!ctK%YLJ&xcgo|_$P(Ldy@wP@QkX^6&!_%Dag zr>kb9STaWAHZf%UpdE0{w^d|&RllpQ#&Ck#7jNvNAe{bTMPCKz$l_5XhVE3DLg?Tu zAX*m{E~Qcn9+UOZdv(VS>)Q7-Kt(lLq%?^`dkDc%(EKGxS-STDA?(je1PGN+lWC^Y z*A@x;2rOkkXt)ViCHCtrLa~g9<|oj#&e&piQXqTry~y~y?ldKoI;Qt@iZz!M@QqQ* zA2_aq zd80(YjNFaPS`fFjkNR7zal2cpk}N%m0p>w{<(*dAC;ZGT6X;@Ne<5g7w_c&&yjzfQ zg6Ov-f8S@D!VLzwz_~Tk{{HiYd9X|6kmZ70_RjJYAL{}UYNcOmHwevt*0+D7*@&}ESD$HV+a(B#AwT$r~(34 zb7gCx*6E3|*mqF4!aw_uL~u8ZX3)<)vM8^R8t<*R`Z7OFbt=q~?6u4cEPqP_8fMO4 z+otXgtq&Ctr{hvdLkoUoG+a)j?W24HLkIqIUw*X_n zFQ`KSc3+&T(f5dk0akn#9D_qOsXyjm#3H+xv`p>mBKP8Ow@T&vMipWDh`bI=Y6q^$ zU-3|c5j&3%IL&NYa%vTbqhxk>O)!6H1FkRR7}?BKWN=(Da8;2`GwVGKP8lXV3k52SPlf9CT34`S#jAkTk*KUtqB?wT8JvP_&RxTof z168)5{o`85Ql}`!`b431<`Er9#AS&AkyGa`K7u1W^%O%A84v-H)KQ5tM}lI)eKmcaf?}TVTYFn0t!yw z!+D4LWV0wSvJXxsHZNH2`b|=*#o(^K?2*C`udCfg(gIgogFs+7uI{f5vxbh;iep6X zjZ$AF2G5N-j+L%`icIw_;t*u57fU}AzJ|uhfDuhd&w14R6LW~M>aiSE;Asj1-8nH%vA(__@%5$3oVP7-sAAO_5 zCg+lofXka3i($fxzcQv8)8AEA%jP z)X5R2o!9O{tEGkPJPD=FN|~+iJwK2b(;(U2;Qn7|BRT6aM};C0&paezpp!+ez7{!c zXr_2+NdaBdJt;JVcsDD=jmd!i#t!p-0J*#a$H)IOMX4JN_g$O2w%m<|crQ0rQ`H95`6-c(3SYb+)3K*NVajYDL;pMP0_!(O{-j_v&t)q+ zb;U2XbR^J&mYe0os&qJK1Sf!8c$Z8CYo^`2%#>RS+2UoDz_3eNabkx*4tUh?-yScTlfyFjN}gIu&(LV{NTXu59Dm!XybmhL8CJ4p@csL9l%CX1zxwm zF4;Q}knnN8l@JYyn=Eoft@Sz^Ff3c(^mgh_9X;FyQ#|J zmBHE0>vm88CMi}>fcFEgwJ$bi--LjC@KY~rr=|vF84HqO&-MR`N&d%pK4m)9r@em7caf0 z=iKJDzBHhVMvskBnJRGRJsxCyN6 z;~H-Y#)|TVs{*xKV>Cpg5hb3`JI?p-4~=2jTW(=YhA~4E_Y}29$|co)1Pf6XPtSWk zipfwuCDWqoOc3D{?r-cQq3b6CFL+aIyXp=1vgK9iVa?Ya#tN&`<}iAJy89;2ME=-?E$vS}l3w|{vH&FLc!qO7p+yH2J2Ths46&Js%Lj1ZRlbR_Zbzw^Ny zO$!WO5^b;I$=vbsWj@oo5Gg=zSQdUCltdKPZ&L$@92kRfgLDPY{Gysfrb~H!1Gn20 z^oiYyzxJwh#5_IfJ$H-y)M($AYY0d{ix`6H-KA2)4t4~Gm>E|r-Q4M8k&@wYG%vVg zB?dy?==aZ>tRYh>@%0@ec2Ed71*AxAN4EE4pJ>6$q&M(x^z0v($Rxi%#pk!C^TB%* zxEm=p*~u(&ozJp%Xg_n69HbbC-#+Z`cm25=XFfDEFtN%E7w)~bwSVT^@P8>N(TnyN zoPc9T?6qQ_X45WPuE1_Gcp|AnJVP(|wuF>A&uzN`{$%1v;C_33-FIx@odAe7>!0*h zBpJ8Nl<7o2i@f_KsPn7R)t3{CRtTG7tX1=J&sMLJSqGofTqQ?vkOJ_Ozf!HkGcY1j zI6URT4!_%nM??7IU9++?bg3RpN<8DwZ}<1SqWDMwG=H&b*vhTT6N*L=QUWrhKTWuG z>DE_EKZP&Jxk0s-bDs8a7g1s?iaOaP1bmt;`)oN;gJg3bNs00pfjnnVpSO|yUq8xW ze(@|5<$uVDF1ncnx+ucOheO|A|M5S8=(~ccpjPuxw10Uk z^Db{XQI;oj7K)btOw5o1X}aebptvX>AI{sd`d>z>9(rgIvHf{0NW&bTtys%#whBIm zD)=Qv8b6aMAC1#V2<*57a=FFx&0{*-Ingt=2OqnwBn*dH?hKMZ|JnApguMZw+Kopw zYHqvtiz`b8snN9=l7U83FKwsH)ME`QhK#JU@_?pwQd&5uNqPIjv&ywfVyj!K;R*$U zqsG*<^;OPhuC-G>@eUdA413A)@U7rP=6!a$ZnN*SK6+(~j1xQMtlLdF*?QMOH+H(W zT=)c~I}4F0-DiKuOi66xLIV8c-D0l=i(yi41du|lk9 z_fEJqaVW2`G>u_dfQ@~++iFmQlSaJ!Sv)DGvV+=j<_8!Pnl#3se@)I0LEBB|t zSX_7EuoUxV5ac3e_D0Wvr9RnC^|caES3`3Ihoq_L0E<2RiCfXTn>=|$?@Bhty=)zv zXOAbE;}^v%TFJOFHyW9{kCaYER(*(uFHz7q^_?8P`5k^KO?RtDN9nSoeAA1udQ(2y z38N4-St63yJjK-p-cLSBaC}rZ8pk!r0=+>Q9gVxGuXZax-*A^`_z3@?gzdY-!&fMw z57>9aDAO<^9zH(s^gJ2${vwVaJ>5i`yeuqUJriz_H2H7J`J+nauqDPB0Pg$E!e^Hsu=H;kN^_$eqeeD?77m7JYPb3(GxpR(7?UU z)BmUx59zUzU{D1eEDbK_nJV=b1;Uk+Es482cC}6~9lDaz3PUGcI*tr)@^cuBil~$)L zcot66mZQuO7`(Trhz!ir4)M1fo;V`HY^kvLv?y=(h!XQ%;zwc9?Mu@Xw^t9}IJRFo zC_m)}Z)&>nsdMYgbgsU_YcD~pj`54oN|L?WMJ%bHrVm1oO8#r&+_>A-V}W67xwp~* z+q=a;fe}HVxXvZN86EMK5&IBolz!(orvk2(<&VFq_@A)G#q^o$^U`Y8T3+5@l007c z!`sC$E$g<<>ix3F01O%v(~ZAxuJtMxc7`)dfwdVSe@;KL-@@01a~=#!W_8*tCS_tydS{cUqYLh%x0x&ay`w@2X6YzI^RNu?{MWS#WSCSpMGgnV1q6Mp~B+OWOs2VSoB%UHIZ1*q^w5dFlDlClL$Jnnj85T z=QxCCB)U}WK%M;Z6SKW!`upT*Iy40v@w#!)y%M{dxHk)3Een{>tzB#9-m-i4)AjY{ zuUk=suzo9V{XO|ILutYJJuON^-p&56u-zGa|8o1Gb7F<<(#7eChSQHTZS8Zxv+av} zYikwP(Ge>aA7uR;v_40$19btXy?YZd<|&w1ZI!w6jJ= z?WX|iabF;O!|}|UZBRA%Fp{G%{q@$Ao9&Yk+)itztN!bkkMNf5O>?cLLiUq2){}qg zLiplOK?LhiBRIzL^S1N{JOoDU z8r@NkRHPnzS+_rg@HAApW4quaH8Vdgf86)tlWFdwni&ka%0VKr{A-*N{lT{*t-Cp} zb9K(%uD8qVis4DKv!Pgo1np6>U!twbk( zxOn3)xqto8&6Az=Vl#gm$RDfT?!Y9=DP-`kTfWwzm}n`!WEH0pi%YgRZE9n$J#Qey zap;S*ZqdU`srr~ZTB9;~2o8$5G6-@8o@Y`yVFmdH|lN!%LWe7XbAJUpP6Lv zth;aDyNz)~RRj%)Tn;k)`l(> zleP6oSv`@sRfd&n{_L0tU3O-=M~VJO` z8T6Atn~!Yr4g!|yU$$fn9^AmGV~?{!--ROVrnFv-Y0p=^*yIR=ls}^bTlYzoSRa>S z=mQugjDejEK1eP?S)pEV&Q>|2 z$w>my@!*`=-1pHWK zZ-R$n1m{sMhCOy-hbk6Ry)_)meaUK6dA6LRcAtIvI)%cMXq>Qp&8bTKDypg!cQP?H z(u?ndR0wypr``^fG^3?}W}2R}=y_kiMk7$cW%B8~7&Y(-|C-0$17`k!_uDyv-j3W{ z(3)bMbC4cdkXBa1?TSUq^t$Q6QY&!-=_B|0kT>hJ-aht$2|V48vY8*S`Yj(A?k~lP zP5zZ~-;a99G5AWYmc|@h02=pzFqJFamn6dGB9GuWDi{0^bJdg{XSkm5MjQj~589Qx zj7!8B-HmuWH;+}{`J=rF+IZkX?p)XQC5gRc!b(syF5494iJSk4(Bi6z zZK5xy6}bF)@;koI%&Fj3zs>f_l*vVN@oK9%LYczu;c}}Ez+3lOH zeiXp?+v7cJK5dCohH1GwhkhcUjwbY(ucdo`o*lR^MmB~1Y%Okyg-q1j>+@4v%qzNJ zB@b34h}oi95R+HGXxY`Y)zoXMt=GV-l`~DtXP9=1#!lKIcHbxAQr?*%PkPYQ zb!nVkXG_YN#V{cv|C0i^(63Zm8VBl=w$<(87})__HJ6NgpNzT$Ho2EqVld{HNYeD{ zoeyA}#wQg`QfyCJ#4+PXy?GFao6@B$(+YPc%|QhvG+BKwYtDA2LDwpucJ$(VSCC&F zdK!Yv=`IU^kghgZzkJ_T|8Zh(gg;}7H!5$eB_8MTHuPAp=;pQPo~sUIX}VH*!qF^P z{L)Ix-=!lVd;4BAd?~r$H=Erg{`a0MkFf$k4P_O`A<;D;-4hBsXcxVaM()BseWJZb zra}JaPoPs^Yu3$w9Sga1nLQI05ctX{jJ3CO|It6dPU9bgf)d96@!R`jdVrh zx~0x;lZIf`Kj|ra-3XEX{axthma{MHjNb003y!6+eCe-r*sU=)_Ay(kU&7eX7c#CN zf(9IJ*~vcMT6YPAIiB1ntQ^RAdty!2>8T%0no-f0(8|RIIu5jRP2;bm#3$l%ne9$6 zOqsN2osx883}nES$7H=oV`^Z;8+F{~LI!i(zfbs=AE$X;b!7D@_Q@vmM@|7_~} zRWFezub+Qz-coK-w{+n_pr-n8PW5ixMiJ-5-nTm4*gK_D(Ni>-C2BxS6jN7<)gzol)>p;~cVZgK zZXt5NS@om>DrnUOQg^m%#kS)FPNBj`WiWNyCz^>2@S1y-F!U#; zD^~vfUVGBN-EMr2m)Jkx#r1P19$1CL236qXZK{-F9$2m9XH7$3H}T+)wu z$7h_be)tlfEp(h;4@+cvIjiyP?c+e+SBtX>$ybqjM=UVSVa^zPe{V_DkBB__4H@u( zHa{hIv&MQbRe}Ue3~OSSm)^kBB6?|!IjUm$WP4*(=(wsL7PeeyAE5Bv;73-%N2=oV zo0fw{cz%x*qglqfiv9OTXs5qrQOC)Sg5#%@q%txLsf_av!f2pA!uC1f7L~*X|G>i; z**;EVwzIr}vKF|K-tJ;qJX6~*0IEe|?1DWstQnpAi1P&3-5kMbyAdH(3p zNX_zK&E3PYC_bomk@}gi#`*!(&g8e!Mb$(^uEBLf+_U)mO_4?XT7*@N>7bBYUa0nw z`u5{%+&)`ShW&t5Zhb^l2vo zOC3c07D~iL6}-dG=ug)($#cUh##$4wamR|V@6X_uunV&}x{G8Mh~~LHkG#Z`gqD)r zBm;2aewNy;(poUxe4~JNoh3DV-HFE9Uzc6@UAlmPY~BeDdE3X6fP1mAOL9ZS6Sb5b4kYsZ~urLa|u?lfHa(X z7IJB-6?N}eP7Nn2F4m3LHgmogGA+k^`_&wX3kr**r<^-6d%gBBCQ!Vgy^1{Q(S*GB z98W!|H&dCNe_ID{N)*0fkwp-$seu~}+CPe5+mrwC=*Ouhyp03bE5OFu{IQ`5gj{QW z^2r4Rct01P;uE6iZZhiR5XMmYqDBUL-1XA>a|v4-HxpyAG#exHJR@*=IpmS6(Lj^m z3i_N%92;79_q=zeJ&;XVl}AtsrUXf!YIyfgDY7~{cD_aS)@&Rb%&#H5X8p4G@WGO@ z5uc+QJEKb0^kpoaZLjm=|62bf2v5)LvI6If1Bi-ZRY4( zvoxDG19zOi`;ioSGVuO>f~!2%gqqj<=bZp5pdb@Uw=o|ZkIQep{d0@?YyoS(^vFf=m_1`UH>YCxpK93O3`y==@otX$@8WAI7LdUHx1c6-HQe5@FzZG#6ul^C^8_i!u z(v6>{2{EkDAWrG!F*`To!n9Rjj0oP>G$0r{Ip@Et%>Nl)>Uth2TKg*j$9&tq%13!U zge#jJGd-?FE;!?Gqt_E*PwC$@7kX%Bfgnf#vVU*-YK3pPyz!2l1e*X?e7o^+_Z#wG zbR(-)cT2$N(x$;=VUP5^>3!$FPOD^tWQ$|Xz3C#EQ0D^jGQ9F9N8 zpUK z5ssZ7D?vSWQ@&9k+{6jRF%tAs7mChraDHuk!*b)J1p+m??J}UpoO{seo2O#`QG)j= z3rY`xQgvX*wv#={n?|a@1kgQiJeipQ@MsT^yeXify~uG?J=H{RQy~MCdOJVi++kWz z&Qp>Y4WDOHlh*~^rj8=ZuYCOGbGi0cEN;r{1mzo`SeEaur2Cr&6KZCVv{)dqrQq=>U_q@p$JZweC~|9kw1mJ3M+1N;63azw(LY;56m5S z^jA5^HEA#<&s|q!HUza4KeQ!7*?RC_v(L^i1o#b>2#QqXpqRAaVq|%&y1r$Kw=y%v zqC~fb96U&pmPlFDR<|bunb-g35oEC?l~prX^$6GYu#POjFxFI0n$0+fhhD7bHcLvB z-WNFACv4jjXk#}%c6n&=p?qO3bG#gy`)^*#eLzNqo z#RKA`M4E5Spgl40RB*##h3znh6Z-iS*EHYJ$6LI#s`)>$;+G(HA0w?l`$Da_%Y+W* zNZ^V*sbh;ozuWTZ`;S>ohYfn7ac%7I50;;r3Q3{)ovE*a{1sqgdQYGRFW20!c!NU%>)*kc?5SK=S*SJ@~U$>7da^nnv6$F6=Q2Fv=Z!hJsk|9VP848_| z9MFx+qV16uV0APgxEgh4jL02jwV!iJ6SlUTs?LAEp8K&rpl^-akT8jqhiML=mmMw0 zL?fL;CS?t*0>WaL!L6YvRU2H2nv@hKFS~i)Pmjo2MCynlpPzQ$$&W9gs0p%Xqy!A% z1YpQGy$bB5%C-;oQQG$+|`4-BC-1`kR}CHhHFOTj^S= zSllPf@!0CMTmR~r^3$nk!74`qK@fLob~3R3hiHBw*ECT?2OSbF%U!JSH2Uc4mU1&F z;_i9~-@Lan113-0KUsF+A!7izFKo+NamGqf@I#T~+5Mf{IHf5hJ1pV}L_0tlR$-~! z2QFBofCjAB-42SN%QDohjEBZ`BSWf3>lStm|Bc+F{9mGRj>je5t+ssEeg0G$JfKKO zl@sI{kPp*)q~rqa#9!R}*~=z}jrx}SvrXd_y{hAY^A;zpV(QmU`Lp?Z1|PT`JMZs& zUHwVDL>qdZ%-n#ls-*Z@Z7C5vHnmV zh{SSXro~(Tr?e28%#+Mmu5ETou^~k?-&{%$XjNT*;KxAqA5|*1MKVH#)@nlc>}J!Q z{)Ipzwq^g11_7!l9I;b7Q z&mL)~9(2GMs8-Ho@1f20D=tc(Wh>Ek@MmY624oi|x-s6nHNf%1zJIH1K z5TtkdgrDfe>tl{RvlY$rqSO$j|C79W@RmJz{eL@I&?pY*2&4jaG7IjWH2Eb7+G_D` z+xJ5pvL2mp*L3_E8_ET|U;0(S9S_5aL z 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 literal 0 HcmV?d00001 diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 0000000..885af99 --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; + +const routes: Routes = [ + { + path: 'home', + loadChildren: () => import('./home/home.module').then( m => m.HomePageModule) + }, + { + path: '', + redirectTo: 'home', + pathMatch: 'full' + }, +]; + +@NgModule({ + imports: [ + RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules, useHash: false }) + ], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..13b9677 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,3 @@ + + + diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 0000000..51b7b65 --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,21 @@ +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; + +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [AppComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..913de3d --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: 'app.component.html', + styleUrls: ['app.component.scss'], +}) +export class AppComponent { + constructor() {} +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..34b715b --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { RouteReuseStrategy } from '@angular/router'; + +import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; + +import { AppComponent } from './app.component'; +import { AppRoutingModule } from './app-routing.module'; + +@NgModule({ + declarations: [AppComponent], + imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule], + providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }], + bootstrap: [AppComponent], +}) +export class AppModule {} diff --git a/src/app/home/home-routing.module.ts b/src/app/home/home-routing.module.ts new file mode 100644 index 0000000..29c3f60 --- /dev/null +++ b/src/app/home/home-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { HomePage } from './home.page'; + +const routes: Routes = [ + { + path: '', + component: HomePage, + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class HomePageRoutingModule {} diff --git a/src/app/home/home.module.ts b/src/app/home/home.module.ts new file mode 100644 index 0000000..a554f01 --- /dev/null +++ b/src/app/home/home.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { IonicModule } from '@ionic/angular'; +import { FormsModule } from '@angular/forms'; +import { HomePage } from './home.page'; + +import { HomePageRoutingModule } from './home-routing.module'; + + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + HomePageRoutingModule + ], + declarations: [HomePage] +}) +export class HomePageModule {} diff --git a/src/app/home/home.page.html b/src/app/home/home.page.html new file mode 100644 index 0000000..f8fe6b2 --- /dev/null +++ b/src/app/home/home.page.html @@ -0,0 +1,17 @@ + + + + PDF标注 Demo + + + + + + + + PDF标注 Demo + + + + + diff --git a/src/app/home/home.page.scss b/src/app/home/home.page.scss new file mode 100644 index 0000000..8993e7c --- /dev/null +++ b/src/app/home/home.page.scss @@ -0,0 +1,27 @@ +#container { + text-align: center; + + position: absolute; + left: 0; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +#container strong { + font-size: 20px; + line-height: 26px; +} + +#container p { + font-size: 16px; + line-height: 22px; + + color: #8c8c8c; + + margin: 0; +} + +#container a { + text-decoration: none; +} \ No newline at end of file diff --git a/src/app/home/home.page.spec.ts b/src/app/home/home.page.spec.ts new file mode 100644 index 0000000..26eb973 --- /dev/null +++ b/src/app/home/home.page.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { HomePage } from './home.page'; + +describe('HomePage', () => { + let component: HomePage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [HomePage], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(HomePage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/home/home.page.ts b/src/app/home/home.page.ts new file mode 100644 index 0000000..b6365e6 --- /dev/null +++ b/src/app/home/home.page.ts @@ -0,0 +1,16 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-home', + templateUrl: 'home.page.html', + styleUrls: ['home.page.scss'], +}) +export class HomePage { + + constructor() {} + +} + +window.addEventListener("message", function(event: any){ + console.log(event); +}, false); diff --git a/src/assets/icon/favicon.png b/src/assets/icon/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..51888a7bbdb59f04c29c548523eb2638c1c954f5 GIT binary patch literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!x&nMcT-^(N+`Ik{1{5}NM-k9f zx+Ot=!3-}y{#<)Uok@}X^0T)Mjw~(h@l#Ir^NC7r=_#0-8E$a3RKVL~nc3p~*UxA# z4bjg_XJBBO<>}%W5^;EK_{&+V40u?Vtzk_Oy;*YMVqw~ozwz&rPG6d~>D#mR`SK=; zww9K@s-5|}%Dy=+ak|}>#qwwKGH>ZO4~|`P_r2LJy1RYqyXB`=?Mw?@F8Z!h{rcpz z^y94Mdt1KFIr?nR|NE2g?N}2vO^d(4;=OB>WP0Plul!REN;cgwUAJuA?C`^98NGCJ zuf=eS_OHmETd)0azdLJ6Z^FIm6*YNHw|4%lGf`stp1;dK$1sNYdj7ec{*dYEN(RM7|LFZWoy#R9733Kz`kee` zcsH&1+JCz2|7qRT%bgpNUdZ3E%i6T)I?vY6{p)ga_qlB<;GAPn(!{OF;x_wm_K%n( zW67=BbK}Hx+Mo2yW_)0K?|;#s9f!Uw=S;9NQ)S^>UOs1+lefL)nQKa6oJzg9f7^uT zr^QQJHL|;hJ!n29P`>r{pI$??E8ll+Vp%D3sqgGAQ?16Ir>}307i!n%dGB~BKleRm zV`}#;lUe7&`Rm%PqCLs%HOEe${KnWk%jlG>GM}cUf9>%Jt~^m(q1U%2$4$<)xHgTq zd0EM;Wjbazr!IcCcJ{`1i$kvS+;+RTmT^vJdf^@OKlARE7bo`3-BEDmtJB75>uhqr zB>Z2>{qec~lUw13i#jzoi~HY= 1) { + final_objects = fabric_item.objects; + group_item = true; + } + + this.addWholeErea(fabric_item, page_width, page_height, this_annotation_layer, page_number, tips); + + // tpm_div.classList.add('linkAnnotation'); + // tpm_div.classList.add('link-annotation-item'); + // tpm_div.innerHTML='

' + if (fabric_item['my_type'] == 'highlight') { + for (var i = 0; i < final_objects.length; i++) { + var item = final_objects[i]; + if (group_item == true) { + item['top'] = item.top + fabric_item.top + fabric_item.height / 2; + item['left'] = item.left + fabric_item.left + fabric_item.width / 2; + } + + var scaleX = item['scaleX'] || 1; + var scaleY = item['scaleY'] || 1; + var angle = item['angle'] || 0; + var tmp_pos = { + 'left': (item.left / page_width * 100).toFixed(point_num) + '%', + 'top': (item.top / page_height * 100).toFixed(point_num) + '%', + 'width': (item.width * scaleX / page_width * 100).toFixed(point_num) + '%', + 'height': (item.height * scaleY / page_height * 100).toFixed(point_num) + '%', + 'rotate': 'rotate(' + angle + 'deg)', + } + + var this_link_id = "page-" + page_number + "-anno-" + fabric_item.id + '-index-' + i.toString() + + "-container-link"; + + // tmp_pos=this.rotateAnnotationPosition(tmp_pos,this_annotation_layer); + + //删除旧的元素,添加新的 + var this_link_e = document.getElementById(this_link_id); + // console.log(this_link_e); + if (this_link_e) { + // this_annotation_layer.remove(this_link_e); + // update existed object position 如果是存在的则更新参数 + this_link_e.style.left = tmp_pos['left']; + this_link_e.style.top = tmp_pos['top']; + this_link_e.style.width = tmp_pos['width']; + this_link_e.style.height = tmp_pos['height']; + this_link_e.style.transform = tmp_pos['rotate']; + } else { + var tpm_div = document.createElement('div'); + tpm_div.innerHTML += + ''; + this_annotation_layer.appendChild(tpm_div.children[0]); + // '
'; + // console.log('临时div',tpm_div); + // console.log('当前对象的位置',tmp_pos); + } + } + } + // tpm_div.innerHTML+='' + } + + // //修改图层的长宽 + // console.log('完整图层',this_annotation_layer.parentElement.style.width); + var this_rotation=this_annotation_layer.getAttribute('my-rotation'); + if (this_rotation==90 || this_rotation==270){ + this_annotation_layer.style.width=this_annotation_layer.parentElement.style.height; + this_annotation_layer.style.height=this_annotation_layer.parentElement.style.width; + } + + + //绘制连接线 + pdfAnnotationUI.showLink(); +} + +pdfwheel.Annotation.prototype.rotateAnnotationPosition = function(tmp_pos,this_annotation_layer){ + var this_rotation=this_annotation_layer.getAttribute('my-rotation'); + if (this_rotation==0){ + return tmp_pos; + } + + var rotate_degree=this_annotation_layer.getAttribute('data-main-rotation'); + tmp_pos['left']=parseFloat(tmp_pos['left'].replace('%','')); + tmp_pos['top']=parseFloat(tmp_pos['top'].replace('%','')); + tmp_pos['width']=parseFloat(tmp_pos['width'].replace('%','')); + tmp_pos['height']=parseFloat(tmp_pos['height'].replace('%','')); + + var new_tmp_pos={}; + + if (this_rotation==270){ + // //270度的旋转结果 + new_tmp_pos['top']=tmp_pos['left']+'%'; + new_tmp_pos['left']=(100-tmp_pos['top']-tmp_pos['height'])+'%'; + new_tmp_pos['width']=tmp_pos['height']+'%'; + new_tmp_pos['height']=tmp_pos['width']+'%'; + new_tmp_pos['angle']=tmp_pos['rotate']; + }else if(this_rotation==180){ + // //180度的旋转结果 + new_tmp_pos['top']=(100-tmp_pos['height']-tmp_pos['top'])+'%'; + new_tmp_pos['left']=(100-tmp_pos['width']-tmp_pos['left'])+'%'; + new_tmp_pos['width']=tmp_pos['width']+'%'; + new_tmp_pos['height']=tmp_pos['height']+'%'; + new_tmp_pos['angle']=tmp_pos['rotate']; + // console.log('新坐标',new_tmp_pos); + }else{ + //90度旋转结果 + new_tmp_pos['left']=tmp_pos['top']+'%'; + new_tmp_pos['top']=(100-tmp_pos['left']-tmp_pos['width'])+'%'; + new_tmp_pos['width']=tmp_pos['height']+'%'; + new_tmp_pos['height']=tmp_pos['width']+'%'; + new_tmp_pos['angle']=tmp_pos['rotate']; + // console.log('新坐标',new_tmp_pos); + } + return new_tmp_pos; +} + +pdfwheel.Annotation.prototype.addWholeErea = function(fabric_item, page_width, page_height, this_annotation_layer, + page_number, tips) { + //in the furture consider about rotate object 后面还要考虑旋转的对象 + var this_link_id = "page-" + page_number + "-anno-" + fabric_item.id + "-container-link"; + var scaleX = fabric_item['scaleX'] || 1; + var scaleY = fabric_item['scaleY'] || 1; + var angle = fabric_item['angle'] || 0; + var tmp_pos = { + 'left': (fabric_item.left / page_width * 100).toFixed(point_num) + '%', + 'top': (fabric_item.top / page_height * 100).toFixed(point_num) + '%', + 'width': (fabric_item.width * scaleX / page_width * 100).toFixed(point_num) + '%', + 'height': (fabric_item.height * scaleY / page_height * 100).toFixed(point_num) + '%', + 'rotate': 'rotate(' + angle + 'deg)', + } + + tmp_pos=this.rotateAnnotationPosition(tmp_pos,this_annotation_layer); + + var tpm_div = document.createElement('div'); + var point_num = 4; + var this_link_e = document.getElementById(this_link_id); + // console.log(this_link_e); + if (this_link_e) { + // this_annotation_layer.remove(this_link_e); + //如果是存在的则更新参数 + this_link_e.style.left = tmp_pos['left']; + this_link_e.style.top = tmp_pos['top']; + this_link_e.style.width = tmp_pos['width']; + this_link_e.style.height = tmp_pos['height']; + this_link_e.style.transform = tmp_pos['rotate']; + } else { + tpm_div.innerHTML = + ''; + this_annotation_layer.appendChild(tpm_div.children[0]); + } + + //非高亮对象的顶层事件 + if (this.set_annotation_layer_for_all_type == true && fabric_item['my_type'] != 'highlight') { + var this_link_id = "page-" + page_number + "-anno-" + fabric_item.id + "-index-0-container-link"; + + //删除旧的元素,添加新的 + var this_link_e = document.getElementById(this_link_id); + // console.log(this_link_e); + if (this_link_e) { + // this_annotation_layer.remove(this_link_e); + //如果是存在的则更新参数 + this_link_e.style.left = tmp_pos['left']; + this_link_e.style.top = tmp_pos['top']; + this_link_e.style.width = tmp_pos['width']; + this_link_e.style.height = tmp_pos['height']; + this_link_e.style.transform = tmp_pos['rotate']; + } else { + var tpm_div = document.createElement('div'); + tpm_div.innerHTML += + ''; + this_annotation_layer.appendChild(tpm_div.children[0]); + } + } + +} + +pdfwheel.Annotation.prototype.clearAllAnnotationLayerItem = function(page_number) { + //删除元素 + var annotation_layer_id = "page-" + page_number + "-annotationLayer"; + var this_annotation_layer = document.getElementById(annotation_layer_id); + if (this_annotation_layer) { + // console.log('所有子节点', this_annotation_layer.childNodes); + var children = this_annotation_layer.childNodes; + var delete_ids = []; + for (var i=0;i 0) { + for (var j = 0; j < annotations_json.length; j++) { + var this_annotation = annotations_json[j]; + this.drawOnFabric(this_annotation, this_fabric_canvas, this_wrapper); + } + } + this.fabric_list[page_id] = { + 'page_id': page_id, + 'page_canvas_container': this_fabric_canvas_container, + 'page_annotations': annotations_json, //current annotation data 当前页面的批注内容 + 'page_canvas': { + 'fabric_canvas': this_fabric_canvas, + 'width': width, + 'height': height, + 'fabric_canvas_json': this_fabric_canvas.toJSON(this.custom_attr), + }, + }; + // this.saveFabricCanvas(page_number); + // this.saveAllFabricData(); + } +} + +pdfwheel.Annotation.prototype.bindFabricEvent = function(this_fabric_canvas) { + var that = this; + this_fabric_canvas.on('mouse:up', function(opt) { + that.fabricMouseUp(opt); //用这样的方式绑定才能保证作用域是当前的类而不是自动变成fabric 画布 + }); + this_fabric_canvas.on('mouse:down', function(opt) { + that.fabricCanvasMouseDown(opt,this_fabric_canvas); + }); + this_fabric_canvas.on('mouse:dblclick', function(opt) { + that.cancleAddFabricObj(opt); + }); + + this_fabric_canvas.on('selection:created', (e) => { + if (pdfAnnotation.current_click_type!='select' && pdfAnnotation.current_click_type!='add_text'){ + this_fabric_canvas.discardActiveObject(); + } + }); + // this_fabric_canvas.on('object:scaling', function(opt) { + // that.keepScreenShotTextScale(opt); + // }); + + // 监听路径创建 + this_fabric_canvas.on('path:created', function(e) { + that.afterPathCreated(e, this_fabric_canvas); + }); + + // 监听路径移动 + this_fabric_canvas.on('mouse:move', function(e) { + // console.log('鼠标移动'); + if ((pdfAnnotation.current_click_type=='add_arrow'|| pdfAnnotation.current_click_type=='add_line') && pdfAnnotation.change_direct==true){ + var pointer = this_fabric_canvas.getPointer(e.e); + if (shiftKeyPressed==true){ + var dx=pointer.x-pdfAnnotation.drawing_item.x1; + var dy=pointer.y-pdfAnnotation.drawing_item.y1; + + //水平方向 + if (Math.abs(dx)>=Math.abs(dy)){ + pdfAnnotation.drawing_item.set({ + x2: pointer.x, + y2: pdfAnnotation.drawing_item.y1+0.01 + }); + }else{ + pdfAnnotation.drawing_item.set({ + x2: pdfAnnotation.drawing_item.x1+0.01, + y2: pointer.y + }); + } + }else{ + pdfAnnotation.drawing_item.set({ + x2: pointer.x, + y2: pointer.y + }); + } + pdfAnnotation.drawing_item.setCoords(); + this_fabric_canvas.renderAll(); + } + }); + + // 监听对象增加 + // this_fabric_canvas.on('object:added', function(e) { + // console.log('对象被添加'); + // that.canvasModified(e,this_fabric_canvas); + // }); + + // 监听对象编辑(移动、缩放、旋转) + this_fabric_canvas.on('object:modified', function(e) { + // console.log('对象被移动、旋转或者缩放',e); + that.canvasModified(e, this_fabric_canvas); + }); + + // 监听对象移除 + // this_fabric_canvas.on('object:removed', function(e) { + // console.log('对象被移除'); + // that.canvasModified(e,this_fabric_canvas); + // }); + + // 监听文字退出编辑,也就是编辑结束之后,实际上文字编辑之后肯定会改变对象的长度,触发'object:modified',所以不需再用文字的监听 + // this_fabric_canvas.on('text:editing:exited', function(e) { + // console.log('文字被编辑'); + // that.canvasModified(e,this_fabric_canvas); + // }); + + // // 监听对象移动 + // this_fabric_canvas.on('object:moving', function(e) { + // console.log('对象被移动'); + // that.canvasModified(e,this_fabric_canvas); + // }); + + // // 监听对象旋转 + // this_fabric_canvas.on('object:rotating', function(e) { + // console.log('对象被旋转'); + // that.canvasModified(e,this_fabric_canvas); + // }); + + // // 监听对象缩放 + // this_fabric_canvas.on('object:scaling', function(e) { + // console.log('对象被缩放'); + // that.canvasModified(e,this_fabric_canvas); + // }); +} + +pdfwheel.Annotation.prototype.canvasModified = function(ev, fabric_canvas) { + // var fabric_canvas = ev.target.canvas; + let canvasBoundaries = fabric_canvas.calcViewportBoundaries(); + let obj = ev.target; + let objBoundingRect = obj.getBoundingRect(); + // console.log('当前对象位置',objBoundingRect); + if (objBoundingRect.left < canvasBoundaries.tl.x) { + ev.target.left = canvasBoundaries.tl.x; + } + + if (objBoundingRect.left + objBoundingRect.width > canvasBoundaries.br.x) { + ev.target.left = canvasBoundaries.br.x - objBoundingRect.width + } + + if (objBoundingRect.top < canvasBoundaries.tl.y) { + ev.target.top = canvasBoundaries.tl.y + } + + if (objBoundingRect.top + objBoundingRect.height > canvasBoundaries.br.y) { + ev.target.top = canvasBoundaries.br.y - objBoundingRect.height + } + + fabric_canvas.renderAll(); + //确保附属对象也在画布内 + this.keepTextFollowScreenShot(ev); + // console.log('对象被编辑',e); + this.saveOnePageByCanvas(fabric_canvas); +} + + +//save all Fabric layers data 保存所有 Fabric 页面数据 +pdfwheel.Annotation.prototype.saveAllFabricData = function() { + // console.log('this.fabric_list',this.fabric_list); + for (var key in this.fabric_list) { + var page_number = key.split('-')[3]; + this.saveFabricCanvas(page_number); + } + // console.log('保存文件'); + // //刷新批注显示列表 + if (pdfAnnotationUI.show_annotation_list) { + pdfAnnotationUI.showAnnotationList(); + } +} + +pdfwheel.Annotation.prototype.setViewer = function(old_viewer) { + var this_viewer = this.shotViewer(); + if (JSON.stringify(this_viewer) !== JSON.stringify(old_viewer)) { + var viewer_container = document.getElementById('viewerContainer'); + PDFViewerApplication.pdfViewer.currentScaleValue = old_viewer['scale']; + PDFViewerApplication.page = old_viewer['page']; + viewer_container.scrollTop = old_viewer['scroll_top']; + viewer_container.scrollLeft = old_viewer['scroll_left']; + } +} + +pdfwheel.Annotation.prototype.shotViewer = function() { + var viewer_container = document.getElementById('viewerContainer'); + var this_viewer = { + 'page': window.PDFViewerApplication.page, + 'scale': window.PDFViewerApplication.pdfViewer.currentScaleValue, + 'scroll_top': viewer_container.scrollTop, + 'scroll_left': viewer_container.scrollLeft, + } + // console.log('this_viewer',this_viewer); + return this_viewer; +} + +pdfwheel.Annotation.prototype.recordFabricHistory = function(this_state_data) { + // console.log('前一部分历史记录',this_state_data); + var this_viewer = this.shotViewer(); + //如果是在undo和redo中突然增加了新记录,则要从当前位置重新记录列表,把当前位置之后的都删除 + this.previous_history = this.previous_history.slice(0, this.history_index); + this.previous_history.push({ + 'this_viewer': this_viewer, + 'this_state_data': this_state_data, + 'first_state': false, + }); + + // console.log('保存历史记录'); + + //超过历史长度后 + if (this.previous_history.length > this.max_history_length) { + // console.log('超过长度,取后十一'); + this.previous_history = this.previous_history.slice(1, this.max_history_length + 1); + } + this.history_index = this.previous_history.length; + if (onload_record_history==false){ + //批注被编辑后 + annotationsModified(); + } +} + +//update or delete annotation 更新或删除批注 +pdfwheel.Annotation.prototype.undoAnnotation = function() { + var tips = { + 'zh-cn': [ + '无更多历史记录可撤销(最多10步)!', + '撤销批注成功', + ], + 'en': [ + 'no more history to undo(max=10)!', + 'undo seccessful!', + ] + } [tips_language]; + // console.log('当前索引',this.history_index); + // console.log('历史记录长度',this.previous_history.length); + if (this.history_index <= 1) { + alert(tips[0]); + return; + } + this.history_index = this.history_index - 1; + this.fabric_list = []; + // var that=this; + var this_data = this.previous_history[this.history_index - 1]; + var page_number = this_data['this_state_data']['page_number']; + var anno_content = this_data['this_state_data']['redo']; + var change_file = this_data['this_state_data']['change_file']; + // console.log('当前数据',anno_content); + + // 先前的记录 + var last_data = this.previous_history[this.history_index]; + this.setViewer(last_data['this_viewer']); + var last_page_number = last_data['this_state_data']['page_number']; + var last_anno_content = last_data['this_state_data']['undo']; + // console.log('历史记录',last_data); + // console.log('历史记录',last_data); + var last_change_file = last_data['this_state_data']['change_file']; + // console.log('当前数据',anno_content); + + //如果是清除文件,则修改文件 + if (last_page_number != page_number) { + //如果是清除文件,则修改文件 + if (change_file == true) { + // console.log('批注文件',anno_content); + this.setFileAnnotation(anno_content); + } else { + this.setOnePageAnnotation(anno_content, page_number); + } + } + + // console.log('上一页',last_page_number); + // console.log('这一页',page_number); + if (last_change_file == true) { + // console.log('批注文件',anno_content); + this.setFileAnnotation(last_anno_content); + } else { + this.setOnePageAnnotation(last_anno_content, last_page_number); + } + + //refresh annotation canvas 刷新注释画布 + // console.log('写入成功'); + this.drawAllPageAnnotations(); + pdfAnnotationUI.cancelOtherButton({ + 'id': 'set_file_and_fresh' + }); + addOperationTips(tips[1]); +} + +//update or delete annotation 更新或删除批注 +pdfwheel.Annotation.prototype.redoAnnotation = function() { + var tips = { + 'zh-cn': [ + '无更多撤销的历史记录可恢复(最多10步)!', + '重做成功!', + ], + 'en': [ + 'no more undo history to redo(max=10)!', + 'redo successful!', + ] + } [tips_language]; + // console.log('索引',this.history_index); + // console.log('当前列表长度',this.previous_history.length); + if (this.history_index >= this.max_history_length || this.history_index >= this.previous_history.length) { + alert(tips[0]); + return; + } + this.fabric_list = []; + // var that=this; + this.history_index += 1; + var this_data = this.previous_history[this.history_index - 1]; + this.setViewer(this_data['this_viewer']); + // this.setFileAnnotation(this_data['this_state_data']); + + // console.log('当前历史记录',this_data); + + var page_number = this_data['this_state_data']['page_number']; + var anno_content = this_data['this_state_data']['redo']; + var change_file = this_data['this_state_data']['change_file']; + + //如果是清除文件,则修改文件 + if (change_file == true) { + this.setFileAnnotation(anno_content); + } else { + this.setOnePageAnnotation(anno_content, page_number); + } + //refresh annotation canvas 刷新注释画布 + // console.log('写入成功'); + this.drawAllPageAnnotations(); + pdfAnnotationUI.cancelOtherButton({ + 'id': 'set_file_and_fresh' + }); + addOperationTips(tips[1]); + // setTimeout(function() { + // that.setFileAnnotation(this_data['this_state_data']); + // }, 500); +} + +//save Fabric data to localStorage(limit file size 5MB) 保存fabric数据到缓存,大小不能超过 5MB +pdfwheel.Annotation.prototype.saveFabricCanvas = function(page_number) { + var tips = { + 'zh-cn': [ + '页面超过5M大小,保存失败,请删除图片等内容', + ], + 'en': [ + 'page annotation beyond 5M, save failed, please delete some image', + ] + } [this.tips_language]; + var page_id = this.fabric_annos_id_tag + page_number.toString(); + var fabric_annotation_id = window.PDFViewerApplication.baseUrl + '_page_fabric_' + page_number.toString(); + + var saved_data = this.fabric_list[page_id]; + saved_data['page_canvas']['fabric_canvas_json'] = saved_data['page_canvas']['fabric_canvas'].toJSON( + this.custom_attr); + + //旧记录 + var old_fabric_obj = this.readFabricAnnotationsForPage(page_number); + // console.log('保存历史记录'); + + //首次编辑时先保存一次历史记录 + var this_history; + // console.log('加载时首次记录',onload_record_history); + if (onload_record_history == true) { + // console.log('首次记录'); + this_history = { + 'undo': old_fabric_obj, + 'redo': old_fabric_obj, + 'page_number': page_number, + 'change_file': false, + } + this.recordFabricHistory(this_history); + onload_record_history = false; + } + + + var content = JSON.stringify(saved_data); + try { + localStorage.setItem(fabric_annotation_id, content); + } catch (e) { + alert(tips[0]); + return; + } + + //新记录 + var new_fabric_obj = this.readFabricAnnotationsForPage(page_number); + this_history = { + 'undo': old_fabric_obj, + 'redo': new_fabric_obj, + 'page_number': page_number, + 'change_file': false, + } + // console.log('历史记录', this_history); + //保存历史记录 + this.recordFabricHistory(this_history); + if (pdfAnnotationUI.show_annotation_list) { + // console.log('显示列表'); + pdfAnnotationUI.showAnnotationList(); + } +} + +//read one Fabric page annotations 读取页面的 Fabric 批注 +pdfwheel.Annotation.prototype.readFabricAnnotationsForPage = function(page_number) { + var this_page_id = window.PDFViewerApplication.baseUrl + '_page_fabric_' + page_number.toString(); + var this_page_annotation = null; + if (localStorage.getItem(this_page_id) !== null) { + try { + this_page_annotation = JSON.parse(localStorage.getItem(this_page_id)); + var this_objects =this_page_annotation.page_canvas.fabric_canvas_json.objects; + + if (Array.prototype.isPrototypeOf(this_objects) && this_objects.length === 0 ) return null; //检验空数组 + if (Object.prototype.isPrototypeOf(this_objects) && Object.keys(this_objects).length === 0 ) return null; + + } catch(e) { + return null; + } + // console.log('页面', this_page_annotation); + if (this_page_annotation == null || Object.keys(this_page_annotation).length === 0) { + return null; + } + if (this_page_annotation['page_canvas']['fabric_canvas_json']['objects'].length == 0) { + return null; + } + } + // console.log('页码',page_number,'批注',this_page_annotation); + return this_page_annotation; +} + +//read one page annotation [highlight/underline] data. 读取某个页面的批注数据[高亮/下划线] +pdfwheel.Annotation.prototype.readAnnotationsForPage = function(annotation_id) { + var this_page_annotation = []; + if (localStorage.getItem(annotation_id) !== null) { + try { + this_page_annotation = JSON.parse(localStorage.getItem(annotation_id)); + } catch(e) { + return []; + } + // console.log('批注',this_page_annotation); + if (this_page_annotation == null) { + this_page_annotation = []; + } else { + for (var i = 0; i < this_page_annotation.length; i++) { + if (Object.prototype.hasOwnProperty.call(this_page_annotation[i], 'id') == false || + this_page_annotation[i] + .id == null) { + this_page_annotation[i].id = this.buildId(i + 1); + } + } + } + } else { + this_page_annotation = []; + } + return this_page_annotation; +} + + +//set id and member_id for created path 创建绘制的路径之后给定批注id和member_id +pdfwheel.Annotation.prototype.afterPathCreated = function(opt, current_canvas) { + var tips = { + 'zh-cn': [ + '添加批注', + ], + 'en': [ + 'add comments', + ] + } [this.tips_language]; + // console.log('路径创建完成',current_canvas.lowerCanvasEl.id); + // var current_canvas_id=current_canvas.lowerCanvasEl.id; + // console.log('点击的画布', current_canvas.lowerCanvasEl.id); + // e.set('id','绘制的路径'); + var path_id = this.buildId(current_canvas.getObjects().length + 1); + opt.path.id = path_id; + opt.path.member_id = pdfAnnotation.getRandomMemberID(); + opt.path.my_type = 'path'; + opt.path.comment = tips[0]; + opt.backup_opacity = 1; + // this.saveAllFabricData(); + //绘制annotationLayer + var fabric_id = current_canvas.lowerCanvasEl.id; + var page_number = fabric_id.split('-')[3]; + + this.saveFabricCanvas(page_number); //保存当前页数据 + + var annotation_layer_id = "page-" + page_number + "-annotationLayer"; + var this_annotation_layer = document.getElementById(annotation_layer_id); + this.addFabricObjToAnnotationTextLayer(this_annotation_layer); +} + +//保存单页数据 +pdfwheel.Annotation.prototype.saveOnePageByCanvas = function(current_canvas) { + var fabric_id = current_canvas.lowerCanvasEl.id; + var page_number = fabric_id.split('-')[3]; + this.saveFabricCanvas(page_number); //保存当前页数据 +} + +pdfwheel.Annotation.prototype.buildId = function(id_number) { + var this_time = new Date().getTime(); + // console.log('当前时间',this_time_second+6*86400); + var id = this_time + '_' + id_number; + return id; +} + +pdfwheel.Annotation.prototype.fabricMouseUp = function(opt) { + var that = this; + clearTimeout(that.timer); //清除未执行的定时器 + if (that.current_click_type != 'select') { + that.timer = setTimeout(function() { + that.processFabricMouseUp(opt); + }, 200); + } else { + that.processFabricMouseUp(opt); + } +} + +// listen fabric mouse up +// pdfwheel.Annotation.prototype.processFabricMouseUp=function(opt) { +pdfwheel.Annotation.prototype.processFabricMouseUp = function(opt) { + if (this.current_click_type != 'select') { + this.computeAddPosition(opt); + } else { + if (opt.button === 1) { + var annos_page_id = null; + for (var key in this.fabric_list) { + var active_objs = this.fabric_list[key].page_canvas.fabric_canvas.getActiveObject(); + if (active_objs != null) { + var annos_page_id = key; + break; + } + + } + + if (annos_page_id == null) { + this.hiddenMenu(); + // this.saveAllFabricData(); + return; + } + var page_number = annos_page_id.split('-')[3]; + var fabricObj = this.fabric_list[annos_page_id].page_canvas.fabric_canvas; + + var active_objs = fabricObj.getActiveObject(); + if (active_objs == null) { + this.hiddenMenu(); + } else { + var ac_objs = fabricObj.getActiveObjects(); + ac_objs.forEach(function(this_obj){ + this_obj.set({ + // borderColor: 'red', //color 边框颜色 + // cornerColor: 'red', //color 控制角颜色 + // cornerSize: 10, //size 控制角大小 + // transparentCorners: false ,//opacity 控制角填充色不透明 + + }); + }); + // // console.log('选中',ac_objs); + if (ac_objs.length > 1) { + active_objs.set({ + hasBorders: false, + // borderColor: 'red', //color 边框颜色 + borderScaleFactor: 2, + hasControls: false, + perPixelTargetFind: true, //无法通过透明部分选中 + hasRotatingPoint: false, //rotate or not 选中时是否可以旋转 + lockMovementX: true, //move in X or not X轴是否可被移动(true为不可,因为前缀是lock) + lockMovementY: true, //move in Y or not Y轴是否可被移动(true为不可,因为前缀是lock) + }); + } + + //隐藏截图按钮 + var screen_shot_btn = document.getElementById("ff-panel-screenshot"); + screen_shot_btn.setAttribute('hidden', true); + + //如果遇到截图框则显示截图按钮 + // console.log(ac_objs); + if (ac_objs.length == 1) { + var first_obj = ac_objs[0]; + if (first_obj['my_type'] == 'screenshot') { + var screen_shot_btn = document.getElementById("ff-panel-screenshot"); + screen_shot_btn.removeAttribute('hidden'); + } + + if (first_obj['my_type'] == 'text') { + first_obj.exitEditing(); + first_obj.set({ + hasControls: true, + selected:false, + lockMovementX:false, + lockMovementY:false, + }); + first_obj.setCoords(); + } + } + + // 获取当前元素 + this.active_fabric_obj = { + 'active_canvas': fabricObj, + 'active_element': ac_objs, + 'page_number': page_number, + } + + // console.log('选中元素', ac_objs); + this.showColorMenu(); + } + } + } + //重绘annotation图层的可选对象 + // console.log('点击事件',opt.e.target.parentNode.parentNode); + // this.saveAllFabricData(); + this.redrawAnnotationLayer(opt); +} + +pdfwheel.Annotation.prototype.showColorMenu = function() { + var menu = document.getElementById('my-menu'); + // 将菜单展示出来 + menu.style.visibility='visible'; + menu.style.zIndex='1000'; + // console.log('显示对象属性',menu.style); + this.hiddenSettingMenu(); //隐藏设置面板 + show_my_menu = true; //显示控制面板 +} + +pdfwheel.Annotation.prototype.showSettingMenu = function() { + // console.log('click_opt', opt.target); + var menu = document.getElementById('my-setting-menu'); + // 将菜单展示出来 + menu.style.visibility='visible'; + menu.style.zIndex='1001'; + show_setting_menu = true; //显示控制面板 +} + +//hidemenu 隐藏菜单 +pdfwheel.Annotation.prototype.hiddenMenu = function() { + if (show_my_menu == true) { + if (changed_number_value == true) { + var this_page_number = this.active_fabric_obj['page_number']; + this.saveFabricCanvas(this_page_number); + changed_number_value = false; + // console.log('隐藏列表,当前页面',this_page_number); + } + var menu = document.getElementById('my-menu'); + menu.style.visibility='hidden'; + menu.style.zIndex='-100'; + // The current active element is null 当前活动元素置空 + this.active_fabric_obj = { + 'page_number': null, + 'active_element': null, + 'page_number': null, + } + show_my_menu = false; + } + this.deactivateAllObjs(); //取消所有元素的激活状态 +} + +//hidemenu 隐藏菜单 +pdfwheel.Annotation.prototype.hiddenSettingMenu = function() { + if (show_setting_menu== true) { + // if (changed_number_value == true) { + // var this_page_number = this.active_fabric_obj['page_number']; + // this.saveFabricCanvas(this_page_number); + // changed_number_value = false; + // // console.log('隐藏列表,当前页面',this_page_number); + // } + var menu = document.getElementById('my-setting-menu'); + menu.style.visibility='hidden'; + menu.style.zIndex='-100'; + show_setting_menu = false; + } +} + +pdfwheel.Annotation.prototype.getCurrentClickCanvas = function(e) { + // var page_div = e.e.target.parentNode.parentNode; + var page_div = e.target.parentNode.parentNode; + var page_number = page_div.getAttribute('data-page-number'); + var annos_page_id = this.fabric_annos_id_tag + page_number; + var this_canvas = this.fabric_list[annos_page_id].page_canvas.fabric_canvas; + return this_canvas; +} + +// 鼠标在画布上松开 +pdfwheel.Annotation.prototype.computeAddPosition = function(e) { + // console.log('触屏点击事件',e.e.type); + this.upPoint = e.absolutePointer; + var downPoint = this.downPoint; + var upPoint = this.upPoint; + // 定位参数计算 + let top = Math.min(downPoint.y, upPoint.y) + let left = Math.min(downPoint.x, upPoint.x) + let width = Math.abs(downPoint.x - upPoint.x) + let height = Math.abs(downPoint.y - upPoint.y) + // console.log('长宽', width, height); + + //生成截屏对象时直接截屏当前区域 + var page_div = e.e.target.parentNode.parentNode; + var page_number = parseInt(page_div.getAttribute('data-page-number')); + + var this_canvas = this.getCurrentClickCanvas(e.e); + if (this.current_click_type == 'add_screenshot') { + this.adding_screen_shot_text.set('left', left); + this.adding_screen_shot_text.set('top', top - this.adding_screen_shot_text.height - 10); + this.adding_screen_shot_text.setCoords(); + + this.adding_screen_shot_item.set('left', left); + this.adding_screen_shot_item.set('top', top); + this.adding_screen_shot_item.set('width', width); + this.adding_screen_shot_item.set('height', height); + this.adding_screen_shot_item.setCoords(); + + this_canvas.add(this.adding_screen_shot_item); + this_canvas.add(this.adding_screen_shot_text); + + this.clipCanvasWhenCreate(this_canvas, this.adding_screen_shot_item, page_number); + } else if (this.current_click_type == 'add_circle') { + this.adding_item.set('left', left); + this.adding_item.set('top', top); + this.adding_item.set('radius', width / 2); + this.adding_item.setCoords(); + this_canvas.add(this.adding_item); + } else if (this.current_click_type == 'add_line') { + this_canvas.remove(this.drawing_item); + this.drawing_item['hasBorders']=true; + this.drawing_item['hasControls']=true; + this_canvas.add(this.drawing_item); + this.change_direct=false; + } else if(this.current_click_type == 'add_arrow'){ + this_canvas.remove(this.drawing_item); + var this_arrow_obj = new fabric.Group([this.drawing_item], { + id: this.adding_item.id, + member_id: this.adding_item.member_id, + my_type: 'arrow', + comment: this.adding_item.comment, + backup_opacity: 1, + }); + + this_canvas.add(this_arrow_obj); + this.change_direct=false; + }else { + this.adding_item.set('left', left); + this.adding_item.set('top', top); + //矩形框需要加上宽度,除了以上则是文本框、图片和箭头,只需要起点即可 + if (this.current_click_type == 'add_rect' || this.current_click_type == 'add_hyperlink') { + this.adding_item.set('width', width); + this.adding_item.set('height', height); + } + + if (this.current_click_type == 'add_hyperlink'){ + current_link_annotation_item={ + 'page_number':page_number, + 'id':this.adding_item.id, + } + pdfAnnotationUI.showHyperLinkLog(); + is_hyper_edit=true; + } + this.adding_item.setCoords(); + this_canvas.add(this.adding_item); + // console.log('选中'); + if (this.current_click_type=='add_text'){ + this_canvas.setActiveObject(this.adding_item); + if (is_droping_text==false){ + this.adding_item.enterEditing(); + this.adding_item['selectable']=true; + } + // console.log('this.adding_item',this.adding_item); + } + } + if (this.current_click_type!='add_text'){ + this.deactivateAllObjs(); + } + this.initialFabricState(this_canvas); + this.saveOnePageByCanvas(this_canvas); + //继续执行操作 + if (is_droping_text==false){ + this.addFabricObj(null, this.option,0); + }else{ + initialDropText(); + } + // this.saveAllFabricData(); +} + +pdfwheel.Annotation.prototype.clipCanvasWhenCreate = function(fabricObj, screen_area, page_number) { + var fabric_canvas_height = fabricObj.height; + var fabric_canvas_width = fabricObj.width; + + var screen_left = screen_area.left; + var screen_top = screen_area.top; + var screen_width = screen_area.width; + var screen_height = screen_area.height; + var screen_scale_x = screen_area.scaleX; + var screen_scale_y = screen_area.scaleY; + + var screen_shot_area = [screen_left / fabric_canvas_width, screen_top / fabric_canvas_height, screen_width / + fabric_canvas_width, screen_height / fabric_canvas_height, screen_scale_x, screen_scale_y + ]; + + this.clipCanvas(page_number, screen_shot_area, screen_area); +} + +//截取位置 +pdfwheel.Annotation.prototype.clipCanvas = function(page_number, area, scrrenshot_area) { + var pages = document.getElementsByClassName('page'); + var current_page = pages[page_number - 1]; + + var current_canvasWrapper = current_page.getElementsByClassName('canvasWrapper')[0]; + var current_canvas = current_canvasWrapper.getElementsByTagName('canvas')[0]; + + var current_canvas_true_width = current_canvas.width; + var current_canvas_true_height = current_canvas.height; + + var current_true_left = current_canvas_true_width * area[0]; + var current_true_top = current_canvas_true_height * area[1]; + var current_true_width = current_canvas_true_width * area[2] * area[4]; + var current_true_height = current_canvas_true_height * area[3] * area[5]; + + //大于页面长宽之后取页面位置 + if ((current_true_left + current_true_width) > current_canvas_true_width) { + current_true_width = current_canvas_true_width - current_true_left; + } + + if ((current_true_top + current_true_height) > current_canvas_true_height) { + current_true_height = current_canvas_true_height - current_true_top; + } + + //小于0也取边界 + if (current_true_left < 0) { + current_true_left = 0; + } + + if (current_true_top < 0) { + current_true_top = 0; + } + + var current_ctx = current_canvas.getContext('2d'); + var clip_imgdata = current_ctx.getImageData(current_true_left, current_true_top, current_true_width, + current_true_height); + + // console.log('真实宽高',current_true_left,current_true_top,current_true_width,current_true_height); + + + var tmp_canvas = document.createElement('canvas'); + tmp_canvas.width = current_true_width; + tmp_canvas.height = current_true_height; + var tmp_ctx = tmp_canvas.getContext('2d'); + tmp_ctx.putImageData(clip_imgdata, 0, 0); + // ctx.drawImage(img, 0, 0, newWidth, newHeight); + + //判断当前环境是否为IE 11 + var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 + var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1; + if (isIE11){ + var img_blob=tmp_canvas.msToBlob(); + saveAs(img_blob, page_number + '.png'); + }else{ + // //保存文件 + tmp_canvas.toBlob(function(blob) { + //截图完成后的事件,可以增加自己的方法 + saveAs(blob, page_number + '.png'); + + //用于自定义表单显示跳转等 + var screen_shot_item = { + "text": scrrenshot_area['comment'], //截屏批注文字 + "id": scrrenshot_area['id'], //截屏批注id + "page_number": page_number, //截屏所在页码 + } + }); + } + + + // console.log('图片数据',img_blob); + + // tmp_canvas.toDataURL(function(img_url){ + // console.log('图片数据',img_url); + // }); + + +} + +//按照矩形区域截图 +pdfwheel.Annotation.prototype.screenShotEl = function() { + var screen_area = this.active_fabric_obj['active_element'][0]; + + var fabricObj = this.active_fabric_obj['active_canvas']; + var page_number = this.active_fabric_obj['page_number']; + var fabric_canvas_height = fabricObj.height; + var fabric_canvas_width = fabricObj.width; + + var screen_left = screen_area.left; + var screen_top = screen_area.top; + var screen_width = screen_area.width; + var screen_height = screen_area.height; + var screen_scale_x = screen_area.scaleX; + var screen_scale_y = screen_area.scaleY; + + var screen_shot_area = [screen_left / fabric_canvas_width, screen_top / fabric_canvas_height, screen_width / + fabric_canvas_width, screen_height / fabric_canvas_height, screen_scale_x, screen_scale_y + ]; + + this.clipCanvas(page_number, screen_shot_area, screen_area); +} + +pdfwheel.Annotation.prototype.deactivateAllObjs = function() { + // console.log('取消所有对象的选中状态'); + for (var key in this.fabric_list) { + this.fabric_list[key].page_canvas.fabric_canvas.discardActiveObject(); + this.fabric_list[key].page_canvas.fabric_canvas.requestRenderAll(); + } +} + +// 鼠标在画布上按下 +pdfwheel.Annotation.prototype.fabricCanvasMouseDown = function(e,this_canvas) { + this.downPoint = e.absolutePointer; + if (this.current_click_type=='add_arrow' || this.current_click_type=='add_line'){ + var points=[this.downPoint.x,this.downPoint.y,this.downPoint.x,this.downPoint.y]; + var line_arro; + if (this.current_click_type=='add_arrow'){ + line_arrow = new fabric.LineArrow(points, { + strokeWidth: default_arrow_width, + fill: default_border_color, + stroke: default_border_color, + originX: 'center', + originY: 'center', + hasBorders: false, + hasControls: false, + }); + }else{ + line_arrow = new fabric.Line(points, default_straight_line); + line_arrow['hasBorders']=false; + line_arrow['hasControls']=false; + } + this_canvas.add(line_arrow); + pdfAnnotation.drawing_item=line_arrow; + this.change_direct=true; + } +} + +pdfwheel.Annotation.prototype.cancleAddFabricObj = function(event) { + clearTimeout(this.timer); //清除未执行的定时器 + if (this.current_click_type != 'select') { + var this_canvas = this.getCurrentClickCanvas(event.e); + this.initialFabricState(this_canvas); //清空添加状态 + + pdfAnnotation.option=-1; + pdfAnnotationUI.setFabricCanvasContainerZIndex(10); + pdfAnnotationUI.fabric_top=false; + removeAllButtonsColor(); + } +} + +pdfwheel.Annotation.prototype.keepTextFollowScreenShot = function(obj) { + if (obj.target.my_type == 'screenshot') { + var screenshot_text_id = obj.target.id + '_text'; + // console.log('文字id',screenshot_text_id); + var fabric_canvas = obj.target.canvas; + var items = fabric_canvas.getObjects(); + for (var i = 0; i < items.length; i++) { + if (items[i].id == screenshot_text_id) { + var this_left = obj.target.left; + var this_top = obj.target.top - items[i].height * items[i].scaleY - 10; + + if (this_top < 0) { + this_top = 0; + } + + items[i].set('left', this_left); + items[i].set('top', this_top); + + items[i].setCoords(); + // console.log(items[i]); + fabric_canvas.requestRenderAll(); + break; + } + } + } +} + +pdfwheel.Annotation.prototype.keepScreenShotTextScale = function(obj) { + // console.log(obj.target); + if (obj.target.my_type == 'screenshot') { + this.keepTextFollowScreenShot(obj); + } + +} + +//画布对象是否可被选中 +pdfwheel.Annotation.prototype.changeAllCanvasSelectState = function() { + for (var key in this.fabric_list) { + this.changeOneCanvasSelectState(this.fabric_list[key].page_canvas.fabric_canvas); + } +} + +pdfwheel.Annotation.prototype.changeOneCanvasSelectState = function(current_canvas) { + //确定是否可以选中 + // console.log('this.current_click_type',this.current_click_type); + switch (this.current_click_type) { + case 'select': + current_canvas.selection = true + current_canvas.selectionColor = 'rgba(100, 100, 255, 0.3)' + current_canvas.selectionBorderColor = 'rgba(255, 255, 255, 0.3)' + current_canvas.skipTargetFind = false // 允许选中 + break + default: + current_canvas.selectionColor = 'transparent' + current_canvas.selectionColor = default_fill_color; + current_canvas.selectionBorderColor = 'rgba(0, 0, 0, 0.2)' + current_canvas.skipTargetFind = true // 禁止选中 + break + } +} + +//set annotation for current file 为当前页面设置批注 +pdfwheel.Annotation.prototype.setOnePageAnnotation = function(page_content, page_number) { + var annotation_id = window.PDFViewerApplication.baseUrl + '_page_' + page_number.toString(); + var fabric_annotation_id = PDFViewerApplication.baseUrl + '_page_fabric_' + page_number.toString(); + var old_anno_content; + var content; + + if (page_content != null) { + old_anno_content = JSON.stringify(page_content['page_annotations']); + content = JSON.stringify(page_content); + } else { + old_anno_content = JSON.stringify([]); + content = JSON.stringify({});; + } + + localStorage.setItem(annotation_id, old_anno_content); + localStorage.setItem(fabric_annotation_id, content); +} + +//set annotation for current file 为当前页面设置批注 +pdfwheel.Annotation.prototype.setFileAnnotation = function(anno_contents) { + this.clearOldAnnotations(); + + this.fabric_list = {}; //clear all pages' Fabric layer and redraw 清空 Fabric 图层后重画 + show_state = {}; //是否默认展开列表 + for (var key in anno_contents) { + // console.log('key',key); + var page_number = key.split('-')[3]; + // set old version localstorage 设置旧版缓存 + this.setOnePageAnnotation(anno_contents[key], page_number); + } + //refresh annotation canvas 刷新注释画布 + // console.log('写入成功'); + this.drawAllPageAnnotations(); + pdfAnnotationUI.cancelOtherButton({ + 'id': 'set_file_and_fresh' + }); + // this.saveAllFabricData(); +} + +pdfwheel.Annotation.prototype.clearOldAnnotations = function() { + var pages_count = PDFViewerApplication.pagesCount; + for (var i = 1; i <= pages_count; i++) { + // console.log('my_member_id',my_member_id,'页码',i); + this.clearAnnotationFromPageLocalStorage(i, 'user_1'); + this.clearAllAnnotationLayerItem(i); //删除顶层对象 + } + + //处理完之后重新渲染 + this.refreshFabricState(); + this.drawAllPageAnnotations(); +} + +pdfwheel.Annotation.prototype.readFileAnnotations = function() { + var page_count = PDFViewerApplication.pagesCount; + var this_file_annotations = {}; + for (var i = 1; i <= page_count; i++) { + var old_fabric_obj = this.readFabricAnnotationsForPage(i); + if (old_fabric_obj) { + // this_file_annotations[current_canvas_page_fabric_id]=old_fabric_obj; + this_file_annotations[this.fabric_annos_id_tag + i.toString()] = old_fabric_obj; + } + } + // console.log(this_file_annotations); + return this_file_annotations; +} + +//save annotation data to json 保存批注数据到 json +pdfwheel.Annotation.prototype.saveAnnotationsJson = function(annotation_id, data) { + var content = JSON.stringify(data); + localStorage.setItem(annotation_id, content); + //save annotation to Fabric list 将批注保存到fabric_list中 + var split_str = annotation_id.split('_'); + var page_number = split_str[split_str.length - 1]; + // console.log('annotation_id',annotation_id); + var page_id = this.fabric_annos_id_tag + page_number.toString(); + // console.log(page_id); + if (this.fabric_list[page_id] == undefined) { + return; + } + this.fabric_list[page_id].page_annotations = data; //record highlight and underline data 记录高亮下划线等内容 + // this.saveFabricCanvas(page_number); +} + +pdfwheel.Annotation.prototype.getRandomMemberID = function() { + // var rand = Math.floor(Math.random() * all_member_id_list.length); + // return all_member_id_list[rand]['id']; + + return this.current_member.id; +} + +// add annotation to fabric 将批注添加到 fabric +pdfwheel.Annotation.prototype.addAnnotationToFabric = function(this_annotation, this_page) { + // console.log('绘制对象',this_annotation); + var this_page_number = this_annotation.page_number; + var pages = document.getElementsByClassName('page'); + this_page = pages[this_page_number - 1]; + + var this_fabric_obj = this.getFabricObj(this_annotation.page_number); + var this_wrapper = this_page.getElementsByClassName('canvasWrapper')[0]; + if (this_fabric_obj) { + this.drawOnFabric(this_annotation, this_fabric_obj.page_canvas.fabric_canvas, this_wrapper); + } else { + this.drawAnnotationOnFabricPageFirstTime(this_wrapper, this_annotation.page_number); + } +} + +//get all fabric layer objects 获取所有 Fabric 页面对象 +pdfwheel.Annotation.prototype.getFabricObj = function(page_number) { + var page_id = this.fabric_annos_id_tag + page_number.toString(); + return this.fabric_list[page_id]; +} + + +pdfwheel.Annotation.prototype.clearFileAnnotations = function() { + var tips = { + 'zh-cn': [ + '确认清空本人(', + ')的所有注释?(含不可见对象)', + ], + 'en': [ + 'clear your(', + ') all annotations?(including invisible objects)', + ] + } [tips_language]; + var this_member_id = this.getRandomMemberID(); + + if (confirm(tips[0] + this_member_id + tips[1])) { + this.confirmToClearFileAnnotations(); + } +} + +pdfwheel.Annotation.prototype.confirmToClearFileAnnotations = function() { + var this_member_id = this.getRandomMemberID(); + var pages_count = PDFViewerApplication.pagesCount; + + var old_file_obj = this.readFileAnnotations(); + for (var i = 1; i <= pages_count; i++) { + // console.log('my_member_id',my_member_id,'页码',i); + this.clearAnnotationFromPageLocalStorage(i, this_member_id); + this.clearAllAnnotationLayerItem(i); //删除顶层对象 + } + this.saveDataAfterClearFile(old_file_obj); + //处理完之后重新渲染 + this.refreshFabricState(); + this.drawAllPageAnnotations(); +} + +//save Fabric data to localStorage(limit file size 5MB) 保存fabric数据到缓存,大小不能超过 5MB +pdfwheel.Annotation.prototype.saveDataAfterClearFile = function(old_fabric_obj) { + //首次编辑时先保存一次历史记录 + var this_history; + // console.log('加载时首次记录',onload_record_history); + if (onload_record_history == true) { + // console.log('首次记录'); + this_history = { + 'undo': old_fabric_obj, + 'redo': old_fabric_obj, + 'page_number': 0, + 'change_file': true, + } + // console.log('首次历史记录', this_history); + this.recordFabricHistory(this_history); + onload_record_history = false; + } + + var new_fabric_obj = this.readFileAnnotations(); + this_history = { + 'undo': old_fabric_obj, + 'redo': new_fabric_obj, + 'page_number': 0, + 'change_file': true, + } + // console.log('历史记录', this_history); + //保存历史记录 + this.recordFabricHistory(this_history); + if (pdfAnnotationUI.show_annotation_list) { + // console.log('显示列表'); + pdfAnnotationUI.showAnnotationList(); + } +} + +pdfwheel.Annotation.prototype.refreshFabricState = function() { + this.fabric_list = {}; + show_state = {}; //是否默认展开批注列表 +} + +pdfwheel.Annotation.prototype.clearAnnotationFromPageLocalStorage = function(page_number, my_member_id) { + var old_fabric_obj = this.readFabricAnnotationsForPage(page_number); + if (old_fabric_obj) { + // old_fabric_obj['page_canvas']['fabric_canvas_json']['objects'] = {}; + old_fabric_obj['page_canvas']['fabric_canvas_json']['objects'] = []; + old_fabric_obj['page_annotations'] = []; + + //设置fabric缓存 + var fabric_annotation_id = window.PDFViewerApplication.baseUrl + '_page_fabric_' + page_number.toString(); + var content = JSON.stringify(old_fabric_obj); + localStorage.setItem(fabric_annotation_id, content); + + //设置旧版缓存 + var annotation_id = window.PDFViewerApplication.baseUrl + '_page_' + page_number.toString(); + var old_anno_content = JSON.stringify([]); + localStorage.setItem(annotation_id, old_anno_content); + // console.log('高亮原长度',this_page_annotations.length,'高亮新长度',new_page_annos.length); + } +} + +//删除某页的批注 +pdfwheel.Annotation.prototype.deleteOnePageAnnotations = function(page_number, this_member_id) { + var fabricObj = this.getFabricObj(page_number); + var fabric_canvas = fabricObj.page_canvas.fabric_canvas; + var items = fabric_canvas.getObjects(); + //删除多个批注对象 + for (var i=0;i= 1) { + //删除最后一个批注 + var last_anno = anno_objects[anno_objects.length - 1]; + fabricObj.page_canvas.fabric_canvas.remove(last_anno); + this.deleteAnnotationsListByID(page_number, last_anno.id); + } else { + alert(tips[0]); + } + event.stopPropagation(); +} + +//delete annotation 删除批注 +pdfwheel.Annotation.prototype.deleteAnnotation = function(node) { + var tips = { + 'zh-cn': [ + '第 ', + ' 页-共 ', + ' 项', + ], + 'en': [ + 'page ', + '-', + ' annotations', + ] + } [tips_language]; + + //关闭历史 + this.closeAnnotationHistory(); + + //delete html element 删除html元素 + var parent_node = node.parentElement; + if (!parent_node){ + parent_node=node; + } + + var this_annotations_json = this.updateAnnotationComent('', parent_node.id, 'delete_annotation'); + var page_num = parent_node.id.split('-')[1]; + + var fabricObj = this.getFabricObj(page_num); + if (fabricObj == undefined) { + return; + } + var fabric_canvas = fabricObj.page_canvas.fabric_canvas; + var items = fabric_canvas.getObjects(); + + var title_id = 'page-' + page_num + '-anno-' + 'title-p'; + var this_title = document.getElementById(title_id); + if (this_title) { + var grand_node = parent_node.parentNode; + this_title.innerText = tips[0] + page_num + tips[1] + items.length + tips[2]; + // this_title.innerText='' + // Delete the page annotation list when there is only one element 只有一个元素时删除该页列表 + if (grand_node) { + grand_node.removeChild(parent_node); + if (items.length == 0) { + grand_node.parentNode.removeChild(grand_node); + } + } + // refreshCanvas(); + } + this.saveFabricCanvas(page_num); //保存结果 +} + +pdfwheel.Annotation.prototype.closeAnnotationHistory = function() { + var his_container = document.getElementById('my_annotation_history'); + his_container.innerHTML = ''; + his_container.style.left = '-200px'; + his_container.style.top = '-500px'; + his_container.setAttribute('hidden', true); +} + +//input comment for highlight and underline text 为高亮和下划线批注增加评论 +pdfwheel.Annotation.prototype.inputComment = function(evt, node) { + var theEvent = evt || window.event || arguments.callee.caller.arguments[0]; //兼容IE、FF、Google + if (theEvent.keyCode == 13) { + node.blur(); + //enter to save 回车后保存 + node.innerHTML = node.innerHTML.replace('
', ''); + // console.log('注释id',node.id); + var this_annotations_json = this.updateAnnotationComent(node.innerText, node.id, 'update_comment'); + var page_number = node.id.split('-')[1]; + this.saveFabricCanvas(page_number); + // console.log('当前节点id',node.id); + } +} + +pdfwheel.Annotation.prototype.saveComment = function(comment_id) { + //enter to save 回车后保存 + var node=document.getElementById(comment_id); + node.innerHTML = node.innerHTML.replace('
', ''); + // console.log('注释id',node.id); + var this_annotations_json = this.updateAnnotationComent(node.innerText, node.id, 'update_comment'); + // var this_annotations_json = this.updateAnnotationComent(node.innerHTML, node.id, 'update_comment'); + var page_number = node.id.split('-')[1]; + this.saveFabricCanvas(page_number); + addOperationTips('保存成功 Saved'); +} + +//更新fabric的批注 +pdfwheel.Annotation.prototype.updateFabricComment = function(page_number, anno_id, content,property) { + var fabricObj = this.getFabricObj(page_number); + var fabric_canvas = fabricObj.page_canvas.fabric_canvas; + var items = fabric_canvas.getObjects(); + for (var i = 0; i < items.length; i++) { + if (items[i].id == anno_id) { + items[i][property] = content; + // console.log('items[i]',items[i]); + break; + } + } +} + +pdfwheel.Annotation.prototype.getItemFromFabric = function(page_number, anno_id) { + var fabricObj = this.getFabricObj(page_number); + var fabric_canvas = fabricObj.page_canvas.fabric_canvas; + var items = fabric_canvas.getObjects(); + var this_item=null; + for (var i = 0; i < items.length; i++) { + if (items[i].id == anno_id) { + this_item=items[i]; + // console.log('items[i]',items[i]); + break; + } + } + return this_item; +} + +pdfwheel.Annotation.prototype.updateAnnotationComent = function(new_comment, full_anno_id, op) { + // console.log('id',full_anno_id); + var infos = full_anno_id.split('-'); + // console.log('id划分后',infos); + var this_annotation_id = PDFViewerApplication.baseUrl + '_page_' + infos[1]; + var this_annotations_json = this.readAnnotationsForPage(this_annotation_id); + var anno_id = infos[3]; + var anno_number = this.getAnnoNumber(this_annotations_json, anno_id); + if (op == 'update_comment') { + this.updateFabricComment(infos[1], anno_id, new_comment,'comment'); + //针对高亮和下划线对象的批注修改 + if (anno_number != null) { + this_annotations_json[anno_number].comment = new_comment; + } + } else { + //删除下划线和高亮对象 + if (anno_number != null) { + this_annotations_json.splice(anno_number, 1); + } + //Delete annotation objects on the fabric layer after they are deleted 删除注释对象后在fabric层上清除对象 + this.deleteFabricObjByID(infos[1], anno_id); + } + this.saveAnnotationsJson(this_annotation_id, this_annotations_json); + // saveAllFabricData(); //保存所有批注 + // showAnnotationList(); + return this_annotations_json; +} + +pdfwheel.Annotation.prototype.clearPageAnnotations = function(node) { + var tips = { + 'zh-cn': [ + '确认清空本人(', + ')第 ', + ' 页的所有注释?(含不可见对象)', + ], + 'en': [ + 'clear your(', + ') all annotations of page', + '?(including invisible objects)', + ] + } [tips_language]; + var this_member_id = this.getRandomMemberID(); + var page_number = node.id.split('-')[1]; + // console.log('page_number', page_number); + PDFViewerApplication.page = parseInt(page_number); + var that = this; + setTimeout(function(){ + if (confirm(tips[0] + this_member_id + tips[1] + page_number + tips[2])) { + var old_fabric_obj = that.readFabricAnnotationsForPage(page_number); + that.deleteOnePageAnnotations(page_number, this_member_id); + that.saveFabricCanvasAfterClearPage(page_number, old_fabric_obj); + // that.saveFabricCanvas(page_number,old_fabric_obj); + // that.saveAllFabricData(); + } + }, 1000); + +} + +//save Fabric data to localStorage(limit file size 5MB) 保存fabric数据到缓存,大小不能超过 5MB +pdfwheel.Annotation.prototype.saveFabricCanvasAfterClearPage = function(page_number, old_fabric_obj) { + var page_id = this.fabric_annos_id_tag + page_number.toString(); + var fabric_annotation_id = window.PDFViewerApplication.baseUrl + '_page_fabric_' + page_number.toString(); + + var saved_data = this.fabric_list[page_id]; + saved_data['page_canvas']['fabric_canvas_json'] = saved_data['page_canvas']['fabric_canvas'].toJSON( + this.custom_attr); + + //首次编辑时先保存一次历史记录 + var this_history; + // console.log('加载时首次记录',onload_record_history); + if (onload_record_history == true) { + // console.log('首次记录'); + this_history = { + 'undo': old_fabric_obj, + 'redo': old_fabric_obj, + 'page_number': page_number, + 'change_file': false, + } + this.recordFabricHistory(this_history); + onload_record_history = false; + } + + + var content = JSON.stringify(saved_data); + try { + localStorage.setItem(fabric_annotation_id, content); + } catch (e) { + alert(tips[0]); + return; + } + + //新记录 + var new_fabric_obj = this.readFabricAnnotationsForPage(page_number); + this_history = { + 'undo': old_fabric_obj, + 'redo': new_fabric_obj, + 'page_number': page_number, + 'change_file': false, + } + // console.log('历史记录', this_history); + //保存历史记录 + this.recordFabricHistory(this_history); + if (pdfAnnotationUI.show_annotation_list) { + // console.log('显示列表'); + pdfAnnotationUI.showAnnotationList(); + } +} + +//delete fabric object by ID 按照 ID 删除 fabric 对象 +pdfwheel.Annotation.prototype.deleteFabricObjByID = function(page_number, anno_id) { + var tips = { + 'zh-cn': [ + '批注所在页面未加载,删除失败,现已自动加载相应页面,请再次尝试删除!', + ], + 'en': [ + 'The page where the annotation is located has not been loaded, so the deletion failed.\nNow the page has been loaded automatically, please try again!', + ] + } [tips_language]; + var fabricObj = this.getFabricObj(page_number); + if (fabricObj == undefined) { + PDFViewerApplication.page = parseInt(page_number); + setTimeout(function(){ + alert(tips[0]); + }, 1000); + return; + } + + var fabric_canvas = fabricObj.page_canvas.fabric_canvas; + var items = fabric_canvas.getObjects(); + for (var i = 0; i < items.length; i++) { + if (items[i].id == anno_id) { + fabric_canvas.setActiveObject(items[i]); + fabric_canvas.remove(items[i]); + break; + } + } + + //从annotationLayer中依据id删除元素 + this.deleteAnnotationLayerItem(page_number, anno_id); + //删除链接线 + // console.log('删除'); + JSplump.deleteConnectByID(page_number, anno_id); +} + +//judge current pdf file is from url or not 判断当前文档是否为 URL 形式加载的 pdf +pdfwheel.Annotation.prototype.judgeUrl = function(URL) { + var str = URL; + var Expression = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/; + var objExp = new RegExp(Expression); + if (objExp.test(str) == true) { + return true; + } else { + return false; + } +} + + +//输入可保存的批注对象 +pdfwheel.Annotation.prototype.outputAnnotations = function() { + // this.saveAllFabricData(); + var is_url = this.judgeUrl(PDFViewerApplication.baseUrl); + var file_name = ''; + if (is_url == true) { + file_name = localStorage.getItem('current_anno_pdf_name'); + } else { + file_name = PDFViewerApplication.baseUrl; + } + + var this_file_annotations = this.readFileAnnotations(); + return { + 'file_name': file_name, + 'file_annotation': this_file_annotations, + } +} + +pdfwheel.Annotation.prototype.isHexColor = function(str) { + // 使用正则表达式检查字符串是否匹配标准颜色格式 + var colorRegex = /^#([0-9A-Fa-f]{6})$/; + return colorRegex.test(str); +} + +//observe value change 监听颜色等数字变化 +pdfwheel.Annotation.prototype.observeValue = function(property) { + var that = this; + // 获取输入元素 + var inputElement = document.getElementById(property); // 请确保使用你的输入元素的实际ID + + // 添加一个input事件监听器 + inputElement.addEventListener('input', function(event) { + // 在这里处理输入事件 + var inputValue = event.target.value; + //非颜色字符串之后返回 + if(!that.isHexColor(inputValue)){ + return; + } + + var activeEls = that.active_fabric_obj['active_element']; + var fabricObj = that.active_fabric_obj['active_canvas']; + var page_number = that.active_fabric_obj['page_number']; + for (var j=0;j height) { + if (width > maxWidth) { + height = Math.round((height * maxWidth) / width); + width = maxWidth; + } + } else { + if (height > maxHeight) { + width = Math.round((width * maxHeight) / height); + height = maxHeight; + } + } + return [width, height]; +} + +//add fabric object添加fabric对象 +pdfwheel.Annotation.prototype.addFabricObj = function(node, option,op2) { + var tips = { + 'zh-cn': [ + '请输入文字', + '添加批注', + '添加截屏批注', + '截屏', + '截屏批注', + '身份\n印章', + '对勾', + '超链接', + ], + 'en': [ + 'please input text', + 'add comments', + 'Add screenshot comment', + 'screenshot', + 'screenshot comment', + 'id card\n stamp', + 'check', + 'hyperlink', + ] + } [this.tips_language]; + + // if (pdfAnnotation.fabric_top == false) { + // this.setFabricCanvasContainerZIndex(100); + // pdfAnnotation.fabric_top = true; + // node.getElementsByTagName('i')[0].classList.add('button-active'); + // node.getElementsByTagName('span')[0].classList.add('button-active'); + + // pdfAnnotation.free_draw = false; + // this.disActivateFreeDraw(); //deactivate draw mode 关闭绘图模式 + // // console.log('选中模式',pdfAnnotation.adding_item); + // if (pdfAnnotation.adding_item==null){ + // addOperationTips(tips[0]); + // } + // } else { + // pdfAnnotation.fabric_top = false; + // this.setFabricCanvasContainerZIndex(10); + // node.getElementsByTagName('i')[0].classList.remove('button-active'); + // node.getElementsByTagName('span')[0].classList.remove('button-active'); + // addOperationTips(tips[1]); + // //清空添加批注状态 + // pdfAnnotation.initialFabricState(null); + // } + + // console.log('激活按钮'); + + //activate 激活选择模式 + if (this.fabric_top == false) { + // var top_node = document.getElementById('ff-pointer-obj'); + // pdfAnnotationUI.setFabricTop(top_node); + pdfAnnotationUI.setFabricCanvasContainerZIndex(100); + pdfAnnotation.fabric_top = true; + } + + // setFabricCanvasContainerZIndex(100); + var fabricObj = this.getCurrentPageFabricCanvas(); + var fabric_item_id = this.buildId(fabricObj.getObjects().length + 1); + var this_member_id = this.getRandomMemberID(); + setDefaultAnnotations();//设置默认批注对象 + switch (option) { + case 2: + //addd text 增加文字 + this.current_click_type = 'add_text'; + default_text['id'] = fabric_item_id; + default_text['member_id'] = this_member_id; + default_text['my_type'] = 'text'; + default_text['comment'] = tips[1]; + default_text['backup_opacity'] = 1; + var this_text='test text'; + if (is_droping_text==true){ + this_text=current_drop_text; + }else{ + this_text=tips[0]; + } + var text = new fabric.IText(this_text, default_text); + this.adding_item = text; + // this.adding_item.enterEditing(); + // fabricObj.add(text); + break; + + case 3: + //add arrow 增加箭头 + this.current_click_type = 'add_arrow'; + this.adding_item = { + id: fabric_item_id, + member_id: this_member_id, + my_type: 'arrow', + comment: tips[1], + backup_opacity: 1, + }; + // fabricObj.add(alltogetherObj); + break; + case 4: + //add rectangle 增加矩形 + this.current_click_type = 'add_rect'; + default_rectangle['id'] = fabric_item_id; + default_rectangle['member_id'] = this_member_id; + default_rectangle['my_type'] = 'rectangle'; + default_rectangle['comment'] = tips[1]; + default_rectangle['backup_opacity'] = 1; + default_rectangle['fill']=default_fill_color; + var rect = new fabric.Rect(default_rectangle); + this.adding_item = rect; + // fabricObj.add(rect); + break; + case 5: + //add circle 增加圆形 + this.current_click_type = 'add_circle'; + default_circle['id'] = fabric_item_id; + default_circle['member_id'] = this_member_id; + default_circle['my_type'] = 'circle'; + default_circle['comment'] = tips[1]; + default_circle['backup_opacity'] = 1; + var currentCircle = new fabric.Circle(default_circle); + this.adding_item = currentCircle; + // fabricObj.add(currentCircle); + break; + case 6: + this.current_click_type = 'add_screenshot'; + this.addScreenShotObject(tips[2], fabric_item_id, this_member_id); + break; + case 7: + this.current_click_type = 'add_line'; + default_straight_line['id'] = fabric_item_id; + default_straight_line['member_id'] = this_member_id; + default_straight_line['my_type'] = 'line'; + default_straight_line['comment'] = tips[1]; + default_straight_line['backup_opacity'] = 1; + // var currentLine = new fabric.Line([0, 100, 170, 100], default_straight_line); + // this.adding_item = currentLine; + // console.log('添加直线对象',currentLine); + break; + case 8: + this.current_click_type = 'add_idcard_stamp'; + var idcard_stamp_text=getTextForIdCardStamp(); + var idcard_stamp = new fabric.Text(idcard_stamp_text, default_idcard_stamp); + + //边框 + var padding_value=3; + var border_rect = new fabric.Rect({ + left: idcard_stamp.get('left')-padding_value, + top: idcard_stamp.get('top')-padding_value, + width: idcard_stamp.width + 2*padding_value, + height: idcard_stamp.height +2*padding_value, + fill: default_transparency_color, + stroke: default_stamp_color, + strokeSize: 2, + my_type:'idcard_stamp_rect', + }); + + //不限制印章对象的编辑 + var group = new fabric.Group([idcard_stamp,border_rect], { + id: fabric_item_id, + text: tips[5], //增加文字 + my_type: 'idcard_stamp', + comment: tips[1], + member_id: this_member_id, + left: defult_left, + top: defult_top, + angle: 0, + opacity: 1, + backup_opacity: 1, + }); + + // //限制印章对象的编辑开始 + // var group = new fabric.Group([idcard_stamp,border_rect], { + // id: fabric_item_id, + // text: tips[5], //增加文字 + // my_type: 'idcard_stamp', + // comment: tips[1], + // member_id: this_member_id, + // left: defult_left, + // top: defult_top, + // angle: 0, + // opacity: 1, + // backup_opacity: 1, + // // hasControls: false, //scale or not 选中时是否可以放大缩小 + // hasRotatingPoint: false, //rotate or not 选中时是否可以旋转 + // hasBorders: true, //border or not 选中时是否有边框 + // selectable: true, //selectable or not 是否可被选中 + // lockMovementX: true, //move in X or not X轴是否可被移动(true为不可,因为前缀是lock) + // lockMovementY: true, //move in Y or not Y轴是否可被移动(true为不可,因为前缀是lock) + // }); + // group.setControlsVisibility({ + // tl: false, + // tr: false, + // br: false, + // bl: false, + // ml: false, + // mt: false, + // mr: false, + // mb: false, + // mtr: false, + // }); + // //限制印章对象的编辑结束 + this.adding_item = group; + break; + case 9: + this.current_click_type = 'add_check'; + var left_top_offset = 20; + + var left_line = new fabric.Line([0, 100, 70, 70],default_check_left_line); + var right_line = new fabric.Line([0, 100, 170, 100],default_check_right_line); + + var objs = [left_line, right_line]; + + var alltogetherObj = new fabric.Group(objs, { + id: fabric_item_id, + member_id: this_member_id, + my_type: 'check', + comment: tips[6], + backup_opacity: 1, + }); + alltogetherObj.set({ + scaleX: 0.5, + scaleY: 0.5 + }); + this.adding_item = alltogetherObj; + break; + case 10: + //add rectangle 增加矩形 + this.current_click_type = 'add_hyperlink'; + default_rectangle['id'] = fabric_item_id; + default_rectangle['member_id'] = this_member_id; + default_rectangle['my_type'] = 'rectangle'; + default_rectangle['comment'] = tips[1]; + default_rectangle['backup_opacity'] = 1; + default_rectangle['fill']=default_hyperlink_fill_color; + var rect = new fabric.Rect(default_rectangle); + this.adding_item = rect; + // fabricObj.add(rect); + break; + default: + return; + } + // console.log('this.current_click_type',this.current_click_type); + this.changeAllCanvasSelectState(); + pdfAnnotationUI.changeMouseText(op2); + // this.saveAllFabricData(); +} + +pdfwheel.Annotation.prototype.addScreenShotObject = function(text, fabric_item_id, this_member_id) { + var screenshot_text = new fabric.IText(text, default_screenshot_text); + screenshot_text['id'] = fabric_item_id + '_text'; + screenshot_text['member_id'] = this_member_id; + screenshot_text['my_type'] = 'screenshot_text'; + screenshot_text['comment'] = text; + screenshot_text['selectable'] = true; //禁止选中,也就不可修改文字 + screenshot_text['backup_opacity'] = 1; + this.adding_screen_shot_text = screenshot_text; + + + var screenshot_rect = new fabric.Rect(default_screenshot_rectangle); + screenshot_rect['id'] = fabric_item_id; + screenshot_rect['member_id'] = this_member_id; + screenshot_rect['my_type'] = 'screenshot'; + screenshot_rect['comment'] = text; //截图对象本身保存文字批注 + screenshot_rect['backup_opacity'] = 1; + this.adding_screen_shot_item = screenshot_rect; + + // fabricObj.add(screenshot_text); + // fabricObj.add(screenshot_rect); + // this.saveAllFabricData(); //保存数据 +} + + +pdfwheel.Annotation.prototype.activateAnnotation = function(e, this_node) { + var id_split = this_node.id.split('-'); + var page_number = id_split[1]; + var anno_id = id_split[3]; + + var fabricObj = this.getFabricObj(page_number); + var fabric_canvas = fabricObj.page_canvas.fabric_canvas_json; + var items = fabric_canvas.objects; + var anno_item = {}; + var anno_number = 0; + for (var i = 0; i < items.length; i++) { + if (items[i].id == anno_id) { + // console.log('点击的对象',items[i]); + anno_item = items[i]; + anno_number = i; + break; + } + } + + var anno_his = this.createOnePageAnnotationForHistory(page_number, anno_number, anno_item); + // console.log('批注历史',anno_his); + + + // console.log('事件',e); + var his_container = document.getElementById('my_annotation_history'); + his_container.innerHTML = ''; + anno_his.removeAttribute('hidden'); + his_container.appendChild(anno_his); + // console.log('历史批注',his_container); + his_container.style.left = e.pageX + 'px'; + his_container.style.top = e.pageY + 20 + 'px'; + his_container.removeAttribute('hidden'); + this.keepInContain(his_container, e); +} + +pdfwheel.Annotation.prototype.goHyperLink = function(hyper_link) { + var tips = { + 'zh-cn': [ + '打开网页:', + '前往页面:', + '打开文件:' + ], + 'en': [ + 'Open URL: ', + 'Go page: ', + 'Open file: ' + ] + } [tips_language]; + switch (hyper_link.type) { + case "url": + addOperationTips(tips[0]+hyper_link.value); + window.open(hyper_link.value,'_blank'); + break; + case "page": + addOperationTips(tips[1]+hyper_link.value); + PDFViewerApplication.page=parseInt(hyper_link.value); + break; + case "file": + addOperationTips(tips[2]+hyper_link.value); + var pdf_file=hyper_link.value.split('#')[0]; + hyper_open_page=parseInt(hyper_link.value.split('#')[1]); + hyper_open_file=true; + //打开新文件时将之前的fabric状态置空 + this.refreshFabricState(); + this.openFile(pdf_file); + loadDetect(); + break; + default: + return; + // console.log('超链接',hyper_link); + } +} + +pdfwheel.Annotation.prototype.keepInContain = function(dom, e) { + const totalHeight = window.innerHeight || document.documentElement.clientHeight; + const totalWidth = window.innerWidth || document.documentElement.clientWidth; + // console.log(dom.getBoundingClientRect()); + // 当滚动条滚动时,top, left, bottom, right时刻会发生改变。 + // const { + // top, + // right, + // bottom, + // left, + // height, + // width, + // } = dom.getBoundingClientRect(); + var this_pos=dom.getBoundingClientRect(); + var top=this_pos['top']; + var right=this_pos['right']; + var bottom=this_pos['bottom']; + var left=this_pos['left']; + var height=this_pos['height']; + var width=this_pos['width']; + //在下方时上移 + + if (bottom > totalHeight) { + dom.style.top = (e.pageY - height - 30) + 'px'; + } + + if (right > totalWidth) { + dom.style.left = (e.pageX - width - 30) + 'px'; + } +} + +pdfwheel.Annotation.prototype.createOnePageAnnotationForHistory = function(page_number, anno_number, anno_item) { + var tips = { + 'zh-cn': [ + '关闭', + '复制', + '删除', + '注释类型', + { + 'highlight': '高亮', + 'underline': '下划线', + 'text': '文本', + 'rectangle': '矩形', + 'arrow': '箭头', + 'circle': '圆形', + 'image': '图片', + 'path': '画笔路径', + 'screenshot': '截屏', + 'screenshot_text': '截屏批注', + 'line': '直线', + 'idcard_stamp':'身份印章', + 'check': '对勾', + }, + '输入注释', + '保存注释', + '点击以保存批注', + '点击前往超链接', + '点击编辑超链接', + ], + 'en': [ + 'close', + 'copy', + 'delete', + 'annotation type', + { + 'highlight': 'highlight', + 'underline': 'underline', + 'text': 'text', + 'rectangle': 'rectangle', + 'arrow': 'arrow', + 'circle': 'circle', + 'image': 'image', + 'path': 'path', + 'screenshot': 'screenshot', + 'screenshot_text': 'screenshot comment', + 'line': 'line', + 'idcard_stamp':'idcard stamp', + 'check': 'check', + }, + 'input comments', + 'save comments', + 'click to save comments', + 'click to go hyperlink', + 'click to edit hyperlink', + ] + } [tips_language]; + + //批注对象显示的文字 + var anno_text = ''; + if (anno_item.my_type == 'highlight' || anno_item.my_type == 'underline') { + anno_text = anno_item.text; + } else { + anno_text = tips[3] + ' : ' + tips[4][anno_item.my_type]; + } + + var hyper_link_text=''; + if ('hyper_link' in anno_item && anno_item.hyper_link.value.length>0){ + var this_id="page-" + page_number + "-anno-" + anno_item.id +"-hyperlink"; + var this_hyper_type=anno_item.hyper_link.type; + var this_hyper_link=anno_item.hyper_link.value; + hyper_link_text=""; + } + + var anno_item_id=id="page-" + page_number + "-anno-" + anno_item.id +"-container"; + var anno_item_itag_id=id="itag-" + page_number + "-anno-" + anno_item.id +"-container"; + var anno_item_link_id=id="link-" + page_number + "-anno-" + anno_item.id +"-container"; + + var this_annotation = document.createElement('div'); + var inner_html = ""; + + this_annotation.innerHTML = inner_html; + + return this_annotation.childNodes[0]; +} + +pdfwheel.Highlight.prototype.getMouseUpPos = function() { + var tips = { + 'zh-cn': [ + '不能跨页批注对象,请重新选择', + '选择对象过多无法批注!', + '无法批注倾斜文字', + '选择了过多对象无法完成标注,请重新选择', + ], + 'en': [ + 'cross page annotating is not supported!', + 'too many annotating content!', + 'rotate content annotating is not supported!', + 'too many annotating content!', + ] + } [this.tips_language]; + + var sel = window.getSelection(); + if (sel.isCollapsed == true) { + this.closeCopyConfirm(); + return null; + }; + + if (this.start_annotation == false) { + if (post_to_parent == true) { + var select_text = sel.toString(); + // window.parent.postMessage({ + // "type": 6, + // "source": "pdfjs", + // "content": select_text + // }, '*'); + } + + //弹出选择框 + this.selectionAct(); + return null; + } + + var Range = sel.getRangeAt(0); + + var spans_dict = this.getNewSelSpans(Range); + for (var data_page_number in spans_dict) { + var spans = spans_dict[data_page_number]; + + if (spans.length > 500) { + this.cancelSelection(tips[1]); + } else { + this.stop_process_annotation = false; + this.initAnnotation(); //初始化高亮对象 + + var highlight_page_id = window.PDFViewerApplication.baseUrl + '_page_' + data_page_number; + this.annotation_id = window.PDFViewerApplication.baseUrl + '_page_' + data_page_number; + //逻辑迁移至viewer.js中,生成页面时即添加id + // this.addIdForTextLayerSpan(this_page); + // console.log('当前页面数字',data_page_number); + var this_page = document.getElementById('page-' + data_page_number); + text_layer = this_page.getElementsByClassName('textLayer')[0]; + + var judge_result = { + 'one_page': true, + 'this_page': this_page, + 'highlight_page_id': highlight_page_id, + 'page_number': data_page_number, + }; + + var highlight_annotations_json = this.processHighlight(judge_result, spans, Range, sel, tips[2]); + if (this.stop_process_annotation == true) { + return null; + } + + + // console.log('数据',pdfHighlight); + pdfAnnotation.saveAnnotationsJson(this.annotation_id, highlight_annotations_json); + // console.log('主动保存高亮列表'); + pdfAnnotation.addAnnotationToFabric(this.tmp_annotation_data, judge_result.this_page); + // pdfAnnotation.saveAllFabricData(); + // console.log('主动保存'); + pdfAnnotation.saveFabricCanvas(judge_result.page_number); + //绘制批注层对象 + var this_annotation_layer = judge_result.this_page.getElementsByClassName('annotationLayer')[0]; + pdfAnnotation.addFabricObjToAnnotationTextLayer(this_annotation_layer); + + //取消选区 + window.getSelection().removeAllRanges(); + + } + } + + //为所有页面内容添加id + // this.addIdForTextLayerSpanForAllPages(); + + // var judge_result = this.judgeOnePage(Range); + // if (judge_result.one_page == false) { + // this.cancelSelection(tips[0]); + // return null; + // } + + return { + 'this_page_highlights_data': highlight_annotations_json, + 'this_highlight_data': this.tmp_annotation_data, + 'this_page': judge_result.this_page, + } +}; + +pdfwheel.Highlight.prototype.getNewSelSpans = function(Range) { + var this_frames = Range.cloneContents(); + var new_div = document.createElement('div'); + new_div.appendChild(this_frames); + var spans = new_div.getElementsByTagName('span'); + var span_page_number; + var new_spans = {}; + if (spans.length == 0) { + var select_node = Range.commonAncestorContainer.parentNode; + span_page_number = select_node.getAttribute('id').split('-')[1]; + new_spans[span_page_number] = []; + } else { + for (var i = 0; i < spans.length; i++) { + if (spans[i].classList[0] != 'markedContent') { + var span_id = spans[i].getAttribute('id'); + if (span_id == null) { + continue; + } + span_page_number = span_id.split('-')[1]; + if (span_page_number in new_spans) { + new_spans[span_page_number].push(spans[i]); + } else { + new_spans[span_page_number] = [spans[i]]; + } + } + } + } + return new_spans; +} + + +pdfwheel.Highlight.prototype.singleHighlightAndUnderline = function(op) { + var old_start_annotation = this.start_annotation; + var old_annotation_type = this.annotation_type; + + this.start_annotation = true; + if (op == 0) { + this.annotation_type = 'highlight'; + } else { + this.annotation_type = 'underline'; + } + + var highlight_data = this.getMouseUpPos(); //listen mouseup 监听鼠标抬起 + // console.log('高亮数据',highlight_data); + this.start_annotation = old_start_annotation; + this.annotation_type = old_annotation_type; + this.closeCopyConfirm(); + if (highlight_data==null){ + return null; + }else{ + return highlight_data.this_highlight_data; + } +} + +//initial empty annotation object 初始化空批注对象 +pdfwheel.Highlight.prototype.initAnnotation = function() { + this.tmp_annotation_data = { + 'id': null, + 'page_number': 0, + 'member_id': pdfAnnotation.getRandomMemberID(), + 'save_scale_x': 0, + 'save_scale_y': 0, + 'comment': '', + 'type': '', + 'true_size': [], + 'all_rect': 0, + 'all_str': '', + 'rects': [], + } +} + +pdfwheel.Highlight.prototype.filterRect = function(this_rects, save_scale_x, save_scale_y) { + var old_scale_x = 2.20125786; + var old_scale_y = 2.19727891; + var old_rects = [ + [1.18317609975, 1.9021843523869997, 0.8160738354952829, 0.02488347032121662], + [1.1402515714800001, 1.9298700666530002, 0.8587150481218062, 0.02488347032121662], + [1.1402515714800001, 1.9573360530280002, 0.8584689922212806, 0.02488347032121662], + [1.1402515714800001, 1.9850217672940003, 0.8589459168632076, 0.02488347032121662] + ]; + + var result_rect = 0; + for (var i = 0; i < this_rects.length; i++) { + var this_rect = this_rects[i]; + for (var j = 0; j < old_rects.length; j++) { + var this_old_rect = old_rects[j]; + } + + } +} + +pdfwheel.Highlight.prototype.filterRect = function(this_rect, old_rect) { + +} + +pdfwheel.Highlight.prototype.processHighlight = function(judge_result, spans, Range, sel, this_tip) { + var highlight_annotations_json = this.readAnnotationsForPage(judge_result.highlight_page_id); + var canvas_sizes = this.getCanvasSize(judge_result.this_page); + + if (spans.length == 0) { + var single_span = Range.commonAncestorContainer.parentNode; + this.highlightSpan(single_span, true, Range.startOffset, Range.endOffset, + false); + } else { + console.log('处理高亮',spans[0]); + this.highlightSpan(spans[0], false, 0, 0, true); + for (let i = 1; i < spans.length; i++) { + this.highlightSpan(spans[i], false, 0, 0, false); + } + } + + //遇到倾斜对象 + if (this.stop_process_annotation == true) { + this.cancelSelection(this_tip); + return; + } + + var all_str = sel.toString(); + this.tmp_annotation_data.rects = this.joinRects(this.tmp_annotation_data.rects); + this.addAnnotationData(all_str, judge_result.this_page); + this.tmp_annotation_data.id = this.buildId(highlight_annotations_json.length + 1); + highlight_annotations_json.push(this.tmp_annotation_data); + return highlight_annotations_json; +} + +pdfwheel.Highlight.prototype.selectionAct = function() { + if (this.stop_touch_highlight == true) { + return; + }; + var selection = window.getSelection(); + if (selection.isCollapsed == true) { + return; + } + var oRange = selection.getRangeAt(0); + + var rects = oRange.getClientRects(); + if (rects && rects.length >= 1) { + // var last_rect = rects[0]; + var last_rect = rects[rects.length - 1]; + this.showCopyConfirm(last_rect.left, last_rect.top + 40); + } +} + +pdfwheel.Highlight.prototype.showCopyConfirm = function(disX, disY) { + var container_pos=pdfAnnotationUI.getViewerPosition(); + let el = document.getElementById("ff-copyconfirm-btn"); + el.style.left = disX-container_pos.x + 'px'; + el.style.top = disY-container_pos.y + 'px'; + el.removeAttribute('hidden'); +} + +//hide operation buttons [highlignt/underline/copy/cancel] 隐藏操作按钮[高亮/下划线/复制/取消] +pdfwheel.Highlight.prototype.closeCopyConfirm = function() { + this.closeCopyConfirmDiv(); + window.getSelection().removeAllRanges(); + document.removeEventListener("selectionchange", endSelectionChangeListen, true); +} + +pdfwheel.Highlight.prototype.closeCopyConfirmDiv = function() { + let el = document.getElementById("ff-copyconfirm-btn"); + el.style.left = '-50px'; + el.style.top = '-50px'; + el.setAttribute('hidden', true); +} + +//write annotation data 写入批注数据 +pdfwheel.Highlight.prototype.addAnnotationData = function(all_str, this_page) { + var tips = { + 'zh-cn': [ + '添加批注', + ], + 'en': [ + 'add comments', + ] + } [this.tips_language]; + + this.tmp_annotation_data.all_str = all_str; //annotation text + var all_rect = []; + if (this.annotation_type == 'highlight') { + all_rect = this.getGroupRect(this.tmp_annotation_data.rects); + } else { + all_rect = this.getGroupRectOfUnderLine(this.tmp_annotation_data.rects); + } + + this.tmp_annotation_data.member_id = pdfAnnotation.getRandomMemberID(); + this.tmp_annotation_data.true_size = [this.canvas_sizes.true_width, this.canvas_sizes.true_height]; + this.tmp_annotation_data.save_scale_x = this.canvas_sizes.canvas_scale_x; + this.tmp_annotation_data.save_scale_y = this.canvas_sizes.canvas_scale_y; + this.tmp_annotation_data.all_rect = all_rect; + this.tmp_annotation_data.type = this.annotation_type; + this.tmp_annotation_data.comment = tips[0]; + this.tmp_annotation_data.page_number = parseInt(this_page.getAttribute('data-page-number')); +} + +//caculate group rect of all highlight rects 计算所有高亮 rects 的最外围矩形范围 +pdfwheel.Highlight.prototype.getGroupRect = function(rects) { + //Because it's proportional, so min_x,min_y are both going to be less than 2 + //因为是比例,所以min_x,min_y都会比2小 + var min_x = 2, + min_y = 2, + max_x = 0, + max_y = 0; + + for (var i = 0; i < rects.length; i++) { + var scale_rect = rects[i]; + var box_left = scale_rect[0], + box_top = scale_rect[1], + box_width = scale_rect[2], + box_height = scale_rect[3]; + + var this_min_x = box_left, + this_max_y = box_top + box_height, + this_max_x = box_left + box_width, + this_min_y = box_top; + + min_x = Math.min(min_x, this_min_x); + max_x = Math.max(max_x, this_max_x); + min_y = Math.min(min_y, this_min_y); + max_y = Math.max(max_y, this_max_y); + } + + return [min_x, min_y, max_x - min_x, max_y - min_y]; +} + +//caculate group rect of all underline rects 计算所有下划线 rects 的最外围矩形范围 +pdfwheel.Highlight.prototype.getGroupRectOfUnderLine = function(rects) { + var min_x = 2, + min_y = 2, + max_x = 0, + max_y = 0; + + for (var i = 0; i < rects.length; i++) { + var scale_rect = rects[i]; + var x1 = scale_rect[0], + y1 = scale_rect[1], + x2 = scale_rect[2], + y2 = scale_rect[3]; + + min_x = Math.min(min_x, x1); + max_x = Math.max(max_x, x2); + min_y = Math.min(min_y, y1); + max_y = Math.max(max_y, y2); + } + + //The maximum range rectangle is built after the four maximum values are obtained + //获得到四个最值之后构建最大范围矩形 + return [min_x, min_y, max_x - min_x, max_y - min_y]; +} + +//join adjacent annotation rectangles 合并相邻的批注矩形 +pdfwheel.Highlight.prototype.joinRects = function(old_rects) { + // [scale_left, scale_top, scale_width, scale_height]; + var rect_dict_list = []; + + if (this.annotation_type == 'highlight') { + for (var i = 0; i < old_rects.length; i++) { + var this_rect = old_rects[i]; + rect_dict_list = this.addRectToRectDictHighlight(this_rect, rect_dict_list, i); + } + } else { + for (var i = 0; i < old_rects.length; i++) { + var this_rect = old_rects[i]; + rect_dict_list = this.addRectToRectDictUnderline(this_rect, rect_dict_list, i); + } + } + + //new rects after joining 合并后的新列表 + var new_rects = []; + for (var j = 0; j < rect_dict_list.length; j++) { + new_rects.push(rect_dict_list[j]['uni_rect']); + } + return new_rects; +} + +pdfwheel.Highlight.prototype.highlightSpan = function(span, single_span, start_offset, end_offset, first_span) { + var ctx = this.canvas_sizes.ctx; + var true_width = this.canvas_sizes.true_width; + var true_height = this.canvas_sizes.true_height; + var canvas_scale_x = this.canvas_sizes.canvas_scale_x; + var canvas_scale_y = this.canvas_sizes.canvas_scale_y; + var canvas_text_scale_x = this.canvas_sizes.canvas_text_scale_x; + var canvas_text_scale_y = this.canvas_sizes.canvas_text_scale_y; + + var this_style = span.style; + + var left = 0.0; + var top = 0.0; + + if (this_style.left.indexOf('%') != -1) { + left = this.getNumberFromStyle(this_style.left, '%') * canvas_scale_x * true_width / 100; //原本是百分比,需要变回长度 + } else { + //px数值 + left = this.getNumberFromStyle(this_style.left, 'px') * canvas_scale_x * canvas_text_scale_x; + } + + + if (this_style.top.indexOf('%') != -1) { + top = this.getNumberFromStyle(this_style.top, '%') * canvas_scale_y * true_height / 100; //原本是百分比,需要变回长度 + } else { + top = this.getNumberFromStyle(this_style.top, 'px') * canvas_scale_y * canvas_text_scale_y; + } + + var height = this.getNumberFromStyle(this_style.fontSize, 'px') * canvas_text_scale_y * canvas_scale_y, + offset_width = 0.0, + width = 0.0, + start_offset_str = '', + metrics = ''; + + var transform_list = this_style.transform.split(' '); + var rotate = 0; //rotate angle 旋转角度 + var scaleX = 1; + if (transform_list.length == 2) { + //stop annoataion if there is annotation object 有旋转对象时终止批注 + rotate = parseFloat(transform_list[0].replace('rotate(', '').replace('deg)', '')); + scaleX = parseFloat(transform_list[1].replace('scaleX(', '').replace(')', '')); + this.stop_process_annotation = true; + return; + } else { + scaleX = parseFloat(this_style.transform.replace('scaleX(', '').replace(')', '')); + } + + var this_font = height + 'px' + " " + this_style.fontFamily; + ctx.font = this_font; + + if (first_span == true) { + var true_span = document.getElementById(span.getAttribute('id')); + start_offset_str = true_span.textContent.replace(span.textContent, ''); + offset_width = ctx.measureText(start_offset_str).width; + } + if (single_span) { + start_offset_str = span.textContent.slice(0, start_offset); + offset_width = ctx.measureText(start_offset_str).width; + metrics = ctx.measureText(span.textContent.slice(start_offset, end_offset)); + } else { + metrics = ctx.measureText(span.textContent); + } + + width = metrics.width; + if (scaleX) { + width = width * scaleX.toFixed(3); + offset_width = offset_width * scaleX.toFixed(3); + } + + //add current annotation relative position in page to page annotation list 添加当前批注相对位置到批注列表 + if (this.annotation_type == 'highlight') { + this.drawRect(ctx, left, offset_width, top, width, height); + } else { + this.drawLine(ctx, left, offset_width, top, width, height); + } +} + +pdfwheel.Highlight.prototype.drawRect = function(ctx, left, offset_width, top, width, height) { + // console.log('高亮',[left, offset_width, top, width, height]); + var true_width = this.canvas_sizes.true_width; + var true_height = this.canvas_sizes.true_height; + + var scale_left = (left + offset_width) / true_width.toFixed(8), + scale_top = top / true_height.toFixed(8), + scale_width = width / true_width.toFixed(8), + scale_height = height / true_height.toFixed(8); + + var scale_rect = [scale_left, scale_top, scale_width, scale_height]; + // console.log('高亮位置',scale_rect); + this.tmp_annotation_data.rects.push(scale_rect); +}; + + +pdfwheel.Highlight.prototype.drawLine = function(ctx, left, offset_width, top, width, height) { + var true_width = this.canvas_sizes.true_width; + var true_height = this.canvas_sizes.true_height; + + var x1 = left + offset_width, + y1 = top + height, + x2 = left + offset_width + width, + y2 = top + height; + h=height; + + this.tmp_annotation_data.rects.push([x1 / true_width, y1 / true_height, x2 / true_width, y2 / true_height,h/true_height]); +}; + +pdfwheel.Highlight.prototype.twoRectInterSect = function(rect1,rect2){ + var t1=rect1[1]; + var h1=rect1[3]; + var s1=t1+h1; + + // console.log('矩形1',t1,h1,s1); + + var t2=rect2['scale_top']; + var h2=rect2['scale_height']; + var s2=t2+h2; + // console.log('矩形2',t2,h2,s2); + + if (t1<=t2 && s1>=t2){ + return true; + } + + if (t1>=t2 && s2>=t1){ + return true; + } + // console.log('不相邻'); + return false; +} + +//join two highlight rectangle 合并两个高亮矩形对象 +pdfwheel.Highlight.prototype.addRectToRectDictHighlight = function(this_rect, rect_dict_list, this_index) { + if (rect_dict_list.length == 0) { + rect_dict_list.push({ + 'scale_top': this_rect[1], + 'scale_height': this_rect[3], + 'uni_rect': this_rect, + 'index': this_index, + }); + return rect_dict_list; + } + //Compare the starting top and height, and merge the starting left and width if they are equal 比对起始top和高度,两者相等时合并起始的左边和宽度 + for (var i = 0; i < rect_dict_list.length; i++) { + var rect_dict = rect_dict_list[i]; + + //起始top和height都相等,合并两个区域,判断两个rect是否相邻 + // if (this_rect[1]==rect_dict['scale_top'] && this_rect[3]==rect_dict['scale_height'] && this_index==(rect_dict['index']+1)){ + // var new_rect=uniTwoRect(rect_dict['uni_rect'],this_rect); + // rect_dict_list[i]['uni_rect']=new_rect; + // rect_dict_list[i]['index']=this_index; + // return rect_dict_list; + // } + + //do not judge whether two RECts are adjacent 不判断两个rect是否相邻 + // console.log('rect_dict',rect_dict); + if (this.twoRectInterSect(this_rect,rect_dict) && this_index==(rect_dict['index']+1)){ + var new_rect = this.uniTwoRect(rect_dict['uni_rect'], this_rect); + rect_dict_list[i]['uni_rect'] = new_rect; + rect_dict_list[i]['index'] = this_index; + return rect_dict_list; + } + + // if (this_rect[1] == rect_dict['scale_top'] && this_rect[3] == rect_dict['scale_height'] && this_index==(rect_dict['index']+1)) { + // var new_rect = this.uniTwoRect(rect_dict['uni_rect'], this_rect); + // rect_dict_list[i]['uni_rect'] = new_rect; + // rect_dict_list[i]['index'] = this_index; + // return rect_dict_list; + // } + } + + //add new rect_list if they don't have equal left and height 宽高都不相等则新增 + rect_dict_list.push({ + 'scale_top': this_rect[1], + 'scale_height': this_rect[3], + 'uni_rect': this_rect, + 'index': this_index, + }); + + return rect_dict_list; +} + + +pdfwheel.Highlight.prototype.twoUnderLineInterSect = function(rect1,rect2){ + var s1=rect1[1]; + var h1=rect1[4]; + var t1=s1-h1; + + // console.log('矩形1',t1,h1,s1); + + var s2=rect2['y1']; + var h2=rect2['h']; + var t2=s2-h2; + // console.log('矩形2',t2,h2,s2); + + if (t1<=t2 && s1>=t2){ + return true; + } + + if (t1>=t2 && s2>=t1){ + return true; + } + // console.log('不相邻'); + return false; +} + +//join two udnerline rectangle 合并两个下划线矩形对象 +pdfwheel.Highlight.prototype.addRectToRectDictUnderline = function(this_rect, rect_dict_list, this_index) { + if (rect_dict_list.length == 0) { + rect_dict_list.push({ + 'x1': this_rect[0], + 'y1': this_rect[1], + 'h':this_rect[4], + 'uni_rect': this_rect, + 'index': this_index, + }); + return rect_dict_list; + } + //Compare the starting top and height, and merge the starting left and width if they are equal 比对起始top和高度,两者相等时合并起始的左边和宽度 + for (var i = 0; i < rect_dict_list.length; i++) { + var rect_dict = rect_dict_list[i]; + + //judge whether two RECts are adjacent 判断两个rect是否相邻 + if (this.twoUnderLineInterSect(this_rect,rect_dict) && this_index == (rect_dict['index'] + 1)) { + rect_dict_list[i]['uni_rect'] = [rect_dict['x1'], rect_dict['y1'], this_rect[2], this_rect[3]]; + rect_dict_list[i]['index'] = this_index; + return rect_dict_list; + } + } + + //add new rect_list if they don't have equal left and height 宽高都不相等则新增 + rect_dict_list.push({ + 'x1': this_rect[0], + 'y1': this_rect[1], + 'h':this_rect[4], + 'uni_rect': this_rect, + 'index': this_index, + }); + + return rect_dict_list; +} + +// join two rect position 合并两个矩形的坐标 +pdfwheel.Highlight.prototype.uniTwoRect = function(rect_one, rect_two) { + var scale_left = Math.min.apply(null, [rect_one[0], rect_two[0]]); + var scale_width = rect_two[0] + rect_two[2] - rect_one[0]; + var new_rect = [scale_left, rect_one[1], scale_width, rect_one[3]]; + return new_rect; +} + +pdfwheel.Highlight.prototype.getCanvasSize = function(this_page) { + var canvasWrapper = this_page.getElementsByClassName('canvasWrapper')[0]; + var text_canvas = canvasWrapper.getElementsByTagName('canvas')[0]; + var ctx = text_canvas.getContext("2d"); + + //initial empty annotation object 初始化空标注对象 + // initAnnotation(); + var true_width = this.getNumberFromStyle(text_canvas.style.width, 'px'); + var true_height = this.getNumberFromStyle(text_canvas.style.height, 'px'); + + var text_layer_width = this.getNumberFromStyle(text_layer.style.width, 'px'); + var text_layer_height = this.getNumberFromStyle(text_layer.style.height, 'px'); + + var canvas_scale_x = (text_canvas.width / true_width).toFixed(8); + var canvas_scale_y = (text_canvas.height / true_height).toFixed(8); + + var canvas_text_scale_x = (true_width / text_layer_width).toFixed(8); + var canvas_text_scale_y = (true_height / text_layer_height).toFixed(8); + + + this.canvas_sizes = { + 'ctx': ctx, + 'true_width': true_width, + 'true_height': true_height, + 'text_layer_width': text_layer_width, + 'text_layer_height': text_layer_height, + 'canvas_scale_x': canvas_scale_x, + 'canvas_scale_y': canvas_scale_y, + 'canvas_text_scale_x': canvas_text_scale_x, + 'canvas_text_scale_y': canvas_text_scale_y, + }; +} + +pdfwheel.Highlight.prototype.getNumberFromStyle = function(str_value, replace_str) { + var re_text = str_value.replace(' ', '').replace('calc(var(--scale-factor)*', '').replace(replace_str + ')', + ''); + var value = parseFloat(re_text); + return value; +} + +pdfwheel.Highlight.prototype.readAnnotationsForPage = function(annotation_id) { + var this_page_annotation = []; + if (localStorage.getItem(annotation_id) !== null) { + this_page_annotation = JSON.parse(localStorage.getItem(annotation_id)); + for (var i = 0; i < this_page_annotation.length; i++) { + if (Object.prototype.hasOwnProperty.call(this_page_annotation[i], 'id') == false || + this_page_annotation[i] + .id == null) { + this_page_annotation[i].id = this.buildId(i + 1); + } + } + } + return this_page_annotation; +} + +pdfwheel.Highlight.prototype.buildId = function(id_number) { + var this_time = new Date().getTime(); + var id = this_time + '_' + id_number; + return id; +} + +pdfwheel.Highlight.prototype.cancelSelection = function(this_tip) { + alert(this_tip); + window.getSelection().removeAllRanges(); +} + +pdfwheel.Highlight.prototype.closeCopyConfirm = function() { + let el = document.getElementById("ff-copyconfirm-btn"); + el.style.left = '-50px'; + el.style.top = '-50px'; + el.setAttribute('hidden', true); + window.getSelection().removeAllRanges(); + // document.removeEventListener("selectionchange", endSelectionChangeListen, true); +} + +pdfwheel.Highlight.prototype.judgeOnePage = function(Range) { + if (Range.commonAncestorContainer.nodeType != 3 && Range.commonAncestorContainer.getAttribute('id') == + 'viewer') { + return { + 'one_page': false, + 'this_page': null, + 'highlight_page_id': null, + 'page_number': null, + }; + } + + var this_page = null; + if (Range.commonAncestorContainer.nodeType == 3) { + this_page = Range.commonAncestorContainer.parentElement; + } else { + this_page = Range.commonAncestorContainer; + } + + + var data_page_number = this_page.getAttribute('data-page-number'); + while (data_page_number == null) { + this_page = this_page.parentElement; + data_page_number = this_page.getAttribute('data-page-number'); + } + + text_layer = this_page.getElementsByClassName('textLayer')[0]; + + var highlight_page_id = window.PDFViewerApplication.baseUrl + '_page_' + data_page_number; + this.annotation_id = window.PDFViewerApplication.baseUrl + '_page_' + data_page_number; + //逻辑迁移至viewer.js中,生成页面时即添加id + // this.addIdForTextLayerSpan(this_page); + return { + 'one_page': true, + 'this_page': this_page, + 'highlight_page_id': highlight_page_id, + 'page_number': data_page_number, + }; +}; + +pdfwheel.Highlight.prototype.getSelSpans = function(Range) { + var this_frames = Range.cloneContents(); + var new_div = document.createElement('div'); + new_div.appendChild(this_frames); + var spans = new_div.getElementsByTagName('span'); + + if (spans.length == 0) { + return spans; + } else { + var new_spans = []; + for (var i = 0; i < spans.length; i++) { + if (spans[i].classList[0] != 'markedContent') { + new_spans.push(spans[i]); + } + } + return new_spans; + } +}; + +pdfwheel.Highlight.prototype.addIdForTextLayerSpanForAllPages = function(page_div) { + var all_pages = document.getElementsByClassName('page'); + for (var i = 0; i < all_pages.length; i++) { + this_page = all_pages[i]; + if (this_page.hasAttribute('added_id') == false) { + this.addIdForTextLayerSpan(this_page); + this_page.setAttribute('added_id', true); + } + } +} + +pdfwheel.Highlight.prototype.addIdForTextLayerSpan = function(page_div) { + var page_number = page_div.getAttribute('data-page-number'); + page_div.setAttribute('id', 'page-' + page_number); + var text_layer = page_div.getElementsByClassName('textLayer')[0]; + if (text_layer == null) { + return; + } + + // console.log('text_layer',text_layer); + + text_layer.setAttribute('id', 'page-textlayer-' + page_number); + + var spans = text_layer.getElementsByTagName('span'); + if (spans.length == 0) { + return; + } + + // if (page_number==4){ + // console.log('spans',spans); + // } + for (var i = 0; i < spans.length; i++) { + if (spans[i].hasAttribute('id') == false) { + var span_id = 'page-' + page_number + '-textspan-' + (i + 1); + spans[i].setAttribute('id', span_id); + } + } +}; + +// 中间横杠 +pdfwheel.UI.prototype.intervalControl = function() { + const verticalImgIcon = document.createElement('img'); + verticalImgIcon.src = this.verticalImg; + + const horizontalImgIcon = document.createElement('img'); + horizontalImgIcon.src = this.horizontalImg; + + function renderIcon(ctx, left, top, styleOverride, fabricObject) { + const wsize = 20; + const hsize = 25; + ctx.save(); + ctx.translate(left, top); + ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle)); + ctx.drawImage(verticalImgIcon, -wsize / 2, -hsize / 2, wsize, hsize); + ctx.restore(); + } + + function renderIconHoz(ctx, left, top, styleOverride, fabricObject) { + const wsize = 25; + const hsize = 20; + ctx.save(); + ctx.translate(left, top); + ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle)); + ctx.drawImage(horizontalImgIcon, -wsize / 2, -hsize / 2, wsize, hsize); + ctx.restore(); + } + // 中间横杠 + fabric.Object.prototype.controls.ml = new fabric.Control({ + x: -0.5, + y: 0, + offsetX: -1, + cursorStyleHandler: fabric.controlsUtils.scaleSkewCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingXOrSkewingY, + getActionName: fabric.controlsUtils.scaleOrSkewActionName, + render: renderIcon, + }); + + fabric.Object.prototype.controls.mr = new fabric.Control({ + x: 0.5, + y: 0, + offsetX: 1, + cursorStyleHandler: fabric.controlsUtils.scaleSkewCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingXOrSkewingY, + getActionName: fabric.controlsUtils.scaleOrSkewActionName, + render: renderIcon, + }); + + fabric.Object.prototype.controls.mb = new fabric.Control({ + x: 0, + y: 0.5, + offsetY: 1, + cursorStyleHandler: fabric.controlsUtils.scaleSkewCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingYOrSkewingX, + getActionName: fabric.controlsUtils.scaleOrSkewActionName, + render: renderIconHoz, + }); + + fabric.Object.prototype.controls.mt = new fabric.Control({ + x: 0, + y: -0.5, + offsetY: -1, + cursorStyleHandler: fabric.controlsUtils.scaleSkewCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingYOrSkewingX, + getActionName: fabric.controlsUtils.scaleOrSkewActionName, + render: renderIconHoz, + }); +} + +// 顶点 +pdfwheel.UI.prototype.peakControl = function() { + const img = document.createElement('img'); + img.src = this.edgeImg; + + function renderIconEdge(ctx, left, top, styleOverride, fabricObject) { + const wsize = 25; + const hsize = 25; + ctx.save(); + ctx.translate(left, top); + ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle)); + ctx.drawImage(img, -wsize / 2, -hsize / 2, wsize, hsize); + ctx.restore(); + } + // 四角图标 + fabric.Object.prototype.controls.tl = new fabric.Control({ + x: -0.5, + y: -0.5, + cursorStyleHandler: fabric.controlsUtils.scaleCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingEqually, + render: renderIconEdge, + }); + fabric.Object.prototype.controls.bl = new fabric.Control({ + x: -0.5, + y: 0.5, + cursorStyleHandler: fabric.controlsUtils.scaleCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingEqually, + render: renderIconEdge, + }); + fabric.Object.prototype.controls.tr = new fabric.Control({ + x: 0.5, + y: -0.5, + cursorStyleHandler: fabric.controlsUtils.scaleCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingEqually, + render: renderIconEdge, + }); + fabric.Object.prototype.controls.br = new fabric.Control({ + x: 0.5, + y: 0.5, + cursorStyleHandler: fabric.controlsUtils.scaleCursorStyleHandler, + actionHandler: fabric.controlsUtils.scalingEqually, + render: renderIconEdge, + }); +} +// 删除 +pdfwheel.UI.prototype.deleteControl = function() { + const deleteIcon = + "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E%3Csvg version='1.1' id='Ebene_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='595.275px' height='595.275px' viewBox='200 215 230 470' xml:space='preserve'%3E%3Ccircle style='fill:%23F44336;' cx='299.76' cy='439.067' r='218.516'/%3E%3Cg%3E%3Crect x='267.162' y='307.978' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -222.6202 340.6915)' style='fill:white;' width='65.545' height='262.18'/%3E%3Crect x='266.988' y='308.153' transform='matrix(0.7071 0.7071 -0.7071 0.7071 398.3889 -83.3116)' style='fill:white;' width='65.544' height='262.179'/%3E%3C/g%3E%3C/svg%3E"; + const delImg = document.createElement('img'); + delImg.src = deleteIcon; + + function renderDelIcon(ctx, left, top, styleOverride, fabricObject) { + const size = this.cornerSize; + ctx.save(); + ctx.translate(left, top); + ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle)); + ctx.drawImage(delImg, -size / 2, -size / 2, size, size); + ctx.restore(); + } + + // 删除选中元素 + function deleteObject() { + pdfAnnotation.delEl(); + } + + // 删除图标 + fabric.Object.prototype.controls.deleteControl = new fabric.Control({ + x: 0.5, + y: -0.5, + offsetY: -16, + offsetX: 16, + cursorStyle: 'pointer', + mouseUpHandler: deleteObject, + render: renderDelIcon, + cornerSize: 24, + }); +} + +// 旋转 +pdfwheel.UI.prototype.rotationControl = function() { + const img = document.createElement('img'); + img.src = this.rotateImg; + + function renderIconRotate(ctx, left, top, styleOverride, fabricObject) { + const wsize = 40; + const hsize = 40; + ctx.save(); + ctx.translate(left, top); + ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle)); + ctx.drawImage(img, -wsize / 2, -hsize / 2, wsize, hsize); + ctx.restore(); + } + // 旋转图标 + fabric.Object.prototype.controls.mtr = new fabric.Control({ + x: 0, + y: 0.5, + cursorStyleHandler: fabric.controlsUtils.rotationStyleHandler, + actionHandler: fabric.controlsUtils.rotationWithSnapping, + offsetY: 30, + hasBorders: true, + withConnecton: false, + actionName: 'rotate', + render: renderIconRotate, + }); +} + +pdfwheel.UI.prototype.initControls = function(canvas) { + this.deleteControl(); + this.peakControl(); + this.intervalControl(); + // this.rotationControl(); + + // 选中样式 + fabric.Object.prototype.set({ + transparentCorners: false, + borderColor: '#51B9F9', + // borderColor: 'red', + cornerColor: '#FFF', + borderScaleFactor: 2.5, + hasBorders: true, + // cornerStyle: 'circle', + cornerStrokeColor: '#0E98FC', + borderOpacityWhenMoving: 1, + objectCaching:false, + noScaleCache:true, + }); +} + + +//click left annotation buttons 点击左侧批注按钮 +pdfwheel.UI.prototype.clickTab = function(node) { + //cancel seletion close annotation 取消选择,关闭注释 + var tips = { + 'zh-cn': [ + "激活功能", + "关闭功能", + ], + 'en': [ + 'activate feature', + 'deactivate feature', + ] + } [tips_language]; + if (this.last_click_node_id == node.id && pdfHighlight.start_annotation == true) { + node.getElementsByTagName('i')[0].classList.remove('button-active'); + pdfHighlight.start_annotation = false; + addOperationTips(tips[1]); + return; + } + + //取消橡皮笔刷 + if (this.last_click_node_id == node.id && pdfAnnotation.eraser_brush == true) { + node.getElementsByTagName('i')[0].classList.remove('button-active'); + this.setFabricCanvasContainerZIndex(10); + pdfAnnotation.eraser_brush = false; + addOperationTips(tips[1]); + return; + } + + pdfHighlight.start_annotation = true; + this.setFabricCanvasContainerZIndex(10); + addOperationTips(tips[0]); + + node.getElementsByTagName('i')[0].classList.add('button-active'); + this.last_click_node_id = node.id; + var buttons = document.getElementById('firefly-annotation-buttons').getElementsByTagName('button'); + for (var i=0;i 0) { + var firstKey = Object.keys(this_file_annotations)[0]; + var page_number = firstKey.split('-')[3]; + last_connect_id = 'page-' + page_number + '-anno-open'; + }; + } + + //刷新时绘制之前的连接线 + if (Object.keys(this_file_annotations).length > 0) { + this.showLink(); + } +} + +pdfwheel.UI.prototype.openOrCloseAnnotation = function(node) { + var id_split = node.id.split('-'); + //修改页面的展开状态 + var this_page_key = this.fabric_annos_id_tag + id_split[1]; + if (id_split[id_split.length - 1] == 'close') { + document.getElementById(node.id.replace('close', 'open')).removeAttribute('hidden'); + this.openAnnotations(node, false); + show_state[id_split[1]] = false; //刷新时默认打开页面 + + JSplump.clearAllAnnotations(node.id); //删除批注连接线 + } else { + show_state[id_split[1]] = true; //刷新时默认关闭页面 + document.getElementById(node.id.replace('open', 'close')).removeAttribute('hidden'); + this.openAnnotations(node, true); + if (this.draw_connect == true) { + JSplump.draw_connect = true; + JSplump.connectAllAnnotations(node.id); //绘制批注连接线 + + //绘制批注链接线时记录id,后面刷新时自动重新链接 + last_connect_id = node.id; + } + } + // console.log('列表展开情况',show_state); + node.setAttribute('hidden', 'true'); +} + +pdfwheel.UI.prototype.hiddenAnnotationList = function() { + document.getElementById('annotations_list').setAttribute('hidden', true); +} + + +//create annotation html elements list for showing 生成展示用的批注html列表元素 +pdfwheel.UI.prototype.createAnnotation = function(this_file_annotations) { + var tips = { + 'zh-cn': [ + '关闭列表', + '显示连接线', + '展开某页批注列表时显示连接线', + ], + 'en': [ + 'Close List', + 'ShowConnection', + 'show connection line when show some page annotation list', + ] + } [tips_language]; + + var parent_button = document.createElement('button'); // add hidden button 增加关闭按钮 + var outer_html = ''; + + var annotation_list_node = document.getElementById('annotations_list'); + annotation_list_node.innerHTML = ''; //clear children 清空所有子元素 + + if (add_annotation_list_title==true){ + if (this.draw_connect == true) { + outer_html = + '
' + + '
' + + '
' + + '
'; + } else { + outer_html = + '
' + + '
' + + '
' + + '
'; + } + + parent_button.innerHTML = outer_html; + annotation_list_node.appendChild(parent_button.childNodes[0]); + }else{ + if (this.draw_connect == true) { + outer_html = + '
'; + } else { + outer_html = + '
'; + } + + parent_button.innerHTML = outer_html; + var show_connect_div = document.getElementById('show_connect_div'); + show_connect_div.innerHTML = ''; //clear children 清空所有子元素 + show_connect_div.appendChild(parent_button.childNodes[0]); + } + + //显示列表 + this.addAnnotationListHtml(this_file_annotations, annotation_list_node); +} + +pdfwheel.UI.prototype.openOrCloseLink = function(node) { + if (node.checked == false) { + //隐藏批注列表 + // console.log('关闭列表'); + this.draw_connect = false; + JSplump.draw_connect = false; + JSplump.clearJsPlump(); + } else { + //显示批注列表 + // console.log('打开列表'); + this.draw_connect = true; + this.showLink(); + } + +} + +pdfwheel.UI.prototype.showLink = function() { + //刷新时如果显示了列表则绘制连接线 + if (last_connect_id != '-1' && this.draw_connect && this.show_annotation_list) { + JSplump.clearJsPlump(); + JSplump.connectAllAnnotations(last_connect_id); //绘制批注连接线 + } +} + +pdfwheel.UI.prototype.createElemetsCarryAttribute = function(tag, attr_dict) { + var this_el = document.createElement(tag); + for (var key in attr_dict) { + this_el.setAttribute(key, attr_dict[key]); + } + return this_el; + +} + +pdfwheel.UI.prototype.applyShowState = function(show_list) { + if (show_list == false) { + hidden_container = "hidden='true'"; + hidden_open = "hidden='true'"; + hidden_close = ""; + } else { + hidden_close = "hidden='true'"; + hidden_open = ""; + hidden_container = ""; + } +} + +pdfwheel.UI.prototype.addAnnotationListHtml = function(this_file_annotations, annotation_list_node) { + if (this.show_all_annotation_list == false) { + // console.log('为假不显示列表'); + return; + } + // console.log('列表展开情况',show_state); + var pure_annotation_div = this.createElemetsCarryAttribute('div', { + 'id': 'my-pure-annotations-container', + }); + + if (add_annotation_list_title==true){ + pure_annotation_div.style.marginTop = '40px'; + } + + // console.log('显示列表dfad',this_file_annotations); + + for (var key in this_file_annotations) { + // console.log('key', key); + var page_number_str = key.split('-') + var i = parseInt(page_number_str[page_number_str.length - 1]) - 1; + // var this_page_annotation = this_file_annotations[key]['page_annotations']; + var this_page_all_annotation = this_file_annotations[key]['page_canvas']['fabric_canvas_json']['objects']; + // console.log(i,this_page_annotation); + //根据选中的用户id需要再过滤一遍 + var this_page_annotation = this_page_all_annotation; + + //是否默认展开列表 + var str_page_number = (i + 1).toString(); + if (!(str_page_number in show_state)) { + show_state[str_page_number] = default_show_onepage_annotation_list; + } + this.applyShowState(show_state[str_page_number]); + + var page_annotation_container = document.createElement('div'); + page_annotation_container.setAttribute('class', 'page-annotations'); + + if (this_page_annotation.length > 0) { + var page_annotation_title = this.createPageAnnotationTitle(i + 1, this_page_annotation.length); + page_annotation_container.appendChild(page_annotation_title); + + //按页存储批注id 页码是i+1 + this.annotation_list_ids['page-' + (i + 1)] = []; + + //add specifical annotation text 添加具体标注内容 + for (var j = 0; j < this_page_annotation.length; j++) { + var anno_item=this_page_annotation[j]; + if ('id' in anno_item){ + var this_annotation = this.createOnePageAnnotation(i + 1, j + 1, this_page_annotation[j]); + page_annotation_container.appendChild(this_annotation); + } + } + + pure_annotation_div.appendChild(page_annotation_container); + } + } + annotation_list_node.appendChild(pure_annotation_div); +} + +//create page annotation title for showing 创建展示用的页面批注title +pdfwheel.UI.prototype.createPageAnnotationTitle = function(page_number, anno_count) { + var tips = { + 'zh-cn': [ + '第 ', + ' 页-共 ', + ' 项', + '收起', + '展开', + '清空当前页面所有注释', + '显示当前页面连接线,仅当 “显示链接线” 按钮勾选时可用', + ], + 'en': [ + 'page ', + '-', + ' annotations', + 'hide', + 'show', + 'clear all annotations of this page', + 'show connect line of this page annotations, only avaliable when "show connection checked"', + ] + } [tips_language]; + + var page_annotations_title = document.createElement('div'); + + + var outer_html = "
" + + "
" + + "" + + "

" + + tips[0] + page_number + tips[1] + anno_count + tips[2] + + "

" + + "
" + + "
"; + page_annotations_title.innerHTML = outer_html; + return page_annotations_title.childNodes[0]; +} + +//create page annotation for showing 创建展示用的页面批注 +pdfwheel.UI.prototype.createOnePageAnnotation = function(page_number, anno_number, anno_item) { + var tips = { + 'zh-cn': [ + '删除', + '复制', + '跳转', + '注释类型', + { + 'highlight': '高亮', + 'underline': '下划线', + 'text': '文本', + 'rectangle': '矩形', + 'arrow': '箭头', + 'circle': '圆形', + 'image': '图片', + 'path': '画笔路径', + 'screenshot': '截屏', + 'screenshot_text': '截屏批注', + 'line': '直线', + 'idcard_stamp': '身份印章', + 'check': '对勾', + }, + '输入注释', + '保存注释', + '点击以保存批注', + '点击跳转超链接', + '编辑超链接', + ], + 'en': [ + 'delete', + 'copy', + 'goto', + 'annotation type', + { + 'highlight': 'highlight', + 'underline': 'underline', + 'text': 'text', + 'rectangle': 'rectangle', + 'arrow': 'arrow', + 'circle': 'circle', + 'image': 'image', + 'path': 'path', + 'screenshot': 'screenshot', + 'screenshot_text': 'screenshot comment', + 'line': 'line', + 'idcard_stamp': 'idcard stamp', + 'check': 'check', + }, + 'input comments', + 'save comments', + 'click to save comments', + 'click to go hyperlink', + 'edit hyperlink', + ] + } [tips_language]; + + //批注对象显示的文字 + var anno_text = ''; + if (anno_item.my_type == 'highlight' || anno_item.my_type == 'underline') { + anno_text = anno_item.text; + } else { + anno_text = tips[3] + ' : ' + tips[4][anno_item.my_type]; + } + + var hyper_link_text=''; + if ('hyper_link' in anno_item && anno_item.hyper_link.value.length>0){ + var this_id="page-" + page_number + "-anno-" + anno_item.id +"-hyperlink"; + var this_hyper_type=anno_item.hyper_link.type; + var this_hyper_link=anno_item.hyper_link.value; + hyper_link_text=""; + } + + var this_annotation = document.createElement('div'); + var inner_html = "
" + + "" + + "" + + "" + + "

" + anno_text + "

" + + hyper_link_text+ + "

" + + anno_item.comment + "

" + + ""+ + "

" + + anno_item + .member_id + "" + this.getDateFromTime(anno_item.id.split( + '_')[ + 0]) + + "

" + + "
"; + + this_annotation.innerHTML = inner_html; + + //保存批注列表的id + var this_annotation_id = "page-" + page_number + "-anno-" + anno_item.id + "-container"; + this.annotation_list_ids['page-' + page_number].push(this_annotation_id); + + return this_annotation.childNodes[0]; +} + + +//将时间戳格式化为日期 +pdfwheel.UI.prototype.getDateFromTime = function(record_time) { + // 根据毫秒数构建 Date 对象 + Date.prototype.toLocaleString = function() { + return this.getFullYear() + "-" + (this.getMonth() + 1) + "-" + this.getDate() + ' ' + this + .getHours() + + ":" + this.getMinutes() + ":" + this.getSeconds(); + }; + // 根据毫秒数构建 Date 对象 + // Date.prototype.toLocaleString = function() { + // return this.getFullYear() + "-" + (this.getMonth() + 1) + "-" + this.getDate(); + // }; + var date = new Date(parseInt(record_time)); + // 按重写的自定义格式,格式化日期 + var dateTime = date.toLocaleString(); + return dateTime; +} + + + +//open highlight and underline annotations list 展开高亮及下划线列表 +pdfwheel.UI.prototype.openAnnotations = function(node, open) { + var parent_node = node.parentNode.parentNode; + var brother_node = parent_node.parentNode.childNodes; + for (var i = 0; i < brother_node.length; i++) { + if (brother_node[i].id && brother_node[i].id != parent_node.id) { + if (open) { + document.getElementById(brother_node[i].id).removeAttribute('hidden'); + } else { + document.getElementById(brother_node[i].id).setAttribute('hidden', true); + } + } + } +} + +//copy annotation text 复制批注文本 +pdfwheel.UI.prototype.copyAnnotation = function(node) { + var tips = { + 'zh-cn': [ + '添加批注', + '添加评论', + ], + 'en': [ + 'add comments', + 'comment', + ] + } [this.tips_language]; + + var parent_node = node.parentNode; + var text1=parent_node.getElementsByTagName('p')[0].innerText; + var text2=parent_node.getElementsByTagName('p')[1].innerText; + + if (text2=== tips[0] ||text2 === tips[1]) { + text = text1; + }else{ + text = text1+' '+text2; + } + + if (post_to_parent == true) { + // window.parent.postMessage({ + // "type": 4, + // "source": "pdfjs", + // "content": text + // }, '*'); + } else { + this.copyText(text); + } +} + +//copy text 复制文本 +pdfwheel.UI.prototype.copyText = function(text) { + var tips = { + 'zh-cn': [ + '复制成功!', + ], + 'en': [ + 'Copied!', + ] + } [tips_language]; + + // number cannot be executed without.length. selectText must be converted to a string + // 数字没有 .length 不能执行selectText 需要转化成字符串 + const textString = text.toString(); + let input = document.querySelector('#copy-input'); + if (!input) { + input = document.createElement('input'); + input.id = "copy-input"; + input.readOnly = "readOnly"; // Prevents ios focus from triggering keyboard events 防止ios聚焦触发键盘事件 + input.style.position = "fixed"; + input.style.left = "-2000px"; + input.style.zIndex = "-2000"; + document.body.appendChild(input) + } + + input.value = textString; + selectText(input, 0, textString + .length + ); // ios requires text to be selected first and does not support input.select(); ios必须先选中文字且不支持 input.select(); + if (document.execCommand('copy')) { + document.execCommand('copy'); + alert(tips[0]); + } + input.blur(); + + //// input's built-in select() method does not work on the Apple side, so you need to write a similar method to select text. createTextRange(setSelectionRange) is the input method + // input自带的select()方法在苹果端无法进行选择,所以需要自己去写一个类似的方法选择文本。createTextRange(setSelectionRange)是input方法 + function selectText(textbox, startIndex, stopIndex) { + if (textbox.createTextRange) { //ie + const range = textbox.createTextRange(); + range.collapse(true); + range.moveStart('character', startIndex); //start index 起始光标 + range.moveEnd('character', stopIndex - startIndex); //end index 结束光标 + range.select(); // Not compatible with ios + } else { //firefox/chrome + textbox.setSelectionRange(startIndex, stopIndex); + textbox.focus(); + } + } +} + + +// click annotation and navigate to target page 点击批注后跳转到批注所在页面 +pdfwheel.UI.prototype.selectAnnotation = function(node) { + var node_id = node.parentNode.getAttribute('id'); + var id_split = node_id.split('-'); + + this.goToSelectAnnotation(id_split[1], id_split[3]); + event.stopPropagation(); +} + +// click annotation and navigate to target page 点击批注后跳转到批注所在页面 +pdfwheel.UI.prototype.goToSelectAnnotation = function(page_number, anno_id) { + window.PDFViewerApplication.page = parseInt(page_number); + //不透明度闪烁 + var that = this; + setTimeout(function(){ + that.shiningAnnotation(['占位', page_number, '占位', anno_id]); + that.goAnnotationByID(page_number, anno_id); + }, 1000); + event.stopPropagation(); +} + +pdfwheel.UI.prototype.goAnnotationByID = function(page_number, anno_id) { + var this_anno_id = "page-" + page_number + "-anno-" + anno_id + "-container-link"; + var this_annotation = document.getElementById(this_anno_id); + // this_span.setAttribute('style', "padding:3px;border:2px solid #ffffff;text-decoration: underline;"); + + //视图移动到当前位置 + var viewer_container = document.getElementById('viewerContainer'); + // console.log('viewer_container.scrollLeft',viewer_container.scrollLeft); + viewer_container.scrollTop = viewer_container.scrollTop + this_annotation.offsetTop - 200; + viewer_container.scrollLeft = this_annotation.offsetLeft; +} + +pdfwheel.UI.prototype.shiningAnnotation = function(id_split) { + var anno_id = id_split[3]; + var page_number = id_split[1]; + + var fabricObj = pdfAnnotation.getFabricObj(page_number); + // console.log('fabricObj', fabricObj); + + var fabric_canvas = fabricObj.page_canvas.fabric_canvas; + var anno_objects = fabric_canvas.getObjects(); + anno_objects.forEach(function(anno_item) { + if (anno_item.id == anno_id) { + var old_opacity = anno_item.opacity; + var max_opacity = 1; + var min_opacity = 0.1; + + //不透明度闪烁 + setTimeout(function(){ + anno_item.set('opacity', min_opacity); + fabric_canvas.requestRenderAll(); + }, 300); + + setTimeout(function(){ + anno_item.set('opacity', max_opacity); + fabric_canvas.requestRenderAll(); + }, 600); + + setTimeout(function(){ + anno_item.set('opacity', min_opacity); + fabric_canvas.requestRenderAll(); + }, 900); + + setTimeout(function(){ + anno_item.set('opacity', max_opacity); + fabric_canvas.requestRenderAll(); + }, 1200); + + setTimeout(function(){ + anno_item.set('opacity', min_opacity); + fabric_canvas.requestRenderAll(); + }, 1500); + + setTimeout(function(){ + anno_item.set('opacity', max_opacity); + fabric_canvas.requestRenderAll(); + }, 1800); + + setTimeout(function(){ + anno_item.set('opacity', old_opacity); + fabric_canvas.requestRenderAll(); + }, 2100); + } + }); +} + +//show download dialog 显示下载提示框 +pdfwheel.UI.prototype.showDownloadLog = function(log_str) { + // console.log(log_str); + let el = document.getElementById("my-download-process-div"); + el.style.top = '150px'; + el.removeAttribute('hidden'); + + var log_div = document.getElementById('my-download-process-log'); + log_div.innerText = ''; + log_div.innerText = log_str; +} + +//hide download dialog 隐藏下载提示框 +pdfwheel.UI.prototype.closeDownloadLog = function() { + let el = document.getElementById("my-download-process-div"); + el.style.top = '-50px'; + el.setAttribute('hidden', true); +} + +//show download dialog 显示下载提示框 +pdfwheel.UI.prototype.showExtractLog = function() { + // console.log(log_str); + let el = document.getElementById("my-extract-process-div"); + el.style.top = '150px'; + el.removeAttribute('hidden'); +} + +//hide download dialog 隐藏下载提示框 +pdfwheel.UI.prototype.closeExtractLog = function() { + let el = document.getElementById("my-extract-process-div"); + el.style.top = '-50px'; + el.setAttribute('hidden', true); +} + +//show download dialog 显示下载提示框 +pdfwheel.UI.prototype.showHyperLinkLog = function() { + // console.log(log_str); + let el = document.getElementById("my-link-set-div"); + el.style.top = '150px'; + el.removeAttribute('hidden'); +} + +//hide download dialog 隐藏下载提示框 +pdfwheel.UI.prototype.closeHyperLinkLog = function() { + let el = document.getElementById("my-link-set-div"); + el.style.top = '-50px'; + el.setAttribute('hidden', true); +} + + +// initail fabric draw 初始化 Fabric 画布 +pdfwheel.UI.prototype.fabricDraw = function(node) { + var tips = { + 'zh-cn': [ + "激活画笔", + "取消画笔", + ], + 'en': [ + 'activate draw', + 'deactivate draw', + ] + } [tips_language]; + + if (pdfAnnotation.free_draw == false || pdfAnnotation.eraser_brush==true) { + this.setFabricCanvasContainerZIndex(100); + if (node) { + node.getElementsByTagName('i')[0].classList.add('button-active'); + node.getElementsByTagName('span')[0].classList.add('button-active'); + } + pdfAnnotation.free_draw = true; + pdfAnnotation.eraser_brush = false; + + if (node!=null){ + addOperationTips(tips[0]); + } + //同时隐藏改变画笔的颜色 + var draw_node = document.getElementById('ff-pointer-obj-btn'); + if (draw_node) { + draw_node.getElementsByTagName('i')[0].classList.remove('button-active'); + draw_node.getElementsByTagName('span')[0].classList.remove('button-active'); + } + pdfAnnotationUI.activateDrawMode(); + } else { + this.setFabricCanvasContainerZIndex(10); + if (node) { + node.getElementsByTagName('i')[0].classList.remove('button-active'); + node.getElementsByTagName('span')[0].classList.remove('button-active'); + } + if (node!=null){ + addOperationTips(tips[1]); + } + + free_draw = false; + pdfAnnotation.free_draw=false; + pdfAnnotation.fabric_top = false; + } + event.stopPropagation(); +} + +pdfwheel.UI.prototype.activateDrawMode = function() { + for (var key in pdfAnnotation.fabric_list) { + pdfAnnotation.fabric_list[key].page_canvas.fabric_canvas.isDrawingMode = pdfAnnotation.free_draw; + //确认笔刷样式 + var this_fabric_canvas = pdfAnnotation.fabric_list[key].page_canvas.fabric_canvas; + var this_brush = null; + if (pdfAnnotation.eraser_brush == true) { + this_brush = new fabric.EraserBrush(this_fabric_canvas) // 使用橡皮擦画笔 + this_brush.width = default_eraser_brush_width; // 设置画笔粗细为 10 + // console.log('设置橡皮擦画笔'); + } else { + this_brush = new fabric.PencilBrush(this_fabric_canvas); + this_brush.decimate = default_brush_decimate; + this_brush.width = default_brush_width; + this_brush.color = default_brush_color; + this_brush.limitedToCanvasSize = true; + } + pdfAnnotation.fabric_list[key].page_canvas.fabric_canvas.freeDrawingBrush = this_brush; + } +} + +//修改fabric的绘图模式 +pdfwheel.UI.prototype.changeFabricDrawMode = function() { + for (var key in pdfAnnotation.fabric_list) { + pdfAnnotation.fabric_list[key].page_canvas.fabric_canvas.isDrawingMode = pdfAnnotation.free_draw; + } +} + +// initail fabric draw 初始化 Fabric 画布 +pdfwheel.UI.prototype.fabricDrawNoActive = function(node) { + if (pdfAnnotation.free_draw == false) { + this.setFabricCanvasContainerZIndex(100); + pdfAnnotation.free_draw = true; + } else { + this.setFabricCanvasContainerZIndex(10); + pdfAnnotation.free_draw = false; + pdfAnnotation.eraser_brush = false; + } + pdfAnnotation.fabric_top = false; + for (var key in pdfAnnotation.fabric_list) { + pdfAnnotation.fabric_list[key].page_canvas.fabric_canvas.isDrawingMode = pdfAnnotation.free_draw; + } +} + +pdfwheel.UI.prototype.changeMouseText = function(op) { + var tips = { + 'zh-cn': [{ + 'add_text': '单击页面插入文字或双击取消', + 'add_arrow': '页面拖拽绘制箭头或双击取消', + 'add_rect': '页面拖拽绘制矩形或双击取消', + 'add_screenshot': '页面拖拽截图或双击取消', + 'add_circle': '页面拖拽绘制圆或双击取消', + 'add_image': '单击页面插入图片或双击取消', + 'add_line': '页面拖拽绘制直线或双击取消', + 'add_idcard_stamp': '单击页面插入身份印章或双击取消', + 'add_check': '单击页面插入对勾或双击取消', + 'add_hyperlink': '页面拖拽绘制超链接对象或双击取消', + }], + 'en': [{ + 'add_text': 'click canvas insert textbox or doubleclick cancle', + 'add_arrow': 'canvas draw arrow or doubleclick cancle', + 'add_rect': 'canvas draw rectangle or doubleclick cancle', + 'add_screenshot': 'canvas draw screenshot or doubleclick cancle', + 'add_circle': 'click canvas insert circle or doubleclick cancle', + 'add_image': 'click canvas insert your image or doubleclick cancle', + 'add_line': 'canvas draw straight line or doubleclick cancle', + 'add_idcard_stamp': 'click canvas insert idcardc stamp or doubleclick cancle', + 'add_check': 'click canvas insert check or doubleclick cancle', + 'add_hyperlink': 'canvas draw hyperlink rect or doubleclick cancle', + }] + } [this.tips_language]; + var current_message=tips[0][pdfAnnotation.current_click_type]; + this.current_mouse_text = current_message; + this.addMouseMoveListen(); + if (op==1){ + addOperationTips(current_message); //添加操作提示信息 + } + // console.log('当前鼠标的文字', this.current_mouse_text); +} + +pdfwheel.UI.prototype.addMouseMoveListen = function() { + var text = document.getElementById('my_mouse_text'); + text.removeAttribute('hidden'); + text.innerText = this.current_mouse_text; + pdf_viewer.addEventListener('mousemove', this.moveMouseText); +} + +pdfwheel.UI.prototype.getViewerPosition = function() { + var container_pos={ + x:0, + y:0, + }; + try{ + container_pos=document.getElementById(pdfHighlight.pdf_view_container_id).getBoundingClientRect(); + return container_pos; + }catch{ + return container_pos; + } +} + +pdfwheel.UI.prototype.moveMouseText = function(e) { + var text = document.getElementById('my_mouse_text'); + // text.style.left = e.screenX-container_pos.x + 15 + 'px'; + // text.style.top = e.screenY-container_pos.y - 25 + 'px'; + // text.style.left = e.screenX + 15 + 'px'; + // text.style.top = e.screenY-65 + 'px'; + // text.style.left = e.pageX + 15 + 'px'; + // text.style.top = e.pageY + 15 + 'px'; + text.style.left = e.clientX + 15 + 'px'; + text.style.top = e.clientY + 15 + 'px'; +} + +pdfwheel.UI.prototype.removeMouseMoveListen = function() { + pdf_viewer.removeEventListener('mousemove', this.moveMouseText); + var text = document.getElementById('my_mouse_text'); + text.setAttribute('hidden',true); + text.innerText = this.current_mouse_text; + text.style.left = '-500px'; + text.style.top = '-500px'; +} + +//Keep the gesture zoom force for pdf render pages 保留pdf渲染页面的手势缩放 +pdfwheel.UI.prototype.forceZoomIn = function() { + var DEFAULT_SCALE_DELTA = 1.1; + var MAX_SCALE = 10; + let newScale = window.PDFViewerApplication.pdfViewer.currentScale; + newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); + newScale = Math.ceil(newScale * 10) / 10; + newScale = Math.min(MAX_SCALE, newScale); + window.PDFViewerApplication.pdfViewer.currentScaleValue = newScale; + //draw annotation 绘制批注 + pdfAnnotation.drawAllPageAnnotations(); +} +//Keep the gesture zoom force for pdf render pages 保留pdf渲染页面的手势缩放 +pdfwheel.UI.prototype.forceZoomOut = function() { + var DEFAULT_SCALE_DELTA = 1.1; + var MIN_SCALE = 0.1; + let newScale = window.PDFViewerApplication.pdfViewer.currentScale; + newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); + newScale = Math.floor(newScale * 10) / 10; + newScale = Math.max(MIN_SCALE, newScale); + window.PDFViewerApplication.pdfViewer.currentScaleValue = newScale; + //draw annotation 绘制批注 + pdfAnnotation.drawAllPageAnnotations(); +} + +//listn touch event 绑定触屏事件 +pdfwheel.UI.prototype.addPinchListener = function() { + let element = document.getElementById("viewerContainer"); + var that = this; + element.addEventListener("touchstart", function(e) { + that.onTouchStart(e); + // e.preventDefault(); + }); + element.addEventListener("touchmove", function(e) { + that.onTouchMove(e); + // e.preventDefault(); + }); + element.addEventListener("touchend", function(e) { + that.onTouchEnd(e); + e.preventDefault(); + }); +} + +//record touches coordinate for start and end 记录触屏触点坐标 记录起始和结束点 +pdfwheel.UI.prototype.onTouchStart = function(evt) { + this.touchState = { + //first touch for all touch 多点触屏的第一点 + startX: evt.touches[0].pageX, + startY: evt.touches[0].pageY, + endX: evt.touches[0].pageX, + endY: evt.touches[0].pageY, + + //second touch for all touch 多点触屏的第二点 单点触屏时记录坐标为 -1 + startX2: evt.touches[1] ? evt.touches[1].pageX : -1, + startY2: evt.touches[1] ? evt.touches[1].pageY : -1, + endX2: evt.touches[1] ? evt.touches[1].pageX : -1, + endY2: evt.touches[1] ? evt.touches[1].pageY : -1 + }; +} + +//Record the touch screen contact coordinates Update the end point coordinates when the touch screen moves 记录触屏触点坐标 触屏移动时更新结束点坐标 +pdfwheel.UI.prototype.onTouchMove = function(evt) { + if (this.touchState === null) { + return; + } + this.touchState.endX = evt.touches[0].pageX; + this.touchState.endY = evt.touches[0].pageY; + this.touchState.endX2 = evt.touches[1] ? evt.touches[1].pageX : -1; + this.touchState.endY2 = evt.touches[1] ? evt.touches[1].pageY : -1; +} + + +//Decide whether to zoomIn or zoomUut at the end of the touch screen 触屏结束时 判断是否放大缩小 +pdfwheel.UI.prototype.onTouchEnd = function(evt) { + var touchState = this.touchState; + if (touchState === null) { + return evt; //return touch event otherwise through error 返回触屏事件,否则报错[Intervention] Ignored attempt to cancel a touchend event with cancelable=false, for example because scrol + } + + //弹出选中后操作框 + pdfHighlight.selectionAct(); + //Calculate the distance between two touches points 计算触屏两点间距离 + var getDistance = function(startX, startY, endX, endY) { + return Math.hypot(endX - startX, endY - startY); + }; + + if (touchState.startX2 != -1 && touchState.endX2 != -1 && touchState.startY2 != -1 && touchState.endY2 != -1) { + let distanceStart = getDistance(touchState.startX, touchState.startY, touchState.startX2, touchState + .startY2); + let distanceEnd = getDistance(touchState.endX, touchState.endY, touchState.endX2, touchState.endY2); + // Compare the distance between two points at the beginning and two single distances at the end to determine whether it is method or reduction + //起始时两点距离和结束时两单距离进行比较,判断是方法还是缩小 + if (distanceStart < distanceEnd) { + this.forceZoomIn(); + } else if (distanceStart > distanceEnd) { + this.forceZoomOut(); + } + } +} + + +// jsPlumb.ready(function() { +// var common = { +// endpoint: 'Rectangle', +// connector: ['Flowchart'], +// anchor: ['Left', 'Right'] +// } + +// jsPlumb.connect({ +// source: 'item_left', +// target: 'item_right', +// endpoint: 'Rectangle' +// }, common) + +// jsPlumb.draggable('item_left') +// jsPlumb.draggable('item_right') +// }) + +pdfwheel.JSplump.prototype.clearAllAnnotations = function(node_id) { + var page_number = node_id.split('-')[1]; + if (page_number == this.last_page_number) { + this.clearJsPlump(); //如果关闭了最后绘制的连接线,则删除 + this.draw_connect = false; + } else { + this.refreshConnections(); + } +} + +pdfwheel.JSplump.prototype.refreshConnections = function() { + //如果不是关闭了当前页面,则重新绘制 + // console.log('重新绘制连线'); + var key = this.last_key; + var all_page_list = this.last_all_page_list; + this.connectOnePageAnnotations(key, all_page_list[key]); +} + +pdfwheel.JSplump.prototype.connectAllAnnotations = function(node_id) { + // console.log('pdfAnnotationUI..annotation_list_ids', pdfAnnotationUI.annotation_list_ids); + // var id_list = ['page-1-anno-1678531092359_2-container', 'page-1-anno-1678531092921_3-container', + // 'page-1-anno-1678531093885_4-container', 'page-1-anno-1678531094436_5-container', + // 'page-1-anno-1678531096168_6-container', 'page-1-anno-1678531096888_7-container', + // 'page-1-anno-1678531098295_8-container' + // ]; + this.draw_connect = true; //绘制连接线 + // console.log('node_id', node_id); + var page_number = node_id.split('-')[1]; + var key = 'page-' + page_number; + var all_page_list = pdfAnnotationUI.annotation_list_ids; + + this.last_page_number = page_number; //当前操作的最后一个页码 + this.last_all_page_list = all_page_list; + this.last_key = key; + + + this.connectOnePageAnnotations(key, all_page_list[key]); + // 监听批注列表对象滚动 + var annotation_list_container = document.getElementById('annotations_list'); + var that = this; + if (annotation_list_container) { + annotation_list_container.addEventListener('scroll', function(e) { + // console.log('批注列表滚动了,重新绘制'); + that.refreshConnections(); + }); + } + + var viewerContainer = document.getElementById('viewerContainer'); + viewerContainer.addEventListener('scroll', function(e) { + // console.log('pdf预览页面滚动了'); + that.refreshConnections(); + }); + + // for (var key in all_page_list) { + // this.connectOnePageAnnotations(key,all_page_list[key]); + // } +} + +pdfwheel.JSplump.prototype.clearJsPlump = function() { + // console.log('jsPlumb',jsPlumb); + if (first_load == false) { + //清空jsplump画布 + jsPlumb.deleteEveryConnection(); + jsPlumb.deleteEveryEndpoint(); + jsPlumb.reset(); + } else { + first_load = false; + } +} + +pdfwheel.JSplump.prototype.deleteConnectByID = function(page_number, anno_id) { + if (this.draw_connect == false) { + return; + } + var this_link_id = "page-" + page_number + "-anno-" + anno_id + "-container-link"; + var connections = jsPlumb.getAllConnections(); + for (var i in connections) { + // console.log('connections[i]',connections[i]); + // connections 是线数据数组 + // connections[i].sourceId; // 线的起始html元素的ID + // connections[i].targetId; // 线的目标html元素的ID + if (connections[i].sourceId === this_link_id) { // 删除相匹配的线 + jsPlumb.deleteConnection(connections[i]); // deleteConnection(@) 删除链接线 @线对象 + break; + } + } + + var that = this; + setTimeout(function() { + that.refreshConnections(); + }, 100) + // this.refreshConnections(); +} + +pdfwheel.JSplump.prototype.connectOnePageAnnotations = function(key, id_list) { + if (this.draw_connect == false) { + return; + } + + if (id_list == undefined) { + return; + } + this.clearJsPlump(); + var common = { + // endpoint: 'Dot', + endpoint: 'Rectangle', + connector: ['Flowchart'], + anchor: ['Left', 'Right'] + } + + // var jsplump_container_id = key + '-annotationLayer'; + var jsplump_container_id = 'jsplump-container'; + jsPlumb.setContainer(document.getElementById(jsplump_container_id)); //设置容器id + // console.log('容器id', jsplump_container_id); + // var left_id = 'test_jsplump'; + for (var i = 0; i < id_list.length; i++) { + var right_id = id_list[i]; + var left_id = id_list[i] + '-link'; + + var right_e = document.getElementById(right_id); + var left_e = document.getElementById(left_id); + + if (right_e == null || left_e == null) { + continue + } + + //如果对象被隐藏则不绘制连接线 + var hidden_right = right_e.getAttribute('hidden'); + var hidden_left = left_e.getAttribute('hidden'); + + if (hidden_right == null && hidden_left == null) { + var connection = jsPlumb.connect({ + source: left_id, + target: right_id, + endpoint: 'Rectangle', + // endpoint: 'Dot', + // Endpoints: [ + // ['Dot', { + // radius: 2 + // }], + // ['Dot', { + // radius: 2 + // }] + // ], + paintStyle: { + strokeWidth: 2, // 设置连接线的粗细 + stroke: "#FFD700", // 连接线的颜色 + dashstyle: "4 2", // 连接线的虚线样式 + shadow: "5px rgba(136, 136, 136, 0.3)", // 阴影 + }, + endpointStyle: { + fill: 'rgba(136, 136, 136, 0.3)', + // fill: 'rgba(255, 237, 0,0.60)', + outlineStroke: 'darkgray', + // outlineWidth: 2, + radius: 7, + }, + }, common); + } + + + // jsPlumb.draggable(left_id); + // jsPlumb.draggable(right_id); + + // 监听源元素的移动事件 + // jsPlumb.draggable(right_id, { + // stop: function(event) { + // // 源元素移动后,重新计算连接线位置 + // connection.repaint(); + // } + // }); + } +} + +//绘制水印文字 +pdfwheel.Annotation.prototype.drawWaterMark =function(page_width, page_height) { + const canvas = document.createElement('canvas'); + canvas.width = page_width; + canvas.height = page_height; + const ctx = canvas.getContext('2d'); + + // 画笔样式 + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + ctx.font = '12px Microsoft Yahei'; + ctx.fillStyle = 'rgba(0, 0, 0, 0.3)'; + + const name = window.waterStr || '测试水印' + let yd = new Date() + let m = (yd.getMonth() + 1 > 9) ? (yd.getMonth() + 1) : ('0' + (yd.getMonth() + 1)) + let d = yd.getDate() > 9 ? yd.getDate() : ('0' + yd.getDate()) + const date = `${yd.getFullYear()}-${m}-${d}` + + const canvasWater = document.createElement('canvas'); + + const waterMarkSize = 400; // 水印大小 + canvasWater.width = waterMarkSize * 1.5; + canvasWater.height = waterMarkSize; + const ctxWater = canvasWater.getContext('2d'); + ctxWater.font = '20px Microsoft Yahei'; + ctxWater.fillStyle = 'rgba(0, 0, 0, 0.1)' + ctxWater.textAlign = 'left'; + ctxWater.textBaseline = 'top'; + if(canvas.width < canvas.height) { + ctxWater.rotate(20 * Math.PI / 180); + } else { + ctxWater.rotate(-20 * Math.PI / 180); + } + + ctxWater.fillText(name, 60, 80); + ctxWater.fillText(date, 60, 105); + ctxWater.font = '40px Microsoft Yahei'; + ctxWater.fillStyle = 'rgba(0, 0, 0, 0.2)' + ctxWater.fillText(functLocStr || '', 60, 130); + ctx.fillStyle = ctx.createPattern(canvasWater, 'repeat'); // 绘制重复的水印 + ctx.fillRect(0, 0, canvas.width, canvas.height); + + + // 将Canvas内容保存为PNG图片 + var dataURL = canvas.toDataURL('image/png'); + return dataURL; +} + diff --git a/src/assets/pdf-annotation/annotation/config.js b/src/assets/pdf-annotation/annotation/config.js new file mode 100755 index 0000000..67e5afb --- /dev/null +++ b/src/assets/pdf-annotation/annotation/config.js @@ -0,0 +1,829 @@ +var post_to_parent = false; +var shiftKeyPressed = false; +// tips_language决定了操作提示语 +var tips_language = 'zh-cn'; +// var tips_language = 'en'; +var first_load = true; +var default_show_annotation_list = false; //控制右侧列表是否默认显示 +if (window.screen.availWidth <= 650) { + default_show_annotation_list = false; +} + +var last_connect_id = '-1'; +var run_in_angular=true; + +var select_link_type='url'; //超链接类型 +var current_link_annotation_item=null; //当前批注对象 +var is_hyper_link_highlight=false; //是否高亮 +var is_hyper_edit=false; //是否高亮 +var hyper_open_page=1; +var hyper_open_file=false; + +var show_state = {}; //是否默认显示页面的批注列表 + +var add_water_mark = false; //是否添加水印 + +var show_my_menu = false; //显示颜色控制面板 +var fold_my_munu=false; +var show_setting_menu = false; //显示配置面板 +var changed_number_value = false; //修改颜色面板的内容 +var onload_record_history = true; //加载时保存一次历史记录 +var object_modified = false; //对象是否被编辑 + +// var add_annotation_list_title=true; //保留批注的表头按钮 +var add_annotation_list_title=false; //保留批注的表头按钮 + +//是否默认显示批注 +var hidden_open = ''; +var hidden_close = ''; +if (default_show_annotation_list == false) { + hidden_open = "hidden='true'"; +} else { + hidden_close = "hidden='true'"; +} + +var default_show_onepage_annotation_list = false; //控制右侧列表每页批注是否默认展开 + +var hidden_container = ''; +if (default_show_onepage_annotation_list == false) { + hidden_container = "hidden='true'"; + hidden_open = "hidden='true'"; + hidden_close = ""; +} else { + hidden_close = "hidden='true'"; + hidden_open = ""; +} + +var defult_left = 0; +var defult_top = 0; +var left_top_offset = 30; + +//默认在视图上的显示比例 +var show_scale_value = 1; + +//下划线宽度和画笔宽度 +var default_underline_width = 1; +var default_brush_width = 15; +var default_arrow_width = 3; //箭头粗细 + +//橡皮擦的默认大小 +var default_eraser_brush_width = 30; +var default_text_size = 30; + +//待提取的pdf页面列表 +var extract_page_numbers = []; + +var default_brush_opacity=100; +var default_fill_color_opacity = 30; //填充色不透明度 +var default_border_color_opacity = 100; //边框色不透明度 +//各类批注的的颜色 +var default_border_color = "rgba(17, 153,158,1)"; +var default_text_color = "rgba(17, 153,158,1)"; +var default_fill_color = 'rgba(255, 237, 0,0.30)'; +var default_hyperlink_fill_color = 'rgba(0,129,255,0.3)'; +var default_stamp_color = "#0081FF"; +var default_brush_color = '#E60000'; +// var default_brush_decimate = 10; //画笔拐角流畅度 +var default_brush_decimate = 0; //画笔拐角流畅度 +var default_screenshot_rect_fill_color = 'rgba(236, 240, 241,0.5)'; +var default_screenshot_rect_background_color = "rgba(17, 153,158,1)"; +var default_screenshot_rect_text_color = 'rgba(255, 255, 255,1)'; +var default_transparency_color = 'rgba(255, 255, 255,0)'; +var default_highlight_color = 'rgba(255, 237, 0,1)'; +var default_hyper_highlight_color='rgba(0,129,255,1)'; +var default_underline_color = 'rgba(57, 181, 74,1)'; +var defult_top = 0; +var defult_screen_shot_top = 30; +var default_eraser_color = "#0081FF"; + +var default_text; +var default_idcard_stamp; +var default_triangle; +var default_line; +var default_check_left_line; +var default_check_right_line; +var default_rectangle; +var default_straight_line; +var default_screenshot_text; +var default_screenshot_rectangle; +var default_circle; +var default_fill_opacity; + +//设置默认批注对象 +function setDefaultAnnotations() { + //default annotation object 默认批注对象 + default_text = { + left: defult_left, + top: defult_top, + fill: default_text_color, + fontSize: default_text_size, + selectable: true, + id: 'id', + }; + + //身份印章配置,包括颜色,文字大小等 + default_idcard_stamp = { + left: defult_left, + top: defult_top, + fill: default_stamp_color, + textAlign: 'center', + fontSize: 25, + selectable: true, + padding: 2, + my_type:'idcard_stamp_text', + }; + + default_triangle = { + width: 30, + height: 40, + fill: default_border_color, + left: 200 + left_top_offset, + top: 0 + left_top_offset, + angle: 90, + }; + + default_line = { + left: 0 + left_top_offset, + top: 13 + left_top_offset, + strokeWidth: 4, + stroke: default_border_color, + }; + + //对勾预制函数,由左右两条线构成 + var default_check_width = 12; + default_check_left_line = { + left: 66 + default_check_width / 2 + left_top_offset, + top: 54 + default_check_width + left_top_offset, + angle: 67, + strokeWidth: default_check_width, + stroke: default_stamp_color, + }; + + default_check_right_line = { + left: 210 + default_check_width / 4 + left_top_offset, + top: 10 + default_check_width + left_top_offset, + angle: 135, + strokeWidth: default_check_width, + stroke: default_stamp_color, + }; + + default_rectangle = { + left: defult_left, + top: defult_top, + width: 300, + height: 300, + fill: default_fill_color, + stroke: default_border_color, + strokeSize: 1, + id: 'id', + }; + + // let line1 = new fabric.Line([lineleft, lineheight, lineleft, + // 0], { //终止位置,线长,起始位置,top,这里是从项目中截下来的我用了变量代替,你要用的话lineheight和lineleft用自己的变量或者数字代替。如果两个终止位置和起始位置的数值一样那么这个线条会垂直,这个应该很好理解。 + // fill: '#5E2300', //填充颜色 + // stroke: '#5E2300', //笔触颜色 + // strokeWidth: 2, //笔触宽度 + // hasControls: false, //选中时是否可以放大缩小 + // hasRotatingPoint: false, //选中时是否可以旋转 + // hasBorders: false, //选中时是否有边框 + // transparentCorners: true, + // perPixelTargetFind: true, //默认false。当设置为true,对象的检测会以像互点为基础,而不是以边界的盒模型为基础。 + // selectable: true, //是否可被选中 + // lockMovementX: true, //X轴是否可被移动(true为不可,因为前缀是lock) + // lockMovementY: true, //Y轴是否可被移动(true为不可,因为前缀是lock) + // }); + + default_straight_line + = { //终止位置,线长,起始位置,top,这里是从项目中截下来的我用了变量代替,你要用的话lineheight和lineleft用自己的变量或者数字代替。如果两个终止位置和起始位置的数值一样那么这个线条会垂直,这个应该很好理解。 + fill: default_border_color, //填充颜色 + stroke: default_border_color, //笔触颜色 + strokeWidth: 3, //笔触宽度 + hasControls: true, //选中时是否可以放大缩小 + hasRotatingPoint: true, //选中时是否可以旋转 + hasBorders: true, //选中时是否有边框 + selectable: true, //是否可被选中 + }; + + //截屏批注 + default_screenshot_text = { + left: defult_left, + top: defult_top, + fill: default_screenshot_rect_text_color, + backgroundColor: default_screenshot_rect_background_color, + fontSize: 25, + strokeWidth: 5, + underline: true, + selectable: true, + id: 'id', + lockRotation: true, + }; + + default_screenshot_rectangle = { + left: defult_left, + top: defult_screen_shot_top, + width: 300, + height: 300, + fill: default_screenshot_rect_fill_color, + stroke: default_fill_color, + lockRotation: true, + strokeSize: 1, + id: 'id', + lockRotation: true, + }; + + default_circle = { + left: defult_left, + top: defult_top, + radius: 200, + fill: default_fill_color, + stroke: default_border_color, + strokeSize: 1, + id: 'id', + }; +} + +//create color control panel 创建颜色控制面板 +function setColorControl() { + if (isIE11()){ + setColorControlForIE(); + return; + } + + var my_menu_node = document.getElementById('my-menu'); + my_menu_node.innerHTML = ''; //clear 清空所有子元素 + var buttons_text = { + 'zh-cn': [ + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + ], + 'en': [ + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + ] + } [tips_language]; + + for (var i = 0; i < buttons_text.length; i++) { + var parent_button = document.createElement('div'); //add button 增加按钮 + var outer_html = buttons_text[i]; + parent_button.innerHTML = outer_html; + my_menu_node.appendChild(parent_button.childNodes[0]); + } + + + //listen color and opacity change 监听颜色变化和透明度变化 + pdfAnnotation.observeValue('fill'); + pdfAnnotation.observeValue('stroke'); + pdfAnnotation.observeValue('backgroundColor'); + pdfAnnotation.observeNumeric('opacity'); + pdfAnnotation.observeNumeric('strokeWidth'); + // setMenuInputBackgroundColor(); +} + +//create color control panel 创建颜色控制面板 +function setColorControlForIE() { + var my_menu_node = document.getElementById('my-menu'); + my_menu_node.innerHTML = ''; //clear 清空所有子元素 + var buttons_text = { + 'zh-cn': [ + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + ], + 'en': [ + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '', + '
', + ] + } [tips_language]; + + for (var i = 0; i < buttons_text.length; i++) { + var parent_button = document.createElement('div'); //add button 增加按钮 + var outer_html = buttons_text[i]; + parent_button.innerHTML = outer_html; + my_menu_node.appendChild(parent_button.childNodes[0]); + } + + //设置颜色选择器 + setSelections("fill"); + setSelections("stroke"); + setSelections("backgroundColor"); + + + //listen color and opacity change 监听颜色变化和透明度变化 + pdfAnnotation.observeIEValue('fill'); + pdfAnnotation.observeIEValue('stroke'); + pdfAnnotation.observeIEValue('backgroundColor'); + pdfAnnotation.observeNumeric('opacity'); + pdfAnnotation.observeNumeric('strokeWidth'); + // setMenuInputBackgroundColor(); +} + +//选中文字后浮动菜单生成 +function setHorAnnotationOperater() { + var buttons_text = { + 'zh-cn': [ + '', + '', + '', + '', + '', + ], + 'en': [ + '', + '', + '', + '', + ] + } [tips_language]; + + var single_buttons = document.getElementById('ff-hor-annotation-btn'); + single_buttons.innerHTML = ''; //clear 清空所有子元素 + + for (var i = 0; i < buttons_text.length; i++) { + var parent_button = document.createElement('button'); //add button 增加按钮 + var outer_html = buttons_text[i]; + parent_button.innerHTML = outer_html; + single_buttons.appendChild(parent_button.childNodes[0]); + + if (i != buttons_text.length - 1) { + var split_div = document.createElement('div'); + split_div.classList.add('vertical-split'); + single_buttons.appendChild(split_div); + } + } +} + + +function setLinkControl(){ + var extract_pdf_html = { + 'zh-cn': [ + '
'+ + ''+ + ''+ + ''+ + '
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
' + ], + 'en': [ + '
'+ + ''+ + ''+ + ''+ + '
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
' + ] + } [tips_language]; + document.getElementById('my-link-set-div').innerHTML = extract_pdf_html[0]; +} + +//选中文字后浮动菜单生成 +function setSingleOperater() { + var buttons_text = { + 'zh-cn': [ + '', + '', + '', + '', + '', + ], + 'en': [ + '', + '', + '', + '', + '', + ] + } [tips_language]; + + var single_buttons = document.getElementById('ff-copyconfirm-btn'); + single_buttons.innerHTML = ''; //clear 清空所有子元素 + + for (var i = 0; i < buttons_text.length; i++) { + var parent_button = document.createElement('button'); //add button 增加按钮 + var outer_html = buttons_text[i]; + parent_button.innerHTML = outer_html; + single_buttons.appendChild(parent_button.childNodes[0]); + + // if (i != buttons_text.length - 1) { + // var split_div = document.createElement('div'); + // split_div.classList.add('vertical-split'); + // single_buttons.appendChild(split_div); + // } + } + var down_triangle = document.createElement('div'); + down_triangle.innerHTML=''; + down_triangle.classList.add('popup'); + single_buttons.appendChild(down_triangle); +} + +// 顶部注释工具栏生成 +function setAnnotationButtons() { + var buttons_text = [ + '', + '
', + '', + '', + '', + '
', + '', + // '', + ]; + var annotation_buttons_node = document.getElementById('toolbarViewerRight'); + var new_html = ''; + for (var i = 0; i < buttons_text.length; i++) { + new_html += buttons_text[i]; + } + annotation_buttons_node.innerHTML += new_html; +} +// function setAnnotationButtons() { +// // return; +// var annotation_buttons_node = document.getElementById('firefly-annotation-buttons'); +// +// annotation_buttons_node.innerHTML = ''; //clear 清空所有子元素 +// // '
' +// var buttons_text = { +// 'zh-cn': [ +// '
', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '
', +// '
', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '
', +// '
', +// '
', +// '', +// '', +// '', +// '', +// '', +// '
', +// ], +// 'en': [ +// '
', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '
', +// '
', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '', +// '
', +// '
', +// '
', +// '', +// '', +// '', +// '', +// '', +// '
', +// ] +// } [tips_language]; +// +// var new_html = ''; +// for (var i = 0; i < buttons_text.length; i++) { +// new_html += buttons_text[i]; +// } +// annotation_buttons_node.innerHTML = new_html; +// } + +//create help text and show 创建帮助文本并显示 +function openHelpDoc() { + var helps = { + 'zh-cn': [{ + 'title': '下载文件', + 'detail': '下载批注后的文件,批注将标记在下载的文件中且不可撤销,如果需要编辑批注请打开未经本应用导入的文件', + }, + { + 'title': '文本高亮', + 'detail': '高亮滑选的文本,对非黑色字体无效。', + }, + { + 'title': '文本下划线', + 'detail': '给滑选的文本增加下划线,对非黑色字体无效。', + }, + { + 'title': '注释列表', + 'detail': '打开注释列表并编辑(复制/删除/前往)', + }, + { + 'title': '选中对象', + 'detail': '选中批注对象并修改', + }, + { + 'title': '插入图片', + 'detail': '插入本地图片,会自动压缩图片', + }, + { + 'title': '画笔工具', + 'detail': '在当前页面使用画笔工具自由绘制', + }, + { + 'title': '文本框工具', + 'detail': '给当前页面添加可输入文本框', + }, + { + 'title': '箭头工具', + 'detail': '给当前页面添加箭头', + }, + { + 'title': '矩形工具', + 'detail': '给当前页面添加矩形框', + }, + { + 'title': '圆形工具', + 'detail': '给当前页面添加圆', + }, + { + 'title': '导出注释', + 'detail': '导出完整结构标注,用于给同名文件增加标注。', + }, + { + 'title': '导入标注', + 'detail': '导入完整结构标注,用于给当前文件增加标注。', + }, + { + 'title': '下载标注', + 'detail': '导出当前文件标注和评论为txt格式文档。', + }, + { + 'title': '切换语言', + 'detail': '切换提示语言至英文', + }, + { + 'title': '帮助文档', + 'detail': '打开帮助文档。', + }, + ], + 'en': [{ + 'title': 'download', + 'detail': 'download pdf with annotations mark, it can not be undo, if you want to modify annotations, please open source file', + }, { + 'title': 'highlight', + 'detail': 'highlight selected text, valid for only black text', + }, + { + 'title': 'underline', + 'detail': 'underline selected text, valid for only black text', + }, + { + 'title': 'annotation list', + 'detail': 'show annotation list and edit (copy/delete/gotp)', + }, + { + 'title': 'select object', + 'detail': 'select annotation to modify', + }, + { + 'title': 'insert image', + 'detail': 'insert image to current page and compress it', + }, + { + 'title': 'free draw', + 'detail': 'free draw by brush in current page', + }, + { + 'title': 'text input box', + 'detail': 'add text input box to current page', + }, + { + 'title': 'arrow tool', + 'detail': 'add arrow to current page', + }, + { + 'title': 'rectangle tool', + 'detail': 'add rectangle to current page', + }, + { + 'title': 'circle tool', + 'detail': 'add circle to current page', + }, + { + 'title': 'output annotations', + 'detail': 'output annotations for importing', + }, + { + 'title': 'import annotations', + 'detail': 'import annotations for current file', + }, + { + 'title': 'download annotations', + 'detail': 'download only annotations text and comments to txt', + }, + { + 'title': 'set language', + 'detail': 'change tips language to Chinese', + }, + { + 'title': 'help', + 'detail': 'open help file', + }, + ] + } [tips_language]; + + if (post_to_parent == true) { + helps = [{ + 'title': '下载文件', + 'detail': '下载批注后的文件,批注将标记在下载的文件中且不可撤销,如果需要编辑批注请打开未经本应用导入的文件', + }, { + 'title': '文本高亮', + 'detail': '高亮滑选的文本,对非黑色字体无效。', + }, + { + 'title': '文本下划线', + 'detail': '给滑选的文本增加下划线,对非黑色字体无效。', + }, + { + 'title': '注释列表', + 'detail': '打开注释列表并编辑(复制/删除/前往)', + }, + { + 'title': '选中对象', + 'detail': '选中批注对象并修改', + }, + { + 'title': '插入图片', + 'detail': '插入本地图片,会自动压缩图片', + }, + { + 'title': '画笔工具', + 'detail': '在当前页面使用画笔工具自由绘制', + }, + { + 'title': '文本框工具', + 'detail': '给当前页面添加可输入文本框', + }, + { + 'title': '箭头工具', + 'detail': '给当前页面添加箭头', + }, + { + 'title': '矩形工具', + 'detail': '给当前页面添加矩形框', + }, + { + 'title': '圆形工具', + 'detail': '给当前页面添加圆', + }, + { + 'title': '导出注释', + 'detail': '导出完整结构标注,用于给同名文件增加标注。', + }, + { + 'title': '导入标注', + 'detail': '导入完整结构标注,用于给当前文件增加标注。', + }, + { + 'title': '云端保存', + 'detail': '将标注保存到云端,仅可用于云端文件。', + }, + { + 'title': '加载云端标注', + 'detail': '用于云端标注未正确加载的情况。', + }, + { + 'title': '下载标注', + 'detail': '导出当前文件标注和评论为txt格式文档。', + }, + { + 'title': '帮助文档', + 'detail': '打开帮助文档。', + }, + ]; + } + + var help_str = { + 'zh-cn': '帮助文档:\n祝使用愉快\n\n按钮功能说明:\n', + 'en': 'help file for buttons introduction:\n', + } [tips_language]; + + var nums = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳']; + for (var i = 0; i < helps.length; i++) { + var this_help = helps[i]; + help_str += nums[i] + ' ' + this_help['title'] + ' : ' + this_help['detail'] + '\n'; + } + + alert(help_str); +}; + +//listen tips_language change 监听tips language 的变化 +function setLanguage(op) { + var tips = { + 'zh-cn': [ + "提示语言已切换至中文", + "提示语言已切换至英文", + ], + 'en': [ + 'tips language changed to Chinese', + 'tips language changed to English', + ] + } [tips_language]; + if (op == 0) { + tips_language = "zh-cn"; + addOperationTips(tips[0]); + } else { + tips_language = "en"; + addOperationTips(tips[1]); + } + //设置提示语言 + pdfAnnotation.tips_language=tips_language; + pdfAnnotationUI.tips_language=tips_language; + pdfHighlight.tips_language=tips_language; + JSplump.tips_language=tips_language; + + setAnnotationButtons(); + setColorControl(); + setSettingsControl(); //添加设置面板 + setSingleOperater(); + setExtractPDFDiv(); //提取 pdf 的组件 + setLinkControl(); + // setHorAnnotationOperater(); //设置水平按钮 + //Listen again after switching languages 切换语言之后重新监听 + pdfAnnotation.observeValue('fill'); + pdfAnnotation.observeValue('stroke'); + pdfAnnotation.observeValue('backgroundColor'); + pdfAnnotation.observeNumeric('opacity'); + pdfAnnotation.observeNumeric('strokeWidth'); + setMenuInputBackgroundColor(); + if (pdfAnnotationUI.show_annotation_list) { + pdfAnnotationUI.showAnnotationList(); + } +}; + +//防止手机端双击缩放和清空添加状态 +function preventDoubleClick(event) { + event.preventDefault(); +}; + diff --git a/src/assets/pdf-annotation/annotation/drag.js b/src/assets/pdf-annotation/annotation/drag.js new file mode 100755 index 0000000..b5e7238 --- /dev/null +++ b/src/assets/pdf-annotation/annotation/drag.js @@ -0,0 +1,212 @@ +var run_in_angular = true; +var is_droping_text = false; +var current_drop_text = ''; + +function listenFileDrag() { + var oDragWrap = document.getElementById('viewer'); + //拖进 + oDragWrap.addEventListener( + "dragenter", + function(e) { + e.preventDefault(); + }, + false + ); + + //拖离 + oDragWrap.addEventListener( + "dragleave", + function(e) { + // dragleaveHandler(e); + }, + false + ); + + //拖来拖去 , 一定要注意dragover事件一定要清除默认事件 + //不然会无法触发后面的drop事件 + oDragWrap.addEventListener( + "dragover", + function(e) { + e.preventDefault(); + }, + false + ); + + //扔 + oDragWrap.addEventListener( + "drop", + function(e) { + dropHandler(e); + }, + false + ); +} + +// listening paste +document.addEventListener('paste', function(event) { + if (is_hyper_link_highlight==true || is_hyper_edit==true){ + return; + } + + var isChrome = false; + if (event.clipboardData || event.originalEvent) { + var data = (event.clipboardData && event.clipboardData.items) || []; + // get paste text + var copied_text=event.clipboardData.getData('text'); + if (copied_text.length!=0){ + dropTextToPDF(copied_text); + return; + }else{ + var bolb = null; + if ((data[0].kind == 'file') && + (data[0].type.match('^image/'))) { + blob = data[0].getAsFile(); + if (blob !== null) { + dropImageToPDF(blob); + } + } + + // let div = document.querySelector("div") + // for (var i = 0; i < data.length; i += 1) { + // if ((data[i].kind == 'file') && + // (data[i].type.match('^image/'))) { + // blob = data[i].getAsFile(); + // if (blob !== null) { + // dropImageToPDF(blob); + // } + // } + // } + } + } +}); + +function dropHandler(e) { + console.log('拖放结果',e); + e.preventDefault(); //获取文件列表 + //将本地图片拖拽到页面中后要进行的处理都在这 + console.log('拖放结束', e.dataTransfer.getData("text")); + var fileList = e.dataTransfer.files; + console.log('文件列表', fileList); + if (fileList.length === 0) { + var this_drop_text = e.dataTransfer.getData("text"); + if (this_drop_text.length != 0) { + // console.log('拖入了文字',drop_text); + // alert(drop_text); + dropTextToPDF(this_drop_text); + } + return; + } + + // 检测文件是不是图片 + if (fileList[0].type.indexOf("image") === -1) { + return; + } + //插入图片 + dropImageToPDF(fileList[0]); +}; + +function dropTextToPDF(text) { + is_droping_text = true; + current_drop_text = text; + document.getElementById("ff-add-text").click(); +} + +function initialDropText() { + is_droping_text = false; + current_drop_text = ''; + document.getElementById("ff-pointer-obj").click(); +} + + +function dropImageToPDF(file) { + var blobURL; + try { + blobURL = URL.createObjectURL(file); + } catch (e) { + return; + } + const img = new Image(); + img.setAttribute('crossOrigin', 'Anonymous'); + img.src = blobURL; + img.onerror = function() { + URL.revokeObjectURL(this.src); + alert(tips[0]); + }; + img.onload = function() { + const MAX_WIDTH = 500; + const MAX_HEIGHT = 500; + const MIME_TYPE = 'image/png'; + const QUALITY = 1; + + URL.revokeObjectURL(this.src); + const this_size = pdfAnnotation.calculateSize( + img, + MAX_WIDTH, + MAX_HEIGHT + ); + var newWidth = this_size[0]; + var newHeight = this_size[1]; + const canvas = document.createElement('canvas'); + canvas.width = newWidth; + canvas.height = newHeight; + const ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0, newWidth, newHeight); + //销毁图片 + image = null; + + var new_image = new Image(); + // The value is set to anonymous, indicating that CORS requests for this element will not set credential flags. You cannot export a canvas or an object on a canvas as a picture without setting it. + //值设置为 anonymous,表示对此元素的 CORS 请求将不设置凭据标志。若不设置,无法将画布或画布上的对象导出为图片。 + new_image.setAttribute('crossOrigin', 'Anonymous'); + // console.log('加载文件'); + new_image.onload = function() { + //插入图片对象 + pdfAnnotation.insertImage(new_image); + new_image = null; //销毁图片 + } + var img_data = canvas.toDataURL('image/png'); + new_image.src = img_data; + } +} + +function prepareImages(){ + var tips = { + 'zh-cn': [ + '无法加载图片', + '添加评论', + '点击画布以插入图片', + ], + 'en': [ + 'can not load image', + 'add comments', + 'click canvas to insert image', + ] + } [this.tips_language]; + + //activate selectable mode 激活选择模式 + if (this.fabric_top == false) { + var top_node = document.getElementById('ff-pointer-obj'); + pdfAnnotationUI.setFabricTop(top_node); + } + var that = this; + var fabricObj = this.getCurrentPageFabricCanvas(); + var fabric_item_id = this.buildId(fabricObj.getObjects().length + 1); + if (fabricObj) { + var set_img = new fabric.Image(new_image, { + id: fabric_item_id, + member_id: that.getRandomMemberID(), + my_type: 'image', + comment: tips[1], + backup_opacity: 1, + }); + set_img.crossOrigin = "Anonymous"; //这里是主要添加的属性 + // fabricObj.add(set_img); + that.adding_item = set_img; //将图片作为待插入对象 + that.current_click_type = 'add_image'; + // console.log('图片加载成功'); + // addOperationTips(tips[2]); + pdfAnnotationUI.changeMouseText(1); //修改鼠标文字 + that.changeAllCanvasSelectState(); + // that.saveAllFabricData(); + } +} \ No newline at end of file diff --git a/src/assets/pdf-annotation/annotation/main.js b/src/assets/pdf-annotation/annotation/main.js new file mode 100755 index 0000000..90c87ff --- /dev/null +++ b/src/assets/pdf-annotation/annotation/main.js @@ -0,0 +1,239 @@ + +// main function, load html and listen 主函数 +window.onload = function() { + if (isIE11()) { + // 在IE11中执行特定操作 + addCssForIE11(); + } + + pdfAnnotationUI.initControls(); + + var all_href = location.href; + var params = all_href.split('?')[1].split('&'); + var file_id = params[0]; + var oriUrl = file_id.split('=')[1]; + var user = params.length > 1 ? params[1].split('=')[1] : null; + if (user) { + setCurrentMemberId({id: user, name: user}); + } + // console.log('加载pdf'); + // var oriUrl = 'example_new_link.pdf'; + // var pdfUrl; + // pdfUrl=oriUrl; + // // openFile(oriUrl); + // window.PDFViewerApplication.open(pdfUrl); //open pdf 打开pdf文档 + + pdfAnnotation.openFile(oriUrl); + + //监听加载是否完成 + loadDetect(); + // pdfAnnotationUI.addPinchListener(); // Listen gesture zoom 监听手势缩放 + // listenFileDrag(); + + setAnnotationButtons(); //add annotation buttons 添加批注功能按钮 + // setColorControl(); //Add color control panel 添加颜色控制面板 + // setSettingsControl(); //添加设置面板 + setExtractPDFDiv(); //提取 pdf 的组件 + setLinkControl(); //超链接组件 + setSingleOperater(); //add operation buttons after selection 增加选中后的操作按钮 + // testSetAllMemberList(); //set member 设置用户 + + pdf_viewer = document.getElementById('viewer'); + pdf_viewer.addEventListener("mouseup", function(event) { + var span_id_list=event.target.id.split('-'); + if (span_id_list.length<3 || span_id_list[2]!='textspan'){ + pdfHighlight.closeCopyConfirm(); + return; + } + + listenHighlight(); + try{ + postToParent(); //API + }catch(e){ + console.error(e); + } + // event.preventDefault(); + }, true); + + //listen selectionchange 监听选区变化 + // document.addEventListener("selectionchange", function(event) { + // console.log('选区变化'); + // }, true); + + //remove listen 监听删除 + document.addEventListener("keydown", function(event) { + if (event.shiftKey) { + shiftKeyPressed = true; + // console.log('Shift键被按下'); + } + + if (event.key === "Delete") { + pdfAnnotation.delEl(); + }; + // console.log('event',event); + + if (event.ctrlKey && event.keyCode === 90) { + // Your code here to handle the "ctrl+z" key combination + // console.log("ctrl+z pressed"); + pdfAnnotation.undoAnnotation(); + }; + if (event.ctrlKey && event.keyCode === 89) { + // Your code here to handle the "ctrl+z" key combination + // console.log("ctrl+z pressed"); + pdfAnnotation.redoAnnotation(); + } + }); + + document.addEventListener('keyup', function(event) { + if (!event.shiftKey) { + shiftKeyPressed = false; + // console.log('Shift键被释放'); + } + }); + + // pdf_viewer.addEventListener("dblclick", function(event) { + // // console.log('双击了页面'); + // if (current_click_type!='select'){ + // // console.log(event); + // var this_canvas = getCurrentClickCanvas(event); + // initialFabricState(this_canvas);//清空添加状态 + // } + // event.preventDefault(); + // }, true); + + + // console.log('域名',document.domain); + var that = this; + //listen file choosing and open 监听文件选择 + var this_e = document.getElementById('choose_file'); + this_e.addEventListener('change', function(e) { + setFileAnnotation(this_e, e); + this_e.value = null; + }); + + var inputElement = document.getElementById("image_insert"); + // console.log('加载图片'); + inputElement.addEventListener('change', function(ev) { + // console.log('插入图片'); + onlaodImgToInsert(ev); + inputElement.value = null; + }); + + //ban mouse right click 禁止在菜单上的默认右键事件 + var my_menu = document.getElementById('my-menu'); + my_menu.oncontextmenu = function(e) { + e.preventDefault() + } + + // //默认打开列表 + // if (default_show_annotation_list==true){ + // editAnnotation(); + // // console.log('打开列表'); + // pdfAnnotationUI.show_all_annotation_list=true; + // pdfAnnotationUI.showAnnotationList(); + // // // //刷新批注显示列表 + // // if (pdfAnnotationUI.show_annotation_list) { + // // } + // } + //历史框可标注 + listenDrag("my_annotation_history"); +} + +window.onresize = function() { //监听屏幕的改变 + setTimeout(function() { + JSplump.refreshConnections(); + }, 100) +}; + + + +var interval = null; + +function loadDetect() { + var tips = { + 'zh-cn': [ + '文档加载中...', + ], + 'en': [ + 'Loading PDF...', + ] + } [tips_language]; + pdfAnnotationUI.showDownloadLog(tips[0]); + interval = setInterval('loadPdf()', 1000); +} + +function loadPdf() { + if (PDFViewerApplication.pdfDocument == null) { + console.info('Loading...'); + } else { + //文档加载完成 + clearInterval(interval); + setSettingsControl(); //添加设置面板 + pdfAnnotationUI.closeDownloadLog(); + if (hyper_open_file==true){ + PDFViewerApplication.page=hyper_open_page; + hyper_open_file=false; + hyper_open_page=1; + } + } +} + +//实现文件下载 +function downFromATag(blobUrl,filename,option,tip){ + //blobUrl为PDF数据,可转换为base 64后上传至服务器 + if (option==0){ + //IE11的下载方式 + //在IE环境下,blobUrl是 blob,转换到 base64时请注意区分 + window.navigator.msSaveBlob(blobUrl,filename); + // window.navigator.msSaveOrOpenBlob(blobUrl, filename); + }else{ + //非IE 11的下载方式 + var a = document.createElement('a'); + if (!a.click) { + throw new Error('DownloadManager: "a.click()" is not supported.'); + } + + a.href = blobUrl; + a.target = '_parent'; + + if ('download' in a) { + a.download = filename; + } + + try{ + postPDFData({ + "filename":filename, + "file_blob_url_data":blobUrl, + }); + }catch(e){ + console.error(e); + } + + (document.body || document.documentElement).appendChild(a); + a.click(); + a.remove(); + + // alert(tip); + } +} + + +function postPDFData(function_name,new_content){ + window.parent.postMessage({"type":0,"source":"pdfmaster",'function_name':function_name,"content":new_content},'*'); +} + +var down_load_file=true; +var return_data=false; +function getPDFBlobData(){ + //get pdf blob data but not download file + down_load_file=false; + return_data=true; + PDFViewerApplication.download(); +} + +function getPDFBlobDataAndDownLoad(){ + //get pdf blob data and download file + down_load_file=true; + return_data=true; + PDFViewerApplication.download(); +} diff --git a/src/assets/pdf-annotation/annotation/promise_js.js b/src/assets/pdf-annotation/annotation/promise_js.js new file mode 100755 index 0000000..aa2f729 --- /dev/null +++ b/src/assets/pdf-annotation/annotation/promise_js.js @@ -0,0 +1,422 @@ + +// import "@babel/polyfill"; + +pdfwheel.Annotation.prototype.modifyPdf = async function(blobUrl, filename) { + var tips = { + 'zh-cn': [ + '初始化文档...', + '1/2 处理文档...', + '2/2 下载准备中...', + '1. 文档已自动下载,请留意浏览器下载窗口\n2. 若文档较大时则耗时较久,请耐心等待', + ], + 'en': [ + 'Initialing PDF...', + '1/2 Processing File...', + '2/2 Prepare for downloading...', + '1. File is downloading, please pay attention to the browser download window\n\n2. When the file is large, it will take a long time, please wait patiently.', + ] + } [tips_language]; + pdfAnnotationUI.showDownloadLog(tips[0]); + // increase(); + var file_annotation = this.readFileAnnotations(); + var havenot_annotation=true; + for (var key in file_annotation){ + var this_annotation=file_annotation[key]; + var string_obj=JSON.stringify(this_annotation.page_canvas.fabric_canvas_json.objects); + if (string_obj!=='{}'){ + havenot_annotation=false; + break; + } + } + + if (havenot_annotation==true){ + pdfAnnotationUI.closeDownloadLog(); + downFromATag(blobUrl, filename,1,tips[3]); + return; + } + + pdfAnnotationUI.showDownloadLog(tips[1]); + + // URL for request URL是要请求的地址 + var existingPdfBytes = await window.fetch(blobUrl).then(res => res + .arrayBuffer()); + // console.log('文件加载完成'); + // var existingPdfBytes = blobUrl.arrayBuffer(); + var pdfDoc = await window.PDFLib.PDFDocument.load(existingPdfBytes); + var pages = pdfDoc.getPages(); + // console.log('批注pdf加载完成2', pages.length); + var pages_imgs = []; + var canvas_scale = 1; + + for (var j = 0; j < pages.length; j++) { + var img = await this.drawCanvasForDownload(pages[j], j + 1, canvas_scale); + // console.log('图片链接',img); + if (img) { + // console.log('图片转换',img); + var eleImgCover = await pdfDoc.embedPng(img); + // console.log('图片转换完成',eleImgCover); + pages_imgs.push(eleImgCover); + } else { + pages_imgs.push(null); + } + } + + + pdfAnnotationUI.showDownloadLog(tips[2]); + + var i = 0; + pages.forEach(item => { + // console.log('当前页面',i); + var this_img = pages_imgs[i]; + // const pageRotation = getPageRotation(item); + if (this_img != null) { + var page_width = item.getSize().width; + var page_height = item.getSize().height; + const rotationAngle = item.getRotation().angle; + + var draw_x; + var draw_y; + var this_scale; + var final_angle=0; + var draw_width; + var draw_height; + if (rotationAngle==90){ + draw_x=page_width; + draw_y=0; + final_angle=90; + draw_width=page_height; + draw_height=page_width; + }else if(rotationAngle==180){ + draw_x=page_width; + draw_y=page_height; + final_angle=180; + draw_width=page_width; + draw_height=page_height; + }else if(rotationAngle==270){ + this_scale = this_img.width / page_width; + draw_x=0; + draw_y=page_height; + final_angle=270; + draw_width=page_height; + draw_height=page_width; + }else{ + this_scale = this_img.width / page_width; + draw_x=0; + draw_y=0; + final_angle=0; + draw_width=page_width; + draw_height=page_height; + } + // console.log('页面旋转角度',rotationAngle); + + item.drawImage(this_img, { + x: draw_x, + y: draw_y, + rotate: PDFLib.degrees(final_angle), + width: draw_width, + height: draw_height, + }); + + // if (this.add_water_mark == true) { + // item.drawText('https://demos.libertynlp.com', { + // x: 0, + // y: page_height / 2, + // size: 40, + // color: PDFLib.rgb(0, 0, 0), + // }) + // } + } + + i = i + 1; + }) + + + //如果存在需要提取的页面 + if (extract_page_numbers.length > 0) { + var new_pdfDoc = await PDFLib.PDFDocument.create(); + for (var j = 0; j < pages.length - 1; j++) { + if (extract_page_numbers.indexOf(j) != -1) { + var [added_Page] = await new_pdfDoc.copyPages(pdfDoc, [j]) + // Add the first copied page + new_pdfDoc.addPage(added_Page) + } + } + pdfDoc = new_pdfDoc; + //处理完之后置空 + extract_page_numbers = []; + } + + if (window.navigator && window.navigator.msSaveOrOpenBlob) { + const blob = new Blob([await pdfDoc.save()], { + type: 'application/pdf' + }); + // console.log('IE-批注转Blob完成'); + downFromATag(blob, filename,0,tips[3]); + } else { + const pdfUrl = URL.createObjectURL( + new Blob([await pdfDoc.save()], { + type: 'application/pdf' + }), + ); + // window.open(pdfUrl, '_blank'); + // console.log('批注转Blob完成'); + downFromATag(pdfUrl, filename,1,tips[3]); + } + pdfAnnotationUI.closeDownloadLog(); +} + +// wux 添加了 merge 方法,将 annotation 合并到 pdf 中。内容基本上是抄的上面 download 方法。 +pdfwheel.Annotation.prototype.merge = async function(blob) { + var tips = { + 'zh-cn': [ + '初始化文档...', + '1/2 处理文档...', + '2/2 准备中...', + '1. 文档正在保存\n2. 若文档较大时则耗时较久,请耐心等待', + ], + 'en': [ + 'Initialing PDF...', + '1/2 Processing File...', + '2/2 Preparing...', + '1. File is saving,\n\n2. When the file is large, it will take a long time, please wait patiently.', + ] + } [tips_language]; + pdfAnnotationUI.showDownloadLog(tips[0]); + // increase(); + var file_annotation = this.readFileAnnotations(); + var havenot_annotation=true; + for (var key in file_annotation){ + var this_annotation=file_annotation[key]; + var string_obj=JSON.stringify(this_annotation.page_canvas.fabric_canvas_json.objects); + if (string_obj!=='{}'){ + havenot_annotation=false; + break; + } + } + + if (havenot_annotation==true){ + pdfAnnotationUI.closeDownloadLog(); + return pdfDoc; + } + + pdfAnnotationUI.showDownloadLog(tips[1]); + + ////////// + // console.log('文件加载完成'); + var existingPdfBytes = await blob.arrayBuffer(); + var pdfDoc = await window.PDFLib.PDFDocument.load(existingPdfBytes); + var pages = pdfDoc.getPages(); + + ////////// + // URL for request URL是要请求的地址 + // console.log('文件加载完成'); + // var existingPdfBytes = blobUrl.arrayBuffer(); + // var pdfDoc = await window.PDFLib.PDFDocument.load(existingPdfBytes); + var pages = pdfDoc.getPages(); + // console.log('批注pdf加载完成2', pages.length); + var pages_imgs = []; + var canvas_scale = 1; + + for (var j = 0; j < pages.length; j++) { + var img = await this.drawCanvasForDownload(pages[j], j + 1, canvas_scale); + // console.log('图片链接',img); + if (img) { + // console.log('图片转换',img); + var eleImgCover = await pdfDoc.embedPng(img); + // console.log('图片转换完成',eleImgCover); + pages_imgs.push(eleImgCover); + } else { + pages_imgs.push(null); + } + } + + pdfAnnotationUI.showDownloadLog(tips[2]); + + var i = 0; + pages.forEach(item => { + // console.log('当前页面',i); + var this_img = pages_imgs[i]; + // const pageRotation = getPageRotation(item); + if (this_img != null) { + var page_width = item.getSize().width; + var page_height = item.getSize().height; + const rotationAngle = item.getRotation().angle; + + var draw_x; + var draw_y; + var this_scale; + var final_angle=0; + var draw_width; + var draw_height; + if (rotationAngle==90){ + draw_x=page_width; + draw_y=0; + final_angle=90; + draw_width=page_height; + draw_height=page_width; + }else if(rotationAngle==180){ + draw_x=page_width; + draw_y=page_height; + final_angle=180; + draw_width=page_width; + draw_height=page_height; + }else if(rotationAngle==270){ + this_scale = this_img.width / page_width; + draw_x=0; + draw_y=page_height; + final_angle=270; + draw_width=page_height; + draw_height=page_width; + }else{ + this_scale = this_img.width / page_width; + draw_x=0; + draw_y=0; + final_angle=0; + draw_width=page_width; + draw_height=page_height; + } + // console.log('页面旋转角度',rotationAngle); + + item.drawImage(this_img, { + x: draw_x, + y: draw_y, + rotate: PDFLib.degrees(final_angle), + width: draw_width, + height: draw_height, + }); + + // if (this.add_water_mark == true) { + // item.drawText('https://demos.libertynlp.com', { + // x: 0, + // y: page_height / 2, + // size: 40, + // color: PDFLib.rgb(0, 0, 0), + // }) + // } + } + + i = i + 1; + }) + + //如果存在需要提取的页面 + if (extract_page_numbers.length > 0) { + var new_pdfDoc = await PDFLib.PDFDocument.create(); + for (var j = 0; j < pages.length - 1; j++) { + if (extract_page_numbers.indexOf(j) != -1) { + var [added_Page] = await new_pdfDoc.copyPages(pdfDoc, [j]) + // Add the first copied page + new_pdfDoc.addPage(added_Page) + } + } + pdfDoc = new_pdfDoc; + //处理完之后置空 + extract_page_numbers = []; + } + + pdfAnnotationUI.closeDownloadLog(); + const pdfBlob = new Blob([await pdfDoc.save()], { + type: 'application/pdf' + }); + return pdfBlob; +} + + +// draw canvas and convert to pdf 绘制批注到 canvas 并转换为 png +pdfwheel.Annotation.prototype.drawCanvasForDownload = async function(item, page_number, scale) { + var old_fabric_obj = this.readFabricAnnotationsForPage(page_number); + if (old_fabric_obj) { + var width = parseFloat(old_fabric_obj.page_canvas.width); + var height = parseFloat(old_fabric_obj.page_canvas.height); + + var anno_canvas = document.createElement("canvas"); + anno_canvas.width = width; + anno_canvas.height = height; + var page_id = this.fabric_annos_id_tag + 'for-download-' + page_number.toString(); + anno_canvas.setAttribute('id', page_id); + + var canvas_container = document.getElementById('div-for-download-canvas'); + canvas_container.appendChild(anno_canvas); + + var this_fabric_canvas = new fabric.Canvas(page_id, { + includeDefaultValues: true, + isDrawingMode: false, + fireRightClick: true, + stopContextMenu: false, + backgroundColor: 'rgba(255, 255, 255, 0)', + }); + + async function loadImageFabricCanvas() { + return new Promise(resolve => { + this_fabric_canvas.loadFromJSON(old_fabric_obj.page_canvas.fabric_canvas_json, + function() { + var this_canvas = document.getElementById(page_id); + var pic_url = this_canvas.toDataURL('image/png'); + canvas_container.innerHTML = ''; + resolve(pic_url); + }); + }) + } + let this_pic_url = await loadImageFabricCanvas(); + return this_pic_url; + } + return null; +} + +/* +拓展功能: + +增加文字水印 +*/ +pdfwheel.Annotation.prototype.addWaterMark = async function(url) { + const existingPdfBytes = await fetch(url).then(res => res.arrayBuffer()) + const pdfDoc = await window.PDFLib.PDFDocument.load(existingPdfBytes) + + //遍历页面增加水印 + const pages = pdfDoc.getPages(); + var pages_imgs = []; + var canvas_scale = 2; + for (var j = 0; j < pages.length; j++) { + var page = pages[j]; + var page_width = page.getSize().width; + var page_height = page.getSize().height; + + // 生成水印对象 + var img = await this.drawWaterMark(page_width * canvas_scale, page_height * canvas_scale); + var pdf_img = await pdfDoc.embedPng(img); + pages_imgs.push(pdf_img); + } + + var i = 0; + pages.forEach(item => { + var this_img = pages_imgs[i]; + var this_scale = this_img.width / page_width; + item.drawImage(this_img, { + x: 0, + y: 0, + width: this_img.width / this_scale, + height: this_img.height / this_scale, + }); + i = i + 1; + }) + // 已经处理好的数据 + const pdfBuffer = await pdfDoc.save() + const pdfUrl = URL.createObjectURL( + new Blob([pdfBuffer], { + type: 'application/pdf' + }), + ); + // 返回出去 + return pdfUrl +} + +pdfwheel.Annotation.prototype.openFile =async function(oriUrl) { + var pdfUrl; + if (add_water_mark == true) { + pdfAnnotationUI.showDownloadLog("文档水印处理中..."); + pdfUrl = await this.addWaterMark(oriUrl); + pdfAnnotationUI.closeDownloadLog(); + } else { + pdfUrl = oriUrl; + } + window.PDFViewerApplication.open(pdfUrl); //open pdf 打开pdf文档 +} \ No newline at end of file diff --git a/src/assets/pdf-annotation/annotation/utils.js b/src/assets/pdf-annotation/annotation/utils.js new file mode 100755 index 0000000..0fac6db --- /dev/null +++ b/src/assets/pdf-annotation/annotation/utils.js @@ -0,0 +1,1707 @@ +//返回印章的文字内容,其中 \n 表示换行 +function getTextForIdCardStamp() { + return "P123456 Name\n20230905"; +} + +// 检查浏览器是否为IE11 +function isIE11() { + return !!window.ActiveXObject || "ActiveXObject" in window; +} + +function addCssForIE11() { + // 创建link元素 + var linkElement = document.createElement('link'); + linkElement.rel = 'stylesheet'; + linkElement.type = 'text/css'; + linkElement.href = '../css/ie_polyfill.css'; // 替换为你的CSS文件的路径 + + // 获取head元素 + var head = document.getElementsByTagName('head')[0]; + // 将link元素添加到head + head.appendChild(linkElement); +} + + + + +function getPDFUrl() { + var parent_url = getParentUrl(); + var this_pdf_url; + if (parent_url == null) { + this_pdf_url = PDFViewerApplication.baseUrl; + } else { + // 获取域名 + var all_url = new URL(parent_url); + var parent_domain = all_url.hostname; + // console.log('主域名',parent_domain); // 输出 "www.example.com" + this_pdf_url = parent_domain + '_' + PDFViewerApplication.baseUrl; + } + // console.log('pdf链接',this_pdf_url); + return this_pdf_url; +} + +//获取嵌套改页面的主页面链接 +function getParentUrl() { + //如果最终 url=null,则说明页面没有被嵌套 + var url = null; + var parent = window.parent; + if (parent !== window) { + try { + url = parent.location.href; + } catch (e) { + url = document.referrer; + } + } + // console.log('父级链接',url); + return url; +} + + +///create color control panel 创建颜色控制面板 +function setSettingsControl() { + if (isIE11()) { + setSettingsControlForIE(); + return; + } + + var my_setting_node = document.getElementById('my-setting-menu'); + my_setting_node.innerHTML = ''; //clear 清空所有子元素 + var buttons_text = { + 'zh-cn': [ + '
', + '
', + '
填充色不透明度
', + '
', + '

', + '
', + createUnderlineShowSize(), + '

', + '
', + createTextShowSize(), + '

', + '
', + createFastSelect(default_brush_width, 'default_brush_width', default_brush_color), + '

', + '
', + createFastSelect(default_eraser_brush_width, 'default_eraser_brush_width', default_eraser_color), + ], + 'en': [ + '
', + '
', + '
Fill Color Opacity
', + '
', + '

', + '
', + createUnderlineShowSize(), + '

', + '
', + createTextShowSize(), + '

', + '
', + createFastSelect(default_brush_width, 'default_brush_width', default_brush_color), + '

', + '
', + createFastSelect(default_eraser_brush_width, 'default_eraser_brush_width', default_eraser_color), + ] + } [tips_language]; + + for (var i = 0; i < buttons_text.length; i++) { + var parent_button = document.createElement('div'); //add button 增加按钮 + var outer_html = buttons_text[i]; + parent_button.innerHTML = outer_html; + my_setting_node.appendChild(parent_button.childNodes[0]); + } + + //监听设置中的颜色改变 + observeSettingValue("default_highlight_color"); + observeSettingValue("default_underline_color"); + observeSettingValue("default_brush_color"); + observeSettingValue("default_text_color"); + observeSettingValue("default_fill_color"); + observeSettingValue("default_border_color"); + + observeSettingNumeric("default_underline_width"); + observeSettingValueNumeric("default_underline_width_value"); + observeSettingNumeric("default_brush_opacity"); + observeSettingValueNumeric("default_brush_width_value"); + observeSettingNumeric("default_eraser_brush_width"); + observeSettingValueNumeric("default_eraser_brush_width_value"); + observeSettingNumeric("default_text_size"); + observeSettingValueNumeric("default_text_size_value"); + observeSettingValueNumeric("default_fill_color_opacity"); + observeSettingValueNumeric("default_border_color_opacity"); + + //设置背景颜色 + setAllInputBackgroundColor(); +} + + +///create color control panel 创建颜色控制面板 +function setSettingsControlForIE() { + var my_setting_node = document.getElementById('my-setting-menu'); + my_setting_node.innerHTML = ''; //clear 清空所有子元素 + var buttons_text = { + 'zh-cn': [ + '
', + '
', + '
填充色不透明度
', + '
', + '

', + '
', + createUnderlineShowSize(), + '

', + '
', + createTextShowSize(), + '

', + '
', + createFastSelect(default_brush_width, 'default_brush_width', default_brush_color), + '

', + '
', + createFastSelect(default_eraser_brush_width, 'default_eraser_brush_width', default_eraser_color), + ], + 'en': [ + '
', + '
', + '
Fill Color Opacity
', + '
', + '

', + '
', + createUnderlineShowSize(), + '

', + '
', + createTextShowSize(), + '

', + '
', + createFastSelect(default_brush_width, 'default_brush_width', default_brush_color), + '

', + '
', + createFastSelect(default_eraser_brush_width, 'default_eraser_brush_width', default_eraser_color), + ] + } [tips_language]; + + for (var i = 0; i < buttons_text.length; i++) { + var parent_button = document.createElement('div'); //add button 增加按钮 + var outer_html = buttons_text[i]; + parent_button.innerHTML = outer_html; + my_setting_node.appendChild(parent_button.childNodes[0]); + } + + //监听设置中的颜色改变 + setSelections("default_highlight_color"); + setSelections("default_underline_color"); + setSelections("default_brush_color"); + setSelections("default_text_color"); + setSelections("default_fill_color"); + setSelections("default_border_color"); + + observeIESettingValue("default_highlight_color"); + observeIESettingValue("default_underline_color"); + observeIESettingValue("default_brush_color"); + observeIESettingValue("default_text_color"); + observeIESettingValue("default_fill_color"); + observeIESettingValue("default_border_color"); + + observeSettingNumeric("default_underline_width"); + observeSettingValueNumeric("default_underline_width_value"); + observeSettingNumeric("default_brush_width"); + observeSettingValueNumeric("default_brush_width_value"); + observeSettingNumeric("default_eraser_brush_width"); + observeSettingValueNumeric("default_eraser_brush_width_value"); + observeSettingNumeric("default_text_size"); + observeSettingValueNumeric("default_text_size_value"); + observeSettingValueNumeric("default_fill_color_opacity"); + observeSettingValueNumeric("default_border_color_opacity"); + + //设置背景颜色 + setAllInputBackgroundColor(); +} + +function setSelections(select_id) { + var color_dict = { + 'zh-cn': { + '绿': 'green', + '蓝': 'blue', + '红': 'red', + '橙': 'orange', + '白': 'white', + '黑': 'black', + '紫': 'purple', + '红-50%红': 'rgba(255,0,0,0.5)', + '绿-50%': 'rgba(0,255,0,0.5)', + '蓝-50%': 'rgba(0,0,255,0.5)', + '橙-50%': 'rgba(255,165,0,0.5)', + '浅蓝-50%': 'rgba(100,140,230,0.5)', + '金-50%': 'rgba(218,165,32,0.5)', + '白-50%': 'rgba(255,255,255,0.5)', + '粉-50%': 'rgba(255,0,255,0.5)', + }, + 'en': { + 'green': 'green', + 'blue': 'blue', + 'red': 'red', + 'orange': 'orange', + 'white': 'white', + 'black': 'black', + 'purple': 'purple', + 'semi-transparent red': 'rgba(255,0,0,0.5)', + 'semi-transparent green': 'rgba(0,255,0,0.5)', + 'semi-transparent blue': 'rgba(0,0,255,0.5)', + 'semi-transparent orange': 'rgba(255,165,0,0.5)', + 'semi-transparent cornflowerblu': 'rgba(100,140,230,0.5)', + 'semi-transparent goldenrod': 'rgba(218,165,32,0.5)', + 'semi-transparent white': 'rgba(255,255,255,0.5)', + 'semi-transparent purple': 'rgba(255,0,255,0.5)', + } + } [tips_language]; + var my_setting_node = document.getElementById(select_id); + my_setting_node.innerHTML = ''; //clear 清空所有子元素 + for (var key in color_dict) { + var select_node = document.createElement('option'); + select_node.style.background = color_dict[key]; + select_node.innerText = key; + select_node.value = color_dict[key]; + my_setting_node.appendChild(select_node); + } +} + +function getTrueScaleValue(value) { + var point_num = 4; + // console.log(PDFViewerApplication); + var size = (PDFViewerApplication.pdfViewer.currentScale * show_scale_value * value).toFixed(point_num); + return size; +} + +//创建画笔大小快速选择的按钮 +function createFastSelect(default_size, value_id, default_color) { + var tips = { + 'zh-cn': [ + '点击设置画笔大小为:', + ], + 'en': [ + 'click to set brush size: ', + ] + } [this.tips_language]; + var size_array = [5, 10, 20, 30, 40, 60]; + // console.log('value_id',value_id); + var value_size_id = value_id + "_size"; + var all_html = "
"; + default_size = getTrueScaleValue(default_size); + // all_html=all_html+'
当前大小:'+default_size+'
' + all_html = all_html + '
'; + // size_array.forEach(size=>{ + // var div_size=size; + // if (div_size<40){ + // div_size=30; + // } + // all_html=all_html+'
'+size+'
'; + // }) + size_array.forEach(function(size) { + all_html = all_html + ''; + }) + all_html = all_html + "
"; + return all_html; +} + +function createUnderlineShowSize() { + var size = getTrueScaleValue(default_underline_width); + var under_line_html = '
'; + return under_line_html; +} + +function setShowingUnderline() { + var size = getTrueScaleValue(default_underline_width); + var under_line_html = ''; + document.getElementById("undeline_show").innerHTML = under_line_html; +} + + +function createTextShowSize() { + var tips = { + 'zh-cn': [ + '文本的样式', + ], + 'en': [ + 'Text Style', + ] + } [this.tips_language]; + var size = getTrueScaleValue(default_text_size); + var text_html = '
' + tips[0] + '
'; + return text_html; +} + +function setShowingText() { + var tips = { + 'zh-cn': [ + '文本的样式', + ], + 'en': [ + 'Text Style', + ] + } [this.tips_language]; + var size = getTrueScaleValue(default_text_size); + var text_html = '' + tips[0] + ''; + document.getElementById("text_show").innerHTML = text_html; + + //更新写入的文本框样式 + default_text = { + left: defult_left, + top: defult_top, + fill: default_text_color, + fontSize: default_text_size, + selectable: true, + id: 'id', + }; +} + + +function setBrushWidth(node) { + var value_id = node.getAttribute("value_id"); + var size_value = parseFloat(node.getAttribute("size_value")); + // console.log('当前设置大小',size_value); + setShowingBrushWidth(value_id, size_value); + switch (value_id) { + case "default_brush_width": + default_brush_width = size_value; + // document.getElementById("default_brush_width").value = size_value; + document.getElementById("default_brush_width_value").value = size_value; + break; + case "default_eraser_brush_width": + default_eraser_brush_width = size_value; + document.getElementById("default_eraser_brush_width").value = size_value; + document.getElementById("default_eraser_brush_width_value").value = size_value; + break; + default: + return; + }; +} + +function setShowingBrushWidth(value_id, size) { + // console.log('show_scale_value',show_scale_value); + var value_size_id = value_id + "_size"; + var value_color; + switch (value_id) { + case "default_brush_width": + value_color = default_brush_color; + break; + case "default_eraser_brush_width": + value_color = "#007bff"; + break; + default: + return; + }; + size = getTrueScaleValue(size); + var new_html = ''; + document.getElementById(value_size_id).innerHTML = new_html; + + //修改1s后生效 + setTimeout(function() { + changeTrueBrush(); + }, 1000); +} + +//设置完画笔显示样式之后修改真实画笔样式 +function changeTrueBrush() { + if (pdfAnnotation.free_draw == true) { + pdfAnnotationUI.activateDrawMode(); + } + + if (pdfAnnotation.eraser_brush == true) { + pdfAnnotationUI.activateDrawMode(); + } +} + + +//observe value change 监听颜色等数字变化 +function observeSettingValue(property) { + // 获取输入元素 + var inputElement = document.getElementById(property); // 请确保使用你的输入元素的实际ID + + // 添加一个input事件监听器 + inputElement.addEventListener('input', function(event) { + // 在这里处理输入事件 + var inputValue = event.target.value; + //非颜色字符串之后返回 + if (!pdfAnnotation.isHexColor(inputValue)) { + return; + } + switch (property) { + case "default_highlight_color": + default_highlight_color = inputValue; + break; + case "default_underline_color": + default_underline_color = inputValue; + setShowingUnderline(); + break; + case "default_brush_color": + default_brush_color = hexToRgba(inputValue, default_brush_opacity); + setShowingBrushWidth("default_brush_width", default_brush_width); + break; + case "default_text_color": + default_text_color = inputValue; + setShowingText(); + break; + case "default_fill_color": + default_fill_color = hexToRgba(inputValue, default_fill_color_opacity); + setDefaultAnnotations(); + break; + case "default_border_color": + default_border_color = hexToRgba(inputValue, default_border_color_opacity); + setDefaultAnnotations(); + break; + default: + return; + }; + setAllInputBackgroundColor(); + }); +} + + +//observe value change 监听颜色等数字变化 +function observeIESettingValue(property) { + // 获取输入元素 + var inputElement = document.getElementById(property); // 请确保使用你的输入元素的实际ID + + // 添加一个input事件监听器 + // inputElement.addEventListener('change', function(event) { + inputElement.addEventListener('input', function(event) { + // 在这里处理输入事件 + var inputValue = inputElement.value; + switch (property) { + case "default_highlight_color": + default_highlight_color = inputValue; + break; + case "default_underline_color": + default_underline_color = inputValue; + setShowingUnderline(); + break; + case "default_brush_color": + default_brush_color = inputValue; + setShowingBrushWidth("default_brush_width", default_brush_width); + break; + case "default_text_color": + default_text_color = inputValue; + setShowingText(); + break; + case "default_fill_color": + default_fill_color = inputValue; + setDefaultAnnotations(); + break; + case "default_border_color": + default_border_color = inputValue; + setDefaultAnnotations(); + break; + default: + return; + }; + setAllInputBackgroundColor(); + }); +} + +function hexToRgba(hex, opacity) { + // 去掉HEX颜色代码中的'#'字符 + hex = hex.replace(/^#/, ''); + + // 解析红色、绿色和蓝色通道的值 + const r = parseInt(hex.slice(0, 2), 16); + const g = parseInt(hex.slice(2, 4), 16); + const b = parseInt(hex.slice(4, 6), 16); + + if (opacity > 100) { + opacity = 100; + } + // 使用RGBA格式返回颜色值 + return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity / 100 + ')'; +} + + +//observe numeric change 监听数字变化 +function observeSettingNumeric(property) { + // document.getElementById(property).onchange = function() { + document.getElementById(property).oninput = function() { + var this_value = parseFloat(this.value); + switch (property) { + case "default_underline_width": + default_underline_width = this_value; + document.getElementById("default_underline_width_value").value = this_value; + setShowingUnderline(); + break; + case "default_brush_opacity": + default_brush_opacity = this_value; + var vs = default_brush_color.replace('rgba(', '').replace(')', '').split(','); + vs[3] = (this_value / 100).toFixed(2).toString(); + default_brush_color = 'rgba(' + vs[0] + ',' + vs[1] + ',' + vs[2] + ',' + vs[3] + ')' + setShowingBrushWidth("default_brush_width", default_brush_width); + break; + case "default_eraser_brush_width": + default_eraser_brush_width = this_value; + document.getElementById("default_eraser_brush_width_value").value = this_value; + setShowingBrushWidth(property, this_value); + break; + case "default_text_size": + default_text_size = this_value; + document.getElementById("default_text_size_value").value = this_value; + setShowingText(); + break; + default: + return; + }; + }; +} + +//observe numeric change 监听配置的数字变化 +function observeSettingValueNumeric(property) { + // 获取输入元素 + var inputElement = document.getElementById(property); // 请确保使用你的输入元素的实际ID + + // 添加一个input事件监听器 + inputElement.addEventListener('input', function(event) { + // 在这里处理输入事件 + var inputValue = event.target.value; + //非颜色字符串之后返回 + if (!inputValue || inputValue < 0) { + return; + } + var this_value = parseFloat(inputValue); + switch (property) { + case "default_underline_width_value": + default_underline_width = this_value; + document.getElementById("default_underline_width").value = this_value; + setShowingUnderline(); + break; + case "default_brush_width_value": + default_brush_width = this_value; + document.getElementById("default_brush_width").value = this_value; + setShowingBrushWidth(property.replace('_value', ''), this_value); + break; + case "default_eraser_brush_width_value": + default_eraser_brush_width = this_value; + document.getElementById("default_eraser_brush_width").value = this_value; + setShowingBrushWidth(property.replace('_value', ''), this_value); + break; + case "default_text_size_value": + default_text_size = this_value; + document.getElementById("default_text_size_value").value = this_value; + setShowingText(); + break; + case "default_fill_color_opacity": + default_fill_color_opacity = this_value; + default_fill_color = hexToRgba(rgbaToHex(default_fill_color), default_fill_color_opacity); + break; + case "default_border_color_opacity": + default_border_color_opacity = this_value; + default_border_color = hexToRgba(rgbaToHex(default_border_color), default_border_color_opacity); + break; + default: + return; + }; + setAllInputBackgroundColor(); + }) +} + +function setAllInputBackgroundColor() { + //非IE 11则不设置背景 + if (!isIE11()) { + return; + } + + var colors_dict = { + "default_highlight_color": default_highlight_color, + "default_underline_color": default_underline_color, + "default_brush_color": default_brush_color, + "default_text_color": default_text_color, + "default_fill_color": default_fill_color, + "default_border_color": default_border_color, + } + for (var color_name in colors_dict) { + var color_value = colors_dict[color_name]; + var color_item = document.getElementById(color_name); + color_item.style.backgroundColor = color_value; + } +} + +function setMenuInputBackgroundColor() { + //非IE 11则不设置背景 + if (!isIE11()) { + return; + } + + var colors_dict = { + "fill": "#000000", + "stroke": "#000000", + "backgroundColor": "#000000", + } + for (var color_name in colors_dict) { + var color_value = colors_dict[color_name]; + var color_item = document.getElementById(color_name); + color_item.style.backgroundColor = color_value; + } +} + +/* +拓展功能: + +提取部分pdf +*/ +//设置操作面板 +function setExtractPDFDiv() { + var extract_pdf_html = { + 'zh-cn': ['
' + + '

请输入需要提取的页码

' + + '' + + '

*注:请输入1-5,8-23的形式,表示提取1-5页及8-23页

' + + '' + + '' + + '
' + ], + 'en': ['
' + + '

Input Pages Number

' + + '' + + '

*Note:please input the form like 1-5,8-23 which represent extract pages 1-5 and pages 8-23

' + + '' + + '' + + '
' + ] + } [tips_language]; + document.getElementById('my-extract-process-div').innerHTML = extract_pdf_html[0]; +} + +function extractPDF() { + pdfwheel.UI.prototype.showExtractLog(); + // var strings='1-5,9-15'; + // var number_arr=rangeToNumbers(strings); + // console.log('截取PDF的页面',number_arr); +} + +//执行提取页面操作 +function executeExtractPDF() { + var tips = { + 'zh-cn': [ + '没有正确指定待抽取页面,请按提示输入正确页码!', + ], + 'en': [ + 'pages number incorrect, please input the correct pages mentioned in Note', + ] + } [tips_language]; + var strings = document.getElementById('extract_pages').value; + extract_page_numbers = rangeToNumbers(strings); + if (extract_page_numbers.length == 0) { + alert(tips[0]); + } else { + pdfwheel.UI.prototype.closeExtractLog(); + document.getElementById('extract_pages').value = ''; + PDFViewerApplication.download(); + } + // console.log('截取PDF的页面',number_arr); +} + +function cancelExtractPDF() { + pdfwheel.UI.prototype.closeExtractLog(); +} + +function handleSelection(node) { + var tips = { + 'zh-cn': [{ + 'url': '请输入要跳转的URL', + 'page': '请输入要跳转的页码', + 'file': '请输入在线文档#页码,如https://example.pdf#1', + }], + 'en': [{ + 'url': 'Enter URL you would like to link to', + 'page': 'Enter page you would like to link to', + 'file': 'Enter file#page you would like to link to, e.g https://example.pdf#1', + }] + } [tips_language]; + // 获取选中的值 + select_link_type = node.value; + var link_tip = tips[0][select_link_type]; + document.getElementById('link_tips').innerText = link_tip; + // console.log('提示语',link_tip); +} + +function linkToURL() { + var tips = { + 'zh-cn': [ + '页码超过文档页数或小于1, 请重新输入', + '文件格式错误', + '超链接添加成功:', + '页面需要是正整数, 请重新输入', + '超链接不能为空, 请重新输入', + ], + 'en': [ + 'input beyond page number or less than 1, input again', + 'file format wrong', + 'hyperlink adding successful: ', + 'input should be integer', + 'hyperlink con not be empty', + ] + } [tips_language]; + var input_url = document.getElementById('link_input').value; + if (input_url.length == 0) { + alert(tips[4]); + return; + } + var page_num = PDFViewerApplication.pagesCount; + if (select_link_type == 'page') { + + // if(Number.isInteger(input_url)==false){ + // alert(tips[3]); + // return; + // } + + if (input_url > page_num || input_url < 1) { + alert(tips[0]); + return; + } + } + + if (select_link_type == 'file') { + var nums = input_url.split('#').length; + if (nums != 2) { + alert(tips[1]); + return; + } + } + pdfHighlight.singleHighlightAndUnderline(0); + // console.log('输入的链接',input_url); + var hyper_item = { + 'type': select_link_type, + 'value': input_url, + } + + var page_number = current_link_annotation_item.page_number; + var anno_id = current_link_annotation_item.id; + //保存超链接 + pdfAnnotation.updateFabricComment(page_number, anno_id, hyper_item, 'hyper_link'); + pdfAnnotation.saveFabricCanvas(page_number); + pdfAnnotationUI.closeHyperLinkLog(); + current_link_annotation_item = null; + is_hyper_link_highlight = false; + document.getElementById('link_input').value = ''; + addOperationTips(tips[2] + input_url) +} + +function unLink() { + var tips = { + 'zh-cn': [ + '取消超链接成功', + ], + 'en': [ + 'unlink successful', + ] + } [tips_language]; + var hyper_item = { + 'type': select_link_type, + 'value': '', + } + + if (is_hyper_link_highlight == true) { + var page_number = current_link_annotation_item.page_number; + var anno_id = current_link_annotation_item.id; + var idstr = 'hyperlink-' + page_number + '-anno-' + anno_id + '-container'; + pdfAnnotation.deleteAnnotation({ + id: idstr + }); + } else { + var page_number = current_link_annotation_item.page_number; + var anno_id = current_link_annotation_item.id; + //保存超链接 + pdfAnnotation.updateFabricComment(page_number, anno_id, hyper_item, 'hyper_link'); + pdfAnnotation.saveFabricCanvas(page_number); + } + + pdfAnnotationUI.closeHyperLinkLog(); + current_link_annotation_item = null; + is_hyper_link_highlight = false; + document.getElementById('link_input').value = ''; + addOperationTips(tips[0]); +} + +function goHyperLink(node) { + var hy_type = node.getAttribute('hy_type'); + var hy_link = node.getAttribute('hy_link'); + pdfAnnotation.goHyperLink({ + 'type': hy_type, + 'value': hy_link, + }); +} + +function editHyperLink(node) { + var tips = { + 'zh-cn': [ + '批注所在页面未加载,对象读取未成功,现已自动加载相应页面,请再次尝试!', + ], + 'en': [ + 'The page where the annotation is located has not been loaded, so the loading failed.\nNow the page has been loaded automatically, please try again!', + ] + } [tips_language]; + + //delete html element 删除html元素 + var parent_node = node.parentElement; + if (!parent_node) { + parent_node = node; + } + // console.log('node',parent_node); + + var page_num = parent_node.id.split('-')[1]; + var anno_id = parent_node.id.split('-')[3]; + var fabricObj = pdfAnnotation.getFabricObj(page_num); + if (fabricObj == undefined) { + pdfAnnotationUI.selectAnnotation(node); + setTimeout(function() { + alert(tips[0]); + }, 1000); + return; + }else{ + pdfAnnotationUI.selectAnnotation(node); + } + + + + // PDFViewerApplication.page = parseInt(page_num); + //关闭历史 + this.closeAnnotationHistory(); + var anno_item = pdfAnnotation.getItemFromFabric(page_num, anno_id); + if (anno_item == null) { + return; + } else { + current_link_annotation_item = { + 'page_number': page_num, + 'id': anno_id, + } + if ('hyper_link' in anno_item && anno_item.hyper_link.value.length > 0) { + var hy_id = 'hy_' + anno_item.hyper_link.type; + document.getElementById(hy_id).setAttribute('checked', true); + document.getElementById('link_input').value = anno_item.hyper_link.value; + } else { + document.getElementById('hy_url').setAttribute('checked', true); + document.getElementById('link_input').value = ''; + } + pdfAnnotationUI.showHyperLinkLog(); + is_hyper_edit = true; + } +} + +function showHyperLinkSet() { + is_hyper_link_highlight = true; + is_hyper_edit = true; + var highlight_data = pdfHighlight.singleHighlightAndUnderline(0); + if ('id' in highlight_data) { + current_link_annotation_item = highlight_data; + pdfHighlight.closeCopyConfirmDiv(); + pdfAnnotationUI.showHyperLinkLog(); + } +} + +function cancelLink() { + // var input=document.getElementById('link_input').value; + // console.log('输入的链接',input); + // console.log('取消链接'); + if (is_hyper_link_highlight == true && current_link_annotation_item) { + var page_number = current_link_annotation_item.page_number; + var anno_id = current_link_annotation_item.id; + var idstr = 'hyperlink-' + page_number + '-anno-' + anno_id + '-container'; + pdfAnnotation.deleteAnnotation({ + id: idstr + }); + } + is_hyper_link_highlight = false; + is_hyper_edit = false; + pdfAnnotationUI.closeHyperLinkLog(); + //删除批注对象 +} + +//折叠或者展开修改面板 +function foldOrOpenMenu() { + var divs = document.getElementById('my-menu').getElementsByTagName('div'); + if (fold_my_munu == false) { + for (var i = 0; i < divs.length; i++) { + var item = divs[i]; + if (item.getAttribute('id') != "fold_or_open_div" && item.getAttribute('id') != 'ff-panel-screenshot') { + item.setAttribute('hidden', true); + } + } + fold_my_munu = true; + } else { + for (var i = 0; i < divs.length; i++) { + var item = divs[i]; + if (item.getAttribute('id') != "fold_or_open_div" && item.getAttribute('id') != 'ff-panel-screenshot') { + item.removeAttribute('hidden'); + } + } + fold_my_munu = false; + } +} + +function listenDrag(id) { + // 获取需要拖动的元素 + var annotationElement = document.getElementById(id); + // 添加鼠标事件处理程序 + annotationElement.addEventListener("mousedown", dragStart); + annotationElement.addEventListener("mousemove", drag); + annotationElement.addEventListener("mouseup", dragEnd); + + + // 当拖动开始时触发的函数 + function dragStart(event) { + // 存储鼠标按下时的坐标和元素的初始位置 + // event.preventDefault(); // 阻止默认的拖动行为 + annotationElement.startX = event.clientX; + annotationElement.startY = event.clientY; + annotationElement.initialX = annotationElement.offsetLeft; + annotationElement.initialY = annotationElement.offsetTop; + + // 添加样式以指示元素正在被拖动 + annotationElement.classList.add("dragging"); + } + + // 当拖动过程中触发的函数 + function drag(event) { + if (annotationElement.startX === undefined || annotationElement.startY === undefined) { + return; + } + + // 计算鼠标移动的距离 + var offsetX = event.clientX - annotationElement.startX; + var offsetY = event.clientY - annotationElement.startY; + + // 计算元素的新位置 + var newX = annotationElement.initialX + offsetX; + var newY = annotationElement.initialY + offsetY; + + // 应用新的位置 + annotationElement.style.left = newX + "px"; + annotationElement.style.top = newY + "px"; + } + + // 当拖动结束时触发的函数 + function dragEnd(event) { + // 清除存储的坐标和初始位置 + annotationElement.startX = undefined; + annotationElement.startY = undefined; + annotationElement.initialX = undefined; + annotationElement.initialY = undefined; + + // 移除拖动样式 + annotationElement.classList.remove("dragging"); + } +} + +function listenHighlight() { + var highlight_data = pdfHighlight.getMouseUpPos(); //listen mouseup 监听鼠标抬起 +} + +function clickTab(node) { + deactivateAddObj(); + pdfAnnotationUI.clickTab(node); +} + +function setFabricTop(node) { + removeAllButtonsColor(); + if (pdfAnnotation.option != -1 && pdfAnnotation.fabric_top == true) { + deactivateAddObj(); + + node.getElementsByTagName('i')[0].classList.add('button-active'); + node.getElementsByTagName('span')[0].classList.add('button-active'); + + pdfAnnotation.free_draw = false; + pdfAnnotationUI.disActivateFreeDraw(); //deactivate draw mode 关闭绘图模式 + } else { + pdfAnnotationUI.setFabricTop(node); + } +} + +function showAnnotationList() { + pdfAnnotationUI.showAnnotationList(); +} + +function editAnnotation() { + var tips = { + 'zh-cn': [ + "打开批注列表", + "关闭批注列表", + ], + 'en': [ + 'open annotation list', + 'close annotation list', + ] + } [tips_language]; + pdfAnnotationUI.show_annotation_list = !pdfAnnotationUI.show_annotation_list; + if (pdfAnnotationUI.show_annotation_list) { + document.getElementById('outerContainer').classList.add('myAnnotationSidebarOpen'); + pdfAnnotationUI.showAnnotationList(); + addOperationTips(tips[0]); + } else { + document.getElementById('outerContainer').classList.remove('myAnnotationSidebarOpen'); + pdfAnnotationUI.hiddenAnnotationList(); + JSplump.draw_connect = false; + JSplump.clearJsPlump(); + addOperationTips(tips[1]); + } +} + +//open or close highlight and underline annotations list 展开或关闭高亮及下划线列表 +function openOrCloseAnnotation(node) { + pdfAnnotationUI.openOrCloseAnnotation(node); +} + +function copyAnnotation(node) { + pdfAnnotationUI.copyAnnotation(node); +} + + +function selectAnnotation(node) { + pdfAnnotationUI.selectAnnotation(node); +} + +function deleteAnnotation(node) { + pdfAnnotation.deleteAnnotation(node); + // console.log('刷新列表',pdfAnnotationUI.show_annotation_list); + // if (pdfAnnotationUI.show_annotation_list==true){ + // pdfAnnotationUI.showAnnotationList(); + // } +} + +//输入可保存的批注对象 +function outputAnnotations() { + var tips = { + 'zh-cn': [ + '批注导出成功', + ], + 'en': [ + 'JSON annotation output', + ] + } [tips_language]; + var this_data = pdfAnnotation.outputAnnotations(); + var content = JSON.stringify(this_data['file_annotation']); + var blob = new Blob([content], { + type: "application/json;charset=utf-8" + }); + saveAs(blob, this_data['file_name'] + ".json"); + addOperationTips(tips[0]); +} + +function clearPageAnnotations(node) { + pdfAnnotation.clearPageAnnotations(node); +} + +function openAnnotationFile() { + var this_e = document.getElementById('choose_file'); + this_e.click(); +} + +function setFileAnnotation(this_e, e) { + var tips = { + 'zh-cn': [ + '批注导入成功', + ], + 'en': [ + 'JSON annotation import', + ] + } [tips_language]; + var file = e.currentTarget.files[0]; + if (file) { + if (file.type != 'application/json') { + alert('only support the file outputed by this application'); + return; + } + + const reader = new FileReader(); + reader.readAsText(file); + reader.onload = function() { + if (file.type == 'application/json') { + var old_file_obj = pdfAnnotation.readFileAnnotations(); + var json_data = JSON.parse(reader.result); + pdfAnnotation.setFileAnnotation(json_data); + //刷新文件保存之后更新历史记录 + pdfAnnotation.saveDataAfterClearFile(old_file_obj); + addOperationTips(tips[0]); + } + } + reader.onerror = function(e) { + alert('error:', e) + } + } + this_e.value = ''; +} + +//载入批注 reload annotations +function setPureFileAnnotation(anno_contents) { + var old_file_obj = pdfAnnotation.readFileAnnotations(); + var json_data = JSON.parse(anno_contents['file_annotation']); + pdfAnnotation.setFileAnnotation(json_data); + //刷新文件保存之后更新历史记录 + pdfAnnotation.saveDataAfterClearFile(old_file_obj); +} + +function confirmToClearFileAnnotations() { + pdfAnnotation.confirmToClearFileAnnotations(); +} + + +function downloadAnnotations() { + var tips = { + 'zh-cn': [ + '[页码 ', + '添加批注', + '添加评论', + 'txt批注下载成功', + ], + 'en': [ + '[page ', + 'add comments', + 'comment', + '.txt annotation download', + ] + } [tips_language]; + var this_data = pdfAnnotation.outputAnnotations(); + var this_file_annotations = this_data['file_annotation']; + + var down_str = ''; + for (var key in this_file_annotations) { + var i = key.split('-')[3]; + var this_page_anno = this_file_annotations[key]['page_annotations']; + + if (this_page_anno.length > 0) { + down_str += tips[0] + i + ']\r\n'; + for (var j = 0; j < this_page_anno.length; j++) { + var this_anno = this_page_anno[j]; + if (this_anno['comment'] != tips[1] && this_anno['comment'] != tips[2]) { + down_str += this_anno['all_str'] + '\r\n' + this_anno['comment'] + '\r\n\n'; + } else { + down_str += this_anno['all_str'] + '\r\n\n'; + } + } + down_str += '\r\n'; + } + } + + var blob = new Blob([down_str]); + saveAs(blob, this_data['file_name'] + ".txt"); + addOperationTips(tips[3]); +} + + +function annotationsModified(){ + // console.log('批注被编辑'); + postPDFData('annotationsModified',{}); +} + +function clearFileAnnotations() { + pdfAnnotation.clearFileAnnotations(); +} + +// download pdf 下载pdf +function myDownLoad() { + PDFViewerApplication.download(); +} +// wux 添加了 merge 方法,用于将 annotation 合并到 pdf 中。 +function mySave() { + PDFViewerApplication.merge(); +} + +function rangeToNumbers(rangeString) { + rangeString = rangeString.replace(',', ',').replace('——', '-'); + var ranges = rangeString.split(','); // 先按逗号分隔不同范围 + var result = []; + + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var start = parseInt(range.split('-')[0]); // 分隔范围并将字符串转换为数字 + var end = parseInt(range.split('-')[1]); // 分隔范围并将字符串转换为数字 + + if (!isNaN(start) && !isNaN(end)) { + for (let i = start; i <= end; i++) { + result.push(i - 1); // 将范围内的数字添加到结果数组 + } + } + } + + return result; +} + +function undoAnnotation() { + pdfAnnotation.undoAnnotation(); +} + +function redoAnnotation() { + pdfAnnotation.redoAnnotation(); +} + +//click to input color 点击后输入颜色 +function clickColorInput(node) { + var this_input = node.getElementsByTagName('input')[0]; + this_input.click(); +} + +function delEl() { + pdfAnnotation.delEl(); +} + +function hiddenMenu() { + pdfAnnotation.hiddenMenu(); +} + + +function showOrHideSettingMenu() { + if (show_setting_menu == false) { + setSettingsControl(); //添加设置面板 + pdfAnnotation.showSettingMenu(); + pdfAnnotation.hiddenMenu(); + show_setting_menu = true; + } else { + pdfAnnotation.hiddenSettingMenu(); + show_setting_menu = false; + } +} + +function hiddenSettingMenu() { + pdfAnnotation.hiddenSettingMenu(); +} + +function deactivateAddObj() { + pdfAnnotation.initialFabricState(null); //清空添加状态 + pdfAnnotation.option = -1; + removeAllButtonsColor(); +} + +function fabricDraw(node) { + deactivateAddObj(); + pdfAnnotationUI.fabricDraw(node); +} + +function eraserTool(node) { + if (pdfAnnotation.eraser_brush == false) { + pdfAnnotation.eraser_brush = true; + pdfAnnotation.free_draw = true; + pdfAnnotationUI.setFabricCanvasContainerZIndex(100); + pdfAnnotationUI.activateDrawMode(); + } else { + pdfAnnotation.eraser_brush = false; + pdfAnnotation.free_draw = false; + pdfAnnotationUI.setFabricCanvasContainerZIndex(10); + } + // console.log('橡皮擦'); +} + + +function chooseImage() { + var inputElement = document.getElementById("image_insert"); + inputElement.click(); + // pdfAnnotation.chooseImage(); +} + +function addFabricObj(node, option) { + pdfAnnotation.addFabricObj(node, option, 1); //1表示显示提示语,0表示不显示提示语 + removeAllButtonsColor(); + if (pdfAnnotation.option != option) { + node.getElementsByTagName('i')[0].classList.add('button-active'); + node.getElementsByTagName('span')[0].classList.add('button-active'); + + pdfAnnotation.option = option; + if (pdfAnnotation.eraser_brush == true || pdfAnnotation.free_draw == true) { + for (var key in pdfAnnotation.fabric_list) { + pdfAnnotation.free_draw = false; + pdfAnnotation.eraser_brush = false; + pdfAnnotation.fabric_list[key].page_canvas.fabric_canvas.isDrawingMode = pdfAnnotation.free_draw; + } + } + } else { + pdfAnnotation.option = -1; + clearTimeout(pdfAnnotation.timer); //清除未执行的定时器 + pdfAnnotation.initialFabricState(); //清空添加状态 + pdfAnnotationUI.setFabricCanvasContainerZIndex(10); + pdfAnnotationUI.fabric_top = false; + } +} + +function removeAllButtonsColor() { + var buttons = document.getElementById('firefly-annotation-buttons').getElementsByTagName('button'); + for (var i = 0; i < buttons.length; i++) { + var button = buttons[i]; + button.getElementsByTagName('i')[0].classList.remove('button-active'); + } + +} + +//按照矩形区域截图 +function screenShotEl() { + pdfAnnotation.screenShotEl(); +} + + +// function inputComment(evt, node) { +// pdfAnnotation.inputComment(evt, node); +// } + +function saveComment(node) { + var comment_id = node.getAttribute('comment_id'); + // console.log('comment_id',comment_id); + pdfAnnotation.saveComment(comment_id); +} + +function closeCopyConfirm() { + pdfHighlight.closeCopyConfirm(); +} + +function singleCopy() { + var this_text = window.getSelection().toString(); + if (post_to_parent == true) { + // window.parent.postMessage({ + // "type": 4, + // "source": "pdfjs", + // "content": text + // }, '*'); + } else { + pdfAnnotationUI.copyText(this_text); + } + pdfHighlight.closeCopyConfirm(); +} + +function singleHighlightAndUnderline(op) { + pdfHighlight.singleHighlightAndUnderline(op); +} + +function openOrCloseLink(node) { + pdfAnnotationUI.openOrCloseLink(node); +} + +function activateAnnotation(e, node) { + // console.log('激活批注',node); + // pdfAnnotation.activateAnnotationByID(node); + pdfAnnotation.activateAnnotation(e, node); +} + +function cancelLightParent(this_node) { + // var parent_node=this_node.parentElement; + // console.log('父级元素',parent_node); + // parent_node.style.backgroundColor='red'; + var id_split = this_node.id.split('-'); + var page_number = id_split[1]; + var anno_id = id_split[3]; + var this_link_id = "page-" + page_number + "-anno-" + anno_id + "-container-link"; + var this_link_e = document.getElementById(this_link_id); + this_link_e.classList.remove('link-annotation-item'); + // console.log('id列表',id_split); +} + +function lightParent(this_node) { + // var parent_node=this_node.parentElement; + // console.log('父级元素',parent_node); + // parent_node.style.backgroundColor='red'; + var id_split = this_node.id.split('-'); + var page_number = id_split[1]; + var anno_id = id_split[3]; + var this_link_id = "page-" + page_number + "-anno-" + anno_id + "-container-link"; + var this_link_e = document.getElementById(this_link_id); + this_link_e.classList.add('link-annotation-item'); + // console.log('id列表',id_split); +} + + +function closeAnnotationHistory() { + pdfAnnotation.closeAnnotationHistory(); +} + +function showThisPageLink(node) { + if (pdfAnnotationUI.draw_connect == true) { + // console.log('绘制连接线', pdfAnnotationUI.draw_connect); + var node_id = node.getAttribute('id'); + var id_split = node_id.split('-'); + this.PDFViewerApplication.page = parseInt(id_split[1]); + setTimeout(function() { + JSplump.draw_connect = true; + // console.log('显示页码'); + JSplump.connectAllAnnotations(node_id); //绘制批注连接线 + + //绘制批注链接线时记录id,后面刷新时自动重新链接 + last_connect_id = node_id; + }, 1000); + } +} + +function onlaodImgToInsert(ev) { + // console.log('加载图片'); + const file = ev.target.files[0]; + var blobURL; + try { + blobURL = URL.createObjectURL(file); + } catch (e) { + return; + } + const img = new Image(); + img.setAttribute('crossOrigin', 'Anonymous'); + img.src = blobURL; + img.onerror = function() { + URL.revokeObjectURL(this.src); + alert(tips[0]); + }; + img.onload = function() { + const MAX_WIDTH = 500; + const MAX_HEIGHT = 500; + const MIME_TYPE = 'image/png'; + const QUALITY = 1; + + URL.revokeObjectURL(this.src); + const this_size = pdfAnnotation.calculateSize( + img, + MAX_WIDTH, + MAX_HEIGHT + ); + var newWidth = this_size[0]; + var newHeight = this_size[1]; + const canvas = document.createElement('canvas'); + canvas.width = newWidth; + canvas.height = newHeight; + const ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0, newWidth, newHeight); + //销毁图片 + image = null; + + var new_image = new Image(); + // The value is set to anonymous, indicating that CORS requests for this element will not set credential flags. You cannot export a canvas or an object on a canvas as a picture without setting it. + //值设置为 anonymous,表示对此元素的 CORS 请求将不设置凭据标志。若不设置,无法将画布或画布上的对象导出为图片。 + new_image.setAttribute('crossOrigin', 'Anonymous'); + // console.log('加载文件'); + new_image.onload = function() { + //插入图片对象 + pdfAnnotation.insertImage(new_image); + new_image = null; //销毁图片 + } + var img_data = canvas.toDataURL('image/png'); + new_image.src = img_data; + } +} + +function setCurrentMemberId(this_member) { + // this_member = { + // 'id': 'user_1', + // 'name': 'member_1', + // }; + pdfHighlight.current_member = this_member; + pdfAnnotation.current_member = this_member; + pdfAnnotationUI.current_member = this_member; +} + +function rgbaToHex(rgbaColor) { + const match = rgbaColor.match(/rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)/); + + if (match) { + const r = parseInt(match[1]); + const g = parseInt(match[2]); + const b = parseInt(match[3]); + + // 将十进制颜色值转换为十六进制,并确保它们至少有两位 + const rHex = r.toString(16).padStart(2, '0'); + const gHex = g.toString(16).padStart(2, '0'); + const bHex = b.toString(16).padStart(2, '0'); + + // 返回十六进制颜色值 + return '#' + rHex + gHex + bHex; + } else { + // 如果输入不是有效的RGBA颜色值,则返回原始值 + return rgbaColor; + } +} + + +function addOperationTips(message) { + // var tips = { + // 'zh-cn': [ + // "点击关闭该消息提示", + // ], + // 'en': [ + // 'click to close this message', + // ] + // } [tips_language]; + // var message_number = document.getElementById('operation_tips').children.length + 1; + // var message_id = pdfAnnotation.buildId(message_number); + // document.getElementById('operation_tips').innerHTML += '
' + message + + // '
'; + // autoRemoveMessage(message_id); +} + +function removeThisMessage(node) { + node.parentNode.removeChild(node); +} + +function autoRemoveMessage(element_id) { + // 使用setTimeout在2秒后删除元素 + setTimeout(function() { + var element = document.getElementById(element_id); + if (element) { + element.parentNode.removeChild(element); + } + }, 3000); // 2000毫秒(2秒) +} + + +fabric.LineArrow = fabric.util.createClass(fabric.Line, { + type: 'lineArrow', + initialize: function(element, options) { + options || (options = {}); + this.callSuper('initialize', element, options); + }, + + toObject: function() { + return fabric.util.object.extend(this.callSuper('toObject')); + }, + + _render: function(ctx) { + this.callSuper('_render', ctx); + + // do not render if width/height are zeros or object is not visible + if (this.width === 0 || this.height === 0 || !this.visible) return; + + ctx.save(); + + var xDiff = this.x2 - this.x1; + var yDiff = this.y2 - this.y1; + var angle = Math.atan2(yDiff, xDiff); + ctx.translate((this.x2 - this.x1) / 2, (this.y2 - this.y1) / 2); + ctx.rotate(angle); + ctx.beginPath(); + //move 10px in front of line to start the arrow so it does not have the square line end showing in front (0,0) + // ctx.moveTo(10, 0); + // ctx.lineTo(-20, 15); + // ctx.lineTo(-20, -15); + + ctx.moveTo(this.strokeWidth * 2, 0); + ctx.lineTo(-this.strokeWidth * 4, this.strokeWidth * 3); + ctx.lineTo(-this.strokeWidth * 4, -this.strokeWidth * 3); + ctx.closePath(); + ctx.fillStyle = this.stroke; + ctx.fill(); + + ctx.restore(); + + } +}); + +fabric.LineArrow.fromObject = function(object, callback) { + callback && callback(new fabric.LineArrow([object.x1, object.y1, object.x2, object.y2], object)); +}; + +fabric.LineArrow.async = true; + +function encodeToBase64(bytes) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + let base64 = ''; + const len = bytes.length; + for (let i = 0; i < len; i += 3) { + base64 += chars[bytes[i] >> 2]; + base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)]; + base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)]; + base64 += chars[bytes[i + 2] & 63]; + } + if (len % 3 === 2) { + base64 = base64.substring(0, base64.length - 1) + '='; + } + else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + '=='; + } + return base64; +}; diff --git a/src/assets/pdf-annotation/build/pdf.js b/src/assets/pdf-annotation/build/pdf.js new file mode 100755 index 0000000..ea5bcc2 --- /dev/null +++ b/src/assets/pdf-annotation/build/pdf.js @@ -0,0 +1,20056 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2022 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define("pdfjs-dist/build/pdf", [], factory); + else if(typeof exports === 'object') + exports["pdfjs-dist/build/pdf"] = factory(); + else + root["pdfjs-dist/build/pdf"] = root.pdfjsLib = factory(); +})(globalThis, () => { +return /******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.VerbosityLevel = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.UNSUPPORTED_FEATURES = exports.TextRenderingMode = exports.StreamType = exports.RenderingIntentFlag = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.LINE_FACTOR = exports.LINE_DESCENT_FACTOR = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FontType = exports.FeatureTest = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.BASELINE_FACTOR = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMode = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationEditorType = exports.AnnotationEditorPrefix = exports.AnnotationEditorParamsType = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; +exports.arrayByteLength = arrayByteLength; +exports.arraysToBytes = arraysToBytes; +exports.assert = assert; +exports.bytesToString = bytesToString; +exports.createPromiseCapability = createPromiseCapability; +exports.createValidAbsoluteUrl = createValidAbsoluteUrl; +exports.getModificationDate = getModificationDate; +exports.getVerbosityLevel = getVerbosityLevel; +exports.info = info; +exports.isArrayBuffer = isArrayBuffer; +exports.isArrayEqual = isArrayEqual; +exports.objectFromMap = objectFromMap; +exports.objectSize = objectSize; +exports.setVerbosityLevel = setVerbosityLevel; +exports.shadow = shadow; +exports.string32 = string32; +exports.stringToBytes = stringToBytes; +exports.stringToPDFString = stringToPDFString; +exports.stringToUTF8String = stringToUTF8String; +exports.unreachable = unreachable; +exports.utf8StringToString = utf8StringToString; +exports.warn = warn; +if (!globalThis._pdfjsCompatibilityChecked) { + globalThis._pdfjsCompatibilityChecked = true; + __w_pdfjs_require__(2); +} +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +exports.IDENTITY_MATRIX = IDENTITY_MATRIX; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; +const LINE_FACTOR = 1.35; +exports.LINE_FACTOR = LINE_FACTOR; +const LINE_DESCENT_FACTOR = 0.35; +exports.LINE_DESCENT_FACTOR = LINE_DESCENT_FACTOR; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +exports.BASELINE_FACTOR = BASELINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + OPLIST: 0x100 +}; +exports.RenderingIntentFlag = RenderingIntentFlag; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +exports.AnnotationMode = AnnotationMode; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +exports.AnnotationEditorPrefix = AnnotationEditorPrefix; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + INK: 15 +}; +exports.AnnotationEditorType = AnnotationEditorType; +const AnnotationEditorParamsType = { + FREETEXT_SIZE: 1, + FREETEXT_COLOR: 2, + FREETEXT_OPACITY: 3, + INK_COLOR: 11, + INK_THICKNESS: 12, + INK_OPACITY: 13 +}; +exports.AnnotationEditorParamsType = AnnotationEditorParamsType; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +exports.PermissionFlag = PermissionFlag; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +exports.TextRenderingMode = TextRenderingMode; +const ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +exports.ImageKind = ImageKind; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +exports.AnnotationType = AnnotationType; +const AnnotationStateModelType = { + MARKED: "Marked", + REVIEW: "Review" +}; +exports.AnnotationStateModelType = AnnotationStateModelType; +const AnnotationMarkedState = { + MARKED: "Marked", + UNMARKED: "Unmarked" +}; +exports.AnnotationMarkedState = AnnotationMarkedState; +const AnnotationReviewState = { + ACCEPTED: "Accepted", + REJECTED: "Rejected", + CANCELLED: "Cancelled", + COMPLETED: "Completed", + NONE: "None" +}; +exports.AnnotationReviewState = AnnotationReviewState; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +exports.AnnotationReplyType = AnnotationReplyType; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +exports.AnnotationFlag = AnnotationFlag; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +exports.AnnotationFieldFlag = AnnotationFieldFlag; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +exports.AnnotationBorderStyleType = AnnotationBorderStyleType; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +exports.AnnotationActionEventType = AnnotationActionEventType; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +exports.DocumentActionEventType = DocumentActionEventType; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +exports.PageActionEventType = PageActionEventType; +const StreamType = { + UNKNOWN: "UNKNOWN", + FLATE: "FLATE", + LZW: "LZW", + DCT: "DCT", + JPX: "JPX", + JBIG: "JBIG", + A85: "A85", + AHX: "AHX", + CCF: "CCF", + RLX: "RLX" +}; +exports.StreamType = StreamType; +const FontType = { + UNKNOWN: "UNKNOWN", + TYPE1: "TYPE1", + TYPE1STANDARD: "TYPE1STANDARD", + TYPE1C: "TYPE1C", + CIDFONTTYPE0: "CIDFONTTYPE0", + CIDFONTTYPE0C: "CIDFONTTYPE0C", + TRUETYPE: "TRUETYPE", + CIDFONTTYPE2: "CIDFONTTYPE2", + TYPE3: "TYPE3", + OPENTYPE: "OPENTYPE", + TYPE0: "TYPE0", + MMTYPE1: "MMTYPE1" +}; +exports.FontType = FontType; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +exports.VerbosityLevel = VerbosityLevel; +const CMapCompressionType = { + NONE: 0, + BINARY: 1 +}; +exports.CMapCompressionType = CMapCompressionType; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91 +}; +exports.OPS = OPS; +const UNSUPPORTED_FEATURES = { + forms: "forms", + javaScript: "javaScript", + signatures: "signatures", + smask: "smask", + shadingPattern: "shadingPattern", + errorTilingPattern: "errorTilingPattern", + errorExtGState: "errorExtGState", + errorXObject: "errorXObject", + errorFontLoadType3: "errorFontLoadType3", + errorFontState: "errorFontState", + errorFontMissing: "errorFontMissing", + errorFontTranslate: "errorFontTranslate", + errorColorSpace: "errorColorSpace", + errorOperatorList: "errorOperatorList", + errorFontToUnicode: "errorFontToUnicode", + errorFontLoadNative: "errorFontLoadNative", + errorFontBuildPath: "errorFontBuildPath", + errorFontGetPath: "errorFontGetPath", + errorMarkedContent: "errorMarkedContent", + errorContentSubStream: "errorContentSubStream" +}; +exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +exports.PasswordResponses = PasswordResponses; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + if (!url) { + return false; + } + switch (url.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url) { + let baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots && dots.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch (ex) {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch (ex) {} + return null; +} +function shadow(obj, prop, value) { + let nonSerializable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + if (this.constructor === BaseException) { + unreachable("Cannot initialize BaseException."); + } + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +exports.BaseException = BaseException; +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +exports.PasswordException = PasswordException; +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +exports.UnknownErrorException = UnknownErrorException; +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +exports.InvalidPDFException = InvalidPDFException; +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); + } +} +exports.MissingPDFException = MissingPDFException; +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; + } +} +exports.UnexpectedResponseException = UnexpectedResponseException; +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +exports.FormatError = FormatError; +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +exports.AbortException = AbortException; +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes === null || bytes.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function arrayByteLength(arr) { + if (arr.length !== undefined) { + return arr.length; + } + if (arr.byteLength !== undefined) { + return arr.byteLength; + } + unreachable("Invalid argument for arrayByteLength"); +} +function arraysToBytes(arr) { + const length = arr.length; + if (length === 1 && arr[0] instanceof Uint8Array) { + return arr[0]; + } + let resultLength = 0; + for (let i = 0; i < length; i++) { + resultLength += arrayByteLength(arr[i]); + } + let pos = 0; + const data = new Uint8Array(resultLength); + for (let i = 0; i < length; i++) { + let item = arr[i]; + if (!(item instanceof Uint8Array)) { + if (typeof item === "string") { + item = stringToBytes(item); + } else { + item = new Uint8Array(item); + } + } + const itemLength = item.byteLength; + data.set(item, pos); + pos += itemLength; + } + return data; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function objectFromMap(map) { + const obj = Object.create(null); + for (const [key, value] of map) { + obj[key] = value; + } + return obj; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch (e) { + return false; + } +} +class FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get platform() { + if (typeof navigator === "undefined") { + return shadow(this, "platform", { + isWin: false, + isMac: false + }); + } + return shadow(this, "platform", { + isWin: navigator.platform.includes("Win"), + isMac: navigator.platform.includes("Mac") + }); + } +} +exports.FeatureTest = FeatureTest; +const hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + } + minMax[0] *= transform[0]; + minMax[1] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + } + minMax[2] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + } + minMax[2] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + } + minMax[0] *= transform[2]; + minMax[1] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[4]; + minMax[2] += transform[5]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; + } + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = Util.applyTransform(r, m); + const p2 = Util.applyTransform(r.slice(2, 4), m); + const p3 = Util.applyTransform([r[0], r[3]], m); + const p4 = Util.applyTransform([r[2], r[1]], m); + return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + const c = m[2] * transpose[0] + m[3] * transpose[2]; + const d = m[2] * transpose[1] + m[3] * transpose[3]; + const first = (a + d) / 2; + const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3) { + const tvalues = [], + bounds = [[], []]; + let a, b, c, t, t1, t2, b2ac, sqrtb2ac; + for (let i = 0; i < 2; ++i) { + if (i === 0) { + b = 6 * x0 - 12 * x1 + 6 * x2; + a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; + c = 3 * x1 - 3 * x0; + } else { + b = 6 * y0 - 12 * y1 + 6 * y2; + a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; + c = 3 * y1 - 3 * y0; + } + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) < 1e-12) { + continue; + } + t = -c / b; + if (0 < t && t < 1) { + tvalues.push(t); + } + continue; + } + b2ac = b * b - 4 * c * a; + sqrtb2ac = Math.sqrt(b2ac); + if (b2ac < 0) { + continue; + } + t1 = (-b + sqrtb2ac) / (2 * a); + if (0 < t1 && t1 < 1) { + tvalues.push(t1); + } + t2 = (-b - sqrtb2ac) / (2 * a); + if (0 < t2 && t2 < 1) { + tvalues.push(t2); + } + } + let j = tvalues.length, + mt; + const jlen = j; + while (j--) { + t = tvalues[j]; + mt = 1 - t; + bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3; + bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3; + } + bounds[0][jlen] = x0; + bounds[1][jlen] = y0; + bounds[0][jlen + 1] = x3; + bounds[1][jlen + 1] = y3; + bounds[0].length = bounds[1].length = jlen + 2; + return [Math.min(...bounds[0]), Math.min(...bounds[1]), Math.max(...bounds[0]), Math.max(...bounds[1])]; + } +} +exports.Util = Util; +const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + return decoder.decode(buffer); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const code = PDFStringTranslateTable[str.charCodeAt(i)]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayBuffer(v) { + return typeof v === "object" && v !== null && v.byteLength !== undefined; +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate() { + let date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date(); + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +function createPromiseCapability() { + const capability = Object.create(null); + let isSettled = false; + Object.defineProperty(capability, "settled", { + get() { + return isSettled; + } + }); + capability.promise = new Promise(function (resolve, reject) { + capability.resolve = function (data) { + isSettled = true; + resolve(data); + }; + capability.reject = function (reason) { + isSettled = true; + reject(reason); + }; + }); + return capability; +} + +/***/ }), +/* 2 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + + +var _is_node = __w_pdfjs_require__(3); +(function checkNodeBtoa() { + if (globalThis.btoa || !_is_node.isNodeJS) { + return; + } + globalThis.btoa = function (chars) { + return Buffer.from(chars, "binary").toString("base64"); + }; +})(); +(function checkNodeAtob() { + if (globalThis.atob || !_is_node.isNodeJS) { + return; + } + globalThis.atob = function (input) { + return Buffer.from(input, "base64").toString("binary"); + }; +})(); +(function checkDOMMatrix() { + if (globalThis.DOMMatrix || !_is_node.isNodeJS) { + return; + } + globalThis.DOMMatrix = require("canvas").DOMMatrix; +})(); +(function checkReadableStream() { + if (globalThis.ReadableStream || !_is_node.isNodeJS) { + return; + } + globalThis.ReadableStream = require("web-streams-polyfill/dist/ponyfill.js").ReadableStream; +})(); +(function checkArrayAt() { + if (Array.prototype.at) { + return; + } + __w_pdfjs_require__(4); +})(); +(function checkTypedArrayAt() { + if (Uint8Array.prototype.at) { + return; + } + __w_pdfjs_require__(78); +})(); +(function checkStructuredClone() { + if (globalThis.structuredClone) { + return; + } + __w_pdfjs_require__(88); +})(); + +/***/ }), +/* 3 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.isNodeJS = void 0; +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +exports.isNodeJS = isNodeJS; + +/***/ }), +/* 4 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(5); +var entryUnbind = __w_pdfjs_require__(77); +module.exports = entryUnbind('Array', 'at'); + +/***/ }), +/* 5 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var $ = __w_pdfjs_require__(6); +var toObject = __w_pdfjs_require__(43); +var lengthOfArrayLike = __w_pdfjs_require__(67); +var toIntegerOrInfinity = __w_pdfjs_require__(65); +var addToUnscopables = __w_pdfjs_require__(72); +$({ + target: 'Array', + proto: true +}, { + at: function at(index) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; + return k < 0 || k >= len ? undefined : O[k]; + } +}); +addToUnscopables('at'); + +/***/ }), +/* 6 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var getOwnPropertyDescriptor = (__w_pdfjs_require__(8).f); +var createNonEnumerableProperty = __w_pdfjs_require__(47); +var defineBuiltIn = __w_pdfjs_require__(51); +var defineGlobalProperty = __w_pdfjs_require__(41); +var copyConstructorProperties = __w_pdfjs_require__(59); +var isForced = __w_pdfjs_require__(71); +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) + for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else + targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) + continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + if (options.sham || targetProperty && targetProperty.sham) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + +/***/ }), +/* 7 */ +/***/ ((module) => { + +var check = function (it) { + return it && it.Math == Math && it; +}; +module.exports = check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || check(typeof self == 'object' && self) || check(typeof global == 'object' && global) || (function () { + return this; +}()) || Function('return this')(); + +/***/ }), +/* 8 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(9); +var call = __w_pdfjs_require__(11); +var propertyIsEnumerableModule = __w_pdfjs_require__(13); +var createPropertyDescriptor = __w_pdfjs_require__(14); +var toIndexedObject = __w_pdfjs_require__(15); +var toPropertyKey = __w_pdfjs_require__(21); +var hasOwn = __w_pdfjs_require__(42); +var IE8_DOM_DEFINE = __w_pdfjs_require__(45); +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) + try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { + } + if (hasOwn(O, P)) + return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + +/***/ }), +/* 9 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +module.exports = !fails(function () { + return Object.defineProperty({}, 1, { + get: function () { + return 7; + } + })[1] != 7; +}); + +/***/ }), +/* 10 */ +/***/ ((module) => { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + +/***/ }), +/* 11 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_BIND = __w_pdfjs_require__(12); +var call = Function.prototype.call; +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + +/***/ }), +/* 12 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +module.exports = !fails(function () { + var test = function () { + }.bind(); + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + +/***/ }), +/* 13 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + +/***/ }), +/* 14 */ +/***/ ((module) => { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +/***/ }), +/* 15 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IndexedObject = __w_pdfjs_require__(16); +var requireObjectCoercible = __w_pdfjs_require__(19); +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + +/***/ }), +/* 16 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var fails = __w_pdfjs_require__(10); +var classof = __w_pdfjs_require__(18); +var $Object = Object; +var split = uncurryThis(''.split); +module.exports = fails(function () { + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split(it, '') : $Object(it); +} : $Object; + +/***/ }), +/* 17 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_BIND = __w_pdfjs_require__(12); +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + +/***/ }), +/* 18 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + +/***/ }), +/* 19 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isNullOrUndefined = __w_pdfjs_require__(20); +var $TypeError = TypeError; +module.exports = function (it) { + if (isNullOrUndefined(it)) + throw $TypeError("Can't call method on " + it); + return it; +}; + +/***/ }), +/* 20 */ +/***/ ((module) => { + +module.exports = function (it) { + return it === null || it === undefined; +}; + +/***/ }), +/* 21 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toPrimitive = __w_pdfjs_require__(22); +var isSymbol = __w_pdfjs_require__(26); +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + +/***/ }), +/* 22 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(11); +var isObject = __w_pdfjs_require__(23); +var isSymbol = __w_pdfjs_require__(26); +var getMethod = __w_pdfjs_require__(33); +var ordinaryToPrimitive = __w_pdfjs_require__(36); +var wellKnownSymbol = __w_pdfjs_require__(37); +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) + return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) + pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) + return result; + throw $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) + pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + +/***/ }), +/* 23 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(24); +var $documentAll = __w_pdfjs_require__(25); +var documentAll = $documentAll.all; +module.exports = $documentAll.IS_HTMLDDA ? function (it) { + return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll; +} : function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + +/***/ }), +/* 24 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var $documentAll = __w_pdfjs_require__(25); +var documentAll = $documentAll.all; +module.exports = $documentAll.IS_HTMLDDA ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + +/***/ }), +/* 25 */ +/***/ ((module) => { + +var documentAll = typeof document == 'object' && document.all; +var IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined; +module.exports = { + all: documentAll, + IS_HTMLDDA: IS_HTMLDDA +}; + +/***/ }), +/* 26 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(27); +var isCallable = __w_pdfjs_require__(24); +var isPrototypeOf = __w_pdfjs_require__(28); +var USE_SYMBOL_AS_UID = __w_pdfjs_require__(29); +var $Object = Object; +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + +/***/ }), +/* 27 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var isCallable = __w_pdfjs_require__(24); +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; + +/***/ }), +/* 28 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +module.exports = uncurryThis({}.isPrototypeOf); + +/***/ }), +/* 29 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_SYMBOL = __w_pdfjs_require__(30); +module.exports = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == 'symbol'; + +/***/ }), +/* 30 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var V8_VERSION = __w_pdfjs_require__(31); +var fails = __w_pdfjs_require__(10); +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol(); + return !String(symbol) || !(Object(symbol) instanceof Symbol) || !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + +/***/ }), +/* 31 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var userAgent = __w_pdfjs_require__(32); +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; +if (v8) { + match = v8.split('.'); + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) + version = +match[1]; + } +} +module.exports = version; + +/***/ }), +/* 32 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(27); +module.exports = getBuiltIn('navigator', 'userAgent') || ''; + +/***/ }), +/* 33 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var aCallable = __w_pdfjs_require__(34); +var isNullOrUndefined = __w_pdfjs_require__(20); +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + +/***/ }), +/* 34 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(24); +var tryToString = __w_pdfjs_require__(35); +var $TypeError = TypeError; +module.exports = function (argument) { + if (isCallable(argument)) + return argument; + throw $TypeError(tryToString(argument) + ' is not a function'); +}; + +/***/ }), +/* 35 */ +/***/ ((module) => { + +var $String = String; +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + +/***/ }), +/* 36 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(11); +var isCallable = __w_pdfjs_require__(24); +var isObject = __w_pdfjs_require__(23); +var $TypeError = TypeError; +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) + return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) + return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) + return val; + throw $TypeError("Can't convert object to primitive value"); +}; + +/***/ }), +/* 37 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var shared = __w_pdfjs_require__(38); +var hasOwn = __w_pdfjs_require__(42); +var uid = __w_pdfjs_require__(44); +var NATIVE_SYMBOL = __w_pdfjs_require__(30); +var USE_SYMBOL_AS_UID = __w_pdfjs_require__(29); +var WellKnownSymbolsStore = shared('wks'); +var Symbol = global.Symbol; +var symbolFor = Symbol && Symbol['for']; +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { + var description = 'Symbol.' + name; + if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { + WellKnownSymbolsStore[name] = Symbol[name]; + } else if (USE_SYMBOL_AS_UID && symbolFor) { + WellKnownSymbolsStore[name] = symbolFor(description); + } else { + WellKnownSymbolsStore[name] = createWellKnownSymbol(description); + } + } + return WellKnownSymbolsStore[name]; +}; + +/***/ }), +/* 38 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IS_PURE = __w_pdfjs_require__(39); +var store = __w_pdfjs_require__(40); +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.26.1', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)', + license: 'https://github.com/zloirock/core-js/blob/v3.26.1/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + +/***/ }), +/* 39 */ +/***/ ((module) => { + +module.exports = false; + +/***/ }), +/* 40 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var defineGlobalProperty = __w_pdfjs_require__(41); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || defineGlobalProperty(SHARED, {}); +module.exports = store; + +/***/ }), +/* 41 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var defineProperty = Object.defineProperty; +module.exports = function (key, value) { + try { + defineProperty(global, key, { + value: value, + configurable: true, + writable: true + }); + } catch (error) { + global[key] = value; + } + return value; +}; + +/***/ }), +/* 42 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var toObject = __w_pdfjs_require__(43); +var hasOwnProperty = uncurryThis({}.hasOwnProperty); +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + +/***/ }), +/* 43 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var requireObjectCoercible = __w_pdfjs_require__(19); +var $Object = Object; +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + +/***/ }), +/* 44 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + +/***/ }), +/* 45 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(9); +var fails = __w_pdfjs_require__(10); +var createElement = __w_pdfjs_require__(46); +module.exports = !DESCRIPTORS && !fails(function () { + return Object.defineProperty(createElement('div'), 'a', { + get: function () { + return 7; + } + }).a != 7; +}); + +/***/ }), +/* 46 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var isObject = __w_pdfjs_require__(23); +var document = global.document; +var EXISTS = isObject(document) && isObject(document.createElement); +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + +/***/ }), +/* 47 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(9); +var definePropertyModule = __w_pdfjs_require__(48); +var createPropertyDescriptor = __w_pdfjs_require__(14); +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +/***/ }), +/* 48 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(9); +var IE8_DOM_DEFINE = __w_pdfjs_require__(45); +var V8_PROTOTYPE_DEFINE_BUG = __w_pdfjs_require__(49); +var anObject = __w_pdfjs_require__(50); +var toPropertyKey = __w_pdfjs_require__(21); +var $TypeError = TypeError; +var $defineProperty = Object.defineProperty; +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } + return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) + try { + return $defineProperty(O, P, Attributes); + } catch (error) { + } + if ('get' in Attributes || 'set' in Attributes) + throw $TypeError('Accessors not supported'); + if ('value' in Attributes) + O[P] = Attributes.value; + return O; +}; + +/***/ }), +/* 49 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(9); +var fails = __w_pdfjs_require__(10); +module.exports = DESCRIPTORS && fails(function () { + return Object.defineProperty(function () { + }, 'prototype', { + value: 42, + writable: false + }).prototype != 42; +}); + +/***/ }), +/* 50 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isObject = __w_pdfjs_require__(23); +var $String = String; +var $TypeError = TypeError; +module.exports = function (argument) { + if (isObject(argument)) + return argument; + throw $TypeError($String(argument) + ' is not an object'); +}; + +/***/ }), +/* 51 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(24); +var definePropertyModule = __w_pdfjs_require__(48); +var makeBuiltIn = __w_pdfjs_require__(52); +var defineGlobalProperty = __w_pdfjs_require__(41); +module.exports = function (O, key, value, options) { + if (!options) + options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) + makeBuiltIn(value, name, options); + if (options.global) { + if (simple) + O[key] = value; + else + defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) + delete O[key]; + else if (O[key]) + simple = true; + } catch (error) { + } + if (simple) + O[key] = value; + else + definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } + return O; +}; + +/***/ }), +/* 52 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +var isCallable = __w_pdfjs_require__(24); +var hasOwn = __w_pdfjs_require__(42); +var DESCRIPTORS = __w_pdfjs_require__(9); +var CONFIGURABLE_FUNCTION_NAME = (__w_pdfjs_require__(53).CONFIGURABLE); +var inspectSource = __w_pdfjs_require__(54); +var InternalStateModule = __w_pdfjs_require__(55); +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var defineProperty = Object.defineProperty; +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { + }, 'length', { value: 8 }).length !== 8; +}); +var TEMPLATE = String(String).split('String'); +var makeBuiltIn = module.exports = function (value, name, options) { + if (String(name).slice(0, 7) === 'Symbol(') { + name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']'; + } + if (options && options.getter) + name = 'get ' + name; + if (options && options.setter) + name = 'set ' + name; + if (!hasOwn(value, 'name') || CONFIGURABLE_FUNCTION_NAME && value.name !== name) { + if (DESCRIPTORS) + defineProperty(value, 'name', { + value: name, + configurable: true + }); + else + value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) + defineProperty(value, 'prototype', { writable: false }); + } else if (value.prototype) + value.prototype = undefined; + } catch (error) { + } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = TEMPLATE.join(typeof name == 'string' ? name : ''); + } + return value; +}; +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + +/***/ }), +/* 53 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(9); +var hasOwn = __w_pdfjs_require__(42); +var FunctionPrototype = Function.prototype; +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; +var EXISTS = hasOwn(FunctionPrototype, 'name'); +var PROPER = EXISTS && function something() { +}.name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable); +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + +/***/ }), +/* 54 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var isCallable = __w_pdfjs_require__(24); +var store = __w_pdfjs_require__(40); +var functionToString = uncurryThis(Function.toString); +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} +module.exports = store.inspectSource; + +/***/ }), +/* 55 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_WEAK_MAP = __w_pdfjs_require__(56); +var global = __w_pdfjs_require__(7); +var isObject = __w_pdfjs_require__(23); +var createNonEnumerableProperty = __w_pdfjs_require__(47); +var hasOwn = __w_pdfjs_require__(42); +var shared = __w_pdfjs_require__(40); +var sharedKey = __w_pdfjs_require__(57); +var hiddenKeys = __w_pdfjs_require__(58); +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } + return state; + }; +}; +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + store.get = store.get; + store.has = store.has; + store.set = store.set; + set = function (it, metadata) { + if (store.has(it)) + throw TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) + throw TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + +/***/ }), +/* 56 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var isCallable = __w_pdfjs_require__(24); +var WeakMap = global.WeakMap; +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + +/***/ }), +/* 57 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var shared = __w_pdfjs_require__(38); +var uid = __w_pdfjs_require__(44); +var keys = shared('keys'); +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +/***/ }), +/* 58 */ +/***/ ((module) => { + +module.exports = {}; + +/***/ }), +/* 59 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var hasOwn = __w_pdfjs_require__(42); +var ownKeys = __w_pdfjs_require__(60); +var getOwnPropertyDescriptorModule = __w_pdfjs_require__(8); +var definePropertyModule = __w_pdfjs_require__(48); +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + +/***/ }), +/* 60 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(27); +var uncurryThis = __w_pdfjs_require__(17); +var getOwnPropertyNamesModule = __w_pdfjs_require__(61); +var getOwnPropertySymbolsModule = __w_pdfjs_require__(70); +var anObject = __w_pdfjs_require__(50); +var concat = uncurryThis([].concat); +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + +/***/ }), +/* 61 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var internalObjectKeys = __w_pdfjs_require__(62); +var enumBugKeys = __w_pdfjs_require__(69); +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + +/***/ }), +/* 62 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var hasOwn = __w_pdfjs_require__(42); +var toIndexedObject = __w_pdfjs_require__(15); +var indexOf = (__w_pdfjs_require__(63).indexOf); +var hiddenKeys = __w_pdfjs_require__(58); +var push = uncurryThis([].push); +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) + !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + while (names.length > i) + if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + +/***/ }), +/* 63 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toIndexedObject = __w_pdfjs_require__(15); +var toAbsoluteIndex = __w_pdfjs_require__(64); +var lengthOfArrayLike = __w_pdfjs_require__(67); +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + var index = toAbsoluteIndex(fromIndex, length); + var value; + if (IS_INCLUDES && el != el) + while (length > index) { + value = O[index++]; + if (value != value) + return true; + } + else + for (; length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) + return IS_INCLUDES || index || 0; + } + return !IS_INCLUDES && -1; + }; +}; +module.exports = { + includes: createMethod(true), + indexOf: createMethod(false) +}; + +/***/ }), +/* 64 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toIntegerOrInfinity = __w_pdfjs_require__(65); +var max = Math.max; +var min = Math.min; +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + +/***/ }), +/* 65 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var trunc = __w_pdfjs_require__(66); +module.exports = function (argument) { + var number = +argument; + return number !== number || number === 0 ? 0 : trunc(number); +}; + +/***/ }), +/* 66 */ +/***/ ((module) => { + +var ceil = Math.ceil; +var floor = Math.floor; +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + +/***/ }), +/* 67 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toLength = __w_pdfjs_require__(68); +module.exports = function (obj) { + return toLength(obj.length); +}; + +/***/ }), +/* 68 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toIntegerOrInfinity = __w_pdfjs_require__(65); +var min = Math.min; +module.exports = function (argument) { + return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; +}; + +/***/ }), +/* 69 */ +/***/ ((module) => { + +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + +/***/ }), +/* 70 */ +/***/ ((__unused_webpack_module, exports) => { + +exports.f = Object.getOwnPropertySymbols; + +/***/ }), +/* 71 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +var isCallable = __w_pdfjs_require__(24); +var replacement = /#|\.prototype\./; +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true : value == NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection; +}; +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; +module.exports = isForced; + +/***/ }), +/* 72 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(37); +var create = __w_pdfjs_require__(73); +var defineProperty = (__w_pdfjs_require__(48).f); +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; +if (ArrayPrototype[UNSCOPABLES] == undefined) { + defineProperty(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + +/***/ }), +/* 73 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var anObject = __w_pdfjs_require__(50); +var definePropertiesModule = __w_pdfjs_require__(74); +var enumBugKeys = __w_pdfjs_require__(69); +var hiddenKeys = __w_pdfjs_require__(58); +var html = __w_pdfjs_require__(76); +var documentCreateElement = __w_pdfjs_require__(46); +var sharedKey = __w_pdfjs_require__(57); +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); +var EmptyConstructor = function () { +}; +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; + return temp; +}; +var NullProtoObjectViaIFrame = function () { + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { + } + NullProtoObject = typeof document != 'undefined' ? document.domain && activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame() : NullProtoObjectViaActiveX(activeXDocument); + var length = enumBugKeys.length; + while (length--) + delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; +hiddenKeys[IE_PROTO] = true; +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + result[IE_PROTO] = O; + } else + result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + +/***/ }), +/* 74 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(9); +var V8_PROTOTYPE_DEFINE_BUG = __w_pdfjs_require__(49); +var definePropertyModule = __w_pdfjs_require__(48); +var anObject = __w_pdfjs_require__(50); +var toIndexedObject = __w_pdfjs_require__(15); +var objectKeys = __w_pdfjs_require__(75); +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) + definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + +/***/ }), +/* 75 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var internalObjectKeys = __w_pdfjs_require__(62); +var enumBugKeys = __w_pdfjs_require__(69); +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + +/***/ }), +/* 76 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(27); +module.exports = getBuiltIn('document', 'documentElement'); + +/***/ }), +/* 77 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +var uncurryThis = __w_pdfjs_require__(17); +module.exports = function (CONSTRUCTOR, METHOD) { + return uncurryThis(global[CONSTRUCTOR].prototype[METHOD]); +}; + +/***/ }), +/* 78 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(79); + +/***/ }), +/* 79 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var ArrayBufferViewCore = __w_pdfjs_require__(80); +var lengthOfArrayLike = __w_pdfjs_require__(67); +var toIntegerOrInfinity = __w_pdfjs_require__(65); +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; +exportTypedArrayMethod('at', function at(index) { + var O = aTypedArray(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; + return k < 0 || k >= len ? undefined : O[k]; +}); + +/***/ }), +/* 80 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var NATIVE_ARRAY_BUFFER = __w_pdfjs_require__(81); +var DESCRIPTORS = __w_pdfjs_require__(9); +var global = __w_pdfjs_require__(7); +var isCallable = __w_pdfjs_require__(24); +var isObject = __w_pdfjs_require__(23); +var hasOwn = __w_pdfjs_require__(42); +var classof = __w_pdfjs_require__(82); +var tryToString = __w_pdfjs_require__(35); +var createNonEnumerableProperty = __w_pdfjs_require__(47); +var defineBuiltIn = __w_pdfjs_require__(51); +var defineProperty = (__w_pdfjs_require__(48).f); +var isPrototypeOf = __w_pdfjs_require__(28); +var getPrototypeOf = __w_pdfjs_require__(84); +var setPrototypeOf = __w_pdfjs_require__(86); +var wellKnownSymbol = __w_pdfjs_require__(37); +var uid = __w_pdfjs_require__(44); +var InternalStateModule = __w_pdfjs_require__(55); +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var Int8Array = global.Int8Array; +var Int8ArrayPrototype = Int8Array && Int8Array.prototype; +var Uint8ClampedArray = global.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array && getPrototypeOf(Int8Array); +var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype = Object.prototype; +var TypeError = global.TypeError; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); +var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; +var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQUIRED = false; +var NAME, Constructor, Prototype; +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; +var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 +}; +var isView = function isView(it) { + if (!isObject(it)) + return false; + var klass = classof(it); + return klass === 'DataView' || hasOwn(TypedArrayConstructorsList, klass) || hasOwn(BigIntArrayConstructorsList, klass); +}; +var getTypedArrayConstructor = function (it) { + var proto = getPrototypeOf(it); + if (!isObject(proto)) + return; + var state = getInternalState(proto); + return state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); +}; +var isTypedArray = function (it) { + if (!isObject(it)) + return false; + var klass = classof(it); + return hasOwn(TypedArrayConstructorsList, klass) || hasOwn(BigIntArrayConstructorsList, klass); +}; +var aTypedArray = function (it) { + if (isTypedArray(it)) + return it; + throw TypeError('Target is not a typed array'); +}; +var aTypedArrayConstructor = function (C) { + if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) + return C; + throw TypeError(tryToString(C) + ' is not a typed array constructor'); +}; +var exportTypedArrayMethod = function (KEY, property, forced, options) { + if (!DESCRIPTORS) + return; + if (forced) + for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) + try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { + } + } + } + if (!TypedArrayPrototype[KEY] || forced) { + defineBuiltIn(TypedArrayPrototype, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); + } +}; +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS) + return; + if (setPrototypeOf) { + if (forced) + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) + try { + delete TypedArrayConstructor[KEY]; + } catch (error) { + } + } + if (!TypedArray[KEY] || forced) { + try { + return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); + } catch (error) { + } + } else + return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + defineBuiltIn(TypedArrayConstructor, KEY, property); + } + } +}; +for (NAME in TypedArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) + enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; + else + NATIVE_ARRAY_BUFFER_VIEWS = false; +} +for (NAME in BigIntArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) + enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; +} +if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { + TypedArray = function TypedArray() { + throw TypeError('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS) + for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) + setPrototypeOf(global[NAME], TypedArray); + } +} +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) + for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) + setPrototypeOf(global[NAME].prototype, TypedArrayPrototype); + } +} +if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} +if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineProperty(TypedArrayPrototype, TO_STRING_TAG, { + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + for (NAME in TypedArrayConstructorsList) + if (global[NAME]) { + createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME); + } +} +module.exports = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + getTypedArrayConstructor: getTypedArrayConstructor, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + +/***/ }), +/* 81 */ +/***/ ((module) => { + +module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + +/***/ }), +/* 82 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var TO_STRING_TAG_SUPPORT = __w_pdfjs_require__(83); +var isCallable = __w_pdfjs_require__(24); +var classofRaw = __w_pdfjs_require__(18); +var wellKnownSymbol = __w_pdfjs_require__(37); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; +var CORRECT_ARGUMENTS = classofRaw((function () { + return arguments; +}())) == 'Arguments'; +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { + } +}; +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag : CORRECT_ARGUMENTS ? classofRaw(O) : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + +/***/ }), +/* 83 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(37); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; +test[TO_STRING_TAG] = 'z'; +module.exports = String(test) === '[object z]'; + +/***/ }), +/* 84 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var hasOwn = __w_pdfjs_require__(42); +var isCallable = __w_pdfjs_require__(24); +var toObject = __w_pdfjs_require__(43); +var sharedKey = __w_pdfjs_require__(57); +var CORRECT_PROTOTYPE_GETTER = __w_pdfjs_require__(85); +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) + return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } + return object instanceof $Object ? ObjectPrototype : null; +}; + +/***/ }), +/* 85 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +module.exports = !fails(function () { + function F() { + } + F.prototype.constructor = null; + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + +/***/ }), +/* 86 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var anObject = __w_pdfjs_require__(50); +var aPossiblePrototype = __w_pdfjs_require__(87); +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? (function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { + } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) + setter(O, proto); + else + O.__proto__ = proto; + return O; + }; +}()) : undefined); + +/***/ }), +/* 87 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(24); +var $String = String; +var $TypeError = TypeError; +module.exports = function (argument) { + if (typeof argument == 'object' || isCallable(argument)) + return argument; + throw $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + +/***/ }), +/* 88 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(89); +__w_pdfjs_require__(96); +__w_pdfjs_require__(98); +__w_pdfjs_require__(121); +__w_pdfjs_require__(123); +var path = __w_pdfjs_require__(132); +module.exports = path.structuredClone; + +/***/ }), +/* 89 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var toIndexedObject = __w_pdfjs_require__(15); +var addToUnscopables = __w_pdfjs_require__(72); +var Iterators = __w_pdfjs_require__(90); +var InternalStateModule = __w_pdfjs_require__(55); +var defineProperty = (__w_pdfjs_require__(48).f); +var defineIterator = __w_pdfjs_require__(91); +var createIterResultObject = __w_pdfjs_require__(95); +var IS_PURE = __w_pdfjs_require__(39); +var DESCRIPTORS = __w_pdfjs_require__(9); +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), + index: 0, + kind: kind + }); +}, function () { + var state = getInternalState(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return createIterResultObject(undefined, true); + } + if (kind == 'keys') + return createIterResultObject(index, false); + if (kind == 'values') + return createIterResultObject(target[index], false); + return createIterResultObject([ + index, + target[index] + ], false); +}, 'values'); +var values = Iterators.Arguments = Iterators.Array; +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); +if (!IS_PURE && DESCRIPTORS && values.name !== 'values') + try { + defineProperty(values, 'name', { value: 'values' }); + } catch (error) { + } + +/***/ }), +/* 90 */ +/***/ ((module) => { + +module.exports = {}; + +/***/ }), +/* 91 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var $ = __w_pdfjs_require__(6); +var call = __w_pdfjs_require__(11); +var IS_PURE = __w_pdfjs_require__(39); +var FunctionName = __w_pdfjs_require__(53); +var isCallable = __w_pdfjs_require__(24); +var createIteratorConstructor = __w_pdfjs_require__(92); +var getPrototypeOf = __w_pdfjs_require__(84); +var setPrototypeOf = __w_pdfjs_require__(86); +var setToStringTag = __w_pdfjs_require__(94); +var createNonEnumerableProperty = __w_pdfjs_require__(47); +var defineBuiltIn = __w_pdfjs_require__(51); +var wellKnownSymbol = __w_pdfjs_require__(37); +var Iterators = __w_pdfjs_require__(90); +var IteratorsCore = __w_pdfjs_require__(93); +var PROPER_FUNCTION_NAME = FunctionName.PROPER; +var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; +var returnThis = function () { + return this; +}; +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) + return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) + return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: + return function keys() { + return new IteratorConstructor(this, KIND); + }; + case VALUES: + return function values() { + return new IteratorConstructor(this, KIND); + }; + case ENTRIES: + return function entries() { + return new IteratorConstructor(this, KIND); + }; + } + return function () { + return new IteratorConstructor(this); + }; + }; + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] || IterablePrototype['@@iterator'] || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { + defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) + Iterators[TO_STRING_TAG] = returnThis; + } + } + if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { + createNonEnumerableProperty(IterablePrototype, 'name', VALUES); + } else { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { + return call(nativeIterator, this); + }; + } + } + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) + for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + defineBuiltIn(IterablePrototype, KEY, methods[KEY]); + } + } + else + $({ + target: NAME, + proto: true, + forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME + }, methods); + } + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); + } + Iterators[NAME] = defaultIterator; + return methods; +}; + +/***/ }), +/* 92 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var IteratorPrototype = (__w_pdfjs_require__(93).IteratorPrototype); +var create = __w_pdfjs_require__(73); +var createPropertyDescriptor = __w_pdfjs_require__(14); +var setToStringTag = __w_pdfjs_require__(94); +var Iterators = __w_pdfjs_require__(90); +var returnThis = function () { + return this; +}; +module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + +/***/ }), +/* 93 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var fails = __w_pdfjs_require__(10); +var isCallable = __w_pdfjs_require__(24); +var isObject = __w_pdfjs_require__(23); +var create = __w_pdfjs_require__(73); +var getPrototypeOf = __w_pdfjs_require__(84); +var defineBuiltIn = __w_pdfjs_require__(51); +var wellKnownSymbol = __w_pdfjs_require__(37); +var IS_PURE = __w_pdfjs_require__(39); +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; +if ([].keys) { + arrayIterator = [].keys(); + if (!('next' in arrayIterator)) + BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) + IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + return IteratorPrototype[ITERATOR].call(test) !== test; +}); +if (NEW_ITERATOR_PROTOTYPE) + IteratorPrototype = {}; +else if (IS_PURE) + IteratorPrototype = create(IteratorPrototype); +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + +/***/ }), +/* 94 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var defineProperty = (__w_pdfjs_require__(48).f); +var hasOwn = __w_pdfjs_require__(42); +var wellKnownSymbol = __w_pdfjs_require__(37); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +module.exports = function (target, TAG, STATIC) { + if (target && !STATIC) + target = target.prototype; + if (target && !hasOwn(target, TO_STRING_TAG)) { + defineProperty(target, TO_STRING_TAG, { + configurable: true, + value: TAG + }); + } +}; + +/***/ }), +/* 95 */ +/***/ ((module) => { + +module.exports = function (value, done) { + return { + value: value, + done: done + }; +}; + +/***/ }), +/* 96 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var TO_STRING_TAG_SUPPORT = __w_pdfjs_require__(83); +var defineBuiltIn = __w_pdfjs_require__(51); +var toString = __w_pdfjs_require__(97); +if (!TO_STRING_TAG_SUPPORT) { + defineBuiltIn(Object.prototype, 'toString', toString, { unsafe: true }); +} + +/***/ }), +/* 97 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __w_pdfjs_require__(83); +var classof = __w_pdfjs_require__(82); +module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + +/***/ }), +/* 98 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(99); + +/***/ }), +/* 99 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var collection = __w_pdfjs_require__(100); +var collectionStrong = __w_pdfjs_require__(118); +collection('Map', function (init) { + return function Map() { + return init(this, arguments.length ? arguments[0] : undefined); + }; +}, collectionStrong); + +/***/ }), +/* 100 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var $ = __w_pdfjs_require__(6); +var global = __w_pdfjs_require__(7); +var uncurryThis = __w_pdfjs_require__(17); +var isForced = __w_pdfjs_require__(71); +var defineBuiltIn = __w_pdfjs_require__(51); +var InternalMetadataModule = __w_pdfjs_require__(101); +var iterate = __w_pdfjs_require__(108); +var anInstance = __w_pdfjs_require__(115); +var isCallable = __w_pdfjs_require__(24); +var isNullOrUndefined = __w_pdfjs_require__(20); +var isObject = __w_pdfjs_require__(23); +var fails = __w_pdfjs_require__(10); +var checkCorrectnessOfIteration = __w_pdfjs_require__(116); +var setToStringTag = __w_pdfjs_require__(94); +var inheritIfRequired = __w_pdfjs_require__(117); +module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + var fixMethod = function (KEY) { + var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]); + defineBuiltIn(NativePrototype, KEY, KEY == 'add' ? function add(value) { + uncurriedNativeMethod(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : function set(key, value) { + uncurriedNativeMethod(this, key === 0 ? 0 : key, value); + return this; + }); + }; + var REPLACE = isForced(CONSTRUCTOR_NAME, !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + }))); + if (REPLACE) { + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.enable(); + } else if (isForced(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + var THROWS_ON_PRIMITIVES = fails(function () { + instance.has(1); + }); + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { + new NativeConstructor(iterable); + }); + var BUGGY_ZERO = !IS_WEAK && fails(function () { + var $instance = new NativeConstructor(); + var index = 5; + while (index--) + $instance[ADDER](index, index); + return !$instance.has(-0); + }); + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance(dummy, NativePrototype); + var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); + if (!isNullOrUndefined(iterable)) + iterate(iterable, that[ADDER], { + that: that, + AS_ENTRIES: IS_MAP + }); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + if (BUGGY_ZERO || HASNT_CHAINING) + fixMethod(ADDER); + if (IS_WEAK && NativePrototype.clear) + delete NativePrototype.clear; + } + exported[CONSTRUCTOR_NAME] = Constructor; + $({ + global: true, + constructor: true, + forced: Constructor != NativeConstructor + }, exported); + setToStringTag(Constructor, CONSTRUCTOR_NAME); + if (!IS_WEAK) + common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + return Constructor; +}; + +/***/ }), +/* 101 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var $ = __w_pdfjs_require__(6); +var uncurryThis = __w_pdfjs_require__(17); +var hiddenKeys = __w_pdfjs_require__(58); +var isObject = __w_pdfjs_require__(23); +var hasOwn = __w_pdfjs_require__(42); +var defineProperty = (__w_pdfjs_require__(48).f); +var getOwnPropertyNamesModule = __w_pdfjs_require__(61); +var getOwnPropertyNamesExternalModule = __w_pdfjs_require__(102); +var isExtensible = __w_pdfjs_require__(105); +var uid = __w_pdfjs_require__(44); +var FREEZING = __w_pdfjs_require__(107); +var REQUIRED = false; +var METADATA = uid('meta'); +var id = 0; +var setMetadata = function (it) { + defineProperty(it, METADATA, { + value: { + objectID: 'O' + id++, + weakData: {} + } + }); +}; +var fastKey = function (it, create) { + if (!isObject(it)) + return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!hasOwn(it, METADATA)) { + if (!isExtensible(it)) + return 'F'; + if (!create) + return 'E'; + setMetadata(it); + } + return it[METADATA].objectID; +}; +var getWeakData = function (it, create) { + if (!hasOwn(it, METADATA)) { + if (!isExtensible(it)) + return true; + if (!create) + return false; + setMetadata(it); + } + return it[METADATA].weakData; +}; +var onFreeze = function (it) { + if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) + setMetadata(it); + return it; +}; +var enable = function () { + meta.enable = function () { + }; + REQUIRED = true; + var getOwnPropertyNames = getOwnPropertyNamesModule.f; + var splice = uncurryThis([].splice); + var test = {}; + test[METADATA] = 1; + if (getOwnPropertyNames(test).length) { + getOwnPropertyNamesModule.f = function (it) { + var result = getOwnPropertyNames(it); + for (var i = 0, length = result.length; i < length; i++) { + if (result[i] === METADATA) { + splice(result, i, 1); + break; + } + } + return result; + }; + $({ + target: 'Object', + stat: true, + forced: true + }, { getOwnPropertyNames: getOwnPropertyNamesExternalModule.f }); + } +}; +var meta = module.exports = { + enable: enable, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze +}; +hiddenKeys[METADATA] = true; + +/***/ }), +/* 102 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classof = __w_pdfjs_require__(18); +var toIndexedObject = __w_pdfjs_require__(15); +var $getOwnPropertyNames = (__w_pdfjs_require__(61).f); +var arraySlice = __w_pdfjs_require__(103); +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; +var getWindowNames = function (it) { + try { + return $getOwnPropertyNames(it); + } catch (error) { + return arraySlice(windowNames); + } +}; +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && classof(it) == 'Window' ? getWindowNames(it) : $getOwnPropertyNames(toIndexedObject(it)); +}; + +/***/ }), +/* 103 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toAbsoluteIndex = __w_pdfjs_require__(64); +var lengthOfArrayLike = __w_pdfjs_require__(67); +var createProperty = __w_pdfjs_require__(104); +var $Array = Array; +var max = Math.max; +module.exports = function (O, start, end) { + var length = lengthOfArrayLike(O); + var k = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); + var result = $Array(max(fin - k, 0)); + for (var n = 0; k < fin; k++, n++) + createProperty(result, n, O[k]); + result.length = n; + return result; +}; + +/***/ }), +/* 104 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var toPropertyKey = __w_pdfjs_require__(21); +var definePropertyModule = __w_pdfjs_require__(48); +var createPropertyDescriptor = __w_pdfjs_require__(14); +module.exports = function (object, key, value) { + var propertyKey = toPropertyKey(key); + if (propertyKey in object) + definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else + object[propertyKey] = value; +}; + +/***/ }), +/* 105 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +var isObject = __w_pdfjs_require__(23); +var classof = __w_pdfjs_require__(18); +var ARRAY_BUFFER_NON_EXTENSIBLE = __w_pdfjs_require__(106); +var $isExtensible = Object.isExtensible; +var FAILS_ON_PRIMITIVES = fails(function () { + $isExtensible(1); +}); +module.exports = FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE ? function isExtensible(it) { + if (!isObject(it)) + return false; + if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') + return false; + return $isExtensible ? $isExtensible(it) : true; +} : $isExtensible; + +/***/ }), +/* 106 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +module.exports = fails(function () { + if (typeof ArrayBuffer == 'function') { + var buffer = new ArrayBuffer(8); + if (Object.isExtensible(buffer)) + Object.defineProperty(buffer, 'a', { value: 8 }); + } +}); + +/***/ }), +/* 107 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +module.exports = !fails(function () { + return Object.isExtensible(Object.preventExtensions({})); +}); + +/***/ }), +/* 108 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var bind = __w_pdfjs_require__(109); +var call = __w_pdfjs_require__(11); +var anObject = __w_pdfjs_require__(50); +var tryToString = __w_pdfjs_require__(35); +var isArrayIteratorMethod = __w_pdfjs_require__(111); +var lengthOfArrayLike = __w_pdfjs_require__(67); +var isPrototypeOf = __w_pdfjs_require__(28); +var getIterator = __w_pdfjs_require__(112); +var getIteratorMethod = __w_pdfjs_require__(113); +var iteratorClose = __w_pdfjs_require__(114); +var $TypeError = TypeError; +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; +var ResultPrototype = Result.prototype; +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + var stop = function (condition) { + if (iterator) + iteratorClose(iterator, 'normal', condition); + return new Result(true, condition); + }; + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } + return INTERRUPTED ? fn(value, stop) : fn(value); + }; + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) + throw $TypeError(tryToString(iterable) + ' is not iterable'); + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) + return result; + } + return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) + return result; + } + return new Result(false); +}; + +/***/ }), +/* 109 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(110); +var aCallable = __w_pdfjs_require__(34); +var NATIVE_BIND = __w_pdfjs_require__(12); +var bind = uncurryThis(uncurryThis.bind); +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function () { + return fn.apply(that, arguments); + }; +}; + +/***/ }), +/* 110 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classofRaw = __w_pdfjs_require__(18); +var uncurryThis = __w_pdfjs_require__(17); +module.exports = function (fn) { + if (classofRaw(fn) === 'Function') + return uncurryThis(fn); +}; + +/***/ }), +/* 111 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(37); +var Iterators = __w_pdfjs_require__(90); +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + +/***/ }), +/* 112 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(11); +var aCallable = __w_pdfjs_require__(34); +var anObject = __w_pdfjs_require__(50); +var tryToString = __w_pdfjs_require__(35); +var getIteratorMethod = __w_pdfjs_require__(113); +var $TypeError = TypeError; +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (aCallable(iteratorMethod)) + return anObject(call(iteratorMethod, argument)); + throw $TypeError(tryToString(argument) + ' is not iterable'); +}; + +/***/ }), +/* 113 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classof = __w_pdfjs_require__(82); +var getMethod = __w_pdfjs_require__(33); +var isNullOrUndefined = __w_pdfjs_require__(20); +var Iterators = __w_pdfjs_require__(90); +var wellKnownSymbol = __w_pdfjs_require__(37); +var ITERATOR = wellKnownSymbol('iterator'); +module.exports = function (it) { + if (!isNullOrUndefined(it)) + return getMethod(it, ITERATOR) || getMethod(it, '@@iterator') || Iterators[classof(it)]; +}; + +/***/ }), +/* 114 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(11); +var anObject = __w_pdfjs_require__(50); +var getMethod = __w_pdfjs_require__(33); +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') + throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') + throw value; + if (innerError) + throw innerResult; + anObject(innerResult); + return value; +}; + +/***/ }), +/* 115 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isPrototypeOf = __w_pdfjs_require__(28); +var $TypeError = TypeError; +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) + return it; + throw $TypeError('Incorrect invocation'); +}; + +/***/ }), +/* 116 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(37); +var ITERATOR = wellKnownSymbol('iterator'); +var SAFE_CLOSING = false; +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + Array.from(iteratorWithReturn, function () { + throw 2; + }); +} catch (error) { +} +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) + return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { + } + return ITERATION_SUPPORT; +}; + +/***/ }), +/* 117 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(24); +var isObject = __w_pdfjs_require__(23); +var setPrototypeOf = __w_pdfjs_require__(86); +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if (setPrototypeOf && isCallable(NewTarget = dummy.constructor) && NewTarget !== Wrapper && isObject(NewTargetPrototype = NewTarget.prototype) && NewTargetPrototype !== Wrapper.prototype) + setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + +/***/ }), +/* 118 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var defineProperty = (__w_pdfjs_require__(48).f); +var create = __w_pdfjs_require__(73); +var defineBuiltIns = __w_pdfjs_require__(119); +var bind = __w_pdfjs_require__(109); +var anInstance = __w_pdfjs_require__(115); +var isNullOrUndefined = __w_pdfjs_require__(20); +var iterate = __w_pdfjs_require__(108); +var defineIterator = __w_pdfjs_require__(91); +var createIterResultObject = __w_pdfjs_require__(95); +var setSpecies = __w_pdfjs_require__(120); +var DESCRIPTORS = __w_pdfjs_require__(9); +var fastKey = (__w_pdfjs_require__(101).fastKey); +var InternalStateModule = __w_pdfjs_require__(55); +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var Constructor = wrapper(function (that, iterable) { + anInstance(that, Prototype); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + index: create(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS) + that.size = 0; + if (!isNullOrUndefined(iterable)) + iterate(iterable, that[ADDER], { + that: that, + AS_ENTRIES: IS_MAP + }); + }); + var Prototype = Constructor.prototype; + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + if (entry) { + entry.value = value; + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) + state.first = entry; + if (previous) + previous.next = entry; + if (DESCRIPTORS) + state.size++; + else + that.size++; + if (index !== 'F') + state.index[index] = entry; + } + return that; + }; + var getEntry = function (that, key) { + var state = getInternalState(that); + var index = fastKey(key); + var entry; + if (index !== 'F') + return state.index[index]; + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) + return entry; + } + }; + defineBuiltIns(Prototype, { + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) + entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS) + state.size = 0; + else + that.size = 0; + }, + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) + prev.next = next; + if (next) + next.previous = prev; + if (state.first == entry) + state.first = next; + if (state.last == entry) + state.last = prev; + if (DESCRIPTORS) + state.size--; + else + that.size--; + } + return !!entry; + }, + forEach: function forEach(callbackfn) { + var state = getInternalState(this); + var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + while (entry && entry.removed) + entry = entry.previous; + } + }, + has: function has(key) { + return !!getEntry(this, key); + } + }); + defineBuiltIns(Prototype, IS_MAP ? { + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS) + defineProperty(Prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return Constructor; + }, + setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + while (entry && entry.removed) + entry = entry.previous; + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + state.target = undefined; + return createIterResultObject(undefined, true); + } + if (kind == 'keys') + return createIterResultObject(entry.key, false); + if (kind == 'values') + return createIterResultObject(entry.value, false); + return createIterResultObject([ + entry.key, + entry.value + ], false); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + setSpecies(CONSTRUCTOR_NAME); + } +}; + +/***/ }), +/* 119 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var defineBuiltIn = __w_pdfjs_require__(51); +module.exports = function (target, src, options) { + for (var key in src) + defineBuiltIn(target, key, src[key], options); + return target; +}; + +/***/ }), +/* 120 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var getBuiltIn = __w_pdfjs_require__(27); +var definePropertyModule = __w_pdfjs_require__(48); +var wellKnownSymbol = __w_pdfjs_require__(37); +var DESCRIPTORS = __w_pdfjs_require__(9); +var SPECIES = wellKnownSymbol('species'); +module.exports = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule.f; + if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { + defineProperty(Constructor, SPECIES, { + configurable: true, + get: function () { + return this; + } + }); + } +}; + +/***/ }), +/* 121 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(122); + +/***/ }), +/* 122 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var collection = __w_pdfjs_require__(100); +var collectionStrong = __w_pdfjs_require__(118); +collection('Set', function (init) { + return function Set() { + return init(this, arguments.length ? arguments[0] : undefined); + }; +}, collectionStrong); + +/***/ }), +/* 123 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IS_PURE = __w_pdfjs_require__(39); +var $ = __w_pdfjs_require__(6); +var global = __w_pdfjs_require__(7); +var getBuiltin = __w_pdfjs_require__(27); +var uncurryThis = __w_pdfjs_require__(17); +var fails = __w_pdfjs_require__(10); +var uid = __w_pdfjs_require__(44); +var isCallable = __w_pdfjs_require__(24); +var isConstructor = __w_pdfjs_require__(124); +var isNullOrUndefined = __w_pdfjs_require__(20); +var isObject = __w_pdfjs_require__(23); +var isSymbol = __w_pdfjs_require__(26); +var iterate = __w_pdfjs_require__(108); +var anObject = __w_pdfjs_require__(50); +var classof = __w_pdfjs_require__(82); +var hasOwn = __w_pdfjs_require__(42); +var createProperty = __w_pdfjs_require__(104); +var createNonEnumerableProperty = __w_pdfjs_require__(47); +var lengthOfArrayLike = __w_pdfjs_require__(67); +var validateArgumentsLength = __w_pdfjs_require__(125); +var getRegExpFlags = __w_pdfjs_require__(126); +var ERROR_STACK_INSTALLABLE = __w_pdfjs_require__(128); +var V8 = __w_pdfjs_require__(31); +var IS_BROWSER = __w_pdfjs_require__(129); +var IS_DENO = __w_pdfjs_require__(130); +var IS_NODE = __w_pdfjs_require__(131); +var Object = global.Object; +var Date = global.Date; +var Error = global.Error; +var EvalError = global.EvalError; +var RangeError = global.RangeError; +var ReferenceError = global.ReferenceError; +var SyntaxError = global.SyntaxError; +var TypeError = global.TypeError; +var URIError = global.URIError; +var PerformanceMark = global.PerformanceMark; +var WebAssembly = global.WebAssembly; +var CompileError = WebAssembly && WebAssembly.CompileError || Error; +var LinkError = WebAssembly && WebAssembly.LinkError || Error; +var RuntimeError = WebAssembly && WebAssembly.RuntimeError || Error; +var DOMException = getBuiltin('DOMException'); +var Set = getBuiltin('Set'); +var Map = getBuiltin('Map'); +var MapPrototype = Map.prototype; +var mapHas = uncurryThis(MapPrototype.has); +var mapGet = uncurryThis(MapPrototype.get); +var mapSet = uncurryThis(MapPrototype.set); +var setAdd = uncurryThis(Set.prototype.add); +var objectKeys = getBuiltin('Object', 'keys'); +var push = uncurryThis([].push); +var thisBooleanValue = uncurryThis(true.valueOf); +var thisNumberValue = uncurryThis(1.0.valueOf); +var thisStringValue = uncurryThis(''.valueOf); +var thisTimeValue = uncurryThis(Date.prototype.getTime); +var PERFORMANCE_MARK = uid('structuredClone'); +var DATA_CLONE_ERROR = 'DataCloneError'; +var TRANSFERRING = 'Transferring'; +var checkBasicSemantic = function (structuredCloneImplementation) { + return !fails(function () { + var set1 = new global.Set([7]); + var set2 = structuredCloneImplementation(set1); + var number = structuredCloneImplementation(Object(7)); + return set2 == set1 || !set2.has(7) || typeof number != 'object' || number != 7; + }) && structuredCloneImplementation; +}; +var checkErrorsCloning = function (structuredCloneImplementation, $Error) { + return !fails(function () { + var error = new $Error(); + var test = structuredCloneImplementation({ + a: error, + b: error + }); + return !(test && test.a === test.b && test.a instanceof $Error && test.a.stack === error.stack); + }); +}; +var checkNewErrorsCloningSemantic = function (structuredCloneImplementation) { + return !fails(function () { + var test = structuredCloneImplementation(new global.AggregateError([1], PERFORMANCE_MARK, { cause: 3 })); + return test.name != 'AggregateError' || test.errors[0] != 1 || test.message != PERFORMANCE_MARK || test.cause != 3; + }); +}; +var nativeStructuredClone = global.structuredClone; +var FORCED_REPLACEMENT = IS_PURE || !checkErrorsCloning(nativeStructuredClone, Error) || !checkErrorsCloning(nativeStructuredClone, DOMException) || !checkNewErrorsCloningSemantic(nativeStructuredClone); +var structuredCloneFromMark = !nativeStructuredClone && checkBasicSemantic(function (value) { + return new PerformanceMark(PERFORMANCE_MARK, { detail: value }).detail; +}); +var nativeRestrictedStructuredClone = checkBasicSemantic(nativeStructuredClone) || structuredCloneFromMark; +var throwUncloneable = function (type) { + throw new DOMException('Uncloneable type: ' + type, DATA_CLONE_ERROR); +}; +var throwUnpolyfillable = function (type, action) { + throw new DOMException((action || 'Cloning') + ' of ' + type + ' cannot be properly polyfilled in this engine', DATA_CLONE_ERROR); +}; +var createDataTransfer = function () { + var dataTransfer; + try { + dataTransfer = new global.DataTransfer(); + } catch (error) { + try { + dataTransfer = new global.ClipboardEvent('').clipboardData; + } catch (error2) { + } + } + return dataTransfer && dataTransfer.items && dataTransfer.files ? dataTransfer : null; +}; +var structuredCloneInternal = function (value, map) { + if (isSymbol(value)) + throwUncloneable('Symbol'); + if (!isObject(value)) + return value; + if (map) { + if (mapHas(map, value)) + return mapGet(map, value); + } else + map = new Map(); + var type = classof(value); + var deep = false; + var C, name, cloned, dataTransfer, i, length, keys, key, source, target; + switch (type) { + case 'Array': + cloned = []; + deep = true; + break; + case 'Object': + cloned = {}; + deep = true; + break; + case 'Map': + cloned = new Map(); + deep = true; + break; + case 'Set': + cloned = new Set(); + deep = true; + break; + case 'RegExp': + cloned = new RegExp(value.source, getRegExpFlags(value)); + break; + case 'Error': + name = value.name; + switch (name) { + case 'AggregateError': + cloned = getBuiltin('AggregateError')([]); + break; + case 'EvalError': + cloned = EvalError(); + break; + case 'RangeError': + cloned = RangeError(); + break; + case 'ReferenceError': + cloned = ReferenceError(); + break; + case 'SyntaxError': + cloned = SyntaxError(); + break; + case 'TypeError': + cloned = TypeError(); + break; + case 'URIError': + cloned = URIError(); + break; + case 'CompileError': + cloned = CompileError(); + break; + case 'LinkError': + cloned = LinkError(); + break; + case 'RuntimeError': + cloned = RuntimeError(); + break; + default: + cloned = Error(); + } + deep = true; + break; + case 'DOMException': + cloned = new DOMException(value.message, value.name); + deep = true; + break; + case 'DataView': + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'BigInt64Array': + case 'BigUint64Array': + C = global[type]; + if (!isObject(C)) + throwUnpolyfillable(type); + cloned = new C(structuredCloneInternal(value.buffer, map), value.byteOffset, type === 'DataView' ? value.byteLength : value.length); + break; + case 'DOMQuad': + try { + cloned = new DOMQuad(structuredCloneInternal(value.p1, map), structuredCloneInternal(value.p2, map), structuredCloneInternal(value.p3, map), structuredCloneInternal(value.p4, map)); + } catch (error) { + if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + throwUnpolyfillable(type); + } + break; + case 'FileList': + dataTransfer = createDataTransfer(); + if (dataTransfer) { + for (i = 0, length = lengthOfArrayLike(value); i < length; i++) { + dataTransfer.items.add(structuredCloneInternal(value[i], map)); + } + cloned = dataTransfer.files; + } else if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + throwUnpolyfillable(type); + break; + case 'ImageData': + try { + cloned = new ImageData(structuredCloneInternal(value.data, map), value.width, value.height, { colorSpace: value.colorSpace }); + } catch (error) { + if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + throwUnpolyfillable(type); + } + break; + default: + if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + switch (type) { + case 'BigInt': + cloned = Object(value.valueOf()); + break; + case 'Boolean': + cloned = Object(thisBooleanValue(value)); + break; + case 'Number': + cloned = Object(thisNumberValue(value)); + break; + case 'String': + cloned = Object(thisStringValue(value)); + break; + case 'Date': + cloned = new Date(thisTimeValue(value)); + break; + case 'ArrayBuffer': + C = global.DataView; + if (!C && typeof value.slice != 'function') + throwUnpolyfillable(type); + try { + if (typeof value.slice == 'function') { + cloned = value.slice(0); + } else { + length = value.byteLength; + cloned = new ArrayBuffer(length); + source = new C(value); + target = new C(cloned); + for (i = 0; i < length; i++) { + target.setUint8(i, source.getUint8(i)); + } + } + } catch (error) { + throw new DOMException('ArrayBuffer is detached', DATA_CLONE_ERROR); + } + break; + case 'SharedArrayBuffer': + cloned = value; + break; + case 'Blob': + try { + cloned = value.slice(0, value.size, value.type); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'DOMPoint': + case 'DOMPointReadOnly': + C = global[type]; + try { + cloned = C.fromPoint ? C.fromPoint(value) : new C(value.x, value.y, value.z, value.w); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'DOMRect': + case 'DOMRectReadOnly': + C = global[type]; + try { + cloned = C.fromRect ? C.fromRect(value) : new C(value.x, value.y, value.width, value.height); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'DOMMatrix': + case 'DOMMatrixReadOnly': + C = global[type]; + try { + cloned = C.fromMatrix ? C.fromMatrix(value) : new C(value); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'AudioData': + case 'VideoFrame': + if (!isCallable(value.clone)) + throwUnpolyfillable(type); + try { + cloned = value.clone(); + } catch (error) { + throwUncloneable(type); + } + break; + case 'File': + try { + cloned = new File([value], value.name, value); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'CropTarget': + case 'CryptoKey': + case 'FileSystemDirectoryHandle': + case 'FileSystemFileHandle': + case 'FileSystemHandle': + case 'GPUCompilationInfo': + case 'GPUCompilationMessage': + case 'ImageBitmap': + case 'RTCCertificate': + case 'WebAssembly.Module': + throwUnpolyfillable(type); + default: + throwUncloneable(type); + } + } + mapSet(map, value, cloned); + if (deep) + switch (type) { + case 'Array': + case 'Object': + keys = objectKeys(value); + for (i = 0, length = lengthOfArrayLike(keys); i < length; i++) { + key = keys[i]; + createProperty(cloned, key, structuredCloneInternal(value[key], map)); + } + break; + case 'Map': + value.forEach(function (v, k) { + mapSet(cloned, structuredCloneInternal(k, map), structuredCloneInternal(v, map)); + }); + break; + case 'Set': + value.forEach(function (v) { + setAdd(cloned, structuredCloneInternal(v, map)); + }); + break; + case 'Error': + createNonEnumerableProperty(cloned, 'message', structuredCloneInternal(value.message, map)); + if (hasOwn(value, 'cause')) { + createNonEnumerableProperty(cloned, 'cause', structuredCloneInternal(value.cause, map)); + } + if (name == 'AggregateError') { + cloned.errors = structuredCloneInternal(value.errors, map); + } + case 'DOMException': + if (ERROR_STACK_INSTALLABLE) { + createNonEnumerableProperty(cloned, 'stack', structuredCloneInternal(value.stack, map)); + } + } + return cloned; +}; +var PROPER_TRANSFER = nativeStructuredClone && !fails(function () { + if (IS_DENO && V8 > 92 || IS_NODE && V8 > 94 || IS_BROWSER && V8 > 97) + return false; + var buffer = new ArrayBuffer(8); + var clone = nativeStructuredClone(buffer, { transfer: [buffer] }); + return buffer.byteLength != 0 || clone.byteLength != 8; +}); +var tryToTransfer = function (rawTransfer, map) { + if (!isObject(rawTransfer)) + throw TypeError('Transfer option cannot be converted to a sequence'); + var transfer = []; + iterate(rawTransfer, function (value) { + push(transfer, anObject(value)); + }); + var i = 0; + var length = lengthOfArrayLike(transfer); + var value, type, C, transferredArray, transferred, canvas, context; + if (PROPER_TRANSFER) { + transferredArray = nativeStructuredClone(transfer, { transfer: transfer }); + while (i < length) + mapSet(map, transfer[i], transferredArray[i++]); + } else + while (i < length) { + value = transfer[i++]; + if (mapHas(map, value)) + throw new DOMException('Duplicate transferable', DATA_CLONE_ERROR); + type = classof(value); + switch (type) { + case 'ImageBitmap': + C = global.OffscreenCanvas; + if (!isConstructor(C)) + throwUnpolyfillable(type, TRANSFERRING); + try { + canvas = new C(value.width, value.height); + context = canvas.getContext('bitmaprenderer'); + context.transferFromImageBitmap(value); + transferred = canvas.transferToImageBitmap(); + } catch (error) { + } + break; + case 'AudioData': + case 'VideoFrame': + if (!isCallable(value.clone) || !isCallable(value.close)) + throwUnpolyfillable(type, TRANSFERRING); + try { + transferred = value.clone(); + value.close(); + } catch (error) { + } + break; + case 'ArrayBuffer': + case 'MediaSourceHandle': + case 'MessagePort': + case 'OffscreenCanvas': + case 'ReadableStream': + case 'TransformStream': + case 'WritableStream': + throwUnpolyfillable(type, TRANSFERRING); + } + if (transferred === undefined) + throw new DOMException('This object cannot be transferred: ' + type, DATA_CLONE_ERROR); + mapSet(map, value, transferred); + } +}; +$({ + global: true, + enumerable: true, + sham: !PROPER_TRANSFER, + forced: FORCED_REPLACEMENT +}, { + structuredClone: function structuredClone(value) { + var options = validateArgumentsLength(arguments.length, 1) > 1 && !isNullOrUndefined(arguments[1]) ? anObject(arguments[1]) : undefined; + var transfer = options ? options.transfer : undefined; + var map; + if (transfer !== undefined) { + map = new Map(); + tryToTransfer(transfer, map); + } + return structuredCloneInternal(value, map); + } +}); + +/***/ }), +/* 124 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(17); +var fails = __w_pdfjs_require__(10); +var isCallable = __w_pdfjs_require__(24); +var classof = __w_pdfjs_require__(82); +var getBuiltIn = __w_pdfjs_require__(27); +var inspectSource = __w_pdfjs_require__(54); +var noop = function () { +}; +var empty = []; +var construct = getBuiltIn('Reflect', 'construct'); +var constructorRegExp = /^\s*(?:class|function)\b/; +var exec = uncurryThis(constructorRegExp.exec); +var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); +var isConstructorModern = function isConstructor(argument) { + if (!isCallable(argument)) + return false; + try { + construct(noop, empty, argument); + return true; + } catch (error) { + return false; + } +}; +var isConstructorLegacy = function isConstructor(argument) { + if (!isCallable(argument)) + return false; + switch (classof(argument)) { + case 'AsyncFunction': + case 'GeneratorFunction': + case 'AsyncGeneratorFunction': + return false; + } + try { + return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); + } catch (error) { + return true; + } +}; +isConstructorLegacy.sham = true; +module.exports = !construct || fails(function () { + var called; + return isConstructorModern(isConstructorModern.call) || !isConstructorModern(Object) || !isConstructorModern(function () { + called = true; + }) || called; +}) ? isConstructorLegacy : isConstructorModern; + +/***/ }), +/* 125 */ +/***/ ((module) => { + +var $TypeError = TypeError; +module.exports = function (passed, required) { + if (passed < required) + throw $TypeError('Not enough arguments'); + return passed; +}; + +/***/ }), +/* 126 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(11); +var hasOwn = __w_pdfjs_require__(42); +var isPrototypeOf = __w_pdfjs_require__(28); +var regExpFlags = __w_pdfjs_require__(127); +var RegExpPrototype = RegExp.prototype; +module.exports = function (R) { + var flags = R.flags; + return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R) ? call(regExpFlags, R) : flags; +}; + +/***/ }), +/* 127 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var anObject = __w_pdfjs_require__(50); +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.hasIndices) + result += 'd'; + if (that.global) + result += 'g'; + if (that.ignoreCase) + result += 'i'; + if (that.multiline) + result += 'm'; + if (that.dotAll) + result += 's'; + if (that.unicode) + result += 'u'; + if (that.unicodeSets) + result += 'v'; + if (that.sticky) + result += 'y'; + return result; +}; + +/***/ }), +/* 128 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(10); +var createPropertyDescriptor = __w_pdfjs_require__(14); +module.exports = !fails(function () { + var error = Error('a'); + if (!('stack' in error)) + return true; + Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); + return error.stack !== 7; +}); + +/***/ }), +/* 129 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IS_DENO = __w_pdfjs_require__(130); +var IS_NODE = __w_pdfjs_require__(131); +module.exports = !IS_DENO && !IS_NODE && typeof window == 'object' && typeof document == 'object'; + +/***/ }), +/* 130 */ +/***/ ((module) => { + +module.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'object'; + +/***/ }), +/* 131 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classof = __w_pdfjs_require__(18); +var global = __w_pdfjs_require__(7); +module.exports = classof(global.process) == 'process'; + +/***/ }), +/* 132 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(7); +module.exports = global; + +/***/ }), +/* 133 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.build = exports.RenderTask = exports.PDFWorkerUtil = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFDocumentLoadingTask = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultStandardFontDataFactory = exports.DefaultCanvasFactory = exports.DefaultCMapReaderFactory = void 0; +exports.getDocument = getDocument; +exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory; +exports.version = void 0; +var _util = __w_pdfjs_require__(1); +var _annotation_storage = __w_pdfjs_require__(134); +var _display_utils = __w_pdfjs_require__(137); +var _font_loader = __w_pdfjs_require__(140); +var _canvas = __w_pdfjs_require__(141); +var _worker_options = __w_pdfjs_require__(144); +var _is_node = __w_pdfjs_require__(3); +var _message_handler = __w_pdfjs_require__(145); +var _metadata = __w_pdfjs_require__(146); +var _optional_content_config = __w_pdfjs_require__(147); +var _transport_stream = __w_pdfjs_require__(148); +var _xfa_text = __w_pdfjs_require__(149); +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classCheckPrivateStaticFieldDescriptor(descriptor, action) { if (descriptor === undefined) { throw new TypeError("attempted to " + action + " private static field before its declaration"); } } +function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +const DEFAULT_RANGE_CHUNK_SIZE = 65536*16; +const RENDERING_CANCELLED_TIMEOUT = 100; +let DefaultCanvasFactory = _display_utils.DOMCanvasFactory; +exports.DefaultCanvasFactory = DefaultCanvasFactory; +let DefaultCMapReaderFactory = _display_utils.DOMCMapReaderFactory; +exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory; +let DefaultStandardFontDataFactory = _display_utils.DOMStandardFontDataFactory; +exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory; +if (_is_node.isNodeJS) { + const { + NodeCanvasFactory, + NodeCMapReaderFactory, + NodeStandardFontDataFactory + } = __w_pdfjs_require__(150); + exports.DefaultCanvasFactory = DefaultCanvasFactory = NodeCanvasFactory; + exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory = NodeCMapReaderFactory; + exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory = NodeStandardFontDataFactory; +} +let createPDFNetworkStream; +function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) { + createPDFNetworkStream = pdfNetworkStreamFactory; +} +function getDocument(src) { + const task = new PDFDocumentLoadingTask(); + let source; + if (typeof src === "string" || src instanceof URL) { + source = { + url: src + }; + } else if ((0, _util.isArrayBuffer)(src)) { + source = { + data: src + }; + } else if (src instanceof PDFDataRangeTransport) { + source = { + range: src + }; + } else { + if (typeof src !== "object") { + throw new Error("Invalid parameter in getDocument, " + "need either string, URL, TypedArray, or parameter object."); + } + if (!src.url && !src.data && !src.range) { + throw new Error("Invalid parameter object: need either .data, .range or .url"); + } + source = src; + } + const params = Object.create(null); + let rangeTransport = null, + worker = null; + for (const key in source) { + const value = source[key]; + switch (key) { + case "url": + if (typeof window !== "undefined") { + try { + params[key] = new URL(value, window.location).href; + continue; + } catch (ex) { + (0, _util.warn)(`Cannot create valid URL: "${ex}".`); + } + } else if (typeof value === "string" || value instanceof URL) { + params[key] = value.toString(); + continue; + } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); + case "range": + rangeTransport = value; + continue; + case "worker": + worker = value; + continue; + case "data": + if (_is_node.isNodeJS && typeof Buffer !== "undefined" && value instanceof Buffer) { + params[key] = new Uint8Array(value); + } else if (value instanceof Uint8Array) { + break; + } else if (typeof value === "string") { + params[key] = (0, _util.stringToBytes)(value); + } else if (typeof value === "object" && value !== null && !isNaN(value.length)) { + params[key] = new Uint8Array(value); + } else if ((0, _util.isArrayBuffer)(value)) { + params[key] = new Uint8Array(value); + } else { + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); + } + continue; + } + params[key] = value; + } + params.CMapReaderFactory = params.CMapReaderFactory || DefaultCMapReaderFactory; + params.StandardFontDataFactory = params.StandardFontDataFactory || DefaultStandardFontDataFactory; + params.ignoreErrors = params.stopAtErrors !== true; + params.fontExtraProperties = params.fontExtraProperties === true; + params.pdfBug = params.pdfBug === true; + params.enableXfa = params.enableXfa === true; + if (!Number.isInteger(params.rangeChunkSize) || params.rangeChunkSize < 1) { + params.rangeChunkSize = DEFAULT_RANGE_CHUNK_SIZE; + } + if (typeof params.docBaseUrl !== "string" || (0, _display_utils.isDataScheme)(params.docBaseUrl)) { + params.docBaseUrl = null; + } + if (!Number.isInteger(params.maxImageSize) || params.maxImageSize < -1) { + params.maxImageSize = -1; + } + if (typeof params.cMapUrl !== "string") { + params.cMapUrl = null; + } + if (typeof params.standardFontDataUrl !== "string") { + params.standardFontDataUrl = null; + } + if (typeof params.useWorkerFetch !== "boolean") { + params.useWorkerFetch = params.CMapReaderFactory === _display_utils.DOMCMapReaderFactory && params.StandardFontDataFactory === _display_utils.DOMStandardFontDataFactory; + } + if (typeof params.isEvalSupported !== "boolean") { + params.isEvalSupported = true; + } + if (typeof params.isOffscreenCanvasSupported !== "boolean") { + params.isOffscreenCanvasSupported = !_is_node.isNodeJS; + } + if (typeof params.disableFontFace !== "boolean") { + params.disableFontFace = _is_node.isNodeJS; + } + if (typeof params.useSystemFonts !== "boolean") { + params.useSystemFonts = !_is_node.isNodeJS && !params.disableFontFace; + } + if (typeof params.ownerDocument !== "object" || params.ownerDocument === null) { + params.ownerDocument = globalThis.document; + } + if (typeof params.disableRange !== "boolean") { + params.disableRange = false; + } + if (typeof params.disableStream !== "boolean") { + params.disableStream = false; + } + if (typeof params.disableAutoFetch !== "boolean") { + params.disableAutoFetch = false; + } + (0, _util.setVerbosityLevel)(params.verbosity); + if (!worker) { + const workerParams = { + verbosity: params.verbosity, + port: _worker_options.GlobalWorkerOptions.workerPort + }; + worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); + task._worker = worker; + } + const docId = task.docId; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + const workerIdPromise = _fetchDocument(worker, params, rangeTransport, docId); + const networkStreamPromise = new Promise(function (resolve) { + let networkStream; + if (rangeTransport) { + networkStream = new _transport_stream.PDFDataTransportStream({ + length: params.length, + initialData: params.initialData, + progressiveDone: params.progressiveDone, + contentDispositionFilename: params.contentDispositionFilename, + disableRange: params.disableRange, + disableStream: params.disableStream + }, rangeTransport); + } else if (!params.data) { + networkStream = createPDFNetworkStream({ + url: params.url, + length: params.length, + httpHeaders: params.httpHeaders, + withCredentials: params.withCredentials, + rangeChunkSize: params.rangeChunkSize, + disableRange: params.disableRange, + disableStream: params.disableStream + }); + } + resolve(networkStream); + }); + return Promise.all([workerIdPromise, networkStreamPromise]).then(function (_ref) { + let [workerId, networkStream] = _ref; + if (task.destroyed) { + throw new Error("Loading aborted"); + } + const messageHandler = new _message_handler.MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, params); + task._transport = transport; + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject); + return task; +} +async function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + if (pdfDataRangeTransport) { + source.length = pdfDataRangeTransport.length; + source.initialData = pdfDataRangeTransport.initialData; + source.progressiveDone = pdfDataRangeTransport.progressiveDone; + source.contentDispositionFilename = pdfDataRangeTransport.contentDispositionFilename; + } + const workerId = await worker.messageHandler.sendWithPromise("GetDocRequest", { + docId, + apiVersion: '3.2.146', + data: source.data, + password: source.password, + disableAutoFetch: source.disableAutoFetch, + rangeChunkSize: source.rangeChunkSize, + length: source.length, + docBaseUrl: source.docBaseUrl, + enableXfa: source.enableXfa, + evaluatorOptions: { + maxImageSize: source.maxImageSize, + disableFontFace: source.disableFontFace, + ignoreErrors: source.ignoreErrors, + isEvalSupported: source.isEvalSupported, + isOffscreenCanvasSupported: source.isOffscreenCanvasSupported, + fontExtraProperties: source.fontExtraProperties, + useSystemFonts: source.useSystemFonts, + cMapUrl: source.useWorkerFetch ? source.cMapUrl : null, + standardFontDataUrl: source.useWorkerFetch ? source.standardFontDataUrl : null + } + }); + if (source.data) { + source.data = null; + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + return workerId; +} +var _onUnsupportedFeature = /*#__PURE__*/new WeakMap(); +class PDFDocumentLoadingTask { + constructor() { + var _PDFDocumentLoadingTa, _PDFDocumentLoadingTa2; + _classPrivateFieldInitSpec(this, _onUnsupportedFeature, { + writable: true, + value: null + }); + this._capability = (0, _util.createPromiseCapability)(); + this._transport = null; + this._worker = null; + this.docId = `d${(_classStaticPrivateFieldSpecSet(PDFDocumentLoadingTask, PDFDocumentLoadingTask, _docId, (_PDFDocumentLoadingTa = _classStaticPrivateFieldSpecGet(PDFDocumentLoadingTask, PDFDocumentLoadingTask, _docId), _PDFDocumentLoadingTa2 = _PDFDocumentLoadingTa++, _PDFDocumentLoadingTa)), _PDFDocumentLoadingTa2)}`; + this.destroyed = false; + this.onPassword = null; + this.onProgress = null; + } + get onUnsupportedFeature() { + return _classPrivateFieldGet(this, _onUnsupportedFeature); + } + set onUnsupportedFeature(callback) { + (0, _display_utils.deprecated)("The PDFDocumentLoadingTask onUnsupportedFeature property will be removed in the future."); + _classPrivateFieldSet(this, _onUnsupportedFeature, callback); + } + get promise() { + return this._capability.promise; + } + async destroy() { + var _this$_transport; + this.destroyed = true; + await ((_this$_transport = this._transport) === null || _this$_transport === void 0 ? void 0 : _this$_transport.destroy()); + this._transport = null; + if (this._worker) { + this._worker.destroy(); + this._worker = null; + } + } +} +exports.PDFDocumentLoadingTask = PDFDocumentLoadingTask; +var _docId = { + writable: true, + value: 0 +}; +class PDFDataRangeTransport { + constructor(length, initialData) { + let progressiveDone = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let contentDispositionFilename = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + this._rangeListeners = []; + this._progressListeners = []; + this._progressiveReadListeners = []; + this._progressiveDoneListeners = []; + this._readyCapability = (0, _util.createPromiseCapability)(); + } + addRangeListener(listener) { + this._rangeListeners.push(listener); + } + addProgressListener(listener) { + this._progressListeners.push(listener); + } + addProgressiveReadListener(listener) { + this._progressiveReadListeners.push(listener); + } + addProgressiveDoneListener(listener) { + this._progressiveDoneListeners.push(listener); + } + onDataRange(begin, chunk) { + for (const listener of this._rangeListeners) { + listener(begin, chunk); + } + } + onDataProgress(loaded, total) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressListeners) { + listener(loaded, total); + } + }); + } + onDataProgressiveRead(chunk) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveReadListeners) { + listener(chunk); + } + }); + } + onDataProgressiveDone() { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveDoneListeners) { + listener(); + } + }); + } + transportReady() { + this._readyCapability.resolve(); + } + requestDataRange(begin, end) { + (0, _util.unreachable)("Abstract method PDFDataRangeTransport.requestDataRange"); + } + abort() {} +} +exports.PDFDataRangeTransport = PDFDataRangeTransport; +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; + } + get annotationStorage() { + return this._transport.annotationStorage; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get stats() { + (0, _display_utils.deprecated)("The PDFDocumentProxy stats property will be removed in the future."); + return this._transport.stats; + } + get isPureXfa() { + return (0, _util.shadow)(this, "isPureXfa", !!this._transport._htmlForXfa); + } + get allXfaHtml() { + return this._transport._htmlForXfa; + } + getPage(pageNumber) { + return this._transport.getPage(pageNumber); + } + getPageIndex(ref) { + return this._transport.getPageIndex(ref); + } + getDestinations() { + return this._transport.getDestinations(); + } + getDestination(id) { + return this._transport.getDestination(id); + } + getPageLabels() { + return this._transport.getPageLabels(); + } + getPageLayout() { + return this._transport.getPageLayout(); + } + getPageMode() { + return this._transport.getPageMode(); + } + getViewerPreferences() { + return this._transport.getViewerPreferences(); + } + getOpenAction() { + return this._transport.getOpenAction(); + } + getAttachments() { + return this._transport.getAttachments(); + } + getJavaScript() { + return this._transport.getJavaScript(); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig() { + return this._transport.getOptionalContentConfig(); + } + getPermissions() { + return this._transport.getPermissions(); + } + getMetadata() { + return this._transport.getMetadata(); + } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { + return this._transport.getData(); + } + saveDocument() { + return this._transport.saveDocument(); + } + getDownloadInfo() { + return this._transport.downloadInfoCapability.promise; + } + cleanup() { + let keepLoadedFonts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + } + destroy() { + return this.loadingTask.destroy(); + } + get loadingParams() { + return this._transport.loadingParams; + } + get loadingTask() { + return this._transport.loadingTask; + } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + hasJSActions() { + return this._transport.hasJSActions(); + } + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } +} +exports.PDFDocumentProxy = PDFDocumentProxy; +class PDFPageProxy { + constructor(pageIndex, pageInfo, transport, ownerDocument) { + let pdfBug = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + this._pageIndex = pageIndex; + this._pageInfo = pageInfo; + this._ownerDocument = ownerDocument; + this._transport = transport; + this._stats = pdfBug ? new _display_utils.StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._bitmaps = new Set(); + this.cleanupAfterRender = false; + this.pendingCleanup = false; + this._intentStates = new Map(); + this.destroyed = false; + } + get pageNumber() { + return this._pageIndex + 1; + } + get rotate() { + return this._pageInfo.rotate; + } + get ref() { + return this._pageInfo.ref; + } + get userUnit() { + return this._pageInfo.userUnit; + } + get view() { + return this._pageInfo.view; + } + getViewport() { + let { + scale, + rotation = this.rotate, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new _display_utils.PageViewport({ + viewBox: this.view, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations() { + let { + intent = "display" + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const intentArgs = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, intentArgs.renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get isPureXfa() { + return (0, _util.shadow)(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + var _this$_transport$_htm; + return ((_this$_transport$_htm = this._transport._htmlForXfa) === null || _this$_transport$_htm === void 0 ? void 0 : _this$_transport$_htm.children[this._pageIndex]) || null; + } + render(_ref2) { + var _this$_stats, _intentState; + let { + canvasContext, + viewport, + intent = "display", + annotationMode = _util.AnnotationMode.ENABLE, + transform = null, + canvasFactory = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null + } = _ref2; + (_this$_stats = this._stats) === null || _this$_stats === void 0 ? void 0 : _this$_stats.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage); + this.pendingCleanup = false; + if (!optionalContentConfigPromise) { + optionalContentConfigPromise = this._transport.getOptionalContentConfig(); + } + let intentState = this._intentStates.get(intentArgs.cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(intentArgs.cacheKey, intentState); + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + const canvasFactoryInstance = canvasFactory || new DefaultCanvasFactory({ + ownerDocument: this._ownerDocument + }); + const intentPrint = !!(intentArgs.renderingIntent & _util.RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + var _this$_stats2; + intentState.displayReadyCapability = (0, _util.createPromiseCapability)(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + (_this$_stats2 = this._stats) === null || _this$_stats2 === void 0 ? void 0 : _this$_stats2.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + const complete = error => { + var _this$_stats3, _this$_stats4; + intentState.renderTasks.delete(internalRenderTask); + if (this.cleanupAfterRender || intentPrint) { + this.pendingCleanup = true; + } + this._tryCleanup(); + if (error) { + internalRenderTask.capability.reject(error); + this._abortOperatorList({ + intentState, + reason: error instanceof Error ? error : new Error(error) + }); + } else { + internalRenderTask.capability.resolve(); + } + (_this$_stats3 = this._stats) === null || _this$_stats3 === void 0 ? void 0 : _this$_stats3.timeEnd("Rendering"); + (_this$_stats4 = this._stats) === null || _this$_stats4 === void 0 ? void 0 : _this$_stats4.timeEnd("Overall"); + }; + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvasContext, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: canvasFactoryInstance, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors + }); + ((_intentState = intentState).renderTasks || (_intentState.renderTasks = new Set())).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(_ref3 => { + var _this$_stats5; + let [transparency, optionalContentConfig] = _ref3; + if (this.pendingCleanup) { + complete(); + return; + } + (_this$_stats5 = this._stats) === null || _this$_stats5 === void 0 ? void 0 : _this$_stats5.time("Rendering"); + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; + } + getOperatorList() { + let { + intent = "display", + annotationMode = _util.AnnotationMode.ENABLE, + printAnnotationStorage = null + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } + } + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, true); + let intentState = this._intentStates.get(intentArgs.cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(intentArgs.cacheKey, intentState); + } + let opListTask; + if (!intentState.opListReadCapability) { + var _intentState2, _this$_stats6; + opListTask = Object.create(null); + opListTask.operatorListChanged = operatorListChanged; + intentState.opListReadCapability = (0, _util.createPromiseCapability)(); + ((_intentState2 = intentState).renderTasks || (_intentState2.renderTasks = new Set())).add(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + (_this$_stats6 = this._stats) === null || _this$_stats6 === void 0 ? void 0 : _this$_stats6.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + return intentState.opListReadCapability.promise; + } + streamTextContent() { + let { + disableCombineTextItems = false, + includeMarkedContent = false + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageIndex: this._pageIndex, + combineTextItems: disableCombineTextItems !== true, + includeMarkedContent: includeMarkedContent === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size(textContent) { + return textContent.items.length; + } + }); + } + getTextContent() { + let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => { + return _xfa_text.XfaText.textContent(xfa); + }); + } + const readableStream = this.streamTextContent(params); + return new Promise(function (resolve, reject) { + function pump() { + reader.read().then(function (_ref4) { + let { + value, + done + } = _ref4; + if (done) { + resolve(textContent); + return; + } + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); + pump(); + }, reject); + } + const reader = readableStream.getReader(); + const textContent = { + items: [], + styles: Object.create(null) + }; + pump(); + }); + } + getStructTree() { + return this._transport.getStructTree(this._pageIndex); + } + _destroy() { + this.destroyed = true; + const waitOn = []; + for (const intentState of this._intentStates.values()) { + this._abortOperatorList({ + intentState, + reason: new Error("Page was destroyed."), + force: true + }); + if (intentState.opListReadCapability) { + continue; + } + for (const internalRenderTask of intentState.renderTasks) { + waitOn.push(internalRenderTask.completed); + internalRenderTask.cancel(); + } + } + this.objs.clear(); + for (const bitmap of this._bitmaps) { + bitmap.close(); + } + this._bitmaps.clear(); + this.pendingCleanup = false; + return Promise.all(waitOn); + } + cleanup() { + let resetStats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + this.pendingCleanup = true; + return this._tryCleanup(resetStats); + } + _tryCleanup() { + let resetStats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (!this.pendingCleanup) { + return false; + } + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } + } + this._intentStates.clear(); + this.objs.clear(); + if (resetStats && this._stats) { + this._stats = new _display_utils.StatTimer(); + } + for (const bitmap of this._bitmaps) { + bitmap.close(); + } + this._bitmaps.clear(); + this.pendingCleanup = false; + return true; + } + _startRenderPage(transparency, cacheKey) { + var _this$_stats7, _intentState$displayR; + const intentState = this._intentStates.get(cacheKey); + if (!intentState) { + return; + } + (_this$_stats7 = this._stats) === null || _this$_stats7 === void 0 ? void 0 : _this$_stats7.timeEnd("Page Request"); + (_intentState$displayR = intentState.displayReadyCapability) === null || _intentState$displayR === void 0 ? void 0 : _intentState$displayR.resolve(transparency); + } + _renderPageChunk(operatorListChunk, intentState) { + for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { + intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); + intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); + } + intentState.operatorList.lastChunk = operatorListChunk.lastChunk; + intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + if (operatorListChunk.lastChunk) { + this._tryCleanup(); + } + } + _pumpOperatorList(_ref5) { + let { + renderingIntent, + cacheKey, + annotationStorageMap + } = _ref5; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageIndex: this._pageIndex, + intent: renderingIntent, + cacheKey, + annotationStorage: annotationStorageMap + }); + const reader = readableStream.getReader(); + const intentState = this._intentStates.get(cacheKey); + intentState.streamReader = reader; + const pump = () => { + reader.read().then(_ref6 => { + let { + value, + done + } = _ref6; + if (done) { + intentState.streamReader = null; + return; + } + if (this._transport.destroyed) { + return; + } + this._renderPageChunk(value, intentState); + pump(); + }, reason => { + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + this._tryCleanup(); + } + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(reason); + } else if (intentState.opListReadCapability) { + intentState.opListReadCapability.reject(reason); + } else { + throw reason; + } + }); + }; + pump(); + } + _abortOperatorList(_ref7) { + let { + intentState, + reason, + force = false + } = _ref7; + if (!intentState.streamReader) { + return; + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + if (!force) { + if (intentState.renderTasks.size > 0) { + return; + } + if (reason instanceof _display_utils.RenderingCancelledException) { + let delay = RENDERING_CANCELLED_TIMEOUT; + if (reason.extraDelay > 0 && reason.extraDelay < 1000) { + delay += reason.extraDelay; + } + intentState.streamReaderCancelTimeout = setTimeout(() => { + intentState.streamReaderCancelTimeout = null; + this._abortOperatorList({ + intentState, + reason, + force: true + }); + }, delay); + return; + } + } + intentState.streamReader.cancel(new _util.AbortException(reason.message)).catch(() => {}); + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + for (const [curCacheKey, curIntentState] of this._intentStates) { + if (curIntentState === intentState) { + this._intentStates.delete(curCacheKey); + break; + } + } + this.cleanup(); + } + get stats() { + return this._stats; + } +} +exports.PDFPageProxy = PDFPageProxy; +var _listeners = /*#__PURE__*/new WeakMap(); +var _deferred = /*#__PURE__*/new WeakMap(); +class LoopbackPort { + constructor() { + _classPrivateFieldInitSpec(this, _listeners, { + writable: true, + value: [] + }); + _classPrivateFieldInitSpec(this, _deferred, { + writable: true, + value: Promise.resolve() + }); + } + postMessage(obj, transfers) { + const event = { + data: structuredClone(obj, transfers) + }; + _classPrivateFieldGet(this, _deferred).then(() => { + for (const listener of _classPrivateFieldGet(this, _listeners)) { + listener.call(this, event); + } + }); + } + addEventListener(name, listener) { + _classPrivateFieldGet(this, _listeners).push(listener); + } + removeEventListener(name, listener) { + const i = _classPrivateFieldGet(this, _listeners).indexOf(listener); + _classPrivateFieldGet(this, _listeners).splice(i, 1); + } + terminate() { + _classPrivateFieldGet(this, _listeners).length = 0; + } +} +exports.LoopbackPort = LoopbackPort; +const PDFWorkerUtil = { + isWorkerDisabled: false, + fallbackWorkerSrc: null, + fakeWorkerId: 0 +}; +exports.PDFWorkerUtil = PDFWorkerUtil; +{ + if (_is_node.isNodeJS && typeof require === "function") { + PDFWorkerUtil.isWorkerDisabled = true; + PDFWorkerUtil.fallbackWorkerSrc = "./pdf.worker.js"; + } else if (typeof document === "object") { + var _document, _document$currentScri; + const pdfjsFilePath = (_document = document) === null || _document === void 0 ? void 0 : (_document$currentScri = _document.currentScript) === null || _document$currentScri === void 0 ? void 0 : _document$currentScri.src; + if (pdfjsFilePath) { + PDFWorkerUtil.fallbackWorkerSrc = pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, ".worker$1$2"); + } + } + PDFWorkerUtil.isSameOrigin = function (baseUrl, otherUrl) { + let base; + try { + base = new URL(baseUrl); + if (!base.origin || base.origin === "null") { + return false; + } + } catch (e) { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + PDFWorkerUtil.createCDNWrapper = function (url) { + const wrapper = `importScripts("${url}");`; + return URL.createObjectURL(new Blob([wrapper])); + }; +} +class PDFWorker { + constructor() { + let { + name = null, + port = null, + verbosity = (0, _util.getVerbosityLevel)() + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (port && _classStaticPrivateFieldSpecGet(PDFWorker, PDFWorker, _workerPorts).has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); + } + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + this._readyCapability = (0, _util.createPromiseCapability)(); + this._port = null; + this._webWorker = null; + this._messageHandler = null; + if (port) { + _classStaticPrivateFieldSpecGet(PDFWorker, PDFWorker, _workerPorts).set(port, this); + this._initializeFromPort(port); + return; + } + this._initialize(); + } + get promise() { + return this._readyCapability.promise; + } + get port() { + return this._port; + } + get messageHandler() { + return this._messageHandler; + } + _initializeFromPort(port) { + this._port = port; + this._messageHandler = new _message_handler.MessageHandler("main", "worker", port); + this._messageHandler.on("ready", function () {}); + this._readyCapability.resolve(); + this._messageHandler.send("configure", { + verbosity: this.verbosity + }); + } + _initialize() { + if (!PDFWorkerUtil.isWorkerDisabled && !PDFWorker._mainThreadWorkerMessageHandler) { + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)) { + workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc); + const messageHandler = new _message_handler.MessageHandler("main", "worker", worker); + const terminateEarly = () => { + worker.removeEventListener("error", onWorkerError); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + } else { + this._setupFakeWorker(); + } + }; + const onWorkerError = () => { + if (!this._webWorker) { + terminateEarly(); + } + }; + worker.addEventListener("error", onWorkerError); + messageHandler.on("test", data => { + worker.removeEventListener("error", onWorkerError); + if (this.destroyed) { + terminateEarly(); + return; + } + if (data) { + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + this._readyCapability.resolve(); + messageHandler.send("configure", { + verbosity: this.verbosity + }); + } else { + this._setupFakeWorker(); + messageHandler.destroy(); + worker.terminate(); + } + }); + messageHandler.on("ready", data => { + worker.removeEventListener("error", onWorkerError); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch (e) { + this._setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch (e) { + (0, _util.info)("The worker has been disabled."); + } + } + this._setupFakeWorker(); + } + _setupFakeWorker() { + if (!PDFWorkerUtil.isWorkerDisabled) { + (0, _util.warn)("Setting up fake worker."); + PDFWorkerUtil.isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this._port = port; + const id = `fake${PDFWorkerUtil.fakeWorkerId++}`; + const workerHandler = new _message_handler.MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + const messageHandler = new _message_handler.MessageHandler(id, id + "_worker", port); + this._messageHandler = messageHandler; + this._readyCapability.resolve(); + messageHandler.send("configure", { + verbosity: this.verbosity + }); + }).catch(reason => { + this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); + } + destroy() { + this.destroyed = true; + if (this._webWorker) { + this._webWorker.terminate(); + this._webWorker = null; + } + _classStaticPrivateFieldSpecGet(PDFWorker, PDFWorker, _workerPorts).delete(this._port); + this._port = null; + if (this._messageHandler) { + this._messageHandler.destroy(); + this._messageHandler = null; + } + } + static fromPort(params) { + if (!(params !== null && params !== void 0 && params.port)) { + throw new Error("PDFWorker.fromPort - invalid method signature."); + } + if (_classStaticPrivateFieldSpecGet(this, PDFWorker, _workerPorts).has(params.port)) { + return _classStaticPrivateFieldSpecGet(this, PDFWorker, _workerPorts).get(params.port); + } + return new PDFWorker(params); + } + static get workerSrc() { + if (_worker_options.GlobalWorkerOptions.workerSrc) { + return _worker_options.GlobalWorkerOptions.workerSrc; + } + if (PDFWorkerUtil.fallbackWorkerSrc !== null) { + if (!_is_node.isNodeJS) { + (0, _display_utils.deprecated)('No "GlobalWorkerOptions.workerSrc" specified.'); + } + return PDFWorkerUtil.fallbackWorkerSrc; + } + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get _mainThreadWorkerMessageHandler() { + try { + var _globalThis$pdfjsWork; + return ((_globalThis$pdfjsWork = globalThis.pdfjsWorker) === null || _globalThis$pdfjsWork === void 0 ? void 0 : _globalThis$pdfjsWork.WorkerMessageHandler) || null; + } catch (ex) { + return null; + } + } + static get _setupFakeWorkerGlobal() { + const loader = async () => { + const mainWorkerMessageHandler = this._mainThreadWorkerMessageHandler; + if (mainWorkerMessageHandler) { + return mainWorkerMessageHandler; + } + if (_is_node.isNodeJS && typeof require === "function") { + const worker = eval("require")(this.workerSrc); + return worker.WorkerMessageHandler; + } + await (0, _display_utils.loadScript)(this.workerSrc); + return window.pdfjsWorker.WorkerMessageHandler; + }; + return (0, _util.shadow)(this, "_setupFakeWorkerGlobal", loader()); + } +} +exports.PDFWorker = PDFWorker; +var _workerPorts = { + writable: true, + value: new WeakMap() +}; +var _docStats = /*#__PURE__*/new WeakMap(); +var _pageCache = /*#__PURE__*/new WeakMap(); +var _pagePromises = /*#__PURE__*/new WeakMap(); +var _metadataPromise = /*#__PURE__*/new WeakMap(); +class WorkerTransport { + constructor(messageHandler, loadingTask, networkStream, params) { + _classPrivateFieldInitSpec(this, _docStats, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _pageCache, { + writable: true, + value: new Map() + }); + _classPrivateFieldInitSpec(this, _pagePromises, { + writable: true, + value: new Map() + }); + _classPrivateFieldInitSpec(this, _metadataPromise, { + writable: true, + value: null + }); + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.commonObjs = new PDFObjects(); + this.fontLoader = new _font_loader.FontLoader({ + onUnsupportedFeature: this._onUnsupportedFeature.bind(this), + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this._params = params; + if (!params.useWorkerFetch) { + this.CMapReaderFactory = new params.CMapReaderFactory({ + baseUrl: params.cMapUrl, + isCompressed: params.cMapPacked + }); + this.StandardFontDataFactory = new params.StandardFontDataFactory({ + baseUrl: params.standardFontDataUrl + }); + } + this.destroyed = false; + this.destroyCapability = null; + this._passwordCapability = null; + this._networkStream = networkStream; + this._fullReader = null; + this._lastProgress = null; + this.downloadInfoCapability = (0, _util.createPromiseCapability)(); + this.setupMessageHandler(); + } + get annotationStorage() { + return (0, _util.shadow)(this, "annotationStorage", new _annotation_storage.AnnotationStorage()); + } + get stats() { + return _classPrivateFieldGet(this, _docStats); + } + getRenderingIntent(intent) { + let annotationMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _util.AnnotationMode.ENABLE; + let printAnnotationStorage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + let isOpList = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + let renderingIntent = _util.RenderingIntentFlag.DISPLAY; + let annotationMap = null; + switch (intent) { + case "any": + renderingIntent = _util.RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = _util.RenderingIntentFlag.PRINT; + break; + default: + (0, _util.warn)(`getRenderingIntent - invalid intent: ${intent}`); + } + switch (annotationMode) { + case _util.AnnotationMode.DISABLE: + renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case _util.AnnotationMode.ENABLE: + break; + case _util.AnnotationMode.ENABLE_FORMS: + renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case _util.AnnotationMode.ENABLE_STORAGE: + renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_STORAGE; + const annotationStorage = renderingIntent & _util.RenderingIntentFlag.PRINT && printAnnotationStorage instanceof _annotation_storage.PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + annotationMap = annotationStorage.serializable; + break; + default: + (0, _util.warn)(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + } + if (isOpList) { + renderingIntent += _util.RenderingIntentFlag.OPLIST; + } + return { + renderingIntent, + cacheKey: `${renderingIntent}_${_annotation_storage.AnnotationStorage.getHash(annotationMap)}`, + annotationStorageMap: annotationMap + }; + } + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = (0, _util.createPromiseCapability)(); + if (this._passwordCapability) { + this._passwordCapability.reject(new Error("Worker was destroyed during onPassword callback")); + } + const waitOn = []; + for (const page of _classPrivateFieldGet(this, _pageCache).values()) { + waitOn.push(page._destroy()); + } + _classPrivateFieldGet(this, _pageCache).clear(); + _classPrivateFieldGet(this, _pagePromises).clear(); + if (this.hasOwnProperty("annotationStorage")) { + this.annotationStorage.resetModified(); + } + const terminated = this.messageHandler.sendWithPromise("Terminate", null); + waitOn.push(terminated); + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); + this.fontLoader.clear(); + _classPrivateFieldSet(this, _metadataPromise, null); + this._getFieldObjectsPromise = null; + this._hasJSActionsPromise = null; + if (this._networkStream) { + this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated.")); + } + if (this.messageHandler) { + this.messageHandler.destroy(); + this.messageHandler = null; + } + this.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; + } + setupMessageHandler() { + const { + messageHandler, + loadingTask + } = this; + messageHandler.on("GetReader", (data, sink) => { + (0, _util.assert)(this._networkStream, "GetReader - no `IPDFStream` instance available."); + this._fullReader = this._networkStream.getFullReader(); + this._fullReader.onProgress = evt => { + this._lastProgress = { + loaded: evt.loaded, + total: evt.total + }; + }; + sink.onPull = () => { + this._fullReader.read().then(function (_ref8) { + let { + value, + done + } = _ref8; + if (done) { + sink.close(); + return; + } + (0, _util.assert)((0, _util.isArrayBuffer)(value), "GetReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + this._fullReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("ReaderHeadersReady", data => { + const headersCapability = (0, _util.createPromiseCapability)(); + const fullReader = this._fullReader; + fullReader.headersReady.then(() => { + if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) { + if (this._lastProgress) { + var _loadingTask$onProgre; + (_loadingTask$onProgre = loadingTask.onProgress) === null || _loadingTask$onProgre === void 0 ? void 0 : _loadingTask$onProgre.call(loadingTask, this._lastProgress); + } + fullReader.onProgress = evt => { + var _loadingTask$onProgre2; + (_loadingTask$onProgre2 = loadingTask.onProgress) === null || _loadingTask$onProgre2 === void 0 ? void 0 : _loadingTask$onProgre2.call(loadingTask, { + loaded: evt.loaded, + total: evt.total + }); + }; + } + headersCapability.resolve({ + isStreamingSupported: fullReader.isStreamingSupported, + isRangeSupported: fullReader.isRangeSupported, + contentLength: fullReader.contentLength + }); + }, headersCapability.reject); + return headersCapability.promise; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + (0, _util.assert)(this._networkStream, "GetRangeReader - no `IPDFStream` instance available."); + const rangeReader = this._networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); + return; + } + sink.onPull = () => { + rangeReader.read().then(function (_ref9) { + let { + value, + done + } = _ref9; + if (done) { + sink.close(); + return; + } + (0, _util.assert)((0, _util.isArrayBuffer)(value), "GetRangeReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + rangeReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("GetDoc", _ref10 => { + let { + pdfInfo + } = _ref10; + this._numPages = pdfInfo.numPages; + this._htmlForXfa = pdfInfo.htmlForXfa; + delete pdfInfo.htmlForXfa; + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); + }); + messageHandler.on("DocException", function (ex) { + let reason; + switch (ex.name) { + case "PasswordException": + reason = new _util.PasswordException(ex.message, ex.code); + break; + case "InvalidPDFException": + reason = new _util.InvalidPDFException(ex.message); + break; + case "MissingPDFException": + reason = new _util.MissingPDFException(ex.message); + break; + case "UnexpectedResponseException": + reason = new _util.UnexpectedResponseException(ex.message, ex.status); + break; + case "UnknownErrorException": + reason = new _util.UnknownErrorException(ex.message, ex.details); + break; + default: + (0, _util.unreachable)("DocException - expected a valid Error."); + } + loadingTask._capability.reject(reason); + }); + messageHandler.on("PasswordRequest", exception => { + this._passwordCapability = (0, _util.createPromiseCapability)(); + if (loadingTask.onPassword) { + const updatePassword = password => { + if (password instanceof Error) { + this._passwordCapability.reject(password); + } else { + this._passwordCapability.resolve({ + password + }); + } + }; + try { + loadingTask.onPassword(updatePassword, exception.code); + } catch (ex) { + this._passwordCapability.reject(ex); + } + } else { + this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code)); + } + return this._passwordCapability.promise; + }); + messageHandler.on("DataLoaded", data => { + var _loadingTask$onProgre3; + (_loadingTask$onProgre3 = loadingTask.onProgress) === null || _loadingTask$onProgre3 === void 0 ? void 0 : _loadingTask$onProgre3.call(loadingTask, { + loaded: data.length, + total: data.length + }); + this.downloadInfoCapability.resolve(data); + }); + messageHandler.on("StartRenderPage", data => { + if (this.destroyed) { + return; + } + const page = _classPrivateFieldGet(this, _pageCache).get(data.pageIndex); + page._startRenderPage(data.transparency, data.cacheKey); + }); + messageHandler.on("commonobj", _ref11 => { + var _globalThis$FontInspe; + let [id, type, exportedData] = _ref11; + if (this.destroyed) { + return; + } + if (this.commonObjs.has(id)) { + return; + } + switch (type) { + case "Font": + const params = this._params; + if ("error" in exportedData) { + const exportedError = exportedData.error; + (0, _util.warn)(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + let fontRegistry = null; + if (params.pdfBug && (_globalThis$FontInspe = globalThis.FontInspector) !== null && _globalThis$FontInspe !== void 0 && _globalThis$FontInspe.enabled) { + fontRegistry = { + registerFont(font, url) { + globalThis.FontInspector.fontAdded(font, url); + } + }; + } + const font = new _font_loader.FontFaceObject(exportedData, { + isEvalSupported: params.isEvalSupported, + disableFontFace: params.disableFontFace, + ignoreErrors: params.ignoreErrors, + onUnsupportedFeature: this._onUnsupportedFeature.bind(this), + fontRegistry + }); + this.fontLoader.bind(font).catch(reason => { + return messageHandler.sendWithPromise("FontFallback", { + id + }); + }).finally(() => { + if (!params.fontExtraProperties && font.data) { + font.data = null; + } + this.commonObjs.resolve(id, font); + }); + break; + case "FontPath": + case "Image": + this.commonObjs.resolve(id, exportedData); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + }); + messageHandler.on("obj", _ref12 => { + let [id, pageIndex, type, imageData] = _ref12; + if (this.destroyed) { + return; + } + const pageProxy = _classPrivateFieldGet(this, _pageCache).get(pageIndex); + if (pageProxy.objs.has(id)) { + return; + } + switch (type) { + case "Image": + pageProxy.objs.resolve(id, imageData); + const MAX_IMAGE_SIZE_TO_STORE = 8000000; + if (imageData) { + let length; + if (imageData.bitmap) { + const { + bitmap, + width, + height + } = imageData; + length = width * height * 4; + pageProxy._bitmaps.add(bitmap); + } else { + var _imageData$data; + length = ((_imageData$data = imageData.data) === null || _imageData$data === void 0 ? void 0 : _imageData$data.length) || 0; + } + if (length > MAX_IMAGE_SIZE_TO_STORE) { + pageProxy.cleanupAfterRender = true; + } + } + break; + case "Pattern": + pageProxy.objs.resolve(id, imageData); + break; + default: + throw new Error(`Got unknown object type ${type}`); + } + }); + messageHandler.on("DocProgress", data => { + var _loadingTask$onProgre4; + if (this.destroyed) { + return; + } + (_loadingTask$onProgre4 = loadingTask.onProgress) === null || _loadingTask$onProgre4 === void 0 ? void 0 : _loadingTask$onProgre4.call(loadingTask, { + loaded: data.loaded, + total: data.total + }); + }); + messageHandler.on("DocStats", data => { + if (this.destroyed) { + return; + } + _classPrivateFieldSet(this, _docStats, Object.freeze({ + streamTypes: Object.freeze(data.streamTypes), + fontTypes: Object.freeze(data.fontTypes) + })); + }); + messageHandler.on("UnsupportedFeature", this._onUnsupportedFeature.bind(this)); + messageHandler.on("FetchBuiltInCMap", data => { + if (this.destroyed) { + return Promise.reject(new Error("Worker was destroyed.")); + } + if (!this.CMapReaderFactory) { + return Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter.")); + } + return this.CMapReaderFactory.fetch(data); + }); + messageHandler.on("FetchStandardFontData", data => { + if (this.destroyed) { + return Promise.reject(new Error("Worker was destroyed.")); + } + if (!this.StandardFontDataFactory) { + return Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter.")); + } + return this.StandardFontDataFactory.fetch(data); + }); + } + _onUnsupportedFeature(_ref13) { + var _this$loadingTask$onU, _this$loadingTask; + let { + featureId + } = _ref13; + if (this.destroyed) { + return; + } + (_this$loadingTask$onU = (_this$loadingTask = this.loadingTask).onUnsupportedFeature) === null || _this$loadingTask$onU === void 0 ? void 0 : _this$loadingTask$onU.call(_this$loadingTask, featureId); + } + getData() { + return this.messageHandler.sendWithPromise("GetData", null); + } + saveDocument() { + var _this$_fullReader; + if (this.annotationStorage.size <= 0) { + (0, _util.warn)("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); + } + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: this.annotationStorage.serializable, + filename: ((_this$_fullReader = this._fullReader) === null || _this$_fullReader === void 0 ? void 0 : _this$_fullReader.filename) ?? null + }).finally(() => { + this.annotationStorage.resetModified(); + }); + } + getPage(pageNumber) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { + return Promise.reject(new Error("Invalid page request.")); + } + const pageIndex = pageNumber - 1, + cachedPromise = _classPrivateFieldGet(this, _pagePromises).get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise("GetPage", { + pageIndex + }).then(pageInfo => { + if (this.destroyed) { + throw new Error("Transport destroyed"); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.ownerDocument, this._params.pdfBug); + _classPrivateFieldGet(this, _pageCache).set(pageIndex, page); + return page; + }); + _classPrivateFieldGet(this, _pagePromises).set(pageIndex, promise); + return promise; + } + getPageIndex(ref) { + if (typeof ref !== "object" || ref === null || !Number.isInteger(ref.num) || ref.num < 0 || !Number.isInteger(ref.gen) || ref.gen < 0) { + return Promise.reject(new Error("Invalid pageIndex request.")); + } + return this.messageHandler.sendWithPromise("GetPageIndex", { + num: ref.num, + gen: ref.gen + }); + } + getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise("GetAnnotations", { + pageIndex, + intent + }); + } + getFieldObjects() { + return this._getFieldObjectsPromise || (this._getFieldObjectsPromise = this.messageHandler.sendWithPromise("GetFieldObjects", null)); + } + hasJSActions() { + return this._hasJSActionsPromise || (this._hasJSActionsPromise = this.messageHandler.sendWithPromise("HasJSActions", null)); + } + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { + return this.messageHandler.sendWithPromise("GetDestinations", null); + } + getDestination(id) { + if (typeof id !== "string") { + return Promise.reject(new Error("Invalid destination request.")); + } + return this.messageHandler.sendWithPromise("GetDestination", { + id + }); + } + getPageLabels() { + return this.messageHandler.sendWithPromise("GetPageLabels", null); + } + getPageLayout() { + return this.messageHandler.sendWithPromise("GetPageLayout", null); + } + getPageMode() { + return this.messageHandler.sendWithPromise("GetPageMode", null); + } + getViewerPreferences() { + return this.messageHandler.sendWithPromise("GetViewerPreferences", null); + } + getOpenAction() { + return this.messageHandler.sendWithPromise("GetOpenAction", null); + } + getAttachments() { + return this.messageHandler.sendWithPromise("GetAttachments", null); + } + getJavaScript() { + return this.messageHandler.sendWithPromise("GetJavaScript", null); + } + getDocJSActions() { + return this.messageHandler.sendWithPromise("GetDocJSActions", null); + } + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex + }); + } + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex + }); + } + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); + } + getOptionalContentConfig() { + return this.messageHandler.sendWithPromise("GetOptionalContentConfig", null).then(results => { + return new _optional_content_config.OptionalContentConfig(results); + }); + } + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); + } + getMetadata() { + return _classPrivateFieldGet(this, _metadataPromise) || _classPrivateFieldSet(this, _metadataPromise, this.messageHandler.sendWithPromise("GetMetadata", null).then(results => { + var _this$_fullReader2, _this$_fullReader3; + return { + info: results[0], + metadata: results[1] ? new _metadata.Metadata(results[1]) : null, + contentDispositionFilename: ((_this$_fullReader2 = this._fullReader) === null || _this$_fullReader2 === void 0 ? void 0 : _this$_fullReader2.filename) ?? null, + contentLength: ((_this$_fullReader3 = this._fullReader) === null || _this$_fullReader3 === void 0 ? void 0 : _this$_fullReader3.contentLength) ?? null + }; + })); + } + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); + } + async startCleanup() { + let keepLoadedFonts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (this.destroyed) { + return; + } + await this.messageHandler.sendWithPromise("Cleanup", null); + for (const page of _classPrivateFieldGet(this, _pageCache).values()) { + const cleanupSuccessful = page.cleanup(); + if (!cleanupSuccessful) { + throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); + } + } + this.commonObjs.clear(); + if (!keepLoadedFonts) { + this.fontLoader.clear(); + } + _classPrivateFieldSet(this, _metadataPromise, null); + this._getFieldObjectsPromise = null; + this._hasJSActionsPromise = null; + } + get loadingParams() { + const params = this._params; + return (0, _util.shadow)(this, "loadingParams", { + disableAutoFetch: params.disableAutoFetch, + enableXfa: params.enableXfa + }); + } +} +var _objs = /*#__PURE__*/new WeakMap(); +var _ensureObj = /*#__PURE__*/new WeakSet(); +class PDFObjects { + constructor() { + _classPrivateMethodInitSpec(this, _ensureObj); + _classPrivateFieldInitSpec(this, _objs, { + writable: true, + value: Object.create(null) + }); + } + get(objId) { + let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + if (callback) { + const obj = _classPrivateMethodGet(this, _ensureObj, _ensureObj2).call(this, objId); + obj.capability.promise.then(() => callback(obj.data)); + return null; + } + const obj = _classPrivateFieldGet(this, _objs)[objId]; + if (!(obj !== null && obj !== void 0 && obj.capability.settled)) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + } + return obj.data; + } + has(objId) { + const obj = _classPrivateFieldGet(this, _objs)[objId]; + return (obj === null || obj === void 0 ? void 0 : obj.capability.settled) || false; + } + resolve(objId) { + let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + const obj = _classPrivateMethodGet(this, _ensureObj, _ensureObj2).call(this, objId); + obj.data = data; + obj.capability.resolve(); + } + clear() { + _classPrivateFieldSet(this, _objs, Object.create(null)); + } +} +function _ensureObj2(objId) { + const obj = _classPrivateFieldGet(this, _objs)[objId]; + if (obj) { + return obj; + } + return _classPrivateFieldGet(this, _objs)[objId] = { + capability: (0, _util.createPromiseCapability)(), + data: null + }; +} +var _internalRenderTask = /*#__PURE__*/new WeakMap(); +class RenderTask { + constructor(internalRenderTask) { + _classPrivateFieldInitSpec(this, _internalRenderTask, { + writable: true, + value: null + }); + _classPrivateFieldSet(this, _internalRenderTask, internalRenderTask); + this.onContinue = null; + } + get promise() { + return _classPrivateFieldGet(this, _internalRenderTask).capability.promise; + } + cancel() { + let extraDelay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + _classPrivateFieldGet(this, _internalRenderTask).cancel(null, extraDelay); + } + get separateAnnots() { + const { + separateAnnots + } = _classPrivateFieldGet(this, _internalRenderTask).operatorList; + if (!separateAnnots) { + return false; + } + const { + annotationCanvasMap + } = _classPrivateFieldGet(this, _internalRenderTask); + return separateAnnots.form || separateAnnots.canvas && (annotationCanvasMap === null || annotationCanvasMap === void 0 ? void 0 : annotationCanvasMap.size) > 0; + } +} +exports.RenderTask = RenderTask; +class InternalRenderTask { + constructor(_ref14) { + let { + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null + } = _ref14; + this.callback = callback; + this.params = params; + this.objs = objs; + this.commonObjs = commonObjs; + this.annotationCanvasMap = annotationCanvasMap; + this.operatorListIdx = null; + this.operatorList = operatorList; + this._pageIndex = pageIndex; + this.canvasFactory = canvasFactory; + this._pdfBug = pdfBug; + this.pageColors = pageColors; + this.running = false; + this.graphicsReadyCallback = null; + this.graphicsReady = false; + this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; + this.cancelled = false; + this.capability = (0, _util.createPromiseCapability)(); + this.task = new RenderTask(this); + this._cancelBound = this.cancel.bind(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + this._canvas = params.canvasContext.canvas; + } + get completed() { + return this.capability.promise.catch(function () {}); + } + initializeGraphics(_ref15) { + var _globalThis$StepperMa, _this$graphicsReadyCa; + let { + transparency = false, + optionalContentConfig + } = _ref15; + if (this.cancelled) { + return; + } + if (this._canvas) { + if (_classStaticPrivateFieldSpecGet(InternalRenderTask, InternalRenderTask, _canvasInUse).has(this._canvas)) { + throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + } + _classStaticPrivateFieldSpecGet(InternalRenderTask, InternalRenderTask, _canvasInUse).add(this._canvas); + } + if (this._pdfBug && (_globalThis$StepperMa = globalThis.StepperManager) !== null && _globalThis$StepperMa !== void 0 && _globalThis$StepperMa.enabled) { + this.stepper = globalThis.StepperManager.create(this._pageIndex); + this.stepper.init(this.operatorList); + this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); + } + const { + canvasContext, + viewport, + transform, + background + } = this.params; + this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors); + this.gfx.beginDrawing({ + transform, + viewport, + transparency, + background + }); + this.operatorListIdx = 0; + this.graphicsReady = true; + (_this$graphicsReadyCa = this.graphicsReadyCallback) === null || _this$graphicsReadyCa === void 0 ? void 0 : _this$graphicsReadyCa.call(this); + } + cancel() { + var _this$gfx; + let error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let extraDelay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + this.running = false; + this.cancelled = true; + (_this$gfx = this.gfx) === null || _this$gfx === void 0 ? void 0 : _this$gfx.endDrawing(); + if (this._canvas) { + _classStaticPrivateFieldSpecGet(InternalRenderTask, InternalRenderTask, _canvasInUse).delete(this._canvas); + } + this.callback(error || new _display_utils.RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, "canvas", extraDelay)); + } + operatorListChanged() { + var _this$stepper; + if (!this.graphicsReady) { + if (!this.graphicsReadyCallback) { + this.graphicsReadyCallback = this._continueBound; + } + return; + } + (_this$stepper = this.stepper) === null || _this$stepper === void 0 ? void 0 : _this$stepper.updateOperatorList(this.operatorList); + if (this.running) { + return; + } + this._continue(); + } + _continue() { + this.running = true; + if (this.cancelled) { + return; + } + if (this.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); + } + } + _scheduleNext() { + if (this._useRequestAnimationFrame) { + window.requestAnimationFrame(() => { + this._nextBound().catch(this._cancelBound); + }); + } else { + Promise.resolve().then(this._nextBound).catch(this._cancelBound); + } + } + async _next() { + if (this.cancelled) { + return; + } + this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + if (this._canvas) { + _classStaticPrivateFieldSpecGet(InternalRenderTask, InternalRenderTask, _canvasInUse).delete(this._canvas); + } + this.callback(); + } + } + } +} +var _canvasInUse = { + writable: true, + value: new WeakSet() +}; +const version = '3.2.146'; +exports.version = version; +const build = '3fd2a3548'; +exports.build = build; + +/***/ }), +/* 134 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PrintAnnotationStorage = exports.AnnotationStorage = void 0; +var _util = __w_pdfjs_require__(1); +var _editor = __w_pdfjs_require__(135); +var _murmurhash = __w_pdfjs_require__(139); +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +var _modified = /*#__PURE__*/new WeakMap(); +var _storage = /*#__PURE__*/new WeakMap(); +var _setModified = /*#__PURE__*/new WeakSet(); +class AnnotationStorage { + constructor() { + _classPrivateMethodInitSpec(this, _setModified); + _classPrivateFieldInitSpec(this, _modified, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _storage, { + writable: true, + value: new Map() + }); + this.onSetModified = null; + this.onResetModified = null; + this.onAnnotationEditor = null; + } + getValue(key, defaultValue) { + const value = _classPrivateFieldGet(this, _storage).get(key); + if (value === undefined) { + return defaultValue; + } + return Object.assign(defaultValue, value); + } + getRawValue(key) { + return _classPrivateFieldGet(this, _storage).get(key); + } + remove(key) { + _classPrivateFieldGet(this, _storage).delete(key); + if (_classPrivateFieldGet(this, _storage).size === 0) { + this.resetModified(); + } + if (typeof this.onAnnotationEditor === "function") { + for (const value of _classPrivateFieldGet(this, _storage).values()) { + if (value instanceof _editor.AnnotationEditor) { + return; + } + } + this.onAnnotationEditor(null); + } + } + setValue(key, value) { + const obj = _classPrivateFieldGet(this, _storage).get(key); + let modified = false; + if (obj !== undefined) { + for (const [entry, val] of Object.entries(value)) { + if (obj[entry] !== val) { + modified = true; + obj[entry] = val; + } + } + } else { + modified = true; + _classPrivateFieldGet(this, _storage).set(key, value); + } + if (modified) { + _classPrivateMethodGet(this, _setModified, _setModified2).call(this); + } + if (value instanceof _editor.AnnotationEditor && typeof this.onAnnotationEditor === "function") { + this.onAnnotationEditor(value.constructor._type); + } + } + has(key) { + return _classPrivateFieldGet(this, _storage).has(key); + } + getAll() { + return _classPrivateFieldGet(this, _storage).size > 0 ? (0, _util.objectFromMap)(_classPrivateFieldGet(this, _storage)) : null; + } + get size() { + return _classPrivateFieldGet(this, _storage).size; + } + resetModified() { + if (_classPrivateFieldGet(this, _modified)) { + _classPrivateFieldSet(this, _modified, false); + if (typeof this.onResetModified === "function") { + this.onResetModified(); + } + } + } + get print() { + return new PrintAnnotationStorage(this); + } + get serializable() { + if (_classPrivateFieldGet(this, _storage).size === 0) { + return null; + } + const clone = new Map(); + for (const [key, val] of _classPrivateFieldGet(this, _storage)) { + const serialized = val instanceof _editor.AnnotationEditor ? val.serialize() : val; + if (serialized) { + clone.set(key, serialized); + } + } + return clone; + } + static getHash(map) { + if (!map) { + return ""; + } + const hash = new _murmurhash.MurmurHash3_64(); + for (const [key, val] of map) { + hash.update(`${key}:${JSON.stringify(val)}`); + } + return hash.hexdigest(); + } +} +exports.AnnotationStorage = AnnotationStorage; +function _setModified2() { + if (!_classPrivateFieldGet(this, _modified)) { + _classPrivateFieldSet(this, _modified, true); + if (typeof this.onSetModified === "function") { + this.onSetModified(); + } + } +} +var _serializable = /*#__PURE__*/new WeakMap(); +class PrintAnnotationStorage extends AnnotationStorage { + constructor(parent) { + super(); + _classPrivateFieldInitSpec(this, _serializable, { + writable: true, + value: null + }); + _classPrivateFieldSet(this, _serializable, structuredClone(parent.serializable)); + } + get print() { + (0, _util.unreachable)("Should not call PrintAnnotationStorage.print"); + } + get serializable() { + return _classPrivateFieldGet(this, _serializable); + } +} +exports.PrintAnnotationStorage = PrintAnnotationStorage; + +/***/ }), +/* 135 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.AnnotationEditor = void 0; +var _tools = __w_pdfjs_require__(136); +var _util = __w_pdfjs_require__(1); +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +var _boundFocusin = /*#__PURE__*/new WeakMap(); +var _boundFocusout = /*#__PURE__*/new WeakMap(); +var _hasBeenSelected = /*#__PURE__*/new WeakMap(); +var _isEditing = /*#__PURE__*/new WeakMap(); +var _isInEditMode = /*#__PURE__*/new WeakMap(); +var _zIndex = /*#__PURE__*/new WeakMap(); +class AnnotationEditor { + constructor(parameters) { + _classPrivateFieldInitSpec(this, _boundFocusin, { + writable: true, + value: this.focusin.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundFocusout, { + writable: true, + value: this.focusout.bind(this) + }); + _classPrivateFieldInitSpec(this, _hasBeenSelected, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _isEditing, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _isInEditMode, { + writable: true, + value: false + }); + _defineProperty(this, "_uiManager", null); + _classPrivateFieldInitSpec(this, _zIndex, { + writable: true, + value: AnnotationEditor._zIndex++ + }); + if (this.constructor === AnnotationEditor) { + (0, _util.unreachable)("Cannot initialize AnnotationEditor."); + } + this.parent = parameters.parent; + this.id = parameters.id; + this.width = this.height = null; + this.pageIndex = parameters.parent.pageIndex; + this.name = parameters.name; + this.div = null; + this._uiManager = parameters.uiManager; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = this.parent.viewport; + this.rotation = rotation; + this.pageDimensions = [pageWidth, pageHeight]; + this.pageTranslation = [pageX, pageY]; + const [width, height] = this.parentDimensions; + this.x = parameters.x / width; + this.y = parameters.y / height; + this.isAttachedToDOM = false; + } + static get _defaultLineColor() { + return (0, _util.shadow)(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + addCommands(params) { + this._uiManager.addCommands(params); + } + get currentLayer() { + return this._uiManager.currentLayer; + } + setInBackground() { + this.div.style.zIndex = 0; + } + setInForeground() { + this.div.style.zIndex = _classPrivateFieldGet(this, _zIndex); + } + setParent(parent) { + if (parent !== null) { + this.pageIndex = parent.pageIndex; + this.pageDimensions = parent.pageDimensions; + } + this.parent = parent; + } + focusin(event) { + if (!_classPrivateFieldGet(this, _hasBeenSelected)) { + this.parent.setSelected(this); + } else { + _classPrivateFieldSet(this, _hasBeenSelected, false); + } + } + focusout(event) { + var _this$parent; + if (!this.isAttachedToDOM) { + return; + } + const target = event.relatedTarget; + if (target !== null && target !== void 0 && target.closest(`#${this.id}`)) { + return; + } + event.preventDefault(); + if (!((_this$parent = this.parent) !== null && _this$parent !== void 0 && _this$parent.isMultipleSelection)) { + this.commitOrRemove(); + } + } + commitOrRemove() { + if (this.isEmpty()) { + this.remove(); + } else { + this.commit(); + } + } + commit() { + this.addToAnnotationStorage(); + } + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + dragstart(event) { + const rect = this.parent.div.getBoundingClientRect(); + this.startX = event.clientX - rect.x; + this.startY = event.clientY - rect.y; + event.dataTransfer.setData("text/plain", this.id); + event.dataTransfer.effectAllowed = "move"; + } + setAt(x, y, tx, ty) { + const [width, height] = this.parentDimensions; + [tx, ty] = this.screenToPageTranslation(tx, ty); + this.x = (x + tx) / width; + this.y = (y + ty) / height; + this.div.style.left = `${100 * this.x}%`; + this.div.style.top = `${100 * this.y}%`; + } + translate(x, y) { + const [width, height] = this.parentDimensions; + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this.div.style.left = `${100 * this.x}%`; + this.div.style.top = `${100 * this.y}%`; + } + screenToPageTranslation(x, y) { + switch (this.parentRotation) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } + } + get parentScale() { + return this._uiManager.viewParameters.realScale; + } + get parentRotation() { + return this._uiManager.viewParameters.rotation; + } + get parentDimensions() { + const { + realScale + } = this._uiManager.viewParameters; + const [pageWidth, pageHeight] = this.pageDimensions; + return [pageWidth * realScale, pageHeight * realScale]; + } + setDims(width, height) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.div.style.width = `${100 * width / parentWidth}%`; + this.div.style.height = `${100 * height / parentHeight}%`; + } + fixDims() { + const { + style + } = this.div; + const { + height, + width + } = style; + const widthPercent = width.endsWith("%"); + const heightPercent = height.endsWith("%"); + if (widthPercent && heightPercent) { + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + if (!widthPercent) { + style.width = `${100 * parseFloat(width) / parentWidth}%`; + } + if (!heightPercent) { + style.height = `${100 * parseFloat(height) / parentHeight}%`; + } + } + getInitialTranslation() { + return [0, 0]; + } + render() { + this.div = document.createElement("div"); + this.div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + this.div.className = this.name; + this.div.setAttribute("id", this.id); + this.div.setAttribute("tabIndex", 0); + this.setInForeground(); + this.div.addEventListener("focusin", _classPrivateFieldGet(this, _boundFocusin)); + this.div.addEventListener("focusout", _classPrivateFieldGet(this, _boundFocusout)); + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + (0, _tools.bindEvents)(this, this.div, ["dragstart", "pointerdown"]); + return this.div; + } + pointerdown(event) { + const { + isMac + } = _util.FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; + } + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } + _classPrivateFieldSet(this, _hasBeenSelected, true); + } + getRect(tx, ty) { + const scale = this.parentScale; + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const shiftX = tx / scale; + const shiftY = ty / scale; + const x = this.x * pageWidth; + const y = this.y * pageHeight; + const width = this.width * pageWidth; + const height = this.height * pageHeight; + switch (this.rotation) { + case 0: + return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; + case 90: + return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; + case 180: + return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; + case 270: + return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; + default: + throw new Error("Invalid rotation"); + } + } + getRectInCurrentCoords(rect, pageHeight) { + const [x1, y1, x2, y2] = rect; + const width = x2 - x1; + const height = y2 - y1; + switch (this.rotation) { + case 0: + return [x1, pageHeight - y2, width, height]; + case 90: + return [x1, pageHeight - y1, height, width]; + case 180: + return [x2, pageHeight - y1, width, height]; + case 270: + return [x2, pageHeight - y2, height, width]; + default: + throw new Error("Invalid rotation"); + } + } + onceAdded() {} + isEmpty() { + return false; + } + enableEditMode() { + _classPrivateFieldSet(this, _isInEditMode, true); + } + disableEditMode() { + _classPrivateFieldSet(this, _isInEditMode, false); + } + isInEditMode() { + return _classPrivateFieldGet(this, _isInEditMode); + } + shouldGetKeyboardEvents() { + return false; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + rebuild() { + var _this$div; + (_this$div = this.div) === null || _this$div === void 0 ? void 0 : _this$div.addEventListener("focusin", _classPrivateFieldGet(this, _boundFocusin)); + } + serialize() { + (0, _util.unreachable)("An editor must be serializable"); + } + static deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: parent.getNextId(), + uiManager + }); + editor.rotation = data.rotation; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); + editor.x = x / pageWidth; + editor.y = y / pageHeight; + editor.width = width / pageWidth; + editor.height = height / pageHeight; + return editor; + } + remove() { + this.div.removeEventListener("focusin", _classPrivateFieldGet(this, _boundFocusin)); + this.div.removeEventListener("focusout", _classPrivateFieldGet(this, _boundFocusout)); + if (!this.isEmpty()) { + this.commit(); + } + this.parent.remove(this); + } + select() { + var _this$div2; + (_this$div2 = this.div) === null || _this$div2 === void 0 ? void 0 : _this$div2.classList.add("selectedEditor"); + } + unselect() { + var _this$div3; + (_this$div3 = this.div) === null || _this$div3 === void 0 ? void 0 : _this$div3.classList.remove("selectedEditor"); + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + get propertiesToUpdate() { + return {}; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return _classPrivateFieldGet(this, _isEditing); + } + set isEditing(value) { + _classPrivateFieldSet(this, _isEditing, value); + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } +} +exports.AnnotationEditor = AnnotationEditor; +_defineProperty(AnnotationEditor, "_colorManager", new _tools.ColorManager()); +_defineProperty(AnnotationEditor, "_zIndex", 1); + +/***/ }), +/* 136 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.KeyboardManager = exports.CommandManager = exports.ColorManager = exports.AnnotationEditorUIManager = void 0; +exports.bindEvents = bindEvents; +exports.opacityToHex = opacityToHex; +var _util = __w_pdfjs_require__(1); +var _display_utils = __w_pdfjs_require__(137); +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +function opacityToHex(opacity) { + return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, "0"); +} +var _id = /*#__PURE__*/new WeakMap(); +class IdManager { + constructor() { + _classPrivateFieldInitSpec(this, _id, { + writable: true, + value: 0 + }); + } + getId() { + var _this$id, _this$id2; + return `${_util.AnnotationEditorPrefix}${(_classPrivateFieldSet(this, _id, (_this$id = _classPrivateFieldGet(this, _id), _this$id2 = _this$id++, _this$id)), _this$id2)}`; + } +} +var _commands = /*#__PURE__*/new WeakMap(); +var _locked = /*#__PURE__*/new WeakMap(); +var _maxSize = /*#__PURE__*/new WeakMap(); +var _position = /*#__PURE__*/new WeakMap(); +class CommandManager { + constructor() { + let maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 128; + _classPrivateFieldInitSpec(this, _commands, { + writable: true, + value: [] + }); + _classPrivateFieldInitSpec(this, _locked, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _maxSize, { + writable: true, + value: void 0 + }); + _classPrivateFieldInitSpec(this, _position, { + writable: true, + value: -1 + }); + _classPrivateFieldSet(this, _maxSize, maxSize); + } + add(_ref) { + let { + cmd, + undo, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + } = _ref; + if (mustExec) { + cmd(); + } + if (_classPrivateFieldGet(this, _locked)) { + return; + } + const save = { + cmd, + undo, + type + }; + if (_classPrivateFieldGet(this, _position) === -1) { + if (_classPrivateFieldGet(this, _commands).length > 0) { + _classPrivateFieldGet(this, _commands).length = 0; + } + _classPrivateFieldSet(this, _position, 0); + _classPrivateFieldGet(this, _commands).push(save); + return; + } + if (overwriteIfSameType && _classPrivateFieldGet(this, _commands)[_classPrivateFieldGet(this, _position)].type === type) { + if (keepUndo) { + save.undo = _classPrivateFieldGet(this, _commands)[_classPrivateFieldGet(this, _position)].undo; + } + _classPrivateFieldGet(this, _commands)[_classPrivateFieldGet(this, _position)] = save; + return; + } + const next = _classPrivateFieldGet(this, _position) + 1; + if (next === _classPrivateFieldGet(this, _maxSize)) { + _classPrivateFieldGet(this, _commands).splice(0, 1); + } else { + _classPrivateFieldSet(this, _position, next); + if (next < _classPrivateFieldGet(this, _commands).length) { + _classPrivateFieldGet(this, _commands).splice(next); + } + } + _classPrivateFieldGet(this, _commands).push(save); + } + undo() { + if (_classPrivateFieldGet(this, _position) === -1) { + return; + } + _classPrivateFieldSet(this, _locked, true); + _classPrivateFieldGet(this, _commands)[_classPrivateFieldGet(this, _position)].undo(); + _classPrivateFieldSet(this, _locked, false); + _classPrivateFieldSet(this, _position, _classPrivateFieldGet(this, _position) - 1); + } + redo() { + if (_classPrivateFieldGet(this, _position) < _classPrivateFieldGet(this, _commands).length - 1) { + _classPrivateFieldSet(this, _position, _classPrivateFieldGet(this, _position) + 1); + _classPrivateFieldSet(this, _locked, true); + _classPrivateFieldGet(this, _commands)[_classPrivateFieldGet(this, _position)].cmd(); + _classPrivateFieldSet(this, _locked, false); + } + } + hasSomethingToUndo() { + return _classPrivateFieldGet(this, _position) !== -1; + } + hasSomethingToRedo() { + return _classPrivateFieldGet(this, _position) < _classPrivateFieldGet(this, _commands).length - 1; + } + destroy() { + _classPrivateFieldSet(this, _commands, null); + } +} +exports.CommandManager = CommandManager; +var _serialize = /*#__PURE__*/new WeakSet(); +class KeyboardManager { + constructor(callbacks) { + _classPrivateMethodInitSpec(this, _serialize); + this.buffer = []; + this.callbacks = new Map(); + this.allKeys = new Set(); + const { + isMac + } = _util.FeatureTest.platform; + for (const [keys, callback] of callbacks) { + for (const key of keys) { + const isMacKey = key.startsWith("mac+"); + if (isMac && isMacKey) { + this.callbacks.set(key.slice(4), callback); + this.allKeys.add(key.split("+").at(-1)); + } else if (!isMac && !isMacKey) { + this.callbacks.set(key, callback); + this.allKeys.add(key.split("+").at(-1)); + } + } + } + } + exec(self, event) { + if (!this.allKeys.has(event.key)) { + return; + } + const callback = this.callbacks.get(_classPrivateMethodGet(this, _serialize, _serialize2).call(this, event)); + if (!callback) { + return; + } + callback.bind(self)(); + event.stopPropagation(); + event.preventDefault(); + } +} +exports.KeyboardManager = KeyboardManager; +function _serialize2(event) { + if (event.altKey) { + this.buffer.push("alt"); + } + if (event.ctrlKey) { + this.buffer.push("ctrl"); + } + if (event.metaKey) { + this.buffer.push("meta"); + } + if (event.shiftKey) { + this.buffer.push("shift"); + } + this.buffer.push(event.key); + const str = this.buffer.join("+"); + this.buffer.length = 0; + return str; +} +class ColorManager { + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + (0, _display_utils.getColorValues)(colors); + return (0, _util.shadow)(this, "_colors", colors); + } + convert(color) { + const rgb = (0, _display_utils.getRGB)(color); + if (!window.matchMedia("(forced-colors: active)").matches) { + return rgb; + } + for (const [name, RGB] of this._colors) { + if (RGB.every((x, i) => x === rgb[i])) { + return ColorManager._colorsMapping.get(name); + } + } + return rgb; + } + getHexCode(name) { + const rgb = this._colors.get(name); + if (!rgb) { + return name; + } + return _util.Util.makeHexColor(...rgb); + } +} +exports.ColorManager = ColorManager; +_defineProperty(ColorManager, "_colorsMapping", new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]])); +var _activeEditor = /*#__PURE__*/new WeakMap(); +var _allEditors = /*#__PURE__*/new WeakMap(); +var _allLayers = /*#__PURE__*/new WeakMap(); +var _annotationStorage = /*#__PURE__*/new WeakMap(); +var _commandManager = /*#__PURE__*/new WeakMap(); +var _currentPageIndex = /*#__PURE__*/new WeakMap(); +var _editorTypes = /*#__PURE__*/new WeakMap(); +var _editorsToRescale = /*#__PURE__*/new WeakMap(); +var _eventBus = /*#__PURE__*/new WeakMap(); +var _idManager = /*#__PURE__*/new WeakMap(); +var _isEnabled = /*#__PURE__*/new WeakMap(); +var _mode = /*#__PURE__*/new WeakMap(); +var _selectedEditors = /*#__PURE__*/new WeakMap(); +var _boundCopy = /*#__PURE__*/new WeakMap(); +var _boundCut = /*#__PURE__*/new WeakMap(); +var _boundPaste = /*#__PURE__*/new WeakMap(); +var _boundKeydown = /*#__PURE__*/new WeakMap(); +var _boundOnEditingAction = /*#__PURE__*/new WeakMap(); +var _boundOnPageChanging = /*#__PURE__*/new WeakMap(); +var _boundOnScaleChanging = /*#__PURE__*/new WeakMap(); +var _boundOnRotationChanging = /*#__PURE__*/new WeakMap(); +var _previousStates = /*#__PURE__*/new WeakMap(); +var _container = /*#__PURE__*/new WeakMap(); +var _addKeyboardManager = /*#__PURE__*/new WeakSet(); +var _removeKeyboardManager = /*#__PURE__*/new WeakSet(); +var _addCopyPasteListeners = /*#__PURE__*/new WeakSet(); +var _removeCopyPasteListeners = /*#__PURE__*/new WeakSet(); +var _dispatchUpdateStates = /*#__PURE__*/new WeakSet(); +var _dispatchUpdateUI = /*#__PURE__*/new WeakSet(); +var _enableAll = /*#__PURE__*/new WeakSet(); +var _disableAll = /*#__PURE__*/new WeakSet(); +var _addEditorToLayer = /*#__PURE__*/new WeakSet(); +var _isEmpty = /*#__PURE__*/new WeakSet(); +var _selectEditors = /*#__PURE__*/new WeakSet(); +class AnnotationEditorUIManager { + constructor(container, eventBus, annotationStorage) { + _classPrivateMethodInitSpec(this, _selectEditors); + _classPrivateMethodInitSpec(this, _isEmpty); + _classPrivateMethodInitSpec(this, _addEditorToLayer); + _classPrivateMethodInitSpec(this, _disableAll); + _classPrivateMethodInitSpec(this, _enableAll); + _classPrivateMethodInitSpec(this, _dispatchUpdateUI); + _classPrivateMethodInitSpec(this, _dispatchUpdateStates); + _classPrivateMethodInitSpec(this, _removeCopyPasteListeners); + _classPrivateMethodInitSpec(this, _addCopyPasteListeners); + _classPrivateMethodInitSpec(this, _removeKeyboardManager); + _classPrivateMethodInitSpec(this, _addKeyboardManager); + _classPrivateFieldInitSpec(this, _activeEditor, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _allEditors, { + writable: true, + value: new Map() + }); + _classPrivateFieldInitSpec(this, _allLayers, { + writable: true, + value: new Map() + }); + _classPrivateFieldInitSpec(this, _annotationStorage, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _commandManager, { + writable: true, + value: new CommandManager() + }); + _classPrivateFieldInitSpec(this, _currentPageIndex, { + writable: true, + value: 0 + }); + _classPrivateFieldInitSpec(this, _editorTypes, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _editorsToRescale, { + writable: true, + value: new Set() + }); + _classPrivateFieldInitSpec(this, _eventBus, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _idManager, { + writable: true, + value: new IdManager() + }); + _classPrivateFieldInitSpec(this, _isEnabled, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _mode, { + writable: true, + value: _util.AnnotationEditorType.NONE + }); + _classPrivateFieldInitSpec(this, _selectedEditors, { + writable: true, + value: new Set() + }); + _classPrivateFieldInitSpec(this, _boundCopy, { + writable: true, + value: this.copy.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundCut, { + writable: true, + value: this.cut.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundPaste, { + writable: true, + value: this.paste.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundKeydown, { + writable: true, + value: this.keydown.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundOnEditingAction, { + writable: true, + value: this.onEditingAction.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundOnPageChanging, { + writable: true, + value: this.onPageChanging.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundOnScaleChanging, { + writable: true, + value: this.onScaleChanging.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundOnRotationChanging, { + writable: true, + value: this.onRotationChanging.bind(this) + }); + _classPrivateFieldInitSpec(this, _previousStates, { + writable: true, + value: { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false + } + }); + _classPrivateFieldInitSpec(this, _container, { + writable: true, + value: null + }); + _classPrivateFieldSet(this, _container, container); + _classPrivateFieldSet(this, _eventBus, eventBus); + _classPrivateFieldGet(this, _eventBus)._on("editingaction", _classPrivateFieldGet(this, _boundOnEditingAction)); + _classPrivateFieldGet(this, _eventBus)._on("pagechanging", _classPrivateFieldGet(this, _boundOnPageChanging)); + _classPrivateFieldGet(this, _eventBus)._on("scalechanging", _classPrivateFieldGet(this, _boundOnScaleChanging)); + _classPrivateFieldGet(this, _eventBus)._on("rotationchanging", _classPrivateFieldGet(this, _boundOnRotationChanging)); + _classPrivateFieldSet(this, _annotationStorage, annotationStorage); + this.viewParameters = { + realScale: _display_utils.PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + } + destroy() { + _classPrivateMethodGet(this, _removeKeyboardManager, _removeKeyboardManager2).call(this); + _classPrivateFieldGet(this, _eventBus)._off("editingaction", _classPrivateFieldGet(this, _boundOnEditingAction)); + _classPrivateFieldGet(this, _eventBus)._off("pagechanging", _classPrivateFieldGet(this, _boundOnPageChanging)); + _classPrivateFieldGet(this, _eventBus)._off("scalechanging", _classPrivateFieldGet(this, _boundOnScaleChanging)); + _classPrivateFieldGet(this, _eventBus)._off("rotationchanging", _classPrivateFieldGet(this, _boundOnRotationChanging)); + for (const layer of _classPrivateFieldGet(this, _allLayers).values()) { + layer.destroy(); + } + _classPrivateFieldGet(this, _allLayers).clear(); + _classPrivateFieldGet(this, _allEditors).clear(); + _classPrivateFieldGet(this, _editorsToRescale).clear(); + _classPrivateFieldSet(this, _activeEditor, null); + _classPrivateFieldGet(this, _selectedEditors).clear(); + _classPrivateFieldGet(this, _commandManager).destroy(); + } + onPageChanging(_ref2) { + let { + pageNumber + } = _ref2; + _classPrivateFieldSet(this, _currentPageIndex, pageNumber - 1); + } + focusMainContainer() { + _classPrivateFieldGet(this, _container).focus(); + } + addShouldRescale(editor) { + _classPrivateFieldGet(this, _editorsToRescale).add(editor); + } + removeShouldRescale(editor) { + _classPrivateFieldGet(this, _editorsToRescale).delete(editor); + } + onScaleChanging(_ref3) { + let { + scale + } = _ref3; + this.commitOrRemove(); + this.viewParameters.realScale = scale * _display_utils.PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of _classPrivateFieldGet(this, _editorsToRescale)) { + editor.onScaleChanging(); + } + } + onRotationChanging(_ref4) { + let { + pagesRotation + } = _ref4; + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && _classPrivateFieldGet(this, _annotationStorage) && !_classPrivateFieldGet(this, _annotationStorage).has(editor.id)) { + _classPrivateFieldGet(this, _annotationStorage).setValue(editor.id, editor); + } + } + copy(event) { + event.preventDefault(); + if (_classPrivateFieldGet(this, _activeEditor)) { + _classPrivateFieldGet(this, _activeEditor).commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of _classPrivateFieldGet(this, _selectedEditors)) { + if (!editor.isEmpty()) { + editors.push(editor.serialize()); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + paste(event) { + event.preventDefault(); + let data = event.clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + (0, _util.warn)(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = _classPrivateFieldGet(this, _allLayers).get(_classPrivateFieldGet(this, _currentPageIndex)); + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = layer.deserialize(editor); + if (!deserializedEditor) { + return; + } + newEditors.push(deserializedEditor); + } + const cmd = () => { + for (const editor of newEditors) { + _classPrivateMethodGet(this, _addEditorToLayer, _addEditorToLayer2).call(this, editor); + } + _classPrivateMethodGet(this, _selectEditors, _selectEditors2).call(this, newEditors); + }; + const undo = () => { + for (const editor of newEditors) { + editor.remove(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } catch (ex) { + (0, _util.warn)(`paste: "${ex.message}".`); + } + } + keydown(event) { + var _this$getActive; + if (!((_this$getActive = this.getActive()) !== null && _this$getActive !== void 0 && _this$getActive.shouldGetKeyboardEvents())) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } + } + onEditingAction(details) { + if (["undo", "redo", "delete", "selectAll"].includes(details.name)) { + this[details.name](); + } + } + setEditingState(isEditing) { + if (isEditing) { + _classPrivateMethodGet(this, _addKeyboardManager, _addKeyboardManager2).call(this); + _classPrivateMethodGet(this, _addCopyPasteListeners, _addCopyPasteListeners2).call(this); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + isEditing: _classPrivateFieldGet(this, _mode) !== _util.AnnotationEditorType.NONE, + isEmpty: _classPrivateMethodGet(this, _isEmpty, _isEmpty2).call(this), + hasSomethingToUndo: _classPrivateFieldGet(this, _commandManager).hasSomethingToUndo(), + hasSomethingToRedo: _classPrivateFieldGet(this, _commandManager).hasSomethingToRedo(), + hasSelectedEditor: false + }); + } else { + _classPrivateMethodGet(this, _removeKeyboardManager, _removeKeyboardManager2).call(this); + _classPrivateMethodGet(this, _removeCopyPasteListeners, _removeCopyPasteListeners2).call(this); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + isEditing: false + }); + } + } + registerEditorTypes(types) { + if (_classPrivateFieldGet(this, _editorTypes)) { + return; + } + _classPrivateFieldSet(this, _editorTypes, types); + for (const editorType of _classPrivateFieldGet(this, _editorTypes)) { + _classPrivateMethodGet(this, _dispatchUpdateUI, _dispatchUpdateUI2).call(this, editorType.defaultPropertiesToUpdate); + } + } + getId() { + return _classPrivateFieldGet(this, _idManager).getId(); + } + get currentLayer() { + return _classPrivateFieldGet(this, _allLayers).get(_classPrivateFieldGet(this, _currentPageIndex)); + } + get currentPageIndex() { + return _classPrivateFieldGet(this, _currentPageIndex); + } + addLayer(layer) { + _classPrivateFieldGet(this, _allLayers).set(layer.pageIndex, layer); + if (_classPrivateFieldGet(this, _isEnabled)) { + layer.enable(); + } else { + layer.disable(); + } + } + removeLayer(layer) { + _classPrivateFieldGet(this, _allLayers).delete(layer.pageIndex); + } + updateMode(mode) { + _classPrivateFieldSet(this, _mode, mode); + if (mode === _util.AnnotationEditorType.NONE) { + this.setEditingState(false); + _classPrivateMethodGet(this, _disableAll, _disableAll2).call(this); + } else { + this.setEditingState(true); + _classPrivateMethodGet(this, _enableAll, _enableAll2).call(this); + for (const layer of _classPrivateFieldGet(this, _allLayers).values()) { + layer.updateMode(mode); + } + } + } + updateToolbar(mode) { + if (mode === _classPrivateFieldGet(this, _mode)) { + return; + } + _classPrivateFieldGet(this, _eventBus).dispatch("switchannotationeditormode", { + source: this, + mode + }); + } + updateParams(type, value) { + if (!_classPrivateFieldGet(this, _editorTypes)) { + return; + } + for (const editor of _classPrivateFieldGet(this, _selectedEditors)) { + editor.updateParams(type, value); + } + for (const editorType of _classPrivateFieldGet(this, _editorTypes)) { + editorType.updateDefaultParams(type, value); + } + } + getEditors(pageIndex) { + const editors = []; + for (const editor of _classPrivateFieldGet(this, _allEditors).values()) { + if (editor.pageIndex === pageIndex) { + editors.push(editor); + } + } + return editors; + } + getEditor(id) { + return _classPrivateFieldGet(this, _allEditors).get(id); + } + addEditor(editor) { + _classPrivateFieldGet(this, _allEditors).set(editor.id, editor); + } + removeEditor(editor) { + var _classPrivateFieldGet2; + _classPrivateFieldGet(this, _allEditors).delete(editor.id); + this.unselect(editor); + (_classPrivateFieldGet2 = _classPrivateFieldGet(this, _annotationStorage)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.remove(editor.id); + } + setActiveEditor(editor) { + if (_classPrivateFieldGet(this, _activeEditor) === editor) { + return; + } + _classPrivateFieldSet(this, _activeEditor, editor); + if (editor) { + _classPrivateMethodGet(this, _dispatchUpdateUI, _dispatchUpdateUI2).call(this, editor.propertiesToUpdate); + } + } + toggleSelected(editor) { + if (_classPrivateFieldGet(this, _selectedEditors).has(editor)) { + _classPrivateFieldGet(this, _selectedEditors).delete(editor); + editor.unselect(); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSelectedEditor: this.hasSelection + }); + return; + } + _classPrivateFieldGet(this, _selectedEditors).add(editor); + editor.select(); + _classPrivateMethodGet(this, _dispatchUpdateUI, _dispatchUpdateUI2).call(this, editor.propertiesToUpdate); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSelectedEditor: true + }); + } + setSelected(editor) { + for (const ed of _classPrivateFieldGet(this, _selectedEditors)) { + if (ed !== editor) { + ed.unselect(); + } + } + _classPrivateFieldGet(this, _selectedEditors).clear(); + _classPrivateFieldGet(this, _selectedEditors).add(editor); + editor.select(); + _classPrivateMethodGet(this, _dispatchUpdateUI, _dispatchUpdateUI2).call(this, editor.propertiesToUpdate); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSelectedEditor: true + }); + } + isSelected(editor) { + return _classPrivateFieldGet(this, _selectedEditors).has(editor); + } + unselect(editor) { + editor.unselect(); + _classPrivateFieldGet(this, _selectedEditors).delete(editor); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSelectedEditor: this.hasSelection + }); + } + get hasSelection() { + return _classPrivateFieldGet(this, _selectedEditors).size !== 0; + } + undo() { + _classPrivateFieldGet(this, _commandManager).undo(); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSomethingToUndo: _classPrivateFieldGet(this, _commandManager).hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: _classPrivateMethodGet(this, _isEmpty, _isEmpty2).call(this) + }); + } + redo() { + _classPrivateFieldGet(this, _commandManager).redo(); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSomethingToUndo: true, + hasSomethingToRedo: _classPrivateFieldGet(this, _commandManager).hasSomethingToRedo(), + isEmpty: _classPrivateMethodGet(this, _isEmpty, _isEmpty2).call(this) + }); + } + addCommands(params) { + _classPrivateFieldGet(this, _commandManager).add(params); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSomethingToUndo: true, + hasSomethingToRedo: false, + isEmpty: _classPrivateMethodGet(this, _isEmpty, _isEmpty2).call(this) + }); + } + delete() { + this.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = [..._classPrivateFieldGet(this, _selectedEditors)]; + const cmd = () => { + for (const editor of editors) { + editor.remove(); + } + }; + const undo = () => { + for (const editor of editors) { + _classPrivateMethodGet(this, _addEditorToLayer, _addEditorToLayer2).call(this, editor); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + commitOrRemove() { + var _classPrivateFieldGet3; + (_classPrivateFieldGet3 = _classPrivateFieldGet(this, _activeEditor)) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.commitOrRemove(); + } + selectAll() { + for (const editor of _classPrivateFieldGet(this, _selectedEditors)) { + editor.commit(); + } + _classPrivateMethodGet(this, _selectEditors, _selectEditors2).call(this, _classPrivateFieldGet(this, _allEditors).values()); + } + unselectAll() { + if (_classPrivateFieldGet(this, _activeEditor)) { + _classPrivateFieldGet(this, _activeEditor).commitOrRemove(); + return; + } + if (_classPrivateFieldGet(this, _selectedEditors).size === 0) { + return; + } + for (const editor of _classPrivateFieldGet(this, _selectedEditors)) { + editor.unselect(); + } + _classPrivateFieldGet(this, _selectedEditors).clear(); + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSelectedEditor: false + }); + } + isActive(editor) { + return _classPrivateFieldGet(this, _activeEditor) === editor; + } + getActive() { + return _classPrivateFieldGet(this, _activeEditor); + } + getMode() { + return _classPrivateFieldGet(this, _mode); + } +} +exports.AnnotationEditorUIManager = AnnotationEditorUIManager; +function _addKeyboardManager2() { + _classPrivateFieldGet(this, _container).addEventListener("keydown", _classPrivateFieldGet(this, _boundKeydown)); +} +function _removeKeyboardManager2() { + _classPrivateFieldGet(this, _container).removeEventListener("keydown", _classPrivateFieldGet(this, _boundKeydown)); +} +function _addCopyPasteListeners2() { + document.addEventListener("copy", _classPrivateFieldGet(this, _boundCopy)); + document.addEventListener("cut", _classPrivateFieldGet(this, _boundCut)); + document.addEventListener("paste", _classPrivateFieldGet(this, _boundPaste)); +} +function _removeCopyPasteListeners2() { + document.removeEventListener("copy", _classPrivateFieldGet(this, _boundCopy)); + document.removeEventListener("cut", _classPrivateFieldGet(this, _boundCut)); + document.removeEventListener("paste", _classPrivateFieldGet(this, _boundPaste)); +} +function _dispatchUpdateStates2(details) { + const hasChanged = Object.entries(details).some(_ref5 => { + let [key, value] = _ref5; + return _classPrivateFieldGet(this, _previousStates)[key] !== value; + }); + if (hasChanged) { + _classPrivateFieldGet(this, _eventBus).dispatch("annotationeditorstateschanged", { + source: this, + details: Object.assign(_classPrivateFieldGet(this, _previousStates), details) + }); + } +} +function _dispatchUpdateUI2(details) { + _classPrivateFieldGet(this, _eventBus).dispatch("annotationeditorparamschanged", { + source: this, + details + }); +} +function _enableAll2() { + if (!_classPrivateFieldGet(this, _isEnabled)) { + _classPrivateFieldSet(this, _isEnabled, true); + for (const layer of _classPrivateFieldGet(this, _allLayers).values()) { + layer.enable(); + } + } +} +function _disableAll2() { + this.unselectAll(); + if (_classPrivateFieldGet(this, _isEnabled)) { + _classPrivateFieldSet(this, _isEnabled, false); + for (const layer of _classPrivateFieldGet(this, _allLayers).values()) { + layer.disable(); + } + } +} +function _addEditorToLayer2(editor) { + const layer = _classPrivateFieldGet(this, _allLayers).get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + } +} +function _isEmpty2() { + if (_classPrivateFieldGet(this, _allEditors).size === 0) { + return true; + } + if (_classPrivateFieldGet(this, _allEditors).size === 1) { + for (const editor of _classPrivateFieldGet(this, _allEditors).values()) { + return editor.isEmpty(); + } + } + return false; +} +function _selectEditors2(editors) { + _classPrivateFieldGet(this, _selectedEditors).clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + _classPrivateFieldGet(this, _selectedEditors).add(editor); + editor.select(); + } + _classPrivateMethodGet(this, _dispatchUpdateStates, _dispatchUpdateStates2).call(this, { + hasSelectedEditor: true + }); +} +_defineProperty(AnnotationEditorUIManager, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], AnnotationEditorUIManager.prototype.selectAll], [["ctrl+z", "mac+meta+z"], AnnotationEditorUIManager.prototype.undo], [["ctrl+y", "ctrl+shift+Z", "mac+meta+shift+Z"], AnnotationEditorUIManager.prototype.redo], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete"], AnnotationEditorUIManager.prototype.delete], [["Escape", "mac+Escape"], AnnotationEditorUIManager.prototype.unselectAll]])); + +/***/ }), +/* 137 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.StatTimer = exports.RenderingCancelledException = exports.PixelsPerInch = exports.PageViewport = exports.PDFDateString = exports.DOMStandardFontDataFactory = exports.DOMSVGFactory = exports.DOMCanvasFactory = exports.DOMCMapReaderFactory = exports.AnnotationPrefix = void 0; +exports.deprecated = deprecated; +exports.getColorValues = getColorValues; +exports.getCurrentTransform = getCurrentTransform; +exports.getCurrentTransformInverse = getCurrentTransformInverse; +exports.getFilenameFromUrl = getFilenameFromUrl; +exports.getPdfFilenameFromUrl = getPdfFilenameFromUrl; +exports.getRGB = getRGB; +exports.getXfaPageViewport = getXfaPageViewport; +exports.isDataScheme = isDataScheme; +exports.isPdfFile = isPdfFile; +exports.isValidFetchUrl = isValidFetchUrl; +exports.loadScript = loadScript; +exports.setLayerDimensions = setLayerDimensions; +var _base_factory = __w_pdfjs_require__(138); +var _util = __w_pdfjs_require__(1); +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +const SVG_NS = "http://www.w3.org/2000/svg"; +const AnnotationPrefix = "pdfjs_internal_id_"; +exports.AnnotationPrefix = AnnotationPrefix; +class PixelsPerInch {} +exports.PixelsPerInch = PixelsPerInch; +_defineProperty(PixelsPerInch, "CSS", 96.0); +_defineProperty(PixelsPerInch, "PDF", 72.0); +_defineProperty(PixelsPerInch, "PDF_TO_CSS_UNITS", PixelsPerInch.CSS / PixelsPerInch.PDF); +class DOMCanvasFactory extends _base_factory.BaseCanvasFactory { + constructor() { + let { + ownerDocument = globalThis.document + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + super(); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} +exports.DOMCanvasFactory = DOMCanvasFactory; +async function fetchData(url) { + let asTypedArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); + } + return asTypedArray ? new Uint8Array(await response.arrayBuffer()) : (0, _util.stringToBytes)(await response.text()); + } + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + if (asTypedArray) { + request.responseType = "arraybuffer"; + } + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + let data; + if (asTypedArray && request.response) { + data = new Uint8Array(request.response); + } else if (!asTypedArray && request.responseText) { + data = (0, _util.stringToBytes)(request.responseText); + } + if (data) { + resolve(data); + return; + } + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class DOMCMapReaderFactory extends _base_factory.BaseCMapReaderFactory { + _fetchData(url, compressionType) { + return fetchData(url, this.isCompressed).then(data => { + return { + cMapData: data, + compressionType + }; + }); + } +} +exports.DOMCMapReaderFactory = DOMCMapReaderFactory; +class DOMStandardFontDataFactory extends _base_factory.BaseStandardFontDataFactory { + _fetchData(url) { + return fetchData(url, true); + } +} +exports.DOMStandardFontDataFactory = DOMStandardFontDataFactory; +class DOMSVGFactory extends _base_factory.BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} +exports.DOMSVGFactory = DOMSVGFactory; +class PageViewport { + constructor(_ref) { + let { + viewBox, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = _ref; + this.viewBox = viewBox; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + const centerX = (viewBox[2] + viewBox[0]) / 2; + const centerY = (viewBox[3] + viewBox[1]) / 2; + let rotateA, rotateB, rotateC, rotateD; + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + case 0: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + default: + throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + let offsetCanvasX, offsetCanvasY; + let width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = (viewBox[3] - viewBox[1]) * scale; + height = (viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = (viewBox[2] - viewBox[0]) * scale; + height = (viewBox[3] - viewBox[1]) * scale; + } + this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; + this.width = width; + this.height = height; + } + get rawDims() { + const { + viewBox + } = this; + return (0, _util.shadow)(this, "rawDims", { + pageWidth: viewBox[2] - viewBox[0], + pageHeight: viewBox[3] - viewBox[1], + pageX: viewBox[0], + pageY: viewBox[1] + }); + } + clone() { + let { + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return new PageViewport({ + viewBox: this.viewBox.slice(), + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + return _util.Util.applyTransform([x, y], this.transform); + } + convertToViewportRectangle(rect) { + const topLeft = _util.Util.applyTransform([rect[0], rect[1]], this.transform); + const bottomRight = _util.Util.applyTransform([rect[2], rect[3]], this.transform); + return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; + } + convertToPdfPoint(x, y) { + return _util.Util.applyInverseTransform([x, y], this.transform); + } +} +exports.PageViewport = PageViewport; +class RenderingCancelledException extends _util.BaseException { + constructor(msg, type) { + let extraDelay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + super(msg, "RenderingCancelledException"); + this.type = type; + this.extraDelay = extraDelay; + } +} +exports.RenderingCancelledException = RenderingCancelledException; +function isDataScheme(url) { + const ii = url.length; + let i = 0; + while (i < ii && url[i].trim() === "") { + i++; + } + return url.substring(i, i + 5).toLowerCase() === "data:"; +} +function isPdfFile(filename) { + return typeof filename === "string" && /\.pdf$/i.test(filename); +} +function getFilenameFromUrl(url) { + let onlyStripPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (!onlyStripPath) { + [url] = url.split(/[#?]/, 1); + } + return url.substring(url.lastIndexOf("/") + 1); +} +function getPdfFilenameFromUrl(url) { + let defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "document.pdf"; + if (typeof url !== "string") { + return defaultFilename; + } + if (isDataScheme(url)) { + (0, _util.warn)('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + const splitURI = reURI.exec(url); + let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0]; + if (suggestedFilename.includes("%")) { + try { + suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; + } catch (ex) {} + } + } + return suggestedFilename || defaultFilename; +} +class StatTimer { + constructor() { + _defineProperty(this, "started", Object.create(null)); + _defineProperty(this, "times", []); + } + time(name) { + if (name in this.started) { + (0, _util.warn)(`Timer is already running for ${name}`); + } + this.started[name] = Date.now(); + } + timeEnd(name) { + if (!(name in this.started)) { + (0, _util.warn)(`Timer has not been started for ${name}`); + } + this.times.push({ + name, + start: this.started[name], + end: Date.now() + }); + delete this.started[name]; + } + toString() { + const outBuf = []; + let longest = 0; + for (const { + name + } of this.times) { + longest = Math.max(name.length, longest); + } + for (const { + name, + start, + end + } of this.times) { + outBuf.push(`${name.padEnd(longest)} ${end - start}ms\n`); + } + return outBuf.join(""); + } +} +exports.StatTimer = StatTimer; +function isValidFetchUrl(url, baseUrl) { + try { + const { + protocol + } = baseUrl ? new URL(url, baseUrl) : new URL(url); + return protocol === "http:" || protocol === "https:"; + } catch (ex) { + return false; + } +} +function loadScript(src) { + let removeScriptElement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + return new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.src = src; + script.onload = function (evt) { + if (removeScriptElement) { + script.remove(); + } + resolve(evt); + }; + script.onerror = function () { + reject(new Error(`Cannot load script at: ${script.src}`)); + }; + (document.head || document.documentElement).append(script); + }); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +let pdfDateStringRegex; +class PDFDateString { + static toDateObject(input) { + if (!input || typeof input !== "string") { + return null; + } + if (!pdfDateStringRegex) { + pdfDateStringRegex = new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + } + const matches = pdfDateStringRegex.exec(input); + if (!matches) { + return null; + } + const year = parseInt(matches[1], 10); + let month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + let day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + let hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + let minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + let second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + const universalTimeRelation = matches[7] || "Z"; + let offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + let offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + if (universalTimeRelation === "-") { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === "+") { + hour -= offsetHour; + minute -= offsetMinute; + } + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } +} +exports.PDFDateString = PDFDateString; +function getXfaPageViewport(xfaPage, _ref2) { + let { + scale = 1, + rotation = 0 + } = _ref2; + const { + width, + height + } = xfaPage.attributes.style; + const viewBox = [0, 0, parseInt(width), parseInt(height)]; + return new PageViewport({ + viewBox, + scale, + rotation + }); +} +function getRGB(color) { + if (color.startsWith("#")) { + const colorRGB = parseInt(color.slice(1), 16); + return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff]; + } + if (color.startsWith("rgb(")) { + return color.slice(4, -1).split(",").map(x => parseInt(x)); + } + if (color.startsWith("rgba(")) { + return color.slice(5, -1).split(",").map(x => parseInt(x)).slice(0, 3); + } + (0, _util.warn)(`Not a valid color format: "${color}"`); + return [0, 0, 0]; +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + document.body.append(span); + for (const name of colors.keys()) { + span.style.color = name; + const computedColor = window.getComputedStyle(span).color; + colors.set(name, getRGB(computedColor)); + } + span.remove(); +} +function getCurrentTransform(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform(); + return [a, b, c, d, e, f]; +} +function getCurrentTransformInverse(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform().invertSelf(); + return [a, b, c, d, e, f]; +} +function setLayerDimensions(div, viewport) { + let mustFlip = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let mustRotate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + if (viewport instanceof PageViewport) { + const { + pageWidth, + pageHeight + } = viewport.rawDims; + const { + style + } = div; + const widthStr = `calc(var(--scale-factor) * ${pageWidth}px)`; + const heightStr = `calc(var(--scale-factor) * ${pageHeight}px)`; + if (!mustFlip || viewport.rotation % 180 === 0) { + style.width = widthStr; + style.height = heightStr; + } else { + style.width = heightStr; + style.height = widthStr; + } + } + if (mustRotate) { + div.setAttribute("data-main-rotation", viewport.rotation); + } +} + +/***/ }), +/* 138 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.BaseStandardFontDataFactory = exports.BaseSVGFactory = exports.BaseCanvasFactory = exports.BaseCMapReaderFactory = void 0; +var _util = __w_pdfjs_require__(1); +class BaseCanvasFactory { + constructor() { + if (this.constructor === BaseCanvasFactory) { + (0, _util.unreachable)("Cannot initialize BaseCanvasFactory."); + } + } + create(width, height) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + const canvas = this._createCanvas(width, height); + return { + canvas, + context: canvas.getContext("2d") + }; + } + reset(canvasAndContext, width, height) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + canvasAndContext.canvas.width = width; + canvasAndContext.canvas.height = height; + } + destroy(canvasAndContext) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + canvasAndContext.canvas.width = 0; + canvasAndContext.canvas.height = 0; + canvasAndContext.canvas = null; + canvasAndContext.context = null; + } + _createCanvas(width, height) { + (0, _util.unreachable)("Abstract method `_createCanvas` called."); + } +} +exports.BaseCanvasFactory = BaseCanvasFactory; +class BaseCMapReaderFactory { + constructor(_ref) { + let { + baseUrl = null, + isCompressed = false + } = _ref; + if (this.constructor === BaseCMapReaderFactory) { + (0, _util.unreachable)("Cannot initialize BaseCMapReaderFactory."); + } + this.baseUrl = baseUrl; + this.isCompressed = isCompressed; + } + async fetch(_ref2) { + let { + name + } = _ref2; + if (!this.baseUrl) { + throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'); + } + if (!name) { + throw new Error("CMap name must be specified."); + } + const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : ""); + const compressionType = this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE; + return this._fetchData(url, compressionType).catch(reason => { + throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); + }); + } + _fetchData(url, compressionType) { + (0, _util.unreachable)("Abstract method `_fetchData` called."); + } +} +exports.BaseCMapReaderFactory = BaseCMapReaderFactory; +class BaseStandardFontDataFactory { + constructor(_ref3) { + let { + baseUrl = null + } = _ref3; + if (this.constructor === BaseStandardFontDataFactory) { + (0, _util.unreachable)("Cannot initialize BaseStandardFontDataFactory."); + } + this.baseUrl = baseUrl; + } + async fetch(_ref4) { + let { + filename + } = _ref4; + if (!this.baseUrl) { + throw new Error('The standard font "baseUrl" parameter must be specified, ensure that ' + 'the "standardFontDataUrl" API parameter is provided.'); + } + if (!filename) { + throw new Error("Font filename must be specified."); + } + const url = `${this.baseUrl}${filename}`; + return this._fetchData(url).catch(reason => { + throw new Error(`Unable to load font data at: ${url}`); + }); + } + _fetchData(url) { + (0, _util.unreachable)("Abstract method `_fetchData` called."); + } +} +exports.BaseStandardFontDataFactory = BaseStandardFontDataFactory; +class BaseSVGFactory { + constructor() { + if (this.constructor === BaseSVGFactory) { + (0, _util.unreachable)("Cannot initialize BaseSVGFactory."); + } + } + create(width, height) { + let skipDimensions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (width <= 0 || height <= 0) { + throw new Error("Invalid SVG dimensions"); + } + const svg = this._createSVG("svg:svg"); + svg.setAttribute("version", "1.1"); + if (!skipDimensions) { + svg.setAttribute("width", `${width}px`); + svg.setAttribute("height", `${height}px`); + } + svg.setAttribute("preserveAspectRatio", "none"); + svg.setAttribute("viewBox", `0 0 ${width} ${height}`); + return svg; + } + createElement(type) { + if (typeof type !== "string") { + throw new Error("Invalid SVG element type"); + } + return this._createSVG(type); + } + _createSVG(type) { + (0, _util.unreachable)("Abstract method `_createSVG` called."); + } +} +exports.BaseSVGFactory = BaseSVGFactory; + +/***/ }), +/* 139 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.MurmurHash3_64 = void 0; +var _util = __w_pdfjs_require__(1); +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if ((0, _util.isArrayBuffer)(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Wrong data format in MurmurHash3_64_update. " + "Input must be a string or array."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} +exports.MurmurHash3_64 = MurmurHash3_64; + +/***/ }), +/* 140 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.FontLoader = exports.FontFaceObject = void 0; +var _util = __w_pdfjs_require__(1); +var _is_node = __w_pdfjs_require__(3); +class FontLoader { + constructor(_ref) { + let { + onUnsupportedFeature, + ownerDocument = globalThis.document, + styleElement = null + } = _ref; + this._onUnsupportedFeature = onUnsupportedFeature; + this._document = ownerDocument; + this.nativeFontFaces = []; + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; + } + addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.push(nativeFontFace); + this._document.fonts.add(nativeFontFace); + } + insertRule(rule) { + if (!this.styleElement) { + this.styleElement = this._document.createElement("style"); + this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); + } + const styleSheet = this.styleElement.sheet; + styleSheet.insertRule(rule, styleSheet.cssRules.length); + } + clear() { + for (const nativeFontFace of this.nativeFontFaces) { + this._document.fonts.delete(nativeFontFace); + } + this.nativeFontFaces.length = 0; + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = null; + } + } + async bind(font) { + if (font.attached || font.missingFile) { + return; + } + font.attached = true; + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + this._onUnsupportedFeature({ + featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadNative + }); + (0, _util.warn)(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); + font.disableFontFace = true; + throw ex; + } + } + return; + } + const rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + if (this.isSyncFontLoadingSupported) { + return; + } + await new Promise(resolve => { + const request = this._queueLoadingCallback(resolve); + this._prepareFontLoadEvent(font, request); + }); + } + } + get isFontLoadingAPISupported() { + var _this$_document; + const hasFonts = !!((_this$_document = this._document) !== null && _this$_document !== void 0 && _this$_document.fonts); + return (0, _util.shadow)(this, "isFontLoadingAPISupported", hasFonts); + } + get isSyncFontLoadingSupported() { + let supported = false; + if (_is_node.isNodeJS) { + supported = true; + } else if (typeof navigator !== "undefined" && /Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent)) { + supported = true; + } + return (0, _util.shadow)(this, "isSyncFontLoadingSupported", supported); + } + _queueLoadingCallback(callback) { + function completeRequest() { + (0, _util.assert)(!request.done, "completeRequest() cannot be called twice."); + request.done = true; + while (loadingRequests.length > 0 && loadingRequests[0].done) { + const otherRequest = loadingRequests.shift(); + setTimeout(otherRequest.callback, 0); + } + } + const { + loadingRequests + } = this; + const request = { + done: false, + complete: completeRequest, + callback + }; + loadingRequests.push(request); + return request; + } + get _loadTestFont() { + const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); + return (0, _util.shadow)(this, "_loadTestFont", testFont); + } + _prepareFontLoadEvent(font, request) { + function int32(data, offset) { + return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + } + function spliceString(s, offset, remove, insert) { + const chunk1 = s.substring(0, offset); + const chunk2 = s.substring(offset + remove); + return chunk1 + insert + chunk2; + } + let i, ii; + const canvas = this._document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + let called = 0; + function isFontReady(name, callback) { + if (++called > 30) { + (0, _util.warn)("Load test font never loaded."); + callback(); + return; + } + ctx.font = "30px " + name; + ctx.fillText(".", 0, 20); + const imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; + } + setTimeout(isFontReady.bind(null, name, callback)); + } + const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; + let data = this._loadTestFont; + const COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + const CFF_CHECKSUM_OFFSET = 16; + const XXXX_VALUE = 0x58585858; + let checksum = int32(data, CFF_CHECKSUM_OFFSET); + for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + } + if (i < loadTestFontId.length) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum)); + const url = `url(data:font/opentype;base64,${btoa(data)});`; + const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; + this.insertRule(rule); + const div = this._document.createElement("div"); + div.style.visibility = "hidden"; + div.style.width = div.style.height = "10px"; + div.style.position = "absolute"; + div.style.top = div.style.left = "0px"; + for (const name of [font.loadedName, loadTestFontId]) { + const span = this._document.createElement("span"); + span.textContent = "Hi"; + span.style.fontFamily = name; + div.append(span); + } + this._document.body.append(div); + isFontReady(loadTestFontId, () => { + div.remove(); + request.complete(); + }); + } +} +exports.FontLoader = FontLoader; +class FontFaceObject { + constructor(translatedData, _ref2) { + let { + isEvalSupported = true, + disableFontFace = false, + ignoreErrors = false, + onUnsupportedFeature, + fontRegistry = null + } = _ref2; + this.compiledGlyphs = Object.create(null); + for (const i in translatedData) { + this[i] = translatedData[i]; + } + this.isEvalSupported = isEvalSupported !== false; + this.disableFontFace = disableFontFace === true; + this.ignoreErrors = ignoreErrors === true; + this._onUnsupportedFeature = onUnsupportedFeature; + this.fontRegistry = fontRegistry; + } + createNativeFontFace() { + var _this$fontRegistry; + if (!this.data || this.disableFontFace) { + return null; + } + let nativeFontFace; + if (!this.cssFontInfo) { + nativeFontFace = new FontFace(this.loadedName, this.data, {}); + } else { + const css = { + weight: this.cssFontInfo.fontWeight + }; + if (this.cssFontInfo.italicAngle) { + css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + } + nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); + } + (_this$fontRegistry = this.fontRegistry) === null || _this$fontRegistry === void 0 ? void 0 : _this$fontRegistry.registerFont(this); + return nativeFontFace; + } + createFontFaceRule() { + var _this$fontRegistry2; + if (!this.data || this.disableFontFace) { + return null; + } + const data = (0, _util.bytesToString)(this.data); + const url = `url(data:${this.mimetype};base64,${btoa(data)});`; + let rule; + if (!this.cssFontInfo) { + rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; + } else { + let css = `font-weight: ${this.cssFontInfo.fontWeight};`; + if (this.cssFontInfo.italicAngle) { + css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; + } + rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; + } + (_this$fontRegistry2 = this.fontRegistry) === null || _this$fontRegistry2 === void 0 ? void 0 : _this$fontRegistry2.registerFont(this, url); + return rule; + } + getPathGenerator(objs, character) { + if (this.compiledGlyphs[character] !== undefined) { + return this.compiledGlyphs[character]; + } + let cmds; + try { + cmds = objs.get(this.loadedName + "_path_" + character); + } catch (ex) { + if (!this.ignoreErrors) { + throw ex; + } + this._onUnsupportedFeature({ + featureId: _util.UNSUPPORTED_FEATURES.errorFontGetPath + }); + (0, _util.warn)(`getPathGenerator - ignoring character: "${ex}".`); + return this.compiledGlyphs[character] = function (c, size) {}; + } + if (this.isEvalSupported && _util.FeatureTest.isEvalSupported) { + const jsBuf = []; + for (const current of cmds) { + const args = current.args !== undefined ? current.args.join(",") : ""; + jsBuf.push("c.", current.cmd, "(", args, ");\n"); + } + return this.compiledGlyphs[character] = new Function("c", "size", jsBuf.join("")); + } + return this.compiledGlyphs[character] = function (c, size) { + for (const current of cmds) { + if (current.cmd === "scale") { + current.args = [size, -size]; + } + c[current.cmd].apply(c, current.args); + } + }; + } +} +exports.FontFaceObject = FontFaceObject; + +/***/ }), +/* 141 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.CanvasGraphics = void 0; +var _util = __w_pdfjs_require__(1); +var _display_utils = __w_pdfjs_require__(137); +var _pattern_helper = __w_pdfjs_require__(142); +var _image_utils = __w_pdfjs_require__(143); +var _is_node = __w_pdfjs_require__(3); +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const MAX_GROUP_SIZE = 4096; +const EXECUTION_TIME = 15; +const EXECUTION_STEPS = 10; +const MAX_SIZE_TO_COMPILE = _is_node.isNodeJS && typeof Path2D === "undefined" ? -1 : 1000; +const FULL_CHUNK_HEIGHT = 16; +function mirrorContextOperations(ctx, destCtx) { + if (ctx._removeMirroring) { + throw new Error("Context is already forwarding operations."); + } + ctx.__originalSave = ctx.save; + ctx.__originalRestore = ctx.restore; + ctx.__originalRotate = ctx.rotate; + ctx.__originalScale = ctx.scale; + ctx.__originalTranslate = ctx.translate; + ctx.__originalTransform = ctx.transform; + ctx.__originalSetTransform = ctx.setTransform; + ctx.__originalResetTransform = ctx.resetTransform; + ctx.__originalClip = ctx.clip; + ctx.__originalMoveTo = ctx.moveTo; + ctx.__originalLineTo = ctx.lineTo; + ctx.__originalBezierCurveTo = ctx.bezierCurveTo; + ctx.__originalRect = ctx.rect; + ctx.__originalClosePath = ctx.closePath; + ctx.__originalBeginPath = ctx.beginPath; + ctx._removeMirroring = () => { + ctx.save = ctx.__originalSave; + ctx.restore = ctx.__originalRestore; + ctx.rotate = ctx.__originalRotate; + ctx.scale = ctx.__originalScale; + ctx.translate = ctx.__originalTranslate; + ctx.transform = ctx.__originalTransform; + ctx.setTransform = ctx.__originalSetTransform; + ctx.resetTransform = ctx.__originalResetTransform; + ctx.clip = ctx.__originalClip; + ctx.moveTo = ctx.__originalMoveTo; + ctx.lineTo = ctx.__originalLineTo; + ctx.bezierCurveTo = ctx.__originalBezierCurveTo; + ctx.rect = ctx.__originalRect; + ctx.closePath = ctx.__originalClosePath; + ctx.beginPath = ctx.__originalBeginPath; + delete ctx._removeMirroring; + }; + ctx.save = function ctxSave() { + destCtx.save(); + this.__originalSave(); + }; + ctx.restore = function ctxRestore() { + destCtx.restore(); + this.__originalRestore(); + }; + ctx.translate = function ctxTranslate(x, y) { + destCtx.translate(x, y); + this.__originalTranslate(x, y); + }; + ctx.scale = function ctxScale(x, y) { + destCtx.scale(x, y); + this.__originalScale(x, y); + }; + ctx.transform = function ctxTransform(a, b, c, d, e, f) { + destCtx.transform(a, b, c, d, e, f); + this.__originalTransform(a, b, c, d, e, f); + }; + ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { + destCtx.setTransform(a, b, c, d, e, f); + this.__originalSetTransform(a, b, c, d, e, f); + }; + ctx.resetTransform = function ctxResetTransform() { + destCtx.resetTransform(); + this.__originalResetTransform(); + }; + ctx.rotate = function ctxRotate(angle) { + destCtx.rotate(angle); + this.__originalRotate(angle); + }; + ctx.clip = function ctxRotate(rule) { + destCtx.clip(rule); + this.__originalClip(rule); + }; + ctx.moveTo = function (x, y) { + destCtx.moveTo(x, y); + this.__originalMoveTo(x, y); + }; + ctx.lineTo = function (x, y) { + destCtx.lineTo(x, y); + this.__originalLineTo(x, y); + }; + ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + }; + ctx.rect = function (x, y, width, height) { + destCtx.rect(x, y, width, height); + this.__originalRect(x, y, width, height); + }; + ctx.closePath = function () { + destCtx.closePath(); + this.__originalClosePath(); + }; + ctx.beginPath = function () { + destCtx.beginPath(); + this.__originalBeginPath(); + }; +} +class CachedCanvases { + constructor(canvasFactory) { + this.canvasFactory = canvasFactory; + this.cache = Object.create(null); + } + getCanvas(id, width, height) { + let canvasEntry; + if (this.cache[id] !== undefined) { + canvasEntry = this.cache[id]; + this.canvasFactory.reset(canvasEntry, width, height); + } else { + canvasEntry = this.canvasFactory.create(width, height); + this.cache[id] = canvasEntry; + } + return canvasEntry; + } + delete(id) { + delete this.cache[id]; + } + clear() { + for (const id in this.cache) { + const canvasEntry = this.cache[id]; + this.canvasFactory.destroy(canvasEntry); + delete this.cache[id]; + } + } +} +function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { + const [a, b, c, d, tx, ty] = (0, _display_utils.getCurrentTransform)(ctx); + if (b === 0 && c === 0) { + const tlX = destX * a + tx; + const rTlX = Math.round(tlX); + const tlY = destY * d + ty; + const rTlY = Math.round(tlY); + const brX = (destX + destW) * a + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destY + destH) * d + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight); + ctx.setTransform(a, b, c, d, tx, ty); + return [rWidth, rHeight]; + } + if (a === 0 && d === 0) { + const tlX = destY * c + tx; + const rTlX = Math.round(tlX); + const tlY = destX * b + ty; + const rTlY = Math.round(tlY); + const brX = (destY + destH) * c + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destX + destW) * b + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth); + ctx.setTransform(a, b, c, d, tx, ty); + return [rHeight, rWidth]; + } + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH); + const scaleX = Math.hypot(a, b); + const scaleY = Math.hypot(c, d); + return [scaleX * destW, scaleY * destH]; +} +function compileType3Glyph(imgData) { + const { + width, + height + } = imgData; + if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { + return null; + } + const POINT_TO_PROCESS_LIMIT = 1000; + const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); + const width1 = width + 1; + let points = new Uint8Array(width1 * (height + 1)); + let i, j, j0; + const lineSize = width + 7 & ~7; + let data = new Uint8Array(lineSize * height), + pos = 0; + for (const elem of imgData.data) { + let mask = 128; + while (mask > 0) { + data[pos++] = elem & mask ? 0 : 255; + mask >>= 1; + } + } + let count = 0; + pos = 0; + if (data[pos] !== 0) { + points[0] = 1; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j] = data[pos] ? 2 : 1; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j] = 2; + ++count; + } + for (i = 1; i < height; i++) { + pos = i * lineSize; + j0 = i * width1; + if (data[pos - lineSize] !== data[pos]) { + points[j0] = data[pos] ? 1 : 8; + ++count; + } + let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + for (j = 1; j < width; j++) { + sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); + if (POINT_TYPES[sum]) { + points[j0 + j] = POINT_TYPES[sum]; + ++count; + } + pos++; + } + if (data[pos - lineSize] !== data[pos]) { + points[j0 + j] = data[pos] ? 2 : 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + } + pos = lineSize * (height - 1); + j0 = i * width1; + if (data[pos] !== 0) { + points[j0] = 8; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j0 + j] = data[pos] ? 4 : 8; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j0 + j] = 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); + const path = new Path2D(); + for (i = 0; count && i <= height; i++) { + let p = i * width1; + const end = p + width; + while (p < end && !points[p]) { + p++; + } + if (p === end) { + continue; + } + path.moveTo(p % width1, i); + const p0 = p; + let type = points[p]; + do { + const step = steps[type]; + do { + p += step; + } while (!points[p]); + const pp = points[p]; + if (pp !== 5 && pp !== 10) { + type = pp; + points[p] = 0; + } else { + type = pp & 0x33 * type >> 4; + points[p] &= type >> 2 | type << 2; + } + path.lineTo(p % width1, p / width1 | 0); + if (!points[p]) { + --count; + } + } while (p0 !== p); + --i; + } + data = null; + points = null; + const drawOutline = function (c) { + c.save(); + c.scale(1 / width, -1 / height); + c.translate(0, -height); + c.fill(path); + c.beginPath(); + c.restore(); + }; + return drawOutline; +} +class CanvasExtraState { + constructor(width, height) { + this.alphaIsShape = false; + this.fontSize = 0; + this.fontSizeScale = 1; + this.textMatrix = _util.IDENTITY_MATRIX; + this.textMatrixScale = 1; + this.fontMatrix = _util.FONT_IDENTITY_MATRIX; + this.leading = 0; + this.x = 0; + this.y = 0; + this.lineX = 0; + this.lineY = 0; + this.charSpacing = 0; + this.wordSpacing = 0; + this.textHScale = 1; + this.textRenderingMode = _util.TextRenderingMode.FILL; + this.textRise = 0; + this.fillColor = "#000000"; + this.strokeColor = "#000000"; + this.patternFill = false; + this.fillAlpha = 1; + this.strokeAlpha = 1; + this.lineWidth = 1; + this.activeSMask = null; + this.transferMaps = null; + this.startNewPathAndClipBox([0, 0, width, height]); + } + clone() { + const clone = Object.create(this); + clone.clipBox = this.clipBox.slice(); + return clone; + } + setCurrentPoint(x, y) { + this.x = x; + this.y = y; + } + updatePathMinMax(transform, x, y) { + [x, y] = _util.Util.applyTransform([x, y], transform); + this.minX = Math.min(this.minX, x); + this.minY = Math.min(this.minY, y); + this.maxX = Math.max(this.maxX, x); + this.maxY = Math.max(this.maxY, y); + } + updateRectMinMax(transform, rect) { + const p1 = _util.Util.applyTransform(rect, transform); + const p2 = _util.Util.applyTransform(rect.slice(2), transform); + this.minX = Math.min(this.minX, p1[0], p2[0]); + this.minY = Math.min(this.minY, p1[1], p2[1]); + this.maxX = Math.max(this.maxX, p1[0], p2[0]); + this.maxY = Math.max(this.maxY, p1[1], p2[1]); + } + updateScalingPathMinMax(transform, minMax) { + _util.Util.scaleMinMax(transform, minMax); + this.minX = Math.min(this.minX, minMax[0]); + this.maxX = Math.max(this.maxX, minMax[1]); + this.minY = Math.min(this.minY, minMax[2]); + this.maxY = Math.max(this.maxY, minMax[3]); + } + updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + const box = _util.Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3); + if (minMax) { + minMax[0] = Math.min(minMax[0], box[0], box[2]); + minMax[1] = Math.max(minMax[1], box[0], box[2]); + minMax[2] = Math.min(minMax[2], box[1], box[3]); + minMax[3] = Math.max(minMax[3], box[1], box[3]); + return; + } + this.updateRectMinMax(transform, box); + } + getPathBoundingBox() { + let pathType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _pattern_helper.PathType.FILL; + let transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + const box = [this.minX, this.minY, this.maxX, this.maxY]; + if (pathType === _pattern_helper.PathType.STROKE) { + if (!transform) { + (0, _util.unreachable)("Stroke bounding box must include transform."); + } + const scale = _util.Util.singularValueDecompose2dScale(transform); + const xStrokePad = scale[0] * this.lineWidth / 2; + const yStrokePad = scale[1] * this.lineWidth / 2; + box[0] -= xStrokePad; + box[1] -= yStrokePad; + box[2] += xStrokePad; + box[3] += yStrokePad; + } + return box; + } + updateClipFromPath() { + const intersect = _util.Util.intersect(this.clipBox, this.getPathBoundingBox()); + this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); + } + isEmptyClip() { + return this.minX === Infinity; + } + startNewPathAndClipBox(box) { + this.clipBox = box; + this.minX = Infinity; + this.minY = Infinity; + this.maxX = 0; + this.maxY = 0; + } + getClippedPathBoundingBox() { + let pathType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _pattern_helper.PathType.FILL; + let transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + return _util.Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + } +} +function putBinaryImageData(ctx, imgData) { + let transferMaps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + if (typeof ImageData !== "undefined" && imgData instanceof ImageData) { + ctx.putImageData(imgData, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0, + destPos; + const src = imgData.data; + const dest = chunkImgData.data; + let i, j, thisChunkHeight, elemsInThisChunk; + let transferMapRed, transferMapGreen, transferMapBlue, transferMapGray; + if (transferMaps) { + switch (transferMaps.length) { + case 1: + transferMapRed = transferMaps[0]; + transferMapGreen = transferMaps[0]; + transferMapBlue = transferMaps[0]; + transferMapGray = transferMaps[0]; + break; + case 4: + transferMapRed = transferMaps[0]; + transferMapGreen = transferMaps[1]; + transferMapBlue = transferMaps[2]; + transferMapGray = transferMaps[3]; + break; + } + } + if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) { + const srcLength = src.byteLength; + const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); + const dest32DataLength = dest32.length; + const fullSrcDiff = width + 7 >> 3; + let white = 0xffffffff; + let black = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + if (transferMapGray) { + if (transferMapGray[0] === 0xff && transferMapGray[0xff] === 0) { + [white, black] = [black, white]; + } + } + for (i = 0; i < totalChunks; i++) { + thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + destPos = 0; + for (j = 0; j < thisChunkHeight; j++) { + const srcDiff = srcLength - srcPos; + let k = 0; + const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; + const kEndUnrolled = kEnd & ~7; + let mask = 0; + let srcByte = 0; + for (; k < kEndUnrolled; k += 8) { + srcByte = src[srcPos++]; + dest32[destPos++] = srcByte & 128 ? white : black; + dest32[destPos++] = srcByte & 64 ? white : black; + dest32[destPos++] = srcByte & 32 ? white : black; + dest32[destPos++] = srcByte & 16 ? white : black; + dest32[destPos++] = srcByte & 8 ? white : black; + dest32[destPos++] = srcByte & 4 ? white : black; + dest32[destPos++] = srcByte & 2 ? white : black; + dest32[destPos++] = srcByte & 1 ? white : black; + } + for (; k < kEnd; k++) { + if (mask === 0) { + srcByte = src[srcPos++]; + mask = 128; + } + dest32[destPos++] = srcByte & mask ? white : black; + mask >>= 1; + } + } + while (destPos < dest32DataLength) { + dest32[destPos++] = 0; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) { + const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue); + j = 0; + elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + for (i = 0; i < fullChunks; i++) { + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + srcPos += elemsInThisChunk; + if (hasTransferMaps) { + for (let k = 0; k < elemsInThisChunk; k += 4) { + if (transferMapRed) { + dest[k + 0] = transferMapRed[dest[k + 0]]; + } + if (transferMapGreen) { + dest[k + 1] = transferMapGreen[dest[k + 1]]; + } + if (transferMapBlue) { + dest[k + 2] = transferMapBlue[dest[k + 2]]; + } + } + } + ctx.putImageData(chunkImgData, 0, j); + j += FULL_CHUNK_HEIGHT; + } + if (i < totalChunks) { + elemsInThisChunk = width * partialChunkHeight * 4; + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + if (hasTransferMaps) { + for (let k = 0; k < elemsInThisChunk; k += 4) { + if (transferMapRed) { + dest[k + 0] = transferMapRed[dest[k + 0]]; + } + if (transferMapGreen) { + dest[k + 1] = transferMapGreen[dest[k + 1]]; + } + if (transferMapBlue) { + dest[k + 2] = transferMapBlue[dest[k + 2]]; + } + } + } + ctx.putImageData(chunkImgData, 0, j); + } + } else if (imgData.kind === _util.ImageKind.RGB_24BPP) { + const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue); + thisChunkHeight = FULL_CHUNK_HEIGHT; + elemsInThisChunk = width * thisChunkHeight; + for (i = 0; i < totalChunks; i++) { + if (i >= fullChunks) { + thisChunkHeight = partialChunkHeight; + elemsInThisChunk = width * thisChunkHeight; + } + destPos = 0; + for (j = elemsInThisChunk; j--;) { + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = 255; + } + if (hasTransferMaps) { + for (let k = 0; k < destPos; k += 4) { + if (transferMapRed) { + dest[k + 0] = transferMapRed[dest[k + 0]]; + } + if (transferMapGreen) { + dest[k + 1] = transferMapGreen[dest[k + 1]]; + } + if (transferMapBlue) { + dest[k + 2] = transferMapBlue[dest[k + 2]]; + } + } + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else { + throw new Error(`bad image kind: ${imgData.kind}`); + } +} +function putBinaryImageMask(ctx, imgData) { + if (imgData.bitmap) { + ctx.drawImage(imgData.bitmap, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + for (let i = 0; i < totalChunks; i++) { + const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + ({ + srcPos + } = (0, _image_utils.applyMaskImageData)({ + src, + srcPos, + dest, + width, + height: thisChunkHeight + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } +} +function copyCtxState(sourceCtx, destCtx) { + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font"]; + for (const property of properties) { + if (sourceCtx[property] !== undefined) { + destCtx[property] = sourceCtx[property]; + } + } + if (sourceCtx.setLineDash !== undefined) { + destCtx.setLineDash(sourceCtx.getLineDash()); + destCtx.lineDashOffset = sourceCtx.lineDashOffset; + } +} +function resetCtxToDefault(ctx, foregroundColor) { + ctx.strokeStyle = ctx.fillStyle = foregroundColor || "#000000"; + ctx.fillRule = "nonzero"; + ctx.globalAlpha = 1; + ctx.lineWidth = 1; + ctx.lineCap = "butt"; + ctx.lineJoin = "miter"; + ctx.miterLimit = 10; + ctx.globalCompositeOperation = "source-over"; + ctx.font = "10px sans-serif"; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([]); + ctx.lineDashOffset = 0; + } +} +function composeSMaskBackdrop(bytes, r0, g0, b0) { + const length = bytes.length; + for (let i = 3; i < length; i += 4) { + const alpha = bytes[i]; + if (alpha === 0) { + bytes[i - 3] = r0; + bytes[i - 2] = g0; + bytes[i - 1] = b0; + } else if (alpha < 255) { + const alpha_ = 255 - alpha; + bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8; + bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8; + bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8; + } + } +} +function composeSMaskAlpha(maskData, layerData, transferMap) { + const length = maskData.length; + const scale = 1 / 255; + for (let i = 3; i < length; i += 4) { + const alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; + layerData[i] = layerData[i] * alpha * scale | 0; + } +} +function composeSMaskLuminosity(maskData, layerData, transferMap) { + const length = maskData.length; + for (let i = 3; i < length; i += 4) { + const y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28; + layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16; + } +} +function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { + const hasBackdrop = !!backdrop; + const r0 = hasBackdrop ? backdrop[0] : 0; + const g0 = hasBackdrop ? backdrop[1] : 0; + const b0 = hasBackdrop ? backdrop[2] : 0; + let composeFn; + if (subtype === "Luminosity") { + composeFn = composeSMaskLuminosity; + } else { + composeFn = composeSMaskAlpha; + } + const PIXELS_TO_PROCESS = 1048576; + const chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); + for (let row = 0; row < height; row += chunkSize) { + const chunkHeight = Math.min(chunkSize, height - row); + const maskData = maskCtx.getImageData(layerOffsetX - maskOffsetX, row + (layerOffsetY - maskOffsetY), width, chunkHeight); + const layerData = layerCtx.getImageData(layerOffsetX, row + layerOffsetY, width, chunkHeight); + if (hasBackdrop) { + composeSMaskBackdrop(maskData.data, r0, g0, b0); + } + composeFn(maskData.data, layerData.data, transferMap); + layerCtx.putImageData(layerData, layerOffsetX, row + layerOffsetY); + } +} +function composeSMask(ctx, smask, layerCtx, layerBox) { + const layerOffsetX = layerBox[0]; + const layerOffsetY = layerBox[1]; + const layerWidth = layerBox[2] - layerOffsetX; + const layerHeight = layerBox[3] - layerOffsetY; + if (layerWidth === 0 || layerHeight === 0) { + return; + } + genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY); + ctx.save(); + ctx.globalAlpha = 1; + ctx.globalCompositeOperation = "source-over"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(layerCtx.canvas, 0, 0); + ctx.restore(); +} +function getImageSmoothingEnabled(transform, interpolate) { + const scale = _util.Util.singularValueDecompose2dScale(transform); + scale[0] = Math.fround(scale[0]); + scale[1] = Math.fround(scale[1]); + const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * _display_utils.PixelsPerInch.PDF_TO_CSS_UNITS); + if (interpolate !== undefined) { + return interpolate; + } else if (scale[0] <= actualScale || scale[1] <= actualScale) { + return true; + } + return false; +} +const LINE_CAP_STYLES = ["butt", "round", "square"]; +const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; +const NORMAL_CLIP = {}; +const EO_CLIP = {}; +var _restoreInitialState = /*#__PURE__*/new WeakSet(); +class CanvasGraphics { + constructor(canvasCtx, commonObjs, objs, canvasFactory, _ref, annotationCanvasMap, pageColors) { + let { + optionalContentConfig, + markedContentStack = null + } = _ref; + _classPrivateMethodInitSpec(this, _restoreInitialState); + this.ctx = canvasCtx; + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.stateStack = []; + this.pendingClip = null; + this.pendingEOFill = false; + this.res = null; + this.xobjs = null; + this.commonObjs = commonObjs; + this.objs = objs; + this.canvasFactory = canvasFactory; + this.groupStack = []; + this.processingType3 = null; + this.baseTransform = null; + this.baseTransformStack = []; + this.groupLevel = 0; + this.smaskStack = []; + this.smaskCounter = 0; + this.tempSMask = null; + this.suspendedCtx = null; + this.contentVisible = true; + this.markedContentStack = markedContentStack || []; + this.optionalContentConfig = optionalContentConfig; + this.cachedCanvases = new CachedCanvases(this.canvasFactory); + this.cachedPatterns = new Map(); + this.annotationCanvasMap = annotationCanvasMap; + this.viewportScale = 1; + this.outputScaleX = 1; + this.outputScaleY = 1; + this.backgroundColor = (pageColors === null || pageColors === void 0 ? void 0 : pageColors.background) || null; + this.foregroundColor = (pageColors === null || pageColors === void 0 ? void 0 : pageColors.foreground) || null; + this._cachedScaleForStroking = null; + this._cachedGetSinglePixelWidth = null; + this._cachedBitmapsMap = new Map(); + } + getObject(data) { + let fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + if (typeof data === "string") { + return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); + } + return fallback; + } + beginDrawing(_ref2) { + let { + transform, + viewport, + transparency = false, + background = null + } = _ref2; + const width = this.ctx.canvas.width; + const height = this.ctx.canvas.height; + const defaultBackgroundColor = background || "#ffffff"; + this.ctx.save(); + if (this.foregroundColor && this.backgroundColor) { + this.ctx.fillStyle = this.foregroundColor; + const fg = this.foregroundColor = this.ctx.fillStyle; + this.ctx.fillStyle = this.backgroundColor; + const bg = this.backgroundColor = this.ctx.fillStyle; + let isValidDefaultBg = true; + let defaultBg = defaultBackgroundColor; + this.ctx.fillStyle = defaultBackgroundColor; + defaultBg = this.ctx.fillStyle; + isValidDefaultBg = typeof defaultBg === "string" && /^#[0-9A-Fa-f]{6}$/.test(defaultBg); + if (fg === "#000000" && bg === "#ffffff" || fg === bg || !isValidDefaultBg) { + this.foregroundColor = this.backgroundColor = null; + } else { + const [rB, gB, bB] = (0, _display_utils.getRGB)(defaultBg); + const newComp = x => { + x /= 255; + return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; + }; + const lumB = Math.round(0.2126 * newComp(rB) + 0.7152 * newComp(gB) + 0.0722 * newComp(bB)); + this.selectColor = (r, g, b) => { + const lumC = 0.2126 * newComp(r) + 0.7152 * newComp(g) + 0.0722 * newComp(b); + return Math.round(lumC) === lumB ? bg : fg; + }; + } + } + this.ctx.fillStyle = this.backgroundColor || defaultBackgroundColor; + this.ctx.fillRect(0, 0, width, height); + this.ctx.restore(); + if (transparency) { + const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); + this.compositeCtx = this.ctx; + this.transparentCanvas = transparentCanvas.canvas; + this.ctx = transparentCanvas.context; + this.ctx.save(); + this.ctx.transform(...(0, _display_utils.getCurrentTransform)(this.compositeCtx)); + } + this.ctx.save(); + resetCtxToDefault(this.ctx, this.foregroundColor); + if (transform) { + this.ctx.transform(...transform); + this.outputScaleX = transform[0]; + this.outputScaleY = transform[0]; + } + this.ctx.transform(...viewport.transform); + this.viewportScale = viewport.scale; + this.baseTransform = (0, _display_utils.getCurrentTransform)(this.ctx); + } + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + let i = executionStartIdx || 0; + const argsArrayLen = argsArray.length; + if (argsArrayLen === i) { + return i; + } + const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; + const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + let steps = 0; + const commonObjs = this.commonObjs; + const objs = this.objs; + let fnId; + while (true) { + if (stepper !== undefined && i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + fnId = fnArray[i]; + if (fnId !== _util.OPS.dependency) { + this[fnId].apply(this, argsArray[i]); + } else { + for (const depObjId of argsArray[i]) { + const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } + i++; + if (i === argsArrayLen) { + return i; + } + if (chunkOperations && ++steps > EXECUTION_STEPS) { + if (Date.now() > endTime) { + continueCallback(); + return i; + } + steps = 0; + } + } + } + endDrawing() { + _classPrivateMethodGet(this, _restoreInitialState, _restoreInitialState2).call(this); + this.cachedCanvases.clear(); + this.cachedPatterns.clear(); + for (const cache of this._cachedBitmapsMap.values()) { + for (const canvas of cache.values()) { + if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) { + canvas.width = canvas.height = 0; + } + } + cache.clear(); + } + this._cachedBitmapsMap.clear(); + } + _scaleImage(img, inverseTransform) { + const width = img.width; + const height = img.height; + let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); + let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + let paintWidth = width, + paintHeight = height; + let tmpCanvasId = "prescale1"; + let tmpCanvas, tmpCtx; + while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { + let newWidth = paintWidth, + newHeight = paintHeight; + if (widthScale > 2 && paintWidth > 1) { + newWidth = Math.ceil(paintWidth / 2); + widthScale /= paintWidth / newWidth; + } + if (heightScale > 2 && paintHeight > 1) { + newHeight = Math.ceil(paintHeight / 2); + heightScale /= paintHeight / newHeight; + } + tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); + tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, newWidth, newHeight); + tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + img = tmpCanvas.canvas; + paintWidth = newWidth; + paintHeight = newHeight; + tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1"; + } + return { + img, + paintWidth, + paintHeight + }; + } + _createMaskCanvas(img) { + const ctx = this.ctx; + const { + width, + height + } = img; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const currentTransform = (0, _display_utils.getCurrentTransform)(ctx); + let cache, cacheKey, scaled, maskCanvas; + if ((img.bitmap || img.data) && img.count > 1) { + const mainKey = img.bitmap || img.data.buffer; + cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); + cache = this._cachedBitmapsMap.get(mainKey); + if (!cache) { + cache = new Map(); + this._cachedBitmapsMap.set(mainKey, cache); + } + const cachedImage = cache.get(cacheKey); + if (cachedImage && !isPatternFill) { + const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); + const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); + return { + canvas: cachedImage, + offsetX, + offsetY + }; + } + scaled = cachedImage; + } + if (!scaled) { + maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + putBinaryImageMask(maskCanvas.context, img); + } + let maskToCanvas = _util.Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = _util.Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const cord1 = _util.Util.applyTransform([0, 0], maskToCanvas); + const cord2 = _util.Util.applyTransform([width, height], maskToCanvas); + const rect = _util.Util.normalizeRect([cord1[0], cord1[1], cord2[0], cord2[1]]); + const drawnWidth = Math.round(rect[2] - rect[0]) || 1; + const drawnHeight = Math.round(rect[3] - rect[1]) || 1; + const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); + const fillCtx = fillCanvas.context; + const offsetX = Math.min(cord1[0], cord2[0]); + const offsetY = Math.min(cord1[1], cord2[1]); + fillCtx.translate(-offsetX, -offsetY); + fillCtx.transform(...maskToCanvas); + if (!scaled) { + scaled = this._scaleImage(maskCanvas.canvas, (0, _display_utils.getCurrentTransformInverse)(fillCtx)); + scaled = scaled.img; + if (cache && isPatternFill) { + cache.set(cacheKey, scaled); + } + } + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled((0, _display_utils.getCurrentTransform)(fillCtx), img.interpolate); + drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + fillCtx.globalCompositeOperation = "source-in"; + const inverse = _util.Util.transform((0, _display_utils.getCurrentTransformInverse)(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, _pattern_helper.PathType.FILL) : fillColor; + fillCtx.fillRect(0, 0, width, height); + if (cache && !isPatternFill) { + this.cachedCanvases.delete("fillCanvas"); + cache.set(cacheKey, fillCanvas.canvas); + } + return { + canvas: fillCanvas.canvas, + offsetX: Math.round(offsetX), + offsetY: Math.round(offsetY) + }; + } + setLineWidth(width) { + if (width !== this.current.lineWidth) { + this._cachedScaleForStroking = null; + } + this.current.lineWidth = width; + this.ctx.lineWidth = width; + } + setLineCap(style) { + this.ctx.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(style) { + this.ctx.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(limit) { + this.ctx.miterLimit = limit; + } + setDash(dashArray, dashPhase) { + const ctx = this.ctx; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + } + setRenderingIntent(intent) {} + setFlatness(flatness) {} + setGState(states) { + for (const [key, value] of states) { + switch (key) { + case "LW": + this.setLineWidth(value); + break; + case "LC": + this.setLineCap(value); + break; + case "LJ": + this.setLineJoin(value); + break; + case "ML": + this.setMiterLimit(value); + break; + case "D": + this.setDash(value[0], value[1]); + break; + case "RI": + this.setRenderingIntent(value); + break; + case "FL": + this.setFlatness(value); + break; + case "Font": + this.setFont(value[0], value[1]); + break; + case "CA": + this.current.strokeAlpha = value; + break; + case "ca": + this.current.fillAlpha = value; + this.ctx.globalAlpha = value; + break; + case "BM": + this.ctx.globalCompositeOperation = value; + break; + case "SMask": + this.current.activeSMask = value ? this.tempSMask : null; + this.tempSMask = null; + this.checkSMaskState(); + break; + case "TR": + this.current.transferMaps = value; + } + } + } + get inSMaskMode() { + return !!this.suspendedCtx; + } + checkSMaskState() { + const inSMaskMode = this.inSMaskMode; + if (this.current.activeSMask && !inSMaskMode) { + this.beginSMaskMode(); + } else if (!this.current.activeSMask && inSMaskMode) { + this.endSMaskMode(); + } + } + beginSMaskMode() { + if (this.inSMaskMode) { + throw new Error("beginSMaskMode called while already in smask mode"); + } + const drawnWidth = this.ctx.canvas.width; + const drawnHeight = this.ctx.canvas.height; + const cacheId = "smaskGroupAt" + this.groupLevel; + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + this.suspendedCtx = this.ctx; + this.ctx = scratchCanvas.context; + const ctx = this.ctx; + ctx.setTransform(...(0, _display_utils.getCurrentTransform)(this.suspendedCtx)); + copyCtxState(this.suspendedCtx, ctx); + mirrorContextOperations(ctx, this.suspendedCtx); + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + } + endSMaskMode() { + if (!this.inSMaskMode) { + throw new Error("endSMaskMode called while not in smask mode"); + } + this.ctx._removeMirroring(); + copyCtxState(this.ctx, this.suspendedCtx); + this.ctx = this.suspendedCtx; + this.suspendedCtx = null; + } + compose(dirtyBox) { + if (!this.current.activeSMask) { + return; + } + if (!dirtyBox) { + dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; + } else { + dirtyBox[0] = Math.floor(dirtyBox[0]); + dirtyBox[1] = Math.floor(dirtyBox[1]); + dirtyBox[2] = Math.ceil(dirtyBox[2]); + dirtyBox[3] = Math.ceil(dirtyBox[3]); + } + const smask = this.current.activeSMask; + const suspendedCtx = this.suspendedCtx; + composeSMask(suspendedCtx, smask, this.ctx, dirtyBox); + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); + this.ctx.restore(); + } + save() { + if (this.inSMaskMode) { + copyCtxState(this.ctx, this.suspendedCtx); + this.suspendedCtx.save(); + } else { + this.ctx.save(); + } + const old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + } + restore() { + if (this.stateStack.length === 0 && this.inSMaskMode) { + this.endSMaskMode(); + } + if (this.stateStack.length !== 0) { + this.current = this.stateStack.pop(); + if (this.inSMaskMode) { + this.suspendedCtx.restore(); + copyCtxState(this.suspendedCtx, this.ctx); + } else { + this.ctx.restore(); + } + this.checkSMaskState(); + this.pendingClip = null; + this._cachedScaleForStroking = null; + this._cachedGetSinglePixelWidth = null; + } + } + transform(a, b, c, d, e, f) { + this.ctx.transform(a, b, c, d, e, f); + this._cachedScaleForStroking = null; + this._cachedGetSinglePixelWidth = null; + } + constructPath(ops, args, minMax) { + const ctx = this.ctx; + const current = this.current; + let x = current.x, + y = current.y; + let startX, startY; + const currentTransform = (0, _display_utils.getCurrentTransform)(ctx); + const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0; + const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null; + for (let i = 0, j = 0, ii = ops.length; i < ii; i++) { + switch (ops[i] | 0) { + case _util.OPS.rectangle: + x = args[j++]; + y = args[j++]; + const width = args[j++]; + const height = args[j++]; + const xw = x + width; + const yh = y + height; + ctx.moveTo(x, y); + if (width === 0 || height === 0) { + ctx.lineTo(xw, yh); + } else { + ctx.lineTo(xw, y); + ctx.lineTo(xw, yh); + ctx.lineTo(x, yh); + } + if (!isScalingMatrix) { + current.updateRectMinMax(currentTransform, [x, y, xw, yh]); + } + ctx.closePath(); + break; + case _util.OPS.moveTo: + x = args[j++]; + y = args[j++]; + ctx.moveTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case _util.OPS.lineTo: + x = args[j++]; + y = args[j++]; + ctx.lineTo(x, y); + if (!isScalingMatrix) { + current.updatePathMinMax(currentTransform, x, y); + } + break; + case _util.OPS.curveTo: + startX = x; + startY = y; + x = args[j + 4]; + y = args[j + 5]; + ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier); + j += 6; + break; + case _util.OPS.curveTo2: + startX = x; + startY = y; + ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); + current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier); + x = args[j + 2]; + y = args[j + 3]; + j += 4; + break; + case _util.OPS.curveTo3: + startX = x; + startY = y; + x = args[j + 2]; + y = args[j + 3]; + ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); + current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier); + j += 4; + break; + case _util.OPS.closePath: + ctx.closePath(); + break; + } + } + if (isScalingMatrix) { + current.updateScalingPathMinMax(currentTransform, minMaxForBezier); + } + current.setCurrentPoint(x, y); + } + closePath() { + this.ctx.closePath(); + } + stroke() { + let consumePath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + const ctx = this.ctx; + const strokeColor = this.current.strokeColor; + ctx.globalAlpha = this.current.strokeAlpha; + if (this.contentVisible) { + if (typeof strokeColor === "object" && strokeColor !== null && strokeColor !== void 0 && strokeColor.getPattern) { + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.STROKE); + this.rescaleAndStroke(false); + ctx.restore(); + } else { + this.rescaleAndStroke(true); + } + } + if (consumePath) { + this.consumePath(this.current.getClippedPathBoundingBox()); + } + ctx.globalAlpha = this.current.fillAlpha; + } + closeStroke() { + this.closePath(); + this.stroke(); + } + fill() { + let consumePath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; + if (isPatternFill) { + ctx.save(); + ctx.fillStyle = fillColor.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.FILL); + needRestore = true; + } + const intersect = this.current.getClippedPathBoundingBox(); + if (this.contentVisible && intersect !== null) { + if (this.pendingEOFill) { + ctx.fill("evenodd"); + this.pendingEOFill = false; + } else { + ctx.fill(); + } + } + if (needRestore) { + ctx.restore(); + } + if (consumePath) { + this.consumePath(intersect); + } + } + eoFill() { + this.pendingEOFill = true; + this.fill(); + } + fillStroke() { + this.fill(false); + this.stroke(false); + this.consumePath(); + } + eoFillStroke() { + this.pendingEOFill = true; + this.fillStroke(); + } + closeFillStroke() { + this.closePath(); + this.fillStroke(); + } + closeEOFillStroke() { + this.pendingEOFill = true; + this.closePath(); + this.fillStroke(); + } + endPath() { + this.consumePath(); + } + clip() { + this.pendingClip = NORMAL_CLIP; + } + eoClip() { + this.pendingClip = EO_CLIP; + } + beginText() { + this.current.textMatrix = _util.IDENTITY_MATRIX; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + endText() { + const paths = this.pendingTextPaths; + const ctx = this.ctx; + if (paths === undefined) { + ctx.beginPath(); + return; + } + ctx.save(); + ctx.beginPath(); + for (const path of paths) { + ctx.setTransform(...path.transform); + ctx.translate(path.x, path.y); + path.addToPath(ctx, path.fontSize); + } + ctx.restore(); + ctx.clip(); + ctx.beginPath(); + delete this.pendingTextPaths; + } + setCharSpacing(spacing) { + this.current.charSpacing = spacing; + } + setWordSpacing(spacing) { + this.current.wordSpacing = spacing; + } + setHScale(scale) { + this.current.textHScale = scale / 100; + } + setLeading(leading) { + this.current.leading = -leading; + } + setFont(fontRefName, size) { + const fontObj = this.commonObjs.get(fontRefName); + const current = this.current; + if (!fontObj) { + throw new Error(`Can't find font for ${fontRefName}`); + } + current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + (0, _util.warn)("Invalid font matrix for font " + fontRefName); + } + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + this.current.font = fontObj; + this.current.fontSize = size; + if (fontObj.isType3Font) { + return; + } + const name = fontObj.loadedName || "sans-serif"; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + const typeface = `"${name}", ${fontObj.fallbackName}`; + let browserFontSize = size; + if (size < MIN_FONT_SIZE) { + browserFontSize = MIN_FONT_SIZE; + } else if (size > MAX_FONT_SIZE) { + browserFontSize = MAX_FONT_SIZE; + } + this.current.fontSizeScale = size / browserFontSize; + this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; + } + setTextRenderingMode(mode) { + this.current.textRenderingMode = mode; + } + setTextRise(rise) { + this.current.textRise = rise; + } + moveText(x, y) { + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + } + setLeadingMoveText(x, y) { + this.setLeading(-y); + this.moveText(x, y); + } + setTextMatrix(a, b, c, d, e, f) { + this.current.textMatrix = [a, b, c, d, e, f]; + this.current.textMatrixScale = Math.hypot(a, b); + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + nextLine() { + this.moveText(0, this.current.leading); + } + paintChar(character, x, y, patternTransform) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const textRenderingMode = current.textRenderingMode; + const fontSize = current.fontSize / current.fontSizeScale; + const fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG); + const patternFill = current.patternFill && !font.missingFile; + let addToPath; + if (font.disableFontFace || isAddToPathSet || patternFill) { + addToPath = font.getPathGenerator(this.commonObjs, character); + } + if (font.disableFontFace || patternFill) { + ctx.save(); + ctx.translate(x, y); + ctx.beginPath(); + addToPath(ctx, fontSize); + if (patternTransform) { + ctx.setTransform(...patternTransform); + } + if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + ctx.fill(); + } + if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + ctx.stroke(); + } + ctx.restore(); + } else { + if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + ctx.fillText(character, x, y); + } + if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + ctx.strokeText(character, x, y); + } + } + if (isAddToPathSet) { + const paths = this.pendingTextPaths || (this.pendingTextPaths = []); + paths.push({ + transform: (0, _display_utils.getCurrentTransform)(ctx), + x, + y, + fontSize, + addToPath + }); + } + } + get isFontSubpixelAAEnabled() { + const { + context: ctx + } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); + ctx.scale(1.5, 1); + ctx.fillText("I", 0, 10); + const data = ctx.getImageData(0, 0, 10, 10).data; + let enabled = false; + for (let i = 3; i < data.length; i += 4) { + if (data[i] > 0 && data[i] < 255) { + enabled = true; + break; + } + } + return (0, _util.shadow)(this, "isFontSubpixelAAEnabled", enabled); + } + showText(glyphs) { + const current = this.current; + const font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + const fontSize = current.fontSize; + if (fontSize === 0) { + return undefined; + } + const ctx = this.ctx; + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const glyphsLength = glyphs.length; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const defaultVMetrics = font.defaultVMetrics; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + const simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { + ctx.scale(textHScale, 1); + } + let patternTransform; + if (current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.FILL); + patternTransform = (0, _display_utils.getCurrentTransform)(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + let lineWidth = current.lineWidth; + const scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + lineWidth = this.getSinglePixelWidth(); + } + } else { + lineWidth /= scale; + } + if (fontSizeScale !== 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + ctx.lineWidth = lineWidth; + if (font.isInvalidPDFjsFont) { + const chars = []; + let width = 0; + for (const glyph of glyphs) { + chars.push(glyph.unicode); + width += glyph.width; + } + ctx.fillText(chars.join(""), 0, 0); + current.x += width * widthAdvanceScale * textHScale; + ctx.restore(); + this.compose(); + return undefined; + } + let x = 0, + i; + for (i = 0; i < glyphsLength; ++i) { + const glyph = glyphs[i]; + if (typeof glyph === "number") { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + let restoreNeeded = false; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + const accent = glyph.accent; + let scaledX, scaledY; + let width = glyph.width; + if (vertical) { + const vmetric = glyph.vmetric || defaultVMetrics; + const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale; + const vy = vmetric[2] * widthAdvanceScale; + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; + } else { + scaledX = x / fontSizeScale; + scaledY = 0; + } + if (font.remeasure && width > 0) { + const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + if (width < measuredWidth && this.isFontSubpixelAAEnabled) { + const characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; + } else if (width !== measuredWidth) { + scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; + } + } + if (this.contentVisible && (glyph.isInFont || font.missingFile)) { + if (simpleFillText && !accent) { + ctx.fillText(character, scaledX, scaledY); + } else { + this.paintChar(character, scaledX, scaledY, patternTransform); + if (accent) { + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform); + } + } + } + let charWidth; + if (vertical) { + charWidth = width * widthAdvanceScale - spacing * fontDirection; + } else { + charWidth = width * widthAdvanceScale + spacing * fontDirection; + } + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + ctx.restore(); + this.compose(); + return undefined; + } + showType3Text(glyphs) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + const fontDirection = current.fontDirection; + const spacingDir = font.vertical ? 1 : -1; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const textHScale = current.textHScale * fontDirection; + const fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this._cachedScaleForStroking = null; + this._cachedGetSinglePixelWidth = null; + ctx.save(); + ctx.transform(...current.textMatrix); + ctx.translate(current.x, current.y); + ctx.scale(textHScale, fontDirection); + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (typeof glyph === "number") { + spacingLength = spacingDir * glyph * fontSize / 1000; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; + } + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const operatorList = font.charProcOperatorList[glyph.operatorListId]; + if (!operatorList) { + (0, _util.warn)(`Type3 character "${glyph.operatorListId}" is not available.`); + continue; + } + if (this.contentVisible) { + this.processingType3 = glyph; + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform(...fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + } + const transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix); + width = transformed[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + this.processingType3 = null; + } + setCharWidth(xWidth, yWidth) {} + setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { + this.ctx.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(); + this.endPath(); + } + getColorN_Pattern(IR) { + let pattern; + if (IR[0] === "TilingPattern") { + const color = IR[1]; + const baseTransform = this.baseTransform || (0, _display_utils.getCurrentTransform)(this.ctx); + const canvasGraphicsFactory = { + createCanvasGraphics: ctx => { + return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, { + optionalContentConfig: this.optionalContentConfig, + markedContentStack: this.markedContentStack + }); + } + }; + pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = this._getPattern(IR[1], IR[2]); + } + return pattern; + } + setStrokeColorN() { + this.current.strokeColor = this.getColorN_Pattern(arguments); + } + setFillColorN() { + this.current.fillColor = this.getColorN_Pattern(arguments); + this.current.patternFill = true; + } + setStrokeRGBColor(r, g, b) { + var _this$selectColor; + const color = ((_this$selectColor = this.selectColor) === null || _this$selectColor === void 0 ? void 0 : _this$selectColor.call(this, r, g, b)) || _util.Util.makeHexColor(r, g, b); + this.ctx.strokeStyle = color; + this.current.strokeColor = color; + } + setFillRGBColor(r, g, b) { + var _this$selectColor2; + const color = ((_this$selectColor2 = this.selectColor) === null || _this$selectColor2 === void 0 ? void 0 : _this$selectColor2.call(this, r, g, b)) || _util.Util.makeHexColor(r, g, b); + this.ctx.fillStyle = color; + this.current.fillColor = color; + this.current.patternFill = false; + } + _getPattern(objId) { + let matrix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let pattern; + if (this.cachedPatterns.has(objId)) { + pattern = this.cachedPatterns.get(objId); + } else { + pattern = (0, _pattern_helper.getShadingPattern)(this.objs.get(objId)); + this.cachedPatterns.set(objId, pattern); + } + if (matrix) { + pattern.matrix = matrix; + } + return pattern; + } + shadingFill(objId) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + this.save(); + const pattern = this._getPattern(objId); + ctx.fillStyle = pattern.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.SHADING); + const inv = (0, _display_utils.getCurrentTransformInverse)(ctx); + if (inv) { + const canvas = ctx.canvas; + const width = canvas.width; + const height = canvas.height; + const bl = _util.Util.applyTransform([0, 0], inv); + const br = _util.Util.applyTransform([0, height], inv); + const ul = _util.Util.applyTransform([width, 0], inv); + const ur = _util.Util.applyTransform([width, height], inv); + const x0 = Math.min(bl[0], br[0], ul[0], ur[0]); + const y0 = Math.min(bl[1], br[1], ul[1], ur[1]); + const x1 = Math.max(bl[0], br[0], ul[0], ur[0]); + const y1 = Math.max(bl[1], br[1], ul[1], ur[1]); + this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.compose(this.current.getClippedPathBoundingBox()); + this.restore(); + } + beginInlineImage() { + (0, _util.unreachable)("Should not call beginInlineImage"); + } + beginImageData() { + (0, _util.unreachable)("Should not call beginImageData"); + } + paintFormXObjectBegin(matrix, bbox) { + if (!this.contentVisible) { + return; + } + this.save(); + this.baseTransformStack.push(this.baseTransform); + if (Array.isArray(matrix) && matrix.length === 6) { + this.transform(...matrix); + } + this.baseTransform = (0, _display_utils.getCurrentTransform)(this.ctx); + if (bbox) { + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + this.ctx.rect(bbox[0], bbox[1], width, height); + this.current.updateRectMinMax((0, _display_utils.getCurrentTransform)(this.ctx), bbox); + this.clip(); + this.endPath(); + } + } + paintFormXObjectEnd() { + if (!this.contentVisible) { + return; + } + this.restore(); + this.baseTransform = this.baseTransformStack.pop(); + } + beginGroup(group) { + if (!this.contentVisible) { + return; + } + this.save(); + if (this.inSMaskMode) { + this.endSMaskMode(); + this.current.activeSMask = null; + } + const currentCtx = this.ctx; + if (!group.isolated) { + (0, _util.info)("TODO: Support non-isolated groups."); + } + if (group.knockout) { + (0, _util.warn)("Knockout groups not supported."); + } + const currentTransform = (0, _display_utils.getCurrentTransform)(currentCtx); + if (group.matrix) { + currentCtx.transform(...group.matrix); + } + if (!group.bbox) { + throw new Error("Bounding box is required."); + } + let bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, (0, _display_utils.getCurrentTransform)(currentCtx)); + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + let drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + let drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + let scaleX = 1, + scaleY = 1; + if (drawnWidth > MAX_GROUP_SIZE) { + scaleX = drawnWidth / MAX_GROUP_SIZE; + drawnWidth = MAX_GROUP_SIZE; + } + if (drawnHeight > MAX_GROUP_SIZE) { + scaleY = drawnHeight / MAX_GROUP_SIZE; + drawnHeight = MAX_GROUP_SIZE; + } + this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); + let cacheId = "groupAt" + this.groupLevel; + if (group.smask) { + cacheId += "_smask_" + this.smaskCounter++ % 2; + } + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + const groupCtx = scratchCanvas.context; + groupCtx.scale(1 / scaleX, 1 / scaleY); + groupCtx.translate(-offsetX, -offsetY); + groupCtx.transform(...currentTransform); + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX, + offsetY, + scaleX, + scaleY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null, + startTransformInverse: null + }); + } else { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.scale(scaleX, scaleY); + currentCtx.save(); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this.groupStack.push(currentCtx); + this.groupLevel++; + } + endGroup(group) { + if (!this.contentVisible) { + return; + } + this.groupLevel--; + const groupCtx = this.ctx; + const ctx = this.groupStack.pop(); + this.ctx = ctx; + this.ctx.imageSmoothingEnabled = false; + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + this.restore(); + } else { + this.ctx.restore(); + const currentMtx = (0, _display_utils.getCurrentTransform)(this.ctx); + this.restore(); + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + const dirtyBox = _util.Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx); + this.ctx.drawImage(groupCtx.canvas, 0, 0); + this.ctx.restore(); + this.compose(dirtyBox); + } + } + beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { + _classPrivateMethodGet(this, _restoreInitialState, _restoreInitialState2).call(this); + resetCtxToDefault(this.ctx, this.foregroundColor); + this.ctx.save(); + this.save(); + if (this.baseTransform) { + this.ctx.setTransform(...this.baseTransform); + } + if (Array.isArray(rect) && rect.length === 4) { + const width = rect[2] - rect[0]; + const height = rect[3] - rect[1]; + if (hasOwnCanvas && this.annotationCanvasMap) { + transform = transform.slice(); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + rect = rect.slice(); + rect[0] = rect[1] = 0; + rect[2] = width; + rect[3] = height; + const [scaleX, scaleY] = _util.Util.singularValueDecompose2dScale((0, _display_utils.getCurrentTransform)(this.ctx)); + const { + viewportScale + } = this; + const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale); + const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale); + this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight); + const { + canvas, + context + } = this.annotationCanvas; + this.annotationCanvasMap.set(id, canvas); + this.annotationCanvas.savedCtx = this.ctx; + this.ctx = context; + this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); + resetCtxToDefault(this.ctx, this.foregroundColor); + } else { + resetCtxToDefault(this.ctx, this.foregroundColor); + this.ctx.rect(rect[0], rect[1], width, height); + this.ctx.clip(); + this.endPath(); + } + } + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.transform(...transform); + this.transform(...matrix); + } + endAnnotation() { + if (this.annotationCanvas) { + this.ctx = this.annotationCanvas.savedCtx; + delete this.annotationCanvas.savedCtx; + delete this.annotationCanvas; + } + } + paintImageMaskXObject(img) { + if (!this.contentVisible) { + return; + } + const count = img.count; + img = this.getObject(img.data, img); + img.count = count; + const ctx = this.ctx; + const glyph = this.processingType3; + if (glyph) { + if (glyph.compiled === undefined) { + glyph.compiled = compileType3Glyph(img); + } + if (glyph.compiled) { + glyph.compiled(ctx); + return; + } + } + const mask = this._createMaskCanvas(img); + const maskCanvas = mask.canvas; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectRepeat(img, scaleX) { + let skewX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + let skewY = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + let scaleY = arguments.length > 4 ? arguments[4] : undefined; + let positions = arguments.length > 5 ? arguments[5] : undefined; + if (!this.contentVisible) { + return; + } + img = this.getObject(img.data, img); + const ctx = this.ctx; + ctx.save(); + const currentTransform = (0, _display_utils.getCurrentTransform)(ctx); + ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); + const mask = this._createMaskCanvas(img); + ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + const trans = _util.Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + const [x, y] = _util.Util.applyTransform([0, 0], trans); + ctx.drawImage(mask.canvas, x, y); + } + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectGroup(images) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + for (const image of images) { + const { + data, + width, + height, + transform + } = image; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; + maskCtx.save(); + const img = this.getObject(data, image); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = "source-in"; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.FILL) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + ctx.save(); + ctx.transform(...transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintImageXObject(objId) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + // console.log('imgData',imgData); + if (!imgData) { + // console.log('报错2'); + (0, _util.warn)("Dependent image isn't ready yet"); + return; + } + this.paintInlineImageXObject(imgData); + } + paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + console.log('报错1'); + (0, _util.warn)("Dependent image isn't ready yet"); + return; + } + const width = imgData.width; + const height = imgData.height; + const map = []; + for (let i = 0, ii = positions.length; i < ii; i += 2) { + map.push({ + transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], + x: 0, + y: 0, + w: width, + h: height + }); + } + this.paintInlineImageXObjectGroup(imgData, map); + } + paintInlineImageXObject(imgData) { + if (!this.contentVisible) { + return; + } + const width = imgData.width; + const height = imgData.height; + const ctx = this.ctx; + this.save(); + ctx.scale(1 / width, -1 / height); + let imgToPaint; + if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { + imgToPaint = imgData; + } else { + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData, this.current.transferMaps); + imgToPaint = tmpCanvas.canvas; + } + const scaled = this._scaleImage(imgToPaint, (0, _display_utils.getCurrentTransformInverse)(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled((0, _display_utils.getCurrentTransform)(ctx), imgData.interpolate); + drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + this.compose(); + this.restore(); + } + paintInlineImageXObjectGroup(imgData, map) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData, this.current.transferMaps); + for (const entry of map) { + ctx.save(); + ctx.transform(...entry.transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintSolidColorImageMask() { + if (!this.contentVisible) { + return; + } + this.ctx.fillRect(0, 0, 1, 1); + this.compose(); + } + markPoint(tag) {} + markPointProps(tag, properties) {} + beginMarkedContent(tag) { + this.markedContentStack.push({ + visible: true + }); + } + beginMarkedContentProps(tag, properties) { + if (tag === "OC") { + this.markedContentStack.push({ + visible: this.optionalContentConfig.isVisible(properties) + }); + } else { + this.markedContentStack.push({ + visible: true + }); + } + this.contentVisible = this.isContentVisible(); + } + endMarkedContent() { + this.markedContentStack.pop(); + this.contentVisible = this.isContentVisible(); + } + beginCompat() {} + endCompat() {} + consumePath(clipBox) { + const isEmpty = this.current.isEmptyClip(); + if (this.pendingClip) { + this.current.updateClipFromPath(); + } + if (!this.pendingClip) { + this.compose(clipBox); + } + const ctx = this.ctx; + if (this.pendingClip) { + if (!isEmpty) { + if (this.pendingClip === EO_CLIP) { + ctx.clip("evenodd"); + } else { + ctx.clip(); + } + } + this.pendingClip = null; + } + this.current.startNewPathAndClipBox(this.current.clipBox); + ctx.beginPath(); + } + getSinglePixelWidth() { + if (!this._cachedGetSinglePixelWidth) { + const m = (0, _display_utils.getCurrentTransform)(this.ctx); + if (m[1] === 0 && m[2] === 0) { + this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); + } else { + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const normX = Math.hypot(m[0], m[2]); + const normY = Math.hypot(m[1], m[3]); + this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet; + } + } + return this._cachedGetSinglePixelWidth; + } + getScaleForStroking() { + if (!this._cachedScaleForStroking) { + const { + lineWidth + } = this.current; + const m = (0, _display_utils.getCurrentTransform)(this.ctx); + let scaleX, scaleY; + if (m[1] === 0 && m[2] === 0) { + const normX = Math.abs(m[0]); + const normY = Math.abs(m[3]); + if (lineWidth === 0) { + scaleX = 1 / normX; + scaleY = 1 / normY; + } else { + const scaledXLineWidth = normX * lineWidth; + const scaledYLineWidth = normY * lineWidth; + scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1; + scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1; + } + } else { + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const normX = Math.hypot(m[0], m[1]); + const normY = Math.hypot(m[2], m[3]); + if (lineWidth === 0) { + scaleX = normY / absDet; + scaleY = normX / absDet; + } else { + const baseArea = lineWidth * absDet; + scaleX = normY > baseArea ? normY / baseArea : 1; + scaleY = normX > baseArea ? normX / baseArea : 1; + } + } + this._cachedScaleForStroking = [scaleX, scaleY]; + } + return this._cachedScaleForStroking; + } + rescaleAndStroke(saveRestore) { + const { + ctx + } = this; + const { + lineWidth + } = this.current; + const [scaleX, scaleY] = this.getScaleForStroking(); + ctx.lineWidth = lineWidth || 1; + if (scaleX === 1 && scaleY === 1) { + ctx.stroke(); + return; + } + let savedMatrix, savedDashes, savedDashOffset; + if (saveRestore) { + savedMatrix = (0, _display_utils.getCurrentTransform)(ctx); + savedDashes = ctx.getLineDash().slice(); + savedDashOffset = ctx.lineDashOffset; + } + ctx.scale(scaleX, scaleY); + const scale = Math.max(scaleX, scaleY); + ctx.setLineDash(ctx.getLineDash().map(x => x / scale)); + ctx.lineDashOffset /= scale; + ctx.stroke(); + if (saveRestore) { + ctx.setTransform(...savedMatrix); + ctx.setLineDash(savedDashes); + ctx.lineDashOffset = savedDashOffset; + } + } + isContentVisible() { + for (let i = this.markedContentStack.length - 1; i >= 0; i--) { + if (!this.markedContentStack[i].visible) { + return false; + } + } + return true; + } +} +exports.CanvasGraphics = CanvasGraphics; +function _restoreInitialState2() { + while (this.stateStack.length || this.inSMaskMode) { + this.restore(); + } + this.ctx.restore(); + if (this.transparentCanvas) { + this.ctx = this.compositeCtx; + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.drawImage(this.transparentCanvas, 0, 0); + this.ctx.restore(); + this.transparentCanvas = null; + } +} +for (const op in _util.OPS) { + if (CanvasGraphics.prototype[op] !== undefined) { + CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op]; + } +} + +/***/ }), +/* 142 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.TilingPattern = exports.PathType = void 0; +exports.getShadingPattern = getShadingPattern; +var _util = __w_pdfjs_require__(1); +var _display_utils = __w_pdfjs_require__(137); +var _is_node = __w_pdfjs_require__(3); +const PathType = { + FILL: "Fill", + STROKE: "Stroke", + SHADING: "Shading" +}; +exports.PathType = PathType; +function applyBoundingBox(ctx, bbox) { + if (!bbox || _is_node.isNodeJS) { + return; + } + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + const region = new Path2D(); + region.rect(bbox[0], bbox[1], width, height); + ctx.clip(region); +} +class BaseShadingPattern { + constructor() { + if (this.constructor === BaseShadingPattern) { + (0, _util.unreachable)("Cannot initialize BaseShadingPattern."); + } + } + getPattern() { + (0, _util.unreachable)("Abstract method `getPattern` called."); + } +} +class RadialAxialShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._type = IR[1]; + this._bbox = IR[2]; + this._colorStops = IR[3]; + this._p0 = IR[4]; + this._p1 = IR[5]; + this._r0 = IR[6]; + this._r1 = IR[7]; + this.matrix = null; + } + _createGradient(ctx) { + let grad; + if (this._type === "axial") { + grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]); + } else if (this._type === "radial") { + grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1); + } + for (const colorStop of this._colorStops) { + grad.addColorStop(colorStop[0], colorStop[1]); + } + return grad; + } + getPattern(ctx, owner, inverse, pathType) { + let pattern; + if (pathType === PathType.STROKE || pathType === PathType.FILL) { + const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, (0, _display_utils.getCurrentTransform)(ctx)) || [0, 0, 0, 0]; + const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1; + const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1; + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height, true); + const tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.beginPath(); + tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]); + inverse = _util.Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); + tmpCtx.transform(...owner.baseTransform); + if (this.matrix) { + tmpCtx.transform(...this.matrix); + } + applyBoundingBox(tmpCtx, this._bbox); + tmpCtx.fillStyle = this._createGradient(tmpCtx); + tmpCtx.fill(); + pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); + const domMatrix = new DOMMatrix(inverse); + pattern.setTransform(domMatrix); + } else { + applyBoundingBox(ctx, this._bbox); + pattern = this._createGradient(ctx); + } + return pattern; + } +} +function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { + const coords = context.coords, + colors = context.colors; + const bytes = data.data, + rowSize = data.width * 4; + let tmp; + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + if (coords[p2 + 1] > coords[p3 + 1]) { + tmp = p2; + p2 = p3; + p3 = tmp; + tmp = c2; + c2 = c3; + c3 = tmp; + } + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + const x1 = (coords[p1] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + if (y1 >= y3) { + return; + } + const c1r = colors[c1], + c1g = colors[c1 + 1], + c1b = colors[c1 + 2]; + const c2r = colors[c2], + c2g = colors[c2 + 1], + c2b = colors[c2 + 2]; + const c3r = colors[c3], + c3g = colors[c3 + 1], + c3b = colors[c3 + 2]; + const minY = Math.round(y1), + maxY = Math.round(y3); + let xa, car, cag, cab; + let xb, cbr, cbg, cbb; + for (let y = minY; y <= maxY; y++) { + if (y < y2) { + let k; + if (y < y1) { + k = 0; + } else { + k = (y1 - y) / (y1 - y2); + } + xa = x1 - (x1 - x2) * k; + car = c1r - (c1r - c2r) * k; + cag = c1g - (c1g - c2g) * k; + cab = c1b - (c1b - c2b) * k; + } else { + let k; + if (y > y3) { + k = 1; + } else if (y2 === y3) { + k = 0; + } else { + k = (y2 - y) / (y2 - y3); + } + xa = x2 - (x2 - x3) * k; + car = c2r - (c2r - c3r) * k; + cag = c2g - (c2g - c3g) * k; + cab = c2b - (c2b - c3b) * k; + } + let k; + if (y < y1) { + k = 0; + } else if (y > y3) { + k = 1; + } else { + k = (y1 - y) / (y1 - y3); + } + xb = x1 - (x1 - x3) * k; + cbr = c1r - (c1r - c3r) * k; + cbg = c1g - (c1g - c3g) * k; + cbb = c1b - (c1b - c3b) * k; + const x1_ = Math.round(Math.min(xa, xb)); + const x2_ = Math.round(Math.max(xa, xb)); + let j = rowSize * y + x1_ * 4; + for (let x = x1_; x <= x2_; x++) { + k = (xa - x) / (xa - xb); + if (k < 0) { + k = 0; + } else if (k > 1) { + k = 1; + } + bytes[j++] = car - (car - cbr) * k | 0; + bytes[j++] = cag - (cag - cbg) * k | 0; + bytes[j++] = cab - (cab - cbb) * k | 0; + bytes[j++] = 255; + } + } +} +function drawFigure(data, figure, context) { + const ps = figure.coords; + const cs = figure.colors; + let i, ii; + switch (figure.type) { + case "lattice": + const verticesPerRow = figure.verticesPerRow; + const rows = Math.floor(ps.length / verticesPerRow) - 1; + const cols = verticesPerRow - 1; + for (i = 0; i < rows; i++) { + let q = i * verticesPerRow; + for (let j = 0; j < cols; j++, q++) { + drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); + drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); + } + } + break; + case "triangles": + for (i = 0, ii = ps.length; i < ii; i += 3) { + drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); + } + break; + default: + throw new Error("illegal figure"); + } +} +class MeshShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._coords = IR[2]; + this._colors = IR[3]; + this._figures = IR[4]; + this._bounds = IR[5]; + this._bbox = IR[7]; + this._background = IR[8]; + this.matrix = null; + } + _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) { + const EXPECTED_SCALE = 1.1; + const MAX_PATTERN_SIZE = 3000; + const BORDER_SIZE = 2; + const offsetX = Math.floor(this._bounds[0]); + const offsetY = Math.floor(this._bounds[1]); + const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; + const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const scaleX = boundsWidth / width; + const scaleY = boundsHeight / height; + const context = { + coords: this._coords, + colors: this._colors, + offsetX: -offsetX, + offsetY: -offsetY, + scaleX: 1 / scaleX, + scaleY: 1 / scaleY + }; + const paddedWidth = width + BORDER_SIZE * 2; + const paddedHeight = height + BORDER_SIZE * 2; + const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false); + const tmpCtx = tmpCanvas.context; + const data = tmpCtx.createImageData(width, height); + if (backgroundColor) { + const bytes = data.data; + for (let i = 0, ii = bytes.length; i < ii; i += 4) { + bytes[i] = backgroundColor[0]; + bytes[i + 1] = backgroundColor[1]; + bytes[i + 2] = backgroundColor[2]; + bytes[i + 3] = 255; + } + } + for (const figure of this._figures) { + drawFigure(data, figure, context); + } + tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); + const canvas = tmpCanvas.canvas; + return { + canvas, + offsetX: offsetX - BORDER_SIZE * scaleX, + offsetY: offsetY - BORDER_SIZE * scaleY, + scaleX, + scaleY + }; + } + getPattern(ctx, owner, inverse, pathType) { + applyBoundingBox(ctx, this._bbox); + let scale; + if (pathType === PathType.SHADING) { + scale = _util.Util.singularValueDecompose2dScale((0, _display_utils.getCurrentTransform)(ctx)); + } else { + scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform); + if (this.matrix) { + const matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix); + scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; + } + } + const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases); + if (pathType !== PathType.SHADING) { + ctx.setTransform(...owner.baseTransform); + if (this.matrix) { + ctx.transform(...this.matrix); + } + } + ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); + return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + } +} +class DummyShadingPattern extends BaseShadingPattern { + getPattern() { + return "hotpink"; + } +} +function getShadingPattern(IR) { + switch (IR[0]) { + case "RadialAxial": + return new RadialAxialShadingPattern(IR); + case "Mesh": + return new MeshShadingPattern(IR); + case "Dummy": + return new DummyShadingPattern(); + } + throw new Error(`Unknown IR type: ${IR[0]}`); +} +const PaintType = { + COLORED: 1, + UNCOLORED: 2 +}; +class TilingPattern { + static get MAX_PATTERN_SIZE() { + return (0, _util.shadow)(this, "MAX_PATTERN_SIZE", 3000); + } + constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) { + this.operatorList = IR[2]; + this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.color = color; + this.ctx = ctx; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + } + createPatternCanvas(owner) { + const operatorList = this.operatorList; + const bbox = this.bbox; + const xstep = this.xstep; + const ystep = this.ystep; + const paintType = this.paintType; + const tilingType = this.tilingType; + const color = this.color; + const canvasGraphicsFactory = this.canvasGraphicsFactory; + (0, _util.info)("TilingType: " + tilingType); + const x0 = bbox[0], + y0 = bbox[1], + x1 = bbox[2], + y1 = bbox[3]; + const matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix); + const curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform); + const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; + const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]); + const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]); + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true); + const tmpCtx = tmpCanvas.context; + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + graphics.groupLevel = owner.groupLevel; + this.setFillAndStrokeStyleToContext(graphics, paintType, color); + let adjustedX0 = x0; + let adjustedY0 = y0; + let adjustedX1 = x1; + let adjustedY1 = y1; + if (x0 < 0) { + adjustedX0 = 0; + adjustedX1 += Math.abs(x0); + } + if (y0 < 0) { + adjustedY0 = 0; + adjustedY1 += Math.abs(y0); + } + tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0)); + graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); + tmpCtx.save(); + this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1); + graphics.baseTransform = (0, _display_utils.getCurrentTransform)(graphics.ctx); + graphics.executeOperatorList(operatorList); + graphics.endDrawing(); + return { + canvas: tmpCanvas.canvas, + scaleX: dimx.scale, + scaleY: dimy.scale, + offsetX: adjustedX0, + offsetY: adjustedY0 + }; + } + getSizeAndScale(step, realOutputSize, scale) { + step = Math.abs(step); + const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); + let size = Math.ceil(step * scale); + if (size >= maxSize) { + size = maxSize; + } else { + scale = size / step; + } + return { + scale, + size + }; + } + clipBbox(graphics, x0, y0, x1, y1) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); + graphics.current.updateRectMinMax((0, _display_utils.getCurrentTransform)(graphics.ctx), [x0, y0, x1, y1]); + graphics.clip(); + graphics.endPath(); + } + setFillAndStrokeStyleToContext(graphics, paintType, color) { + const context = graphics.ctx, + current = graphics.current; + switch (paintType) { + case PaintType.COLORED: + const ctx = this.ctx; + context.fillStyle = ctx.fillStyle; + context.strokeStyle = ctx.strokeStyle; + current.fillColor = ctx.fillStyle; + current.strokeColor = ctx.strokeStyle; + break; + case PaintType.UNCOLORED: + const cssColor = _util.Util.makeHexColor(color[0], color[1], color[2]); + context.fillStyle = cssColor; + context.strokeStyle = cssColor; + current.fillColor = cssColor; + current.strokeColor = cssColor; + break; + default: + throw new _util.FormatError(`Unsupported paint type: ${paintType}`); + } + } + getPattern(ctx, owner, inverse, pathType) { + let matrix = inverse; + if (pathType !== PathType.SHADING) { + matrix = _util.Util.transform(matrix, owner.baseTransform); + if (this.matrix) { + matrix = _util.Util.transform(matrix, this.matrix); + } + } + const temporaryPatternCanvas = this.createPatternCanvas(owner); + let domMatrix = new DOMMatrix(matrix); + domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); + pattern.setTransform(domMatrix); + return pattern; + } +} +exports.TilingPattern = TilingPattern; + +/***/ }), +/* 143 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.applyMaskImageData = applyMaskImageData; +var _util = __w_pdfjs_require__(1); +function applyMaskImageData(_ref) { + let { + src, + srcPos = 0, + dest, + destPos = 0, + width, + height, + inverseDecode = false + } = _ref; + const opaque = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = !inverseDecode ? [opaque, 0] : [0, opaque]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} + +/***/ }), +/* 144 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.GlobalWorkerOptions = void 0; +const GlobalWorkerOptions = Object.create(null); +exports.GlobalWorkerOptions = GlobalWorkerOptions; +GlobalWorkerOptions.workerPort = GlobalWorkerOptions.workerPort === undefined ? null : GlobalWorkerOptions.workerPort; +GlobalWorkerOptions.workerSrc = GlobalWorkerOptions.workerSrc === undefined ? "" : GlobalWorkerOptions.workerSrc; + +/***/ }), +/* 145 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.MessageHandler = void 0; +var _util = __w_pdfjs_require__(1); +const CallbackKind = { + UNKNOWN: 0, + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + UNKNOWN: 0, + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function wrapReason(reason) { + if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { + (0, _util.unreachable)('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (reason.name) { + case "AbortException": + return new _util.AbortException(reason.message); + case "MissingPDFException": + return new _util.MissingPDFException(reason.message); + case "PasswordException": + return new _util.PasswordException(reason.message, reason.code); + case "UnexpectedResponseException": + return new _util.UnexpectedResponseException(reason.message, reason.status); + case "UnknownErrorException": + return new _util.UnknownErrorException(reason.message, reason.details); + default: + return new _util.UnknownErrorException(reason.message, reason.toString()); + } +} +class MessageHandler { + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + this._onComObjOnMessage = event => { + const data = event.data; + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this._processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const cbSourceName = this.sourceName; + const cbTargetName = data.sourceName; + new Promise(function (resolve) { + resolve(action(data.data)); + }).then(function (result) { + comObj.postMessage({ + sourceName: cbSourceName, + targetName: cbTargetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName: cbSourceName, + targetName: cbTargetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this._createStreamSink(data); + return; + } + action(data.data); + }; + comObj.addEventListener("message", this._onComObjOnMessage); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = (0, _util.createPromiseCapability)(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = (0, _util.createPromiseCapability)(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = (0, _util.createPromiseCapability)(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + (0, _util.assert)(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = (0, _util.createPromiseCapability)(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + _createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk) { + let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + let transfers = arguments.length > 2 ? arguments[2] : undefined; + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = (0, _util.createPromiseCapability)(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + (0, _util.assert)(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: (0, _util.createPromiseCapability)(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + new Promise(function (resolve) { + resolve(action(data.data, streamSink)); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + _processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + new Promise(function (resolve) { + resolve(streamSink.onPull && streamSink.onPull()); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + (0, _util.assert)(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + (0, _util.assert)(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this._deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + (0, _util.assert)(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this._deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this._deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + new Promise(function (resolve) { + resolve(streamSink.onCancel && streamSink.onCancel(wrapReason(data.reason))); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(wrapReason(data.reason)); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async _deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall && streamController.startCall.promise, streamController.pullCall && streamController.pullCall.promise, streamController.cancelCall && streamController.cancelCall.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.comObj.removeEventListener("message", this._onComObjOnMessage); + } +} +exports.MessageHandler = MessageHandler; + +/***/ }), +/* 146 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Metadata = void 0; +var _util = __w_pdfjs_require__(1); +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +var _metadataMap = /*#__PURE__*/new WeakMap(); +var _data = /*#__PURE__*/new WeakMap(); +class Metadata { + constructor(_ref) { + let { + parsedData, + rawData + } = _ref; + _classPrivateFieldInitSpec(this, _metadataMap, { + writable: true, + value: void 0 + }); + _classPrivateFieldInitSpec(this, _data, { + writable: true, + value: void 0 + }); + _classPrivateFieldSet(this, _metadataMap, parsedData); + _classPrivateFieldSet(this, _data, rawData); + } + getRaw() { + return _classPrivateFieldGet(this, _data); + } + get(name) { + return _classPrivateFieldGet(this, _metadataMap).get(name) ?? null; + } + getAll() { + return (0, _util.objectFromMap)(_classPrivateFieldGet(this, _metadataMap)); + } + has(name) { + return _classPrivateFieldGet(this, _metadataMap).has(name); + } +} +exports.Metadata = Metadata; + +/***/ }), +/* 147 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.OptionalContentConfig = void 0; +var _util = __w_pdfjs_require__(1); +var _murmurhash = __w_pdfjs_require__(139); +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +const INTERNAL = Symbol("INTERNAL"); +var _visible = /*#__PURE__*/new WeakMap(); +class OptionalContentGroup { + constructor(name, intent) { + _classPrivateFieldInitSpec(this, _visible, { + writable: true, + value: true + }); + this.name = name; + this.intent = intent; + } + get visible() { + return _classPrivateFieldGet(this, _visible); + } + _setVisible(internal, visible) { + if (internal !== INTERNAL) { + (0, _util.unreachable)("Internal method `_setVisible` called."); + } + _classPrivateFieldSet(this, _visible, visible); + } +} +var _cachedGetHash = /*#__PURE__*/new WeakMap(); +var _groups = /*#__PURE__*/new WeakMap(); +var _initialHash = /*#__PURE__*/new WeakMap(); +var _order = /*#__PURE__*/new WeakMap(); +var _evaluateVisibilityExpression = /*#__PURE__*/new WeakSet(); +class OptionalContentConfig { + constructor(data) { + _classPrivateMethodInitSpec(this, _evaluateVisibilityExpression); + _classPrivateFieldInitSpec(this, _cachedGetHash, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _groups, { + writable: true, + value: new Map() + }); + _classPrivateFieldInitSpec(this, _initialHash, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _order, { + writable: true, + value: null + }); + this.name = null; + this.creator = null; + if (data === null) { + return; + } + this.name = data.name; + this.creator = data.creator; + _classPrivateFieldSet(this, _order, data.order); + for (const group of data.groups) { + _classPrivateFieldGet(this, _groups).set(group.id, new OptionalContentGroup(group.name, group.intent)); + } + if (data.baseState === "OFF") { + for (const group of _classPrivateFieldGet(this, _groups).values()) { + group._setVisible(INTERNAL, false); + } + } + for (const on of data.on) { + _classPrivateFieldGet(this, _groups).get(on)._setVisible(INTERNAL, true); + } + for (const off of data.off) { + _classPrivateFieldGet(this, _groups).get(off)._setVisible(INTERNAL, false); + } + _classPrivateFieldSet(this, _initialHash, this.getHash()); + } + isVisible(group) { + if (_classPrivateFieldGet(this, _groups).size === 0) { + return true; + } + if (!group) { + (0, _util.warn)("Optional content group not defined."); + return true; + } + if (group.type === "OCG") { + if (!_classPrivateFieldGet(this, _groups).has(group.id)) { + (0, _util.warn)(`Optional content group not found: ${group.id}`); + return true; + } + return _classPrivateFieldGet(this, _groups).get(group.id).visible; + } else if (group.type === "OCMD") { + if (group.expression) { + return _classPrivateMethodGet(this, _evaluateVisibilityExpression, _evaluateVisibilityExpression2).call(this, group.expression); + } + if (!group.policy || group.policy === "AnyOn") { + for (const id of group.ids) { + if (!_classPrivateFieldGet(this, _groups).has(id)) { + (0, _util.warn)(`Optional content group not found: ${id}`); + return true; + } + if (_classPrivateFieldGet(this, _groups).get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOn") { + for (const id of group.ids) { + if (!_classPrivateFieldGet(this, _groups).has(id)) { + (0, _util.warn)(`Optional content group not found: ${id}`); + return true; + } + if (!_classPrivateFieldGet(this, _groups).get(id).visible) { + return false; + } + } + return true; + } else if (group.policy === "AnyOff") { + for (const id of group.ids) { + if (!_classPrivateFieldGet(this, _groups).has(id)) { + (0, _util.warn)(`Optional content group not found: ${id}`); + return true; + } + if (!_classPrivateFieldGet(this, _groups).get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOff") { + for (const id of group.ids) { + if (!_classPrivateFieldGet(this, _groups).has(id)) { + (0, _util.warn)(`Optional content group not found: ${id}`); + return true; + } + if (_classPrivateFieldGet(this, _groups).get(id).visible) { + return false; + } + } + return true; + } + (0, _util.warn)(`Unknown optional content policy ${group.policy}.`); + return true; + } + (0, _util.warn)(`Unknown group type ${group.type}.`); + return true; + } + setVisibility(id) { + let visible = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + if (!_classPrivateFieldGet(this, _groups).has(id)) { + (0, _util.warn)(`Optional content group not found: ${id}`); + return; + } + _classPrivateFieldGet(this, _groups).get(id)._setVisible(INTERNAL, !!visible); + _classPrivateFieldSet(this, _cachedGetHash, null); + } + get hasInitialVisibility() { + return this.getHash() === _classPrivateFieldGet(this, _initialHash); + } + getOrder() { + if (!_classPrivateFieldGet(this, _groups).size) { + return null; + } + if (_classPrivateFieldGet(this, _order)) { + return _classPrivateFieldGet(this, _order).slice(); + } + return [..._classPrivateFieldGet(this, _groups).keys()]; + } + getGroups() { + return _classPrivateFieldGet(this, _groups).size > 0 ? (0, _util.objectFromMap)(_classPrivateFieldGet(this, _groups)) : null; + } + getGroup(id) { + return _classPrivateFieldGet(this, _groups).get(id) || null; + } + getHash() { + if (_classPrivateFieldGet(this, _cachedGetHash) !== null) { + return _classPrivateFieldGet(this, _cachedGetHash); + } + const hash = new _murmurhash.MurmurHash3_64(); + for (const [id, group] of _classPrivateFieldGet(this, _groups)) { + hash.update(`${id}:${group.visible}`); + } + return _classPrivateFieldSet(this, _cachedGetHash, hash.hexdigest()); + } +} +exports.OptionalContentConfig = OptionalContentConfig; +function _evaluateVisibilityExpression2(array) { + const length = array.length; + if (length < 2) { + return true; + } + const operator = array[0]; + for (let i = 1; i < length; i++) { + const element = array[i]; + let state; + if (Array.isArray(element)) { + state = _classPrivateMethodGet(this, _evaluateVisibilityExpression, _evaluateVisibilityExpression2).call(this, element); + } else if (_classPrivateFieldGet(this, _groups).has(element)) { + state = _classPrivateFieldGet(this, _groups).get(element).visible; + } else { + (0, _util.warn)(`Optional content group not found: ${element}`); + return true; + } + switch (operator) { + case "And": + if (!state) { + return false; + } + break; + case "Or": + if (state) { + return true; + } + break; + case "Not": + return !state; + default: + return true; + } + } + return operator === "And"; +} + +/***/ }), +/* 148 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PDFDataTransportStream = void 0; +var _util = __w_pdfjs_require__(1); +var _display_utils = __w_pdfjs_require__(137); +class PDFDataTransportStream { + constructor(params, pdfDataRangeTransport) { + (0, _util.assert)(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); + this._queuedChunks = []; + this._progressiveDone = params.progressiveDone || false; + this._contentDispositionFilename = params.contentDispositionFilename || null; + const initialData = params.initialData; + if ((initialData === null || initialData === void 0 ? void 0 : initialData.length) > 0) { + const buffer = new Uint8Array(initialData).buffer; + this._queuedChunks.push(buffer); + } + this._pdfDataRangeTransport = pdfDataRangeTransport; + this._isStreamingSupported = !params.disableStream; + this._isRangeSupported = !params.disableRange; + this._contentLength = params.length; + this._fullRequestReader = null; + this._rangeReaders = []; + this._pdfDataRangeTransport.addRangeListener((begin, chunk) => { + this._onReceiveData({ + begin, + chunk + }); + }); + this._pdfDataRangeTransport.addProgressListener((loaded, total) => { + this._onProgress({ + loaded, + total + }); + }); + this._pdfDataRangeTransport.addProgressiveReadListener(chunk => { + this._onReceiveData({ + chunk + }); + }); + this._pdfDataRangeTransport.addProgressiveDoneListener(() => { + this._onProgressiveDone(); + }); + this._pdfDataRangeTransport.transportReady(); + } + _onReceiveData(args) { + const buffer = new Uint8Array(args.chunk).buffer; + if (args.begin === undefined) { + if (this._fullRequestReader) { + this._fullRequestReader._enqueue(buffer); + } else { + this._queuedChunks.push(buffer); + } + } else { + const found = this._rangeReaders.some(function (rangeReader) { + if (rangeReader._begin !== args.begin) { + return false; + } + rangeReader._enqueue(buffer); + return true; + }); + (0, _util.assert)(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + } + } + get _progressiveDataLength() { + var _this$_fullRequestRea; + return ((_this$_fullRequestRea = this._fullRequestReader) === null || _this$_fullRequestRea === void 0 ? void 0 : _this$_fullRequestRea._loaded) ?? 0; + } + _onProgress(evt) { + if (evt.total === undefined) { + var _this$_rangeReaders$, _this$_rangeReaders$$; + (_this$_rangeReaders$ = this._rangeReaders[0]) === null || _this$_rangeReaders$ === void 0 ? void 0 : (_this$_rangeReaders$$ = _this$_rangeReaders$.onProgress) === null || _this$_rangeReaders$$ === void 0 ? void 0 : _this$_rangeReaders$$.call(_this$_rangeReaders$, { + loaded: evt.loaded + }); + } else { + var _this$_fullRequestRea2, _this$_fullRequestRea3; + (_this$_fullRequestRea2 = this._fullRequestReader) === null || _this$_fullRequestRea2 === void 0 ? void 0 : (_this$_fullRequestRea3 = _this$_fullRequestRea2.onProgress) === null || _this$_fullRequestRea3 === void 0 ? void 0 : _this$_fullRequestRea3.call(_this$_fullRequestRea2, { + loaded: evt.loaded, + total: evt.total + }); + } + } + _onProgressiveDone() { + var _this$_fullRequestRea4; + (_this$_fullRequestRea4 = this._fullRequestReader) === null || _this$_fullRequestRea4 === void 0 ? void 0 : _this$_fullRequestRea4.progressiveDone(); + this._progressiveDone = true; + } + _removeRangeReader(reader) { + const i = this._rangeReaders.indexOf(reader); + if (i >= 0) { + this._rangeReaders.splice(i, 1); + } + } + getFullReader() { + (0, _util.assert)(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once."); + const queuedChunks = this._queuedChunks; + this._queuedChunks = null; + return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename); + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFDataTransportStreamRangeReader(this, begin, end); + this._pdfDataRangeTransport.requestDataRange(begin, end); + this._rangeReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + var _this$_fullRequestRea5; + (_this$_fullRequestRea5 = this._fullRequestReader) === null || _this$_fullRequestRea5 === void 0 ? void 0 : _this$_fullRequestRea5.cancel(reason); + for (const reader of this._rangeReaders.slice(0)) { + reader.cancel(reason); + } + this._pdfDataRangeTransport.abort(); + } +} +exports.PDFDataTransportStream = PDFDataTransportStream; +class PDFDataTransportStreamReader { + constructor(stream, queuedChunks) { + let progressiveDone = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let contentDispositionFilename = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + this._stream = stream; + this._done = progressiveDone || false; + this._filename = (0, _display_utils.isPdfFile)(contentDispositionFilename) ? contentDispositionFilename : null; + this._queuedChunks = queuedChunks || []; + this._loaded = 0; + for (const chunk of this._queuedChunks) { + this._loaded += chunk.byteLength; + } + this._requests = []; + this._headersReady = Promise.resolve(); + stream._fullRequestReader = this; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunks.push(chunk); + } + this._loaded += chunk.byteLength; + } + get headersReady() { + return this._headersReady; + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._stream._isRangeSupported; + } + get isStreamingSupported() { + return this._stream._isStreamingSupported; + } + get contentLength() { + return this._stream._contentLength; + } + async read() { + if (this._queuedChunks.length > 0) { + const chunk = this._queuedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = (0, _util.createPromiseCapability)(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + progressiveDone() { + if (this._done) { + return; + } + this._done = true; + } +} +class PDFDataTransportStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._begin = begin; + this._end = end; + this._queuedChunk = null; + this._requests = []; + this._done = false; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + const requestsCapability = this._requests.shift(); + requestsCapability.resolve({ + value: chunk, + done: false + }); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + this._done = true; + this._stream._removeRangeReader(this); + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._queuedChunk) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = (0, _util.createPromiseCapability)(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._stream._removeRangeReader(this); + } +} + +/***/ }), +/* 149 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XfaText = void 0; +class XfaText { + static textContent(xfa) { + const items = []; + const output = { + items, + styles: Object.create(null) + }; + function walk(node) { + var _node$attributes; + if (!node) { + return; + } + let str = null; + const name = node.name; + if (name === "#text") { + str = node.value; + } else if (!XfaText.shouldBuildText(name)) { + return; + } else if (node !== null && node !== void 0 && (_node$attributes = node.attributes) !== null && _node$attributes !== void 0 && _node$attributes.textContent) { + str = node.attributes.textContent; + } else if (node.value) { + str = node.value; + } + if (str !== null) { + items.push({ + str + }); + } + if (!node.children) { + return; + } + for (const child of node.children) { + walk(child); + } + } + walk(xfa); + return output; + } + static shouldBuildText(name) { + return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + } +} +exports.XfaText = XfaText; + +/***/ }), +/* 150 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.NodeStandardFontDataFactory = exports.NodeCanvasFactory = exports.NodeCMapReaderFactory = void 0; +var _base_factory = __w_pdfjs_require__(138); +; +const fetchData = function (url) { + return new Promise((resolve, reject) => { + const fs = require("fs"); + fs.readFile(url, (error, data) => { + if (error || !data) { + reject(new Error(error)); + return; + } + resolve(new Uint8Array(data)); + }); + }); +}; +class NodeCanvasFactory extends _base_factory.BaseCanvasFactory { + _createCanvas(width, height) { + const Canvas = require("canvas"); + return Canvas.createCanvas(width, height); + } +} +exports.NodeCanvasFactory = NodeCanvasFactory; +class NodeCMapReaderFactory extends _base_factory.BaseCMapReaderFactory { + _fetchData(url, compressionType) { + return fetchData(url).then(data => { + return { + cMapData: data, + compressionType + }; + }); + } +} +exports.NodeCMapReaderFactory = NodeCMapReaderFactory; +class NodeStandardFontDataFactory extends _base_factory.BaseStandardFontDataFactory { + _fetchData(url) { + return fetchData(url); + } +} +exports.NodeStandardFontDataFactory = NodeStandardFontDataFactory; + +/***/ }), +/* 151 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.TextLayerRenderTask = void 0; +exports.renderTextLayer = renderTextLayer; +exports.updateTextLayer = updateTextLayer; +var _util = __w_pdfjs_require__(1); +var _display_utils = __w_pdfjs_require__(137); +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +const DEFAULT_FONT_ASCENT = 0.8; +const ascentCache = new Map(); +function getCtx(size, isOffscreenCanvasSupported) { + let ctx; + if (isOffscreenCanvasSupported && _util.FeatureTest.isOffscreenCanvasSupported) { + ctx = new OffscreenCanvas(size, size).getContext("2d", { + alpha: false + }); + } else { + const canvas = document.createElement("canvas"); + canvas.width = canvas.height = size; + ctx = canvas.getContext("2d", { + alpha: false + }); + } + return ctx; +} +function getAscent(fontFamily, isOffscreenCanvasSupported) { + const cachedAscent = ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = getCtx(DEFAULT_FONT_SIZE, isOffscreenCanvasSupported); + ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`; + const metrics = ctx.measureText(""); + let ascent = metrics.fontBoundingBoxAscent; + let descent = Math.abs(metrics.fontBoundingBoxDescent); + if (ascent) { + const ratio = ascent / (ascent + descent); + ascentCache.set(fontFamily, ratio); + ctx.canvas.width = ctx.canvas.height = 0; + return ratio; + } + ctx.strokeStyle = "red"; + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("g", 0, 0); + let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + descent = 0; + for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) { + if (pixels[i] > 0) { + descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); + ctx.strokeText("A", 0, DEFAULT_FONT_SIZE); + pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; + ascent = 0; + for (let i = 0, ii = pixels.length; i < ii; i += 4) { + if (pixels[i] > 0) { + ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE); + break; + } + } + ctx.canvas.width = ctx.canvas.height = 0; + if (ascent) { + const ratio = ascent / (ascent + descent); + ascentCache.set(fontFamily, ratio); + return ratio; + } + ascentCache.set(fontFamily, DEFAULT_FONT_ASCENT); + return DEFAULT_FONT_ASCENT; +} +function appendText(task, geom, styles) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + task._textDivs.push(textDiv); + const tx = _util.Util.transform(task._transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = styles[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * getAscent(style.fontFamily, task._isOffscreenCanvasSupported); + let left, top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + fontAscent * Math.sin(angle); + top = tx[5] - fontAscent * Math.cos(angle); + } + const scaleFactorStr = "calc(var(--scale-factor)*"; + const divStyle = textDiv.style; + if (task._container === task._rootContainer) { + divStyle.left = `${(100 * left / task._pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / task._pageHeight).toFixed(2)}%`; + } else { + divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; + divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; + } + divStyle.fontSize = `${scaleFactorStr}${fontHeight.toFixed(2)}px)`; + divStyle.fontFamily = style.fontFamily; + textDivProperties.fontSize = fontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (task._fontInspectorEnabled) { + textDiv.dataset.fontName = geom.fontName; + } + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); + } + let shouldScaleText = false; + if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { + shouldScaleText = true; + } + } + if (shouldScaleText) { + textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + } + task._textDivProperties.set(textDiv, textDivProperties); + if (task._isReadableStream) { + task._layoutText(textDiv); + } +} +function layout(params) { + const { + div, + scale, + properties, + ctx, + prevFontSize, + prevFontFamily + } = params; + const { + style + } = div; + let transform = ""; + if (properties.canvasWidth !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const { + canvasWidth, + fontSize + } = properties; + if (prevFontSize !== fontSize || prevFontFamily !== fontFamily) { + ctx.font = `${fontSize * scale}px ${fontFamily}`; + params.prevFontSize = fontSize; + params.prevFontFamily = fontFamily; + } + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + transform = `scaleX(${canvasWidth * scale / width})`; + } + } + if (properties.angle !== 0) { + transform = `rotate(${properties.angle}deg) ${transform}`; + } + if (transform.length > 0) { + style.transform = transform; + } +} +function render(task) { + if (task._canceled) { + return; + } + const textDivs = task._textDivs; + const capability = task._capability; + const textDivsLength = textDivs.length; + if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { + capability.resolve(); + return; + } + if (!task._isReadableStream) { + for (const textDiv of textDivs) { + task._layoutText(textDiv); + } + } + capability.resolve(); +} +class TextLayerRenderTask { + constructor(_ref) { + var _globalThis$FontInspe; + let { + textContentSource, + container, + viewport, + textDivs, + textDivProperties, + textContentItemsStr, + isOffscreenCanvasSupported + } = _ref; + this._textContentSource = textContentSource; + this._isReadableStream = textContentSource instanceof ReadableStream; + this._container = this._rootContainer = container; + this._textDivs = textDivs || []; + this._textContentItemsStr = textContentItemsStr || []; + this._fontInspectorEnabled = !!((_globalThis$FontInspe = globalThis.FontInspector) !== null && _globalThis$FontInspe !== void 0 && _globalThis$FontInspe.enabled); + this._reader = null; + this._textDivProperties = textDivProperties || new WeakMap(); + this._canceled = false; + this._capability = (0, _util.createPromiseCapability)(); + this._layoutTextParams = { + prevFontSize: null, + prevFontFamily: null, + div: null, + scale: viewport.scale * (globalThis.devicePixelRatio || 1), + properties: null, + ctx: getCtx(0, isOffscreenCanvasSupported) + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this._transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this._pageWidth = pageWidth; + this._pageHeight = pageHeight; + (0, _display_utils.setLayerDimensions)(container, viewport); + this._capability.promise.finally(() => { + this._layoutTextParams = null; + }).catch(() => {}); + } + get promise() { + return this._capability.promise; + } + cancel() { + this._canceled = true; + if (this._reader) { + this._reader.cancel(new _util.AbortException("TextLayer task cancelled.")).catch(() => {}); + this._reader = null; + } + this._capability.reject(new _util.AbortException("TextLayer task cancelled.")); + } + _processItems(items, styleCache) { + for (const item of items) { + if (item.str === undefined) { + if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { + const parent = this._container; + this._container = document.createElement("span"); + this._container.classList.add("markedContent"); + if (item.id !== null) { + this._container.setAttribute("id", `${item.id}`); + } + parent.append(this._container); + } else if (item.type === "endMarkedContent") { + this._container = this._container.parentNode; + } + continue; + } + this._textContentItemsStr.push(item.str); + appendText(this, item, styleCache); + } + } + _layoutText(textDiv) { + const textDivProperties = this._layoutTextParams.properties = this._textDivProperties.get(textDiv); + this._layoutTextParams.div = textDiv; + layout(this._layoutTextParams); + if (textDivProperties.hasText) { + this._container.append(textDiv); + } + if (textDivProperties.hasEOL) { + const br = document.createElement("br"); + br.setAttribute("role", "presentation"); + this._container.append(br); + } + } + _render() { + const capability = (0, _util.createPromiseCapability)(); + let styleCache = Object.create(null); + if (this._isReadableStream) { + const pump = () => { + this._reader.read().then(_ref2 => { + let { + value, + done + } = _ref2; + if (done) { + capability.resolve(); + return; + } + Object.assign(styleCache, value.styles); + this._processItems(value.items, styleCache); + pump(); + }, capability.reject); + }; + this._reader = this._textContentSource.getReader(); + pump(); + } else if (this._textContentSource) { + const { + items, + styles + } = this._textContentSource; + this._processItems(items, styles); + capability.resolve(); + } else { + throw new Error('No "textContentSource" parameter specified.'); + } + capability.promise.then(() => { + styleCache = null; + render(this); + }, this._capability.reject); + } +} +exports.TextLayerRenderTask = TextLayerRenderTask; +function renderTextLayer(params) { + if (!params.textContentSource && (params.textContent || params.textContentStream)) { + (0, _display_utils.deprecated)("The TextLayerRender `textContent`/`textContentStream` parameters " + "will be removed in the future, please use `textContentSource` instead."); + params.textContentSource = params.textContent || params.textContentStream; + } + const task = new TextLayerRenderTask(params); + task._render(); + return task; +} +function updateTextLayer(_ref3) { + let { + container, + viewport, + textDivs, + textDivProperties, + isOffscreenCanvasSupported, + mustRotate = true, + mustRescale = true + } = _ref3; + if (mustRotate) { + (0, _display_utils.setLayerDimensions)(container, { + rotation: viewport.rotation + }); + } + if (mustRescale) { + const ctx = getCtx(0, isOffscreenCanvasSupported); + const scale = viewport.scale * (globalThis.devicePixelRatio || 1); + const params = { + prevFontSize: null, + prevFontFamily: null, + div: null, + scale, + properties: null, + ctx + }; + for (const div of textDivs) { + params.properties = textDivProperties.get(div); + params.div = div; + layout(params); + } + } +} + +/***/ }), +/* 152 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.AnnotationEditorLayer = void 0; +var _util = __w_pdfjs_require__(1); +var _tools = __w_pdfjs_require__(136); +var _freetext = __w_pdfjs_require__(153); +var _ink = __w_pdfjs_require__(154); +var _display_utils = __w_pdfjs_require__(137); +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +var _accessibilityManager = /*#__PURE__*/new WeakMap(); +var _allowClick = /*#__PURE__*/new WeakMap(); +var _boundPointerup = /*#__PURE__*/new WeakMap(); +var _boundPointerdown = /*#__PURE__*/new WeakMap(); +var _editors = /*#__PURE__*/new WeakMap(); +var _hadPointerDown = /*#__PURE__*/new WeakMap(); +var _isCleaningUp = /*#__PURE__*/new WeakMap(); +var _uiManager = /*#__PURE__*/new WeakMap(); +var _changeParent = /*#__PURE__*/new WeakSet(); +var _createNewEditor = /*#__PURE__*/new WeakSet(); +var _createAndAddNewEditor = /*#__PURE__*/new WeakSet(); +var _cleanup = /*#__PURE__*/new WeakSet(); +class AnnotationEditorLayer { + constructor(options) { + _classPrivateMethodInitSpec(this, _cleanup); + _classPrivateMethodInitSpec(this, _createAndAddNewEditor); + _classPrivateMethodInitSpec(this, _createNewEditor); + _classPrivateMethodInitSpec(this, _changeParent); + _classPrivateFieldInitSpec(this, _accessibilityManager, { + writable: true, + value: void 0 + }); + _classPrivateFieldInitSpec(this, _allowClick, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _boundPointerup, { + writable: true, + value: this.pointerup.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundPointerdown, { + writable: true, + value: this.pointerdown.bind(this) + }); + _classPrivateFieldInitSpec(this, _editors, { + writable: true, + value: new Map() + }); + _classPrivateFieldInitSpec(this, _hadPointerDown, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _isCleaningUp, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _uiManager, { + writable: true, + value: void 0 + }); + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + _freetext.FreeTextEditor.initialize(options.l10n); + _ink.InkEditor.initialize(options.l10n); + } + options.uiManager.registerEditorTypes([_freetext.FreeTextEditor, _ink.InkEditor]); + _classPrivateFieldSet(this, _uiManager, options.uiManager); + this.pageIndex = options.pageIndex; + this.div = options.div; + _classPrivateFieldSet(this, _accessibilityManager, options.accessibilityManager); + _classPrivateFieldGet(this, _uiManager).addLayer(this); + } + updateToolbar(mode) { + _classPrivateFieldGet(this, _uiManager).updateToolbar(mode); + } + updateMode() { + let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _classPrivateFieldGet(this, _uiManager).getMode(); + _classPrivateMethodGet(this, _cleanup, _cleanup2).call(this); + if (mode === _util.AnnotationEditorType.INK) { + this.addInkEditorIfNeeded(false); + this.disableClick(); + } else { + this.enableClick(); + } + _classPrivateFieldGet(this, _uiManager).unselectAll(); + this.div.classList.toggle("freeTextEditing", mode === _util.AnnotationEditorType.FREETEXT); + this.div.classList.toggle("inkEditing", mode === _util.AnnotationEditorType.INK); + } + addInkEditorIfNeeded(isCommitting) { + if (!isCommitting && _classPrivateFieldGet(this, _uiManager).getMode() !== _util.AnnotationEditorType.INK) { + return; + } + if (!isCommitting) { + for (const editor of _classPrivateFieldGet(this, _editors).values()) { + if (editor.isEmpty()) { + editor.setInBackground(); + return; + } + } + } + const editor = _classPrivateMethodGet(this, _createAndAddNewEditor, _createAndAddNewEditor2).call(this, { + offsetX: 0, + offsetY: 0 + }); + editor.setInBackground(); + } + setEditingState(isEditing) { + _classPrivateFieldGet(this, _uiManager).setEditingState(isEditing); + } + addCommands(params) { + _classPrivateFieldGet(this, _uiManager).addCommands(params); + } + enable() { + this.div.style.pointerEvents = "auto"; + for (const editor of _classPrivateFieldGet(this, _editors).values()) { + editor.enableEditing(); + } + } + disable() { + this.div.style.pointerEvents = "none"; + for (const editor of _classPrivateFieldGet(this, _editors).values()) { + editor.disableEditing(); + } + } + setActiveEditor(editor) { + const currentActive = _classPrivateFieldGet(this, _uiManager).getActive(); + if (currentActive === editor) { + return; + } + _classPrivateFieldGet(this, _uiManager).setActiveEditor(editor); + } + enableClick() { + this.div.addEventListener("pointerdown", _classPrivateFieldGet(this, _boundPointerdown)); + this.div.addEventListener("pointerup", _classPrivateFieldGet(this, _boundPointerup)); + } + disableClick() { + this.div.removeEventListener("pointerdown", _classPrivateFieldGet(this, _boundPointerdown)); + this.div.removeEventListener("pointerup", _classPrivateFieldGet(this, _boundPointerup)); + } + attach(editor) { + _classPrivateFieldGet(this, _editors).set(editor.id, editor); + } + detach(editor) { + var _classPrivateFieldGet2; + _classPrivateFieldGet(this, _editors).delete(editor.id); + (_classPrivateFieldGet2 = _classPrivateFieldGet(this, _accessibilityManager)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.removePointerInTextLayer(editor.contentDiv); + } + remove(editor) { + _classPrivateFieldGet(this, _uiManager).removeEditor(editor); + this.detach(editor); + editor.div.style.display = "none"; + setTimeout(() => { + editor.div.style.display = ""; + editor.div.remove(); + editor.isAttachedToDOM = false; + if (document.activeElement === document.body) { + _classPrivateFieldGet(this, _uiManager).focusMainContainer(); + } + }, 0); + if (!_classPrivateFieldGet(this, _isCleaningUp)) { + this.addInkEditorIfNeeded(false); + } + } + add(editor) { + _classPrivateMethodGet(this, _changeParent, _changeParent2).call(this, editor); + _classPrivateFieldGet(this, _uiManager).addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + this.moveEditorInDOM(editor); + editor.onceAdded(); + _classPrivateFieldGet(this, _uiManager).addToAnnotationStorage(editor); + } + moveEditorInDOM(editor) { + var _classPrivateFieldGet3; + (_classPrivateFieldGet3 = _classPrivateFieldGet(this, _accessibilityManager)) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.rebuild(); + } else { + this.add(editor); + } + } + addANewEditor(editor) { + const cmd = () => { + this.addOrRebuild(editor); + }; + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + addUndoableEditor(editor) { + const cmd = () => { + this.addOrRebuild(editor); + }; + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getNextId() { + return _classPrivateFieldGet(this, _uiManager).getId(); + } + deserialize(data) { + switch (data.annotationType) { + case _util.AnnotationEditorType.FREETEXT: + return _freetext.FreeTextEditor.deserialize(data, this, _classPrivateFieldGet(this, _uiManager)); + case _util.AnnotationEditorType.INK: + return _ink.InkEditor.deserialize(data, this, _classPrivateFieldGet(this, _uiManager)); + } + return null; + } + setSelected(editor) { + _classPrivateFieldGet(this, _uiManager).setSelected(editor); + } + toggleSelected(editor) { + _classPrivateFieldGet(this, _uiManager).toggleSelected(editor); + } + isSelected(editor) { + return _classPrivateFieldGet(this, _uiManager).isSelected(editor); + } + unselect(editor) { + _classPrivateFieldGet(this, _uiManager).unselect(editor); + } + pointerup(event) { + const { + isMac + } = _util.FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + if (!_classPrivateFieldGet(this, _hadPointerDown)) { + return; + } + _classPrivateFieldSet(this, _hadPointerDown, false); + if (!_classPrivateFieldGet(this, _allowClick)) { + _classPrivateFieldSet(this, _allowClick, true); + return; + } + _classPrivateMethodGet(this, _createAndAddNewEditor, _createAndAddNewEditor2).call(this, event); + } + pointerdown(event) { + const { + isMac + } = _util.FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + _classPrivateFieldSet(this, _hadPointerDown, true); + const editor = _classPrivateFieldGet(this, _uiManager).getActive(); + _classPrivateFieldSet(this, _allowClick, !editor || editor.isEmpty()); + } + drop(event) { + const id = event.dataTransfer.getData("text/plain"); + const editor = _classPrivateFieldGet(this, _uiManager).getEditor(id); + if (!editor) { + return; + } + event.preventDefault(); + event.dataTransfer.dropEffect = "move"; + _classPrivateMethodGet(this, _changeParent, _changeParent2).call(this, editor); + const rect = this.div.getBoundingClientRect(); + const endX = event.clientX - rect.x; + const endY = event.clientY - rect.y; + editor.translate(endX - editor.startX, endY - editor.startY); + this.moveEditorInDOM(editor); + editor.div.focus(); + } + dragover(event) { + event.preventDefault(); + } + destroy() { + var _classPrivateFieldGet4; + if (((_classPrivateFieldGet4 = _classPrivateFieldGet(this, _uiManager).getActive()) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.parent) === this) { + _classPrivateFieldGet(this, _uiManager).setActiveEditor(null); + } + for (const editor of _classPrivateFieldGet(this, _editors).values()) { + var _classPrivateFieldGet5; + (_classPrivateFieldGet5 = _classPrivateFieldGet(this, _accessibilityManager)) === null || _classPrivateFieldGet5 === void 0 ? void 0 : _classPrivateFieldGet5.removePointerInTextLayer(editor.contentDiv); + editor.setParent(null); + editor.isAttachedToDOM = false; + editor.div.remove(); + } + this.div = null; + _classPrivateFieldGet(this, _editors).clear(); + _classPrivateFieldGet(this, _uiManager).removeLayer(this); + } + render(_ref) { + let { + viewport + } = _ref; + this.viewport = viewport; + (0, _display_utils.setLayerDimensions)(this.div, viewport); + (0, _tools.bindEvents)(this, this.div, ["dragover", "drop"]); + for (const editor of _classPrivateFieldGet(this, _uiManager).getEditors(this.pageIndex)) { + this.add(editor); + } + this.updateMode(); + } + update(_ref2) { + let { + viewport + } = _ref2; + _classPrivateFieldGet(this, _uiManager).commitOrRemove(); + this.viewport = viewport; + (0, _display_utils.setLayerDimensions)(this.div, { + rotation: viewport.rotation + }); + this.updateMode(); + } + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; + } +} +exports.AnnotationEditorLayer = AnnotationEditorLayer; +function _changeParent2(editor) { + var _editor$parent; + if (editor.parent === this) { + return; + } + this.attach(editor); + (_editor$parent = editor.parent) === null || _editor$parent === void 0 ? void 0 : _editor$parent.detach(editor); + editor.setParent(this); + if (editor.div && editor.isAttachedToDOM) { + editor.div.remove(); + this.div.append(editor.div); + } +} +function _createNewEditor2(params) { + switch (_classPrivateFieldGet(this, _uiManager).getMode()) { + case _util.AnnotationEditorType.FREETEXT: + return new _freetext.FreeTextEditor(params); + case _util.AnnotationEditorType.INK: + return new _ink.InkEditor(params); + } + return null; +} +function _createAndAddNewEditor2(event) { + const id = this.getNextId(); + const editor = _classPrivateMethodGet(this, _createNewEditor, _createNewEditor2).call(this, { + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: _classPrivateFieldGet(this, _uiManager) + }); + if (editor) { + this.add(editor); + } + return editor; +} +function _cleanup2() { + _classPrivateFieldSet(this, _isCleaningUp, true); + for (const editor of _classPrivateFieldGet(this, _editors).values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } + _classPrivateFieldSet(this, _isCleaningUp, false); +} +_defineProperty(AnnotationEditorLayer, "_initialized", false); + +/***/ }), +/* 153 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.FreeTextEditor = void 0; +var _util = __w_pdfjs_require__(1); +var _tools = __w_pdfjs_require__(136); +var _editor = __w_pdfjs_require__(135); +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +var _boundEditorDivBlur = /*#__PURE__*/new WeakMap(); +var _boundEditorDivFocus = /*#__PURE__*/new WeakMap(); +var _boundEditorDivInput = /*#__PURE__*/new WeakMap(); +var _boundEditorDivKeydown = /*#__PURE__*/new WeakMap(); +var _color = /*#__PURE__*/new WeakMap(); +var _content = /*#__PURE__*/new WeakMap(); +var _editorDivId = /*#__PURE__*/new WeakMap(); +var _hasAlreadyBeenCommitted = /*#__PURE__*/new WeakMap(); +var _fontSize = /*#__PURE__*/new WeakMap(); +var _updateFontSize = /*#__PURE__*/new WeakSet(); +var _updateColor = /*#__PURE__*/new WeakSet(); +var _extractText = /*#__PURE__*/new WeakSet(); +var _setEditorDimensions = /*#__PURE__*/new WeakSet(); +class FreeTextEditor extends _editor.AnnotationEditor { + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + _classPrivateMethodInitSpec(this, _setEditorDimensions); + _classPrivateMethodInitSpec(this, _extractText); + _classPrivateMethodInitSpec(this, _updateColor); + _classPrivateMethodInitSpec(this, _updateFontSize); + _classPrivateFieldInitSpec(this, _boundEditorDivBlur, { + writable: true, + value: this.editorDivBlur.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundEditorDivFocus, { + writable: true, + value: this.editorDivFocus.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundEditorDivInput, { + writable: true, + value: this.editorDivInput.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundEditorDivKeydown, { + writable: true, + value: this.editorDivKeydown.bind(this) + }); + _classPrivateFieldInitSpec(this, _color, { + writable: true, + value: void 0 + }); + _classPrivateFieldInitSpec(this, _content, { + writable: true, + value: "" + }); + _classPrivateFieldInitSpec(this, _editorDivId, { + writable: true, + value: `${this.id}-editor` + }); + _classPrivateFieldInitSpec(this, _hasAlreadyBeenCommitted, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _fontSize, { + writable: true, + value: void 0 + }); + _classPrivateFieldSet(this, _color, params.color || FreeTextEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor); + _classPrivateFieldSet(this, _fontSize, params.fontSize || FreeTextEditor._defaultFontSize); + } + static initialize(l10n) { + this._l10nPromise = new Map(["free_text2_default_content", "editor_free_text2_aria_label"].map(str => [str, l10n.get(str)])); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); + } + static updateDefaultParams(type, value) { + switch (type) { + case _util.AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case _util.AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; + } + } + updateParams(type, value) { + switch (type) { + case _util.AnnotationEditorParamsType.FREETEXT_SIZE: + _classPrivateMethodGet(this, _updateFontSize, _updateFontSize2).call(this, value); + break; + case _util.AnnotationEditorParamsType.FREETEXT_COLOR: + _classPrivateMethodGet(this, _updateColor, _updateColor2).call(this, value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[_util.AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [_util.AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor]]; + } + get propertiesToUpdate() { + return [[_util.AnnotationEditorParamsType.FREETEXT_SIZE, _classPrivateFieldGet(this, _fontSize)], [_util.AnnotationEditorParamsType.FREETEXT_COLOR, _classPrivateFieldGet(this, _color)]]; + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + _classPrivateFieldGet(this, _fontSize)) * scale]; + } + rebuild() { + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + enableEditMode() { + if (this.isInEditMode()) { + return; + } + this.parent.setEditingState(false); + this.parent.updateToolbar(_util.AnnotationEditorType.FREETEXT); + super.enableEditMode(); + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this.div.draggable = false; + this.div.removeAttribute("aria-activedescendant"); + this.editorDiv.addEventListener("keydown", _classPrivateFieldGet(this, _boundEditorDivKeydown)); + this.editorDiv.addEventListener("focus", _classPrivateFieldGet(this, _boundEditorDivFocus)); + this.editorDiv.addEventListener("blur", _classPrivateFieldGet(this, _boundEditorDivBlur)); + this.editorDiv.addEventListener("input", _classPrivateFieldGet(this, _boundEditorDivInput)); + } + disableEditMode() { + if (!this.isInEditMode()) { + return; + } + this.parent.setEditingState(true); + super.disableEditMode(); + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", _classPrivateFieldGet(this, _editorDivId)); + this.div.draggable = true; + this.editorDiv.removeEventListener("keydown", _classPrivateFieldGet(this, _boundEditorDivKeydown)); + this.editorDiv.removeEventListener("focus", _classPrivateFieldGet(this, _boundEditorDivFocus)); + this.editorDiv.removeEventListener("blur", _classPrivateFieldGet(this, _boundEditorDivBlur)); + this.editorDiv.removeEventListener("input", _classPrivateFieldGet(this, _boundEditorDivInput)); + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freeTextEditing"); + } + focusin(event) { + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } + } + onceAdded() { + if (this.width) { + return; + } + this.enableEditMode(); + this.editorDiv.focus(); + } + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + this.parent.setEditingState(true); + this.parent.div.classList.add("freeTextEditing"); + super.remove(); + } + commit() { + if (!this.isInEditMode()) { + return; + } + super.commit(); + if (!_classPrivateFieldGet(this, _hasAlreadyBeenCommitted)) { + _classPrivateFieldSet(this, _hasAlreadyBeenCommitted, true); + this.parent.addUndoableEditor(this); + } + this.disableEditMode(); + _classPrivateFieldSet(this, _content, _classPrivateMethodGet(this, _extractText, _extractText2).call(this).trimEnd()); + _classPrivateMethodGet(this, _setEditorDimensions, _setEditorDimensions2).call(this); + } + shouldGetKeyboardEvents() { + return this.isInEditMode(); + } + dblclick(event) { + this.enableEditMode(); + this.editorDiv.focus(); + } + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enableEditMode(); + this.editorDiv.focus(); + } + } + editorDivKeydown(event) { + FreeTextEditor._keyboardManager.exec(this, event); + } + editorDivFocus(event) { + this.isEditing = true; + } + editorDivBlur(event) { + this.isEditing = false; + } + editorDivInput(event) { + this.parent.div.classList.toggle("freeTextEditing", this.isEmpty()); + } + disableEditing() { + this.editorDiv.setAttribute("role", "comment"); + this.editorDiv.removeAttribute("aria-multiline"); + } + enableEditing() { + this.editorDiv.setAttribute("role", "textbox"); + this.editorDiv.setAttribute("aria-multiline", true); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", _classPrivateFieldGet(this, _editorDivId)); + this.enableEditing(); + FreeTextEditor._l10nPromise.get("editor_free_text2_aria_label").then(msg => { + var _this$editorDiv; + return (_this$editorDiv = this.editorDiv) === null || _this$editorDiv === void 0 ? void 0 : _this$editorDiv.setAttribute("aria-label", msg); + }); + FreeTextEditor._l10nPromise.get("free_text2_default_content").then(msg => { + var _this$editorDiv2; + return (_this$editorDiv2 = this.editorDiv) === null || _this$editorDiv2 === void 0 ? void 0 : _this$editorDiv2.setAttribute("default-content", msg); + }); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${_classPrivateFieldGet(this, _fontSize)}px * var(--scale-factor))`; + style.color = _classPrivateFieldGet(this, _color); + this.div.append(this.editorDiv); + this.overlayDiv = document.createElement("div"); + this.overlayDiv.classList.add("overlay", "enabled"); + this.div.append(this.overlayDiv); + (0, _tools.bindEvents)(this, this.div, ["dblclick", "keydown"]); + if (this.width) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + for (const line of _classPrivateFieldGet(this, _content).split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + this.editorDiv.append(div); + } + this.div.draggable = true; + this.editorDiv.contentEditable = false; + } else { + this.div.draggable = false; + this.editorDiv.contentEditable = true; + } + return this.div; + } + get contentDiv() { + return this.editorDiv; + } + static deserialize(data, parent, uiManager) { + const editor = super.deserialize(data, parent, uiManager); + _classPrivateFieldSet(editor, _fontSize, data.fontSize); + _classPrivateFieldSet(editor, _color, _util.Util.makeHexColor(...data.color)); + _classPrivateFieldSet(editor, _content, data.value); + return editor; + } + serialize() { + if (this.isEmpty()) { + return null; + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + const rect = this.getRect(padding, padding); + const color = _editor.AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : _classPrivateFieldGet(this, _color)); + return { + annotationType: _util.AnnotationEditorType.FREETEXT, + color, + fontSize: _classPrivateFieldGet(this, _fontSize), + value: _classPrivateFieldGet(this, _content), + pageIndex: this.pageIndex, + rect, + rotation: this.rotation + }; + } +} +exports.FreeTextEditor = FreeTextEditor; +function _updateFontSize2(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`; + this.translate(0, -(size - _classPrivateFieldGet(this, _fontSize)) * this.parentScale); + _classPrivateFieldSet(this, _fontSize, size); + _classPrivateMethodGet(this, _setEditorDimensions, _setEditorDimensions2).call(this); + }; + const savedFontsize = _classPrivateFieldGet(this, _fontSize); + this.addCommands({ + cmd: () => { + setFontsize(fontSize); + }, + undo: () => { + setFontsize(savedFontsize); + }, + mustExec: true, + type: _util.AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); +} +function _updateColor2(color) { + const savedColor = _classPrivateFieldGet(this, _color); + this.addCommands({ + cmd: () => { + _classPrivateFieldSet(this, _color, this.editorDiv.style.color = color); + }, + undo: () => { + _classPrivateFieldSet(this, _color, this.editorDiv.style.color = savedColor); + }, + mustExec: true, + type: _util.AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); +} +function _extractText2() { + const divs = this.editorDiv.getElementsByTagName("div"); + if (divs.length === 0) { + return this.editorDiv.innerText; + } + const buffer = []; + for (const div of divs) { + buffer.push(div.innerText.replace(/\r\n?|\n/, "")); + } + return buffer.join("\n"); +} +function _setEditorDimensions2() { + const [parentWidth, parentHeight] = this.parentDimensions; + let rect; + if (this.isAttachedToDOM) { + rect = this.div.getBoundingClientRect(); + } else { + const { + currentLayer, + div + } = this; + const savedDisplay = div.style.display; + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + } + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; +} +_defineProperty(FreeTextEditor, "_freeTextDefaultContent", ""); +_defineProperty(FreeTextEditor, "_l10nPromise", void 0); +_defineProperty(FreeTextEditor, "_internalPadding", 0); +_defineProperty(FreeTextEditor, "_defaultColor", null); +_defineProperty(FreeTextEditor, "_defaultFontSize", 10); +_defineProperty(FreeTextEditor, "_keyboardManager", new _tools.KeyboardManager([[["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], FreeTextEditor.prototype.commitOrRemove]])); +_defineProperty(FreeTextEditor, "_type", "freetext"); + +/***/ }), +/* 154 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.InkEditor = void 0; +Object.defineProperty(exports, "fitCurve", ({ + enumerable: true, + get: function () { + return _pdfjsFitCurve.fitCurve; + } +})); +var _util = __w_pdfjs_require__(1); +var _editor = __w_pdfjs_require__(135); +var _pdfjsFitCurve = __w_pdfjs_require__(155); +var _tools = __w_pdfjs_require__(136); +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classStaticPrivateMethodGet(receiver, classConstructor, method) { _classCheckPrivateStaticAccess(receiver, classConstructor); return method; } +function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } } +function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } +function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } +function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } +function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +const RESIZER_SIZE = 16; +const TIME_TO_WAIT_BEFORE_FIXING_DIMS = 100; +var _aspectRatio = /*#__PURE__*/new WeakMap(); +var _baseHeight = /*#__PURE__*/new WeakMap(); +var _baseWidth = /*#__PURE__*/new WeakMap(); +var _boundCanvasPointermove = /*#__PURE__*/new WeakMap(); +var _boundCanvasPointerleave = /*#__PURE__*/new WeakMap(); +var _boundCanvasPointerup = /*#__PURE__*/new WeakMap(); +var _boundCanvasPointerdown = /*#__PURE__*/new WeakMap(); +var _disableEditing = /*#__PURE__*/new WeakMap(); +var _isCanvasInitialized = /*#__PURE__*/new WeakMap(); +var _lastPoint = /*#__PURE__*/new WeakMap(); +var _observer = /*#__PURE__*/new WeakMap(); +var _realWidth = /*#__PURE__*/new WeakMap(); +var _realHeight = /*#__PURE__*/new WeakMap(); +var _requestFrameCallback = /*#__PURE__*/new WeakMap(); +var _updateThickness = /*#__PURE__*/new WeakSet(); +var _updateColor = /*#__PURE__*/new WeakSet(); +var _updateOpacity = /*#__PURE__*/new WeakSet(); +var _getInitialBBox = /*#__PURE__*/new WeakSet(); +var _setStroke = /*#__PURE__*/new WeakSet(); +var _startDrawing = /*#__PURE__*/new WeakSet(); +var _draw = /*#__PURE__*/new WeakSet(); +var _stopDrawing = /*#__PURE__*/new WeakSet(); +var _redraw = /*#__PURE__*/new WeakSet(); +var _endDrawing = /*#__PURE__*/new WeakSet(); +var _createCanvas = /*#__PURE__*/new WeakSet(); +var _createObserver = /*#__PURE__*/new WeakSet(); +var _setCanvasDims = /*#__PURE__*/new WeakSet(); +var _setScaleFactor = /*#__PURE__*/new WeakSet(); +var _updateTransform = /*#__PURE__*/new WeakSet(); +var _serializePaths = /*#__PURE__*/new WeakSet(); +var _extractPointsOnBezier = /*#__PURE__*/new WeakSet(); +var _isAlmostFlat = /*#__PURE__*/new WeakSet(); +var _getBbox = /*#__PURE__*/new WeakSet(); +var _getPadding = /*#__PURE__*/new WeakSet(); +var _fitToContent = /*#__PURE__*/new WeakSet(); +var _setMinDims = /*#__PURE__*/new WeakSet(); +class InkEditor extends _editor.AnnotationEditor { + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + _classPrivateMethodInitSpec(this, _setMinDims); + _classPrivateMethodInitSpec(this, _fitToContent); + _classPrivateMethodInitSpec(this, _getPadding); + _classPrivateMethodInitSpec(this, _getBbox); + _classPrivateMethodInitSpec(this, _isAlmostFlat); + _classPrivateMethodInitSpec(this, _extractPointsOnBezier); + _classPrivateMethodInitSpec(this, _serializePaths); + _classPrivateMethodInitSpec(this, _updateTransform); + _classPrivateMethodInitSpec(this, _setScaleFactor); + _classPrivateMethodInitSpec(this, _setCanvasDims); + _classPrivateMethodInitSpec(this, _createObserver); + _classPrivateMethodInitSpec(this, _createCanvas); + _classPrivateMethodInitSpec(this, _endDrawing); + _classPrivateMethodInitSpec(this, _redraw); + _classPrivateMethodInitSpec(this, _stopDrawing); + _classPrivateMethodInitSpec(this, _draw); + _classPrivateMethodInitSpec(this, _startDrawing); + _classPrivateMethodInitSpec(this, _setStroke); + _classPrivateMethodInitSpec(this, _getInitialBBox); + _classPrivateMethodInitSpec(this, _updateOpacity); + _classPrivateMethodInitSpec(this, _updateColor); + _classPrivateMethodInitSpec(this, _updateThickness); + _classPrivateFieldInitSpec(this, _aspectRatio, { + writable: true, + value: 0 + }); + _classPrivateFieldInitSpec(this, _baseHeight, { + writable: true, + value: 0 + }); + _classPrivateFieldInitSpec(this, _baseWidth, { + writable: true, + value: 0 + }); + _classPrivateFieldInitSpec(this, _boundCanvasPointermove, { + writable: true, + value: this.canvasPointermove.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundCanvasPointerleave, { + writable: true, + value: this.canvasPointerleave.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundCanvasPointerup, { + writable: true, + value: this.canvasPointerup.bind(this) + }); + _classPrivateFieldInitSpec(this, _boundCanvasPointerdown, { + writable: true, + value: this.canvasPointerdown.bind(this) + }); + _classPrivateFieldInitSpec(this, _disableEditing, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _isCanvasInitialized, { + writable: true, + value: false + }); + _classPrivateFieldInitSpec(this, _lastPoint, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _observer, { + writable: true, + value: null + }); + _classPrivateFieldInitSpec(this, _realWidth, { + writable: true, + value: 0 + }); + _classPrivateFieldInitSpec(this, _realHeight, { + writable: true, + value: 0 + }); + _classPrivateFieldInitSpec(this, _requestFrameCallback, { + writable: true, + value: null + }); + this.color = params.color || null; + this.thickness = params.thickness || null; + this.opacity = params.opacity || null; + this.paths = []; + this.bezierPath2D = []; + this.currentPath = []; + this.scaleFactor = 1; + this.translationX = this.translationY = 0; + this.x = 0; + this.y = 0; + } + static initialize(l10n) { + this._l10nPromise = new Map(["editor_ink_canvas_aria_label", "editor_ink2_aria_label"].map(str => [str, l10n.get(str)])); + } + static updateDefaultParams(type, value) { + switch (type) { + case _util.AnnotationEditorParamsType.INK_THICKNESS: + InkEditor._defaultThickness = value; + break; + case _util.AnnotationEditorParamsType.INK_COLOR: + InkEditor._defaultColor = value; + break; + case _util.AnnotationEditorParamsType.INK_OPACITY: + InkEditor._defaultOpacity = value / 100; + break; + } + } + updateParams(type, value) { + switch (type) { + case _util.AnnotationEditorParamsType.INK_THICKNESS: + _classPrivateMethodGet(this, _updateThickness, _updateThickness2).call(this, value); + break; + case _util.AnnotationEditorParamsType.INK_COLOR: + _classPrivateMethodGet(this, _updateColor, _updateColor2).call(this, value); + break; + case _util.AnnotationEditorParamsType.INK_OPACITY: + _classPrivateMethodGet(this, _updateOpacity, _updateOpacity2).call(this, value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[_util.AnnotationEditorParamsType.INK_THICKNESS, InkEditor._defaultThickness], [_util.AnnotationEditorParamsType.INK_COLOR, InkEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor], [_util.AnnotationEditorParamsType.INK_OPACITY, Math.round(InkEditor._defaultOpacity * 100)]]; + } + get propertiesToUpdate() { + return [[_util.AnnotationEditorParamsType.INK_THICKNESS, this.thickness || InkEditor._defaultThickness], [_util.AnnotationEditorParamsType.INK_COLOR, this.color || InkEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor], [_util.AnnotationEditorParamsType.INK_OPACITY, Math.round(100 * (this.opacity ?? InkEditor._defaultOpacity))]]; + } + rebuild() { + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.canvas) { + _classPrivateMethodGet(this, _createCanvas, _createCanvas2).call(this); + _classPrivateMethodGet(this, _createObserver, _createObserver2).call(this); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + _classPrivateMethodGet(this, _setCanvasDims, _setCanvasDims2).call(this); + } + _classPrivateMethodGet(this, _fitToContent, _fitToContent2).call(this); + } + remove() { + if (this.canvas === null) { + return; + } + if (!this.isEmpty()) { + this.commit(); + } + this.canvas.width = this.canvas.height = 0; + this.canvas.remove(); + this.canvas = null; + _classPrivateFieldGet(this, _observer).disconnect(); + _classPrivateFieldSet(this, _observer, null); + super.remove(); + } + setParent(parent) { + if (!this.parent && parent) { + this._uiManager.removeShouldRescale(this); + } else if (this.parent && parent === null) { + this._uiManager.addShouldRescale(this); + } + super.setParent(parent); + } + onScaleChanging() { + const [parentWidth, parentHeight] = this.parentDimensions; + const width = this.width * parentWidth; + const height = this.height * parentHeight; + this.setDimensions(width, height); + } + enableEditMode() { + if (_classPrivateFieldGet(this, _disableEditing) || this.canvas === null) { + return; + } + super.enableEditMode(); + this.div.draggable = false; + this.canvas.addEventListener("pointerdown", _classPrivateFieldGet(this, _boundCanvasPointerdown)); + this.canvas.addEventListener("pointerup", _classPrivateFieldGet(this, _boundCanvasPointerup)); + } + disableEditMode() { + if (!this.isInEditMode() || this.canvas === null) { + return; + } + super.disableEditMode(); + this.div.draggable = !this.isEmpty(); + this.div.classList.remove("editing"); + this.canvas.removeEventListener("pointerdown", _classPrivateFieldGet(this, _boundCanvasPointerdown)); + this.canvas.removeEventListener("pointerup", _classPrivateFieldGet(this, _boundCanvasPointerup)); + } + onceAdded() { + this.div.draggable = !this.isEmpty(); + } + isEmpty() { + return this.paths.length === 0 || this.paths.length === 1 && this.paths[0].length === 0; + } + commit() { + if (_classPrivateFieldGet(this, _disableEditing)) { + return; + } + super.commit(); + this.isEditing = false; + this.disableEditMode(); + this.setInForeground(); + _classPrivateFieldSet(this, _disableEditing, true); + this.div.classList.add("disabled"); + _classPrivateMethodGet(this, _fitToContent, _fitToContent2).call(this, true); + this.parent.addInkEditorIfNeeded(true); + this.parent.moveEditorInDOM(this); + this.div.focus({ + preventScroll: true + }); + } + focusin(event) { + super.focusin(event); + this.enableEditMode(); + } + canvasPointerdown(event) { + if (event.button !== 0 || !this.isInEditMode() || _classPrivateFieldGet(this, _disableEditing)) { + return; + } + this.setInForeground(); + if (event.type !== "mouse") { + this.div.focus(); + } + event.stopPropagation(); + this.canvas.addEventListener("pointerleave", _classPrivateFieldGet(this, _boundCanvasPointerleave)); + this.canvas.addEventListener("pointermove", _classPrivateFieldGet(this, _boundCanvasPointermove)); + _classPrivateMethodGet(this, _startDrawing, _startDrawing2).call(this, event.offsetX, event.offsetY); + } + canvasPointermove(event) { + event.stopPropagation(); + _classPrivateMethodGet(this, _draw, _draw2).call(this, event.offsetX, event.offsetY); + } + canvasPointerup(event) { + if (event.button !== 0) { + return; + } + if (this.isInEditMode() && this.currentPath.length !== 0) { + event.stopPropagation(); + _classPrivateMethodGet(this, _endDrawing, _endDrawing2).call(this, event); + this.setInBackground(); + } + } + canvasPointerleave(event) { + _classPrivateMethodGet(this, _endDrawing, _endDrawing2).call(this, event); + this.setInBackground(); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this.width) { + baseX = this.x; + baseY = this.y; + } + super.render(); + InkEditor._l10nPromise.get("editor_ink2_aria_label").then(msg => { + var _this$div; + return (_this$div = this.div) === null || _this$div === void 0 ? void 0 : _this$div.setAttribute("aria-label", msg); + }); + const [x, y, w, h] = _classPrivateMethodGet(this, _getInitialBBox, _getInitialBBox2).call(this); + this.setAt(x, y, 0, 0); + this.setDims(w, h); + _classPrivateMethodGet(this, _createCanvas, _createCanvas2).call(this); + if (this.width) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + _classPrivateFieldSet(this, _isCanvasInitialized, true); + _classPrivateMethodGet(this, _setCanvasDims, _setCanvasDims2).call(this); + this.setDims(this.width * parentWidth, this.height * parentHeight); + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + _classPrivateMethodGet(this, _setMinDims, _setMinDims2).call(this); + this.div.classList.add("disabled"); + } else { + this.div.classList.add("editing"); + this.enableEditMode(); + } + _classPrivateMethodGet(this, _createObserver, _createObserver2).call(this); + return this.div; + } + setDimensions(width, height) { + const roundedWidth = Math.round(width); + const roundedHeight = Math.round(height); + if (_classPrivateFieldGet(this, _realWidth) === roundedWidth && _classPrivateFieldGet(this, _realHeight) === roundedHeight) { + return; + } + _classPrivateFieldSet(this, _realWidth, roundedWidth); + _classPrivateFieldSet(this, _realHeight, roundedHeight); + this.canvas.style.visibility = "hidden"; + if (_classPrivateFieldGet(this, _aspectRatio) && Math.abs(_classPrivateFieldGet(this, _aspectRatio) - width / height) > 1e-2) { + height = Math.ceil(width / _classPrivateFieldGet(this, _aspectRatio)); + this.setDims(width, height); + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.width = width / parentWidth; + this.height = height / parentHeight; + if (_classPrivateFieldGet(this, _disableEditing)) { + _classPrivateMethodGet(this, _setScaleFactor, _setScaleFactor2).call(this, width, height); + } + _classPrivateMethodGet(this, _setCanvasDims, _setCanvasDims2).call(this); + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + this.canvas.style.visibility = "visible"; + } + static deserialize(data, parent, uiManager) { + const editor = super.deserialize(data, parent, uiManager); + editor.thickness = data.thickness; + editor.color = _util.Util.makeHexColor(...data.color); + editor.opacity = data.opacity; + const [pageWidth, pageHeight] = editor.pageDimensions; + const width = editor.width * pageWidth; + const height = editor.height * pageHeight; + const scaleFactor = editor.parentScale; + const padding = data.thickness / 2; + _classPrivateFieldSet(editor, _aspectRatio, width / height); + _classPrivateFieldSet(editor, _disableEditing, true); + _classPrivateFieldSet(editor, _realWidth, Math.round(width)); + _classPrivateFieldSet(editor, _realHeight, Math.round(height)); + for (const { + bezier + } of data.paths) { + const path = []; + editor.paths.push(path); + let p0 = scaleFactor * (bezier[0] - padding); + let p1 = scaleFactor * (height - bezier[1] - padding); + for (let i = 2, ii = bezier.length; i < ii; i += 6) { + const p10 = scaleFactor * (bezier[i] - padding); + const p11 = scaleFactor * (height - bezier[i + 1] - padding); + const p20 = scaleFactor * (bezier[i + 2] - padding); + const p21 = scaleFactor * (height - bezier[i + 3] - padding); + const p30 = scaleFactor * (bezier[i + 4] - padding); + const p31 = scaleFactor * (height - bezier[i + 5] - padding); + path.push([[p0, p1], [p10, p11], [p20, p21], [p30, p31]]); + p0 = p30; + p1 = p31; + } + const path2D = _classStaticPrivateMethodGet(this, InkEditor, _buildPath2D).call(this, path); + editor.bezierPath2D.push(path2D); + } + const bbox = _classPrivateMethodGet(editor, _getBbox, _getBbox2).call(editor); + _classPrivateFieldSet(editor, _baseWidth, Math.max(RESIZER_SIZE, bbox[2] - bbox[0])); + _classPrivateFieldSet(editor, _baseHeight, Math.max(RESIZER_SIZE, bbox[3] - bbox[1])); + _classPrivateMethodGet(editor, _setScaleFactor, _setScaleFactor2).call(editor, width, height); + return editor; + } + serialize() { + if (this.isEmpty()) { + return null; + } + const rect = this.getRect(0, 0); + const height = this.rotation % 180 === 0 ? rect[3] - rect[1] : rect[2] - rect[0]; + const color = _editor.AnnotationEditor._colorManager.convert(this.ctx.strokeStyle); + return { + annotationType: _util.AnnotationEditorType.INK, + color, + thickness: this.thickness, + opacity: this.opacity, + paths: _classPrivateMethodGet(this, _serializePaths, _serializePaths2).call(this, this.scaleFactor / this.parentScale, this.translationX, this.translationY, height), + pageIndex: this.pageIndex, + rect, + rotation: this.rotation + }; + } +} +exports.InkEditor = InkEditor; +function _updateThickness2(thickness) { + const savedThickness = this.thickness; + this.addCommands({ + cmd: () => { + this.thickness = thickness; + _classPrivateMethodGet(this, _fitToContent, _fitToContent2).call(this); + }, + undo: () => { + this.thickness = savedThickness; + _classPrivateMethodGet(this, _fitToContent, _fitToContent2).call(this); + }, + mustExec: true, + type: _util.AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true + }); +} +function _updateColor2(color) { + const savedColor = this.color; + this.addCommands({ + cmd: () => { + this.color = color; + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + }, + undo: () => { + this.color = savedColor; + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + }, + mustExec: true, + type: _util.AnnotationEditorParamsType.INK_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); +} +function _updateOpacity2(opacity) { + opacity /= 100; + const savedOpacity = this.opacity; + this.addCommands({ + cmd: () => { + this.opacity = opacity; + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + }, + undo: () => { + this.opacity = savedOpacity; + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + }, + mustExec: true, + type: _util.AnnotationEditorParamsType.INK_OPACITY, + overwriteIfSameType: true, + keepUndo: true + }); +} +function _getInitialBBox2() { + const { + parentRotation, + parentDimensions: [width, height] + } = this; + switch (parentRotation) { + case 90: + return [0, height, height, width]; + case 180: + return [width, height, width, height]; + case 270: + return [width, 0, height, width]; + default: + return [0, 0, width, height]; + } +} +function _setStroke2() { + const { + ctx, + color, + opacity, + thickness, + parentScale, + scaleFactor + } = this; + ctx.lineWidth = thickness * parentScale / scaleFactor; + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + ctx.miterLimit = 10; + ctx.strokeStyle = `${color}${(0, _tools.opacityToHex)(opacity)}`; +} +function _startDrawing2(x, y) { + this.isEditing = true; + if (!_classPrivateFieldGet(this, _isCanvasInitialized)) { + _classPrivateFieldSet(this, _isCanvasInitialized, true); + _classPrivateMethodGet(this, _setCanvasDims, _setCanvasDims2).call(this); + this.thickness || (this.thickness = InkEditor._defaultThickness); + this.color || (this.color = InkEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor); + this.opacity ?? (this.opacity = InkEditor._defaultOpacity); + } + this.currentPath.push([x, y]); + _classPrivateFieldSet(this, _lastPoint, null); + _classPrivateMethodGet(this, _setStroke, _setStroke2).call(this); + this.ctx.beginPath(); + this.ctx.moveTo(x, y); + _classPrivateFieldSet(this, _requestFrameCallback, () => { + if (!_classPrivateFieldGet(this, _requestFrameCallback)) { + return; + } + if (_classPrivateFieldGet(this, _lastPoint)) { + if (this.isEmpty()) { + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + } else { + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + } + this.ctx.lineTo(..._classPrivateFieldGet(this, _lastPoint)); + _classPrivateFieldSet(this, _lastPoint, null); + this.ctx.stroke(); + } + window.requestAnimationFrame(_classPrivateFieldGet(this, _requestFrameCallback)); + }); + window.requestAnimationFrame(_classPrivateFieldGet(this, _requestFrameCallback)); +} +function _draw2(x, y) { + const [lastX, lastY] = this.currentPath.at(-1); + if (x === lastX && y === lastY) { + return; + } + this.currentPath.push([x, y]); + _classPrivateFieldSet(this, _lastPoint, [x, y]); +} +function _stopDrawing2(x, y) { + this.ctx.closePath(); + _classPrivateFieldSet(this, _requestFrameCallback, null); + x = Math.min(Math.max(x, 0), this.canvas.width); + y = Math.min(Math.max(y, 0), this.canvas.height); + const [lastX, lastY] = this.currentPath.at(-1); + if (x !== lastX || y !== lastY) { + this.currentPath.push([x, y]); + } + let bezier; + if (this.currentPath.length !== 1) { + bezier = (0, _pdfjsFitCurve.fitCurve)(this.currentPath, 30, null); + } else { + const xy = [x, y]; + bezier = [[xy, xy.slice(), xy.slice(), xy]]; + } + const path2D = _classStaticPrivateMethodGet(InkEditor, InkEditor, _buildPath2D).call(InkEditor, bezier); + this.currentPath.length = 0; + const cmd = () => { + this.paths.push(bezier); + this.bezierPath2D.push(path2D); + this.rebuild(); + }; + const undo = () => { + this.paths.pop(); + this.bezierPath2D.pop(); + if (this.paths.length === 0) { + this.remove(); + } else { + if (!this.canvas) { + _classPrivateMethodGet(this, _createCanvas, _createCanvas2).call(this); + _classPrivateMethodGet(this, _createObserver, _createObserver2).call(this); + } + _classPrivateMethodGet(this, _fitToContent, _fitToContent2).call(this); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); +} +function _redraw2() { + if (this.isEmpty()) { + _classPrivateMethodGet(this, _updateTransform, _updateTransform2).call(this); + return; + } + _classPrivateMethodGet(this, _setStroke, _setStroke2).call(this); + const { + canvas, + ctx + } = this; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + _classPrivateMethodGet(this, _updateTransform, _updateTransform2).call(this); + for (const path of this.bezierPath2D) { + ctx.stroke(path); + } +} +function _endDrawing2(event) { + _classPrivateMethodGet(this, _stopDrawing, _stopDrawing2).call(this, event.offsetX, event.offsetY); + this.canvas.removeEventListener("pointerleave", _classPrivateFieldGet(this, _boundCanvasPointerleave)); + this.canvas.removeEventListener("pointermove", _classPrivateFieldGet(this, _boundCanvasPointermove)); + this.addToAnnotationStorage(); +} +function _createCanvas2() { + this.canvas = document.createElement("canvas"); + this.canvas.width = this.canvas.height = 0; + this.canvas.className = "inkEditorCanvas"; + InkEditor._l10nPromise.get("editor_ink_canvas_aria_label").then(msg => { + var _this$canvas; + return (_this$canvas = this.canvas) === null || _this$canvas === void 0 ? void 0 : _this$canvas.setAttribute("aria-label", msg); + }); + this.div.append(this.canvas); + this.ctx = this.canvas.getContext("2d"); +} +function _createObserver2() { + let timeoutId = null; + _classPrivateFieldSet(this, _observer, new ResizeObserver(entries => { + const rect = entries[0].contentRect; + if (rect.width && rect.height) { + if (timeoutId !== null) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(() => { + this.fixDims(); + timeoutId = null; + }, TIME_TO_WAIT_BEFORE_FIXING_DIMS); + this.setDimensions(rect.width, rect.height); + } + })); + _classPrivateFieldGet(this, _observer).observe(this.div); +} +function _setCanvasDims2() { + if (!_classPrivateFieldGet(this, _isCanvasInitialized)) { + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.canvas.width = Math.ceil(this.width * parentWidth); + this.canvas.height = Math.ceil(this.height * parentHeight); + _classPrivateMethodGet(this, _updateTransform, _updateTransform2).call(this); +} +function _setScaleFactor2(width, height) { + const padding = _classPrivateMethodGet(this, _getPadding, _getPadding2).call(this); + const scaleFactorW = (width - padding) / _classPrivateFieldGet(this, _baseWidth); + const scaleFactorH = (height - padding) / _classPrivateFieldGet(this, _baseHeight); + this.scaleFactor = Math.min(scaleFactorW, scaleFactorH); +} +function _updateTransform2() { + const padding = _classPrivateMethodGet(this, _getPadding, _getPadding2).call(this) / 2; + this.ctx.setTransform(this.scaleFactor, 0, 0, this.scaleFactor, this.translationX * this.scaleFactor + padding, this.translationY * this.scaleFactor + padding); +} +function _buildPath2D(bezier) { + const path2D = new Path2D(); + for (let i = 0, ii = bezier.length; i < ii; i++) { + const [first, control1, control2, second] = bezier[i]; + if (i === 0) { + path2D.moveTo(...first); + } + path2D.bezierCurveTo(control1[0], control1[1], control2[0], control2[1], second[0], second[1]); + } + return path2D; +} +function _serializePaths2(s, tx, ty, h) { + const NUMBER_OF_POINTS_ON_BEZIER_CURVE = 4; + const paths = []; + const padding = this.thickness / 2; + let buffer, points; + for (const bezier of this.paths) { + buffer = []; + points = []; + for (let i = 0, ii = bezier.length; i < ii; i++) { + const [first, control1, control2, second] = bezier[i]; + const p10 = s * (first[0] + tx) + padding; + const p11 = h - s * (first[1] + ty) - padding; + const p20 = s * (control1[0] + tx) + padding; + const p21 = h - s * (control1[1] + ty) - padding; + const p30 = s * (control2[0] + tx) + padding; + const p31 = h - s * (control2[1] + ty) - padding; + const p40 = s * (second[0] + tx) + padding; + const p41 = h - s * (second[1] + ty) - padding; + if (i === 0) { + buffer.push(p10, p11); + points.push(p10, p11); + } + buffer.push(p20, p21, p30, p31, p40, p41); + _classPrivateMethodGet(this, _extractPointsOnBezier, _extractPointsOnBezier2).call(this, p10, p11, p20, p21, p30, p31, p40, p41, NUMBER_OF_POINTS_ON_BEZIER_CURVE, points); + } + paths.push({ + bezier: buffer, + points + }); + } + return paths; +} +function _extractPointsOnBezier2(p10, p11, p20, p21, p30, p31, p40, p41, n, points) { + if (_classPrivateMethodGet(this, _isAlmostFlat, _isAlmostFlat2).call(this, p10, p11, p20, p21, p30, p31, p40, p41)) { + points.push(p40, p41); + return; + } + for (let i = 1; i < n - 1; i++) { + const t = i / n; + const mt = 1 - t; + let q10 = t * p10 + mt * p20; + let q11 = t * p11 + mt * p21; + let q20 = t * p20 + mt * p30; + let q21 = t * p21 + mt * p31; + const q30 = t * p30 + mt * p40; + const q31 = t * p31 + mt * p41; + q10 = t * q10 + mt * q20; + q11 = t * q11 + mt * q21; + q20 = t * q20 + mt * q30; + q21 = t * q21 + mt * q31; + q10 = t * q10 + mt * q20; + q11 = t * q11 + mt * q21; + points.push(q10, q11); + } + points.push(p40, p41); +} +function _isAlmostFlat2(p10, p11, p20, p21, p30, p31, p40, p41) { + const tol = 10; + const ax = (3 * p20 - 2 * p10 - p40) ** 2; + const ay = (3 * p21 - 2 * p11 - p41) ** 2; + const bx = (3 * p30 - p10 - 2 * p40) ** 2; + const by = (3 * p31 - p11 - 2 * p41) ** 2; + return Math.max(ax, bx) + Math.max(ay, by) <= tol; +} +function _getBbox2() { + let xMin = Infinity; + let xMax = -Infinity; + let yMin = Infinity; + let yMax = -Infinity; + for (const path of this.paths) { + for (const [first, control1, control2, second] of path) { + const bbox = _util.Util.bezierBoundingBox(...first, ...control1, ...control2, ...second); + xMin = Math.min(xMin, bbox[0]); + yMin = Math.min(yMin, bbox[1]); + xMax = Math.max(xMax, bbox[2]); + yMax = Math.max(yMax, bbox[3]); + } + } + return [xMin, yMin, xMax, yMax]; +} +function _getPadding2() { + return _classPrivateFieldGet(this, _disableEditing) ? Math.ceil(this.thickness * this.parentScale) : 0; +} +function _fitToContent2() { + let firstTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (this.isEmpty()) { + return; + } + if (!_classPrivateFieldGet(this, _disableEditing)) { + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + return; + } + const bbox = _classPrivateMethodGet(this, _getBbox, _getBbox2).call(this); + const padding = _classPrivateMethodGet(this, _getPadding, _getPadding2).call(this); + _classPrivateFieldSet(this, _baseWidth, Math.max(RESIZER_SIZE, bbox[2] - bbox[0])); + _classPrivateFieldSet(this, _baseHeight, Math.max(RESIZER_SIZE, bbox[3] - bbox[1])); + const width = Math.ceil(padding + _classPrivateFieldGet(this, _baseWidth) * this.scaleFactor); + const height = Math.ceil(padding + _classPrivateFieldGet(this, _baseHeight) * this.scaleFactor); + const [parentWidth, parentHeight] = this.parentDimensions; + this.width = width / parentWidth; + this.height = height / parentHeight; + _classPrivateFieldSet(this, _aspectRatio, width / height); + _classPrivateMethodGet(this, _setMinDims, _setMinDims2).call(this); + const prevTranslationX = this.translationX; + const prevTranslationY = this.translationY; + this.translationX = -bbox[0]; + this.translationY = -bbox[1]; + _classPrivateMethodGet(this, _setCanvasDims, _setCanvasDims2).call(this); + _classPrivateMethodGet(this, _redraw, _redraw2).call(this); + _classPrivateFieldSet(this, _realWidth, width); + _classPrivateFieldSet(this, _realHeight, height); + this.setDims(width, height); + const unscaledPadding = firstTime ? padding / this.scaleFactor / 2 : 0; + this.translate(prevTranslationX - this.translationX - unscaledPadding, prevTranslationY - this.translationY - unscaledPadding); +} +function _setMinDims2() { + const { + style + } = this.div; + if (_classPrivateFieldGet(this, _aspectRatio) >= 1) { + style.minHeight = `${RESIZER_SIZE}px`; + style.minWidth = `${Math.round(_classPrivateFieldGet(this, _aspectRatio) * RESIZER_SIZE)}px`; + } else { + style.minWidth = `${RESIZER_SIZE}px`; + style.minHeight = `${Math.round(RESIZER_SIZE / _classPrivateFieldGet(this, _aspectRatio))}px`; + } +} +_defineProperty(InkEditor, "_defaultColor", null); +_defineProperty(InkEditor, "_defaultOpacity", 1); +_defineProperty(InkEditor, "_defaultThickness", 1); +_defineProperty(InkEditor, "_l10nPromise", void 0); +_defineProperty(InkEditor, "_type", "ink"); + +/***/ }), +/* 155 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.fitCurve = void 0; +const fitCurve = __w_pdfjs_require__(156); +exports.fitCurve = fitCurve; + +/***/ }), +/* 156 */ +/***/ ((module) => { + +"use strict"; + + +function fitCurve(points, maxError, progressCallback) { + if (!Array.isArray(points)) { + throw new TypeError("First argument should be an array"); + } + points.forEach(point => { + if (!Array.isArray(point) || point.some(item => typeof item !== 'number') || point.length !== points[0].length) { + throw Error("Each point should be an array of numbers. Each point should have the same amount of numbers."); + } + }); + points = points.filter((point, i) => i === 0 || !point.every((val, j) => val === points[i - 1][j])); + if (points.length < 2) { + return []; + } + const len = points.length; + const leftTangent = createTangent(points[1], points[0]); + const rightTangent = createTangent(points[len - 2], points[len - 1]); + return fitCubic(points, leftTangent, rightTangent, maxError, progressCallback); +} +function fitCubic(points, leftTangent, rightTangent, error, progressCallback) { + const MaxIterations = 20; + var bezCurve, u, uPrime, maxError, prevErr, splitPoint, prevSplit, centerVector, toCenterTangent, fromCenterTangent, beziers, dist, i; + if (points.length === 2) { + dist = maths.vectorLen(maths.subtract(points[0], points[1])) / 3.0; + bezCurve = [points[0], maths.addArrays(points[0], maths.mulItems(leftTangent, dist)), maths.addArrays(points[1], maths.mulItems(rightTangent, dist)), points[1]]; + return [bezCurve]; + } + u = chordLengthParameterize(points); + [bezCurve, maxError, splitPoint] = generateAndReport(points, u, u, leftTangent, rightTangent, progressCallback); + if (maxError === 0 || maxError < error) { + return [bezCurve]; + } + if (maxError < error * error) { + uPrime = u; + prevErr = maxError; + prevSplit = splitPoint; + for (i = 0; i < MaxIterations; i++) { + uPrime = reparameterize(bezCurve, points, uPrime); + [bezCurve, maxError, splitPoint] = generateAndReport(points, u, uPrime, leftTangent, rightTangent, progressCallback); + if (maxError < error) { + return [bezCurve]; + } else if (splitPoint === prevSplit) { + let errChange = maxError / prevErr; + if (errChange > .9999 && errChange < 1.0001) { + break; + } + } + prevErr = maxError; + prevSplit = splitPoint; + } + } + beziers = []; + centerVector = maths.subtract(points[splitPoint - 1], points[splitPoint + 1]); + if (centerVector.every(val => val === 0)) { + centerVector = maths.subtract(points[splitPoint - 1], points[splitPoint]); + [centerVector[0], centerVector[1]] = [-centerVector[1], centerVector[0]]; + } + toCenterTangent = maths.normalize(centerVector); + fromCenterTangent = maths.mulItems(toCenterTangent, -1); + beziers = beziers.concat(fitCubic(points.slice(0, splitPoint + 1), leftTangent, toCenterTangent, error, progressCallback)); + beziers = beziers.concat(fitCubic(points.slice(splitPoint), fromCenterTangent, rightTangent, error, progressCallback)); + return beziers; +} +; +function generateAndReport(points, paramsOrig, paramsPrime, leftTangent, rightTangent, progressCallback) { + var bezCurve, maxError, splitPoint; + bezCurve = generateBezier(points, paramsPrime, leftTangent, rightTangent, progressCallback); + [maxError, splitPoint] = computeMaxError(points, bezCurve, paramsOrig); + if (progressCallback) { + progressCallback({ + bez: bezCurve, + points: points, + params: paramsOrig, + maxErr: maxError, + maxPoint: splitPoint + }); + } + return [bezCurve, maxError, splitPoint]; +} +function generateBezier(points, parameters, leftTangent, rightTangent) { + var bezCurve, + A, + a, + C, + X, + det_C0_C1, + det_C0_X, + det_X_C1, + alpha_l, + alpha_r, + epsilon, + segLength, + i, + len, + tmp, + u, + ux, + firstPoint = points[0], + lastPoint = points[points.length - 1]; + bezCurve = [firstPoint, null, null, lastPoint]; + A = maths.zeros_Xx2x2(parameters.length); + for (i = 0, len = parameters.length; i < len; i++) { + u = parameters[i]; + ux = 1 - u; + a = A[i]; + a[0] = maths.mulItems(leftTangent, 3 * u * (ux * ux)); + a[1] = maths.mulItems(rightTangent, 3 * ux * (u * u)); + } + C = [[0, 0], [0, 0]]; + X = [0, 0]; + for (i = 0, len = points.length; i < len; i++) { + u = parameters[i]; + a = A[i]; + C[0][0] += maths.dot(a[0], a[0]); + C[0][1] += maths.dot(a[0], a[1]); + C[1][0] += maths.dot(a[0], a[1]); + C[1][1] += maths.dot(a[1], a[1]); + tmp = maths.subtract(points[i], bezier.q([firstPoint, firstPoint, lastPoint, lastPoint], u)); + X[0] += maths.dot(a[0], tmp); + X[1] += maths.dot(a[1], tmp); + } + det_C0_C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1]; + det_C0_X = C[0][0] * X[1] - C[1][0] * X[0]; + det_X_C1 = X[0] * C[1][1] - X[1] * C[0][1]; + alpha_l = det_C0_C1 === 0 ? 0 : det_X_C1 / det_C0_C1; + alpha_r = det_C0_C1 === 0 ? 0 : det_C0_X / det_C0_C1; + segLength = maths.vectorLen(maths.subtract(firstPoint, lastPoint)); + epsilon = 1.0e-6 * segLength; + if (alpha_l < epsilon || alpha_r < epsilon) { + bezCurve[1] = maths.addArrays(firstPoint, maths.mulItems(leftTangent, segLength / 3.0)); + bezCurve[2] = maths.addArrays(lastPoint, maths.mulItems(rightTangent, segLength / 3.0)); + } else { + bezCurve[1] = maths.addArrays(firstPoint, maths.mulItems(leftTangent, alpha_l)); + bezCurve[2] = maths.addArrays(lastPoint, maths.mulItems(rightTangent, alpha_r)); + } + return bezCurve; +} +; +function reparameterize(bezier, points, parameters) { + return parameters.map((p, i) => newtonRaphsonRootFind(bezier, points[i], p)); +} +; +function newtonRaphsonRootFind(bez, point, u) { + var d = maths.subtract(bezier.q(bez, u), point), + qprime = bezier.qprime(bez, u), + numerator = maths.mulMatrix(d, qprime), + denominator = maths.sum(maths.squareItems(qprime)) + 2 * maths.mulMatrix(d, bezier.qprimeprime(bez, u)); + if (denominator === 0) { + return u; + } else { + return u - numerator / denominator; + } +} +; +function chordLengthParameterize(points) { + var u = [], + currU, + prevU, + prevP; + points.forEach((p, i) => { + currU = i ? prevU + maths.vectorLen(maths.subtract(p, prevP)) : 0; + u.push(currU); + prevU = currU; + prevP = p; + }); + u = u.map(x => x / prevU); + return u; +} +; +function computeMaxError(points, bez, parameters) { + var dist, maxDist, splitPoint, v, i, count, point, t; + maxDist = 0; + splitPoint = Math.floor(points.length / 2); + const t_distMap = mapTtoRelativeDistances(bez, 10); + for (i = 0, count = points.length; i < count; i++) { + point = points[i]; + t = find_t(bez, parameters[i], t_distMap, 10); + v = maths.subtract(bezier.q(bez, t), point); + dist = v[0] * v[0] + v[1] * v[1]; + if (dist > maxDist) { + maxDist = dist; + splitPoint = i; + } + } + return [maxDist, splitPoint]; +} +; +var mapTtoRelativeDistances = function (bez, B_parts) { + var B_t_curr; + var B_t_dist = [0]; + var B_t_prev = bez[0]; + var sumLen = 0; + for (var i = 1; i <= B_parts; i++) { + B_t_curr = bezier.q(bez, i / B_parts); + sumLen += maths.vectorLen(maths.subtract(B_t_curr, B_t_prev)); + B_t_dist.push(sumLen); + B_t_prev = B_t_curr; + } + B_t_dist = B_t_dist.map(x => x / sumLen); + return B_t_dist; +}; +function find_t(bez, param, t_distMap, B_parts) { + if (param < 0) { + return 0; + } + if (param > 1) { + return 1; + } + var lenMax, lenMin, tMax, tMin, t; + for (var i = 1; i <= B_parts; i++) { + if (param <= t_distMap[i]) { + tMin = (i - 1) / B_parts; + tMax = i / B_parts; + lenMin = t_distMap[i - 1]; + lenMax = t_distMap[i]; + t = (param - lenMin) / (lenMax - lenMin) * (tMax - tMin) + tMin; + break; + } + } + return t; +} +function createTangent(pointA, pointB) { + return maths.normalize(maths.subtract(pointA, pointB)); +} +class maths { + static zeros_Xx2x2(x) { + var zs = []; + while (x--) { + zs.push([0, 0]); + } + return zs; + } + static mulItems(items, multiplier) { + return items.map(x => x * multiplier); + } + static mulMatrix(m1, m2) { + return m1.reduce((sum, x1, i) => sum + x1 * m2[i], 0); + } + static subtract(arr1, arr2) { + return arr1.map((x1, i) => x1 - arr2[i]); + } + static addArrays(arr1, arr2) { + return arr1.map((x1, i) => x1 + arr2[i]); + } + static addItems(items, addition) { + return items.map(x => x + addition); + } + static sum(items) { + return items.reduce((sum, x) => sum + x); + } + static dot(m1, m2) { + return maths.mulMatrix(m1, m2); + } + static vectorLen(v) { + return Math.hypot(...v); + } + static divItems(items, divisor) { + return items.map(x => x / divisor); + } + static squareItems(items) { + return items.map(x => x * x); + } + static normalize(v) { + return this.divItems(v, this.vectorLen(v)); + } +} +class bezier { + static q(ctrlPoly, t) { + var tx = 1.0 - t; + var pA = maths.mulItems(ctrlPoly[0], tx * tx * tx), + pB = maths.mulItems(ctrlPoly[1], 3 * tx * tx * t), + pC = maths.mulItems(ctrlPoly[2], 3 * tx * t * t), + pD = maths.mulItems(ctrlPoly[3], t * t * t); + return maths.addArrays(maths.addArrays(pA, pB), maths.addArrays(pC, pD)); + } + static qprime(ctrlPoly, t) { + var tx = 1.0 - t; + var pA = maths.mulItems(maths.subtract(ctrlPoly[1], ctrlPoly[0]), 3 * tx * tx), + pB = maths.mulItems(maths.subtract(ctrlPoly[2], ctrlPoly[1]), 6 * tx * t), + pC = maths.mulItems(maths.subtract(ctrlPoly[3], ctrlPoly[2]), 3 * t * t); + return maths.addArrays(maths.addArrays(pA, pB), pC); + } + static qprimeprime(ctrlPoly, t) { + return maths.addArrays(maths.mulItems(maths.addArrays(maths.subtract(ctrlPoly[2], maths.mulItems(ctrlPoly[1], 2)), ctrlPoly[0]), 6 * (1.0 - t)), maths.mulItems(maths.addArrays(maths.subtract(ctrlPoly[3], maths.mulItems(ctrlPoly[2], 2)), ctrlPoly[1]), 6 * t)); + } +} +module.exports = fitCurve; +module.exports.fitCubic = fitCubic; +module.exports.createTangent = createTangent; + +/***/ }), +/* 157 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.AnnotationLayer = void 0; +var _util = __w_pdfjs_require__(1); +var _display_utils = __w_pdfjs_require__(137); +var _annotation_storage = __w_pdfjs_require__(134); +var _scripting_utils = __w_pdfjs_require__(158); +var _xfa_layer = __w_pdfjs_require__(159); +function _classStaticPrivateMethodGet(receiver, classConstructor, method) { _classCheckPrivateStaticAccess(receiver, classConstructor); return method; } +function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); } +function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } +function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } +const DEFAULT_TAB_INDEX = 1000; +const DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +function getRectDims(rect) { + return { + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; +} +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case _util.AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case _util.AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case _util.AnnotationType.WIDGET: + const fieldType = parameters.data.fieldType; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotationElement(parameters); + case "Btn": + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + return new PushButtonWidgetAnnotationElement(parameters); + case "Ch": + return new ChoiceWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case _util.AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case _util.AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case _util.AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case _util.AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case _util.AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case _util.AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case _util.AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case _util.AnnotationType.INK: + return new InkAnnotationElement(parameters); + case _util.AnnotationType.POLYGON: + return new PolygonAnnotationElement(parameters); + case _util.AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case _util.AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case _util.AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case _util.AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case _util.AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case _util.AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + constructor(parameters) { + let { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + this.page = parameters.page; + this.viewport = parameters.viewport; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderForms = parameters.renderForms; + this.svgFactory = parameters.svgFactory; + this.annotationStorage = parameters.annotationStorage; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + if (isRenderable) { + this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this.quadrilaterals = this._createQuadrilaterals(ignoreBorder); + } + } + _createContainer() { + let ignoreBorder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const { + data, + page, + viewport + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + const { + width, + height + } = getRectDims(data.rect); + const rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); + if (!ignoreBorder && data.borderStyle.width > 0) { + container.style.borderWidth = `${data.borderStyle.width}px`; + const horizontalRadius = data.borderStyle.horizontalCornerRadius; + const verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`; + container.style.borderRadius = radius; + } else if (this instanceof RadioButtonWidgetAnnotationElement) { + const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`; + container.style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case _util.AnnotationBorderStyleType.SOLID: + container.style.borderStyle = "solid"; + break; + case _util.AnnotationBorderStyleType.DASHED: + container.style.borderStyle = "dashed"; + break; + case _util.AnnotationBorderStyleType.BEVELED: + (0, _util.warn)("Unimplemented border style: beveled"); + break; + case _util.AnnotationBorderStyleType.INSET: + (0, _util.warn)("Unimplemented border style: inset"); + break; + case _util.AnnotationBorderStyleType.UNDERLINE: + container.style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + container.style.borderColor = _util.Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); + } else { + container.style.borderWidth = 0; + } + } + container.style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + container.style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + container.style.width = `${100 * width / pageWidth}%`; + container.style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle) { + let container = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.container; + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + const { + width, + height + } = getRectDims(this.data.rect); + let elementWidth, elementHeight; + if (angle % 180 === 0) { + elementWidth = 100 * width / pageWidth; + elementHeight = 100 * height / pageHeight; + } else { + elementWidth = 100 * height / pageWidth; + elementHeight = 100 * width / pageHeight; + } + container.style.width = `${elementWidth}%`; + container.style.height = `${elementHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + event.target.style[styleName] = _scripting_utils.ColorConverters[`${color[0]}_HTML`](color.slice(1)); + }; + return (0, _util.shadow)(this, "_commonActions", { + display: event => { + const hidden = event.detail.display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + hidden, + print: event.detail.display === 0 || event.detail.display === 3 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + print: event.detail.print + }); + }, + hidden: event => { + this.container.style.visibility = event.detail.hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + hidden: event.detail.hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + if (event.detail.readonly) { + event.target.setAttribute("readonly", ""); + } else { + event.target.removeAttribute("readonly"); + } + }, + required: event => { + this._setRequired(event.target, event.detail.required); + }, + bgColor: event => { + setColor("bgColor", "backgroundColor", event); + }, + fillColor: event => { + setColor("fillColor", "backgroundColor", event); + }, + fgColor: event => { + setColor("fgColor", "color", event); + }, + textColor: event => { + setColor("textColor", "color", event); + }, + borderColor: event => { + setColor("borderColor", "borderColor", event); + }, + strokeColor: event => { + setColor("strokeColor", "borderColor", event); + }, + rotation: event => { + const angle = event.detail.rotation; + this.setRotation(angle); + this.annotationStorage.setValue(this.data.id, { + rotation: angle + }); + } + }); + } + _dispatchEventFromSandbox(actions, jsEvent) { + const commonActions = this._commonActions; + for (const name of Object.keys(jsEvent.detail)) { + const action = actions[name] || commonActions[name]; + action === null || action === void 0 ? void 0 : action(jsEvent); + } + } + _setDefaultPropertiesFromJS(element) { + if (!this.enableScripting) { + return; + } + const storedData = this.annotationStorage.getRawValue(this.data.id); + if (!storedData) { + return; + } + const commonActions = this._commonActions; + for (const [actionName, detail] of Object.entries(storedData)) { + const action = commonActions[actionName]; + if (action) { + const eventProxy = { + detail: { + [actionName]: detail + }, + target: element + }; + action(eventProxy); + delete storedData[actionName]; + } + } + } + _createQuadrilaterals() { + let ignoreBorder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (!this.data.quadPoints) { + return null; + } + const quadrilaterals = []; + const savedRect = this.data.rect; + for (const quadPoint of this.data.quadPoints) { + this.data.rect = [quadPoint[2].x, quadPoint[2].y, quadPoint[1].x, quadPoint[1].y]; + quadrilaterals.push(this._createContainer(ignoreBorder)); + } + this.data.rect = savedRect; + return quadrilaterals; + } + _createPopup(trigger, data) { + let container = this.container; + if (this.quadrilaterals) { + trigger = trigger || this.quadrilaterals; + container = this.quadrilaterals[0]; + } + if (!trigger) { + trigger = document.createElement("div"); + trigger.className = "popupTriggerArea"; + container.append(trigger); + } + const popupElement = new PopupElement({ + container, + trigger, + color: data.color, + titleObj: data.titleObj, + modificationDate: data.modificationDate, + contentsObj: data.contentsObj, + richText: data.richText, + hideWrapper: true + }); + const popup = popupElement.render(); + popup.style.left = "100%"; + container.append(popup); + } + _renderQuadrilaterals(className) { + for (const quadrilateral of this.quadrilaterals) { + quadrilateral.className = className; + } + return this.quadrilaterals; + } + render() { + (0, _util.unreachable)("Abstract method `AnnotationElement.render` called"); + } + _getElementsByName(name) { + let skipId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + const fields = []; + if (this._fieldObjects) { + const fieldObj = this._fieldObjects[name]; + if (fieldObj) { + for (const { + page, + id, + exportValues + } of fieldObj) { + if (page === -1) { + continue; + } + if (id === skipId) { + continue; + } + const exportValue = typeof exportValues === "string" ? exportValues : null; + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (domElement && !GetElementsByNameSet.has(domElement)) { + (0, _util.warn)(`_getElementsByName - element not allowed: ${id}`); + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + } + return fields; + } + for (const domElement of document.getElementsByName(name)) { + const { + exportValue + } = domElement; + const id = domElement.getAttribute("data-element-id"); + if (id === skipId) { + continue; + } + if (!GetElementsByNameSet.has(domElement)) { + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } +} +var _setInternalLink = /*#__PURE__*/new WeakSet(); +var _bindSetOCGState = /*#__PURE__*/new WeakSet(); +class LinkAnnotationElement extends AnnotationElement { + constructor(parameters) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + super(parameters, { + isRenderable: true, + ignoreBorder: !!(options !== null && options !== void 0 && options.ignoreBorder), + createQuadrilaterals: true + }); + _classPrivateMethodInitSpec(this, _bindSetOCGState); + _classPrivateMethodInitSpec(this, _setInternalLink); + this.isTooltipOnly = parameters.data.isTooltipOnly; + } + render() { + const { + data, + linkService + } = this; + const link = document.createElement("a"); + link.setAttribute("data-element-id", data.id); + let isBound = false; + if (data.url) { + linkService.addLinkAttributes(link, data.url, data.newWindow); + isBound = true; + } else if (data.action) { + this._bindNamedAction(link, data.action); + isBound = true; + } else if (data.attachment) { + this._bindAttachment(link, data.attachment); + isBound = true; + } else if (data.setOCGState) { + _classPrivateMethodGet(this, _bindSetOCGState, _bindSetOCGState2).call(this, link, data.setOCGState); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest); + isBound = true; + } else { + if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + isBound = true; + } + if (data.resetForm) { + this._bindResetFormAction(link, data.resetForm); + isBound = true; + } else if (this.isTooltipOnly && !isBound) { + this._bindLink(link, ""); + isBound = true; + } + } + if (this.quadrilaterals) { + return this._renderQuadrilaterals("linkAnnotation").map((quadrilateral, index) => { + const linkElement = index === 0 ? link : link.cloneNode(); + quadrilateral.append(linkElement); + return quadrilateral; + }); + } + this.container.className = "linkAnnotation"; + if (isBound) { + this.container.append(link); + } + return this.container; + } + _bindLink(link, destination) { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + _classPrivateMethodGet(this, _setInternalLink, _setInternalLink2).call(this); + } + } + _bindNamedAction(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + _classPrivateMethodGet(this, _setInternalLink, _setInternalLink2).call(this); + } + _bindAttachment(link, attachment) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + var _this$downloadManager; + (_this$downloadManager = this.downloadManager) === null || _this$downloadManager === void 0 ? void 0 : _this$downloadManager.openOrDownloadData(this.container, attachment.content, attachment.filename); + return false; + }; + _classPrivateMethodGet(this, _setInternalLink, _setInternalLink2).call(this); + } + _bindJSAction(link, data) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + for (const name of Object.keys(data.actions)) { + const jsName = map.get(name); + if (!jsName) { + continue; + } + link[jsName] = () => { + var _this$linkService$eve; + (_this$linkService$eve = this.linkService.eventBus) === null || _this$linkService$eve === void 0 ? void 0 : _this$linkService$eve.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: data.id, + name + } + }); + return false; + }; + } + if (!link.onclick) { + link.onclick = () => false; + } + _classPrivateMethodGet(this, _setInternalLink, _setInternalLink2).call(this); + } + _bindResetFormAction(link, resetForm) { + const otherClickAction = link.onclick; + if (!otherClickAction) { + link.href = this.linkService.getAnchorUrl(""); + } + _classPrivateMethodGet(this, _setInternalLink, _setInternalLink2).call(this); + if (!this._fieldObjects) { + (0, _util.warn)(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); + if (!otherClickAction) { + link.onclick = () => false; + } + return; + } + link.onclick = () => { + otherClickAction === null || otherClickAction === void 0 ? void 0 : otherClickAction(); + const { + fields: resetFormFields, + refs: resetFormRefs, + include + } = resetForm; + const allFields = []; + if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { + const fieldIds = new Set(resetFormRefs); + for (const fieldName of resetFormFields) { + const fields = this._fieldObjects[fieldName] || []; + for (const { + id + } of fields) { + fieldIds.add(id); + } + } + for (const fields of Object.values(this._fieldObjects)) { + for (const field of fields) { + if (fieldIds.has(field.id) === include) { + allFields.push(field); + } + } + } + } else { + for (const fields of Object.values(this._fieldObjects)) { + allFields.push(...fields); + } + } + const storage = this.annotationStorage; + const allIds = []; + for (const field of allFields) { + const { + id + } = field; + allIds.push(id); + switch (field.type) { + case "text": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + case "checkbox": + case "radiobutton": + { + const value = field.defaultValue === field.exportValues; + storage.setValue(id, { + value + }); + break; + } + case "combobox": + case "listbox": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + default: + continue; + } + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (!domElement) { + continue; + } else if (!GetElementsByNameSet.has(domElement)) { + (0, _util.warn)(`_bindResetFormAction - element not allowed: ${id}`); + continue; + } + domElement.dispatchEvent(new Event("resetform")); + } + if (this.enableScripting) { + var _this$linkService$eve2; + (_this$linkService$eve2 = this.linkService.eventBus) === null || _this$linkService$eve2 === void 0 ? void 0 : _this$linkService$eve2.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: "app", + ids: allIds, + name: "ResetForm" + } + }); + } + return false; + }; + } +} +function _setInternalLink2() { + this.container.setAttribute("data-internal-link", ""); +} +function _bindSetOCGState2(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + _classPrivateMethodGet(this, _setInternalLink, _setInternalLink2).call(this); +} +class TextAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl, _parameters$data$cont, _parameters$data$rich; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl = parameters.data.titleObj) !== null && _parameters$data$titl !== void 0 && _parameters$data$titl.str || (_parameters$data$cont = parameters.data.contentsObj) !== null && _parameters$data$cont !== void 0 && _parameters$data$cont.str || (_parameters$data$rich = parameters.data.richText) !== null && _parameters$data$rich !== void 0 && _parameters$data$rich.str); + super(parameters, { + isRenderable + }); + } + render() { + this.container.className = "textAnnotation"; + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.alt = "[{{type}} Annotation]"; + image.dataset.l10nId = "text_annotation_type"; + image.dataset.l10nArgs = JSON.stringify({ + type: this.data.name + }); + if (!this.data.hasPopup) { + this._createPopup(image, this.data); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + if (this.data.alternativeText) { + this.container.title = this.data.alternativeText; + } + return this.container; + } + _getKeyModifier(event) { + const { + isWin, + isMac + } = _util.FeatureTest.platform; + return isWin && event.ctrlKey || isMac && event.metaKey; + } + _setEventListener(element, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + var _this$linkService$eve3; + (_this$linkService$eve3 = this.linkService.eventBus) === null || _this$linkService$eve3 === void 0 ? void 0 : _this$linkService$eve3.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + var _this$linkService$eve4; + (_this$linkService$eve4 = this.linkService.eventBus) === null || _this$linkService$eve4 === void 0 ? void 0 : _this$linkService$eve4.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, names, getter) { + for (const [baseName, eventName] of names) { + var _this$data$actions; + if (eventName === "Action" || (_this$data$actions = this.data.actions) !== null && _this$data$actions !== void 0 && _this$data$actions[eventName]) { + this._setEventListener(element, baseName, eventName, getter); + } + } + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : _util.Util.makeHexColor(color[0], color[1], color[2]); + } + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontColor + } = this.data.defaultAppearanceData; + const fontSize = this.data.defaultAppearanceData.fontSize || DEFAULT_FONT_SIZE; + const style = element.style; + let computedFontSize; + const BORDER_SIZE = 2; + const roundToOneDecimal = x => Math.round(10 * x) / 10; + if (this.data.multiLine) { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + const numberOfLines = Math.round(height / (_util.LINE_FACTOR * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / _util.LINE_FACTOR)); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / _util.LINE_FACTOR)); + } + style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`; + style.color = _util.Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); + if (this.data.textAlignment !== null) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + } + _setRequired(element, isRequired) { + if (isRequired) { + element.setAttribute("required", true); + } else { + element.removeAttribute("required"); + } + element.setAttribute("aria-required", isRequired); + } +} +class TextWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + const isRenderable = parameters.renderForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + super(parameters, { + isRenderable + }); + } + setPropertyOnSiblings(base, key, value, keyInStorage) { + const storage = this.annotationStorage; + for (const element of this._getElementsByName(base.name, base.id)) { + if (element.domElement) { + element.domElement[key] = value; + } + storage.setValue(element.id, { + [keyInStorage]: value + }); + } + } + render() { + const storage = this.annotationStorage; + const id = this.data.id; + this.container.className = "textWidgetAnnotation"; + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.formattedValue || storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + const elementData = { + userValue: textContent, + formattedValue: null, + lastCommittedValue: null, + commitKey: 1 + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = "text"; + element.setAttribute("value", textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = DEFAULT_TAB_INDEX; + this._setRequired(element, this.data.required); + if (maxLen) { + element.maxLength = maxLen; + } + element.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + this.setPropertyOnSiblings(element, "value", event.target.value, "value"); + }); + element.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue ?? ""; + element.value = elementData.userValue = defaultValue; + elementData.formattedValue = null; + }); + let blurListener = event => { + const { + formattedValue + } = elementData; + if (formattedValue !== null && formattedValue !== undefined) { + event.target.value = formattedValue; + } + event.target.scrollLeft = 0; + }; + if (this.enableScripting && this.hasJSActions) { + var _this$data$actions2; + element.addEventListener("focus", event => { + const { + target + } = event; + if (elementData.userValue) { + target.value = elementData.userValue; + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + }); + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + storage.setValue(id, { + value: elementData.userValue.toString() + }); + event.target.value = elementData.userValue; + }, + formattedValue(event) { + const { + formattedValue + } = event.detail; + elementData.formattedValue = formattedValue; + if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { + event.target.value = formattedValue; + } + storage.setValue(id, { + formattedValue + }); + }, + selRange(event) { + event.target.setSelectionRange(...event.detail.selRange); + }, + charLimit: event => { + var _this$linkService$eve5; + const { + charLimit + } = event.detail; + const { + target + } = event; + if (charLimit === 0) { + target.removeAttribute("maxLength"); + return; + } + target.setAttribute("maxLength", charLimit); + let value = elementData.userValue; + if (!value || value.length <= charLimit) { + return; + } + value = value.slice(0, charLimit); + target.value = elementData.userValue = value; + storage.setValue(id, { + value + }); + (_this$linkService$eve5 = this.linkService.eventBus) === null || _this$linkService$eve5 === void 0 ? void 0 : _this$linkService$eve5.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: 1, + selStart: target.selectionStart, + selEnd: target.selectionEnd + } + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + element.addEventListener("keydown", event => { + var _this$linkService$eve6; + elementData.commitKey = 1; + let commitKey = -1; + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter" && !this.data.multiLine) { + commitKey = 2; + } else if (event.key === "Tab") { + elementData.commitKey = 3; + } + if (commitKey === -1) { + return; + } + const { + value + } = event.target; + if (elementData.lastCommittedValue === value) { + return; + } + elementData.lastCommittedValue = value; + elementData.userValue = value; + (_this$linkService$eve6 = this.linkService.eventBus) === null || _this$linkService$eve6 === void 0 ? void 0 : _this$linkService$eve6.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (!event.relatedTarget) { + return; + } + const { + value + } = event.target; + elementData.userValue = value; + if (elementData.lastCommittedValue !== value) { + var _this$linkService$eve7; + (_this$linkService$eve7 = this.linkService.eventBus) === null || _this$linkService$eve7 === void 0 ? void 0 : _this$linkService$eve7.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: elementData.commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + _blurListener(event); + }); + if ((_this$data$actions2 = this.data.actions) !== null && _this$data$actions2 !== void 0 && _this$data$actions2.Keystroke) { + element.addEventListener("beforeinput", event => { + var _this$linkService$eve8; + elementData.lastCommittedValue = null; + const { + data, + target + } = event; + const { + value, + selectionStart, + selectionEnd + } = target; + let selStart = selectionStart, + selEnd = selectionEnd; + switch (event.inputType) { + case "deleteWordBackward": + { + const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/); + if (match) { + selStart -= match[0].length; + } + break; + } + case "deleteWordForward": + { + const match = value.substring(selectionStart).match(/^[^\w]*\w*/); + if (match) { + selEnd += match[0].length; + } + break; + } + case "deleteContentBackward": + if (selectionStart === selectionEnd) { + selStart -= 1; + } + break; + case "deleteContentForward": + if (selectionStart === selectionEnd) { + selEnd += 1; + } + break; + } + event.preventDefault(); + (_this$linkService$eve8 = this.linkService.eventBus) === null || _this$linkService$eve8 === void 0 ? void 0 : _this$linkService$eve8.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + change: data || "", + willCommit: false, + selStart, + selEnd + } + }); + }); + } + this._setEventListeners(element, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + if (blurListener) { + element.addEventListener("blur", blurListener); + } + if (this.data.comb) { + const fieldWidth = this.data.rect[2] - this.data.rect[0]; + const combWidth = fieldWidth / maxLen; + element.classList.add("comb"); + element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`; + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.exportValue === data.fieldValue + }).value; + if (typeof value === "string") { + value = value !== "Off"; + storage.setValue(id, { + value + }); + } + this.container.className = "buttonWidgetAnnotation checkBox"; + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "checkbox"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.setAttribute("exportValue", data.exportValue); + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const checkbox of this._getElementsByName(name, id)) { + const curChecked = checked && checkbox.exportValue === data.exportValue; + if (checkbox.domElement) { + checkbox.domElement.checked = curChecked; + } + storage.setValue(checkbox.id, { + value: curChecked + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue || "Off"; + event.target.checked = defaultValue === data.exportValue; + }); + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + event.target.checked = event.detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.className = "buttonWidgetAnnotation radioButton"; + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.fieldValue === data.buttonValue + }).value; + if (typeof value === "string") { + value = value !== data.buttonValue; + storage.setValue(id, { + value + }); + } + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "radio"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const radio of this._getElementsByName(name, id)) { + storage.setValue(radio.id, { + value: false + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue; + event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + }); + if (this.enableScripting && this.hasJSActions) { + const pdfButtonValue = data.buttonValue; + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value: event => { + const checked = pdfButtonValue === event.detail.value; + for (const radio of this._getElementsByName(event.target.name)) { + const curChecked = checked && radio.id === id; + if (radio.domElement) { + radio.domElement.checked = curChecked; + } + storage.setValue(radio.id, { + value: curChecked + }); + } + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { + constructor(parameters) { + super(parameters, { + ignoreBorder: parameters.data.hasAppearance + }); + } + render() { + const container = super.render(); + container.className = "buttonWidgetAnnotation pushButton"; + if (this.data.alternativeText) { + container.title = this.data.alternativeText; + } + const linkElement = container.lastChild; + if (this.enableScripting && this.hasJSActions && linkElement) { + this._setDefaultPropertiesFromJS(linkElement); + linkElement.addEventListener("updatefromsandbox", jsEvent => { + this._dispatchEventFromSandbox({}, jsEvent); + }); + } + return container; + } +} +class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.className = "choiceWidgetAnnotation"; + const storage = this.annotationStorage; + const id = this.data.id; + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + const selectElement = document.createElement("select"); + GetElementsByNameSet.add(selectElement); + selectElement.setAttribute("data-element-id", id); + selectElement.disabled = this.data.readOnly; + this._setRequired(selectElement, this.data.required); + selectElement.name = this.data.fieldName; + selectElement.tabIndex = DEFAULT_TAB_INDEX; + let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + selectElement.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue; + for (const option of selectElement.options) { + option.selected = option.value === defaultValue; + } + }); + for (const option of this.data.options) { + const optionElement = document.createElement("option"); + optionElement.textContent = option.displayValue; + optionElement.value = option.exportValue; + if (storedData.value.includes(option.exportValue)) { + optionElement.setAttribute("selected", true); + addAnEmptyEntry = false; + } + selectElement.append(optionElement); + } + let removeEmptyEntry = null; + if (addAnEmptyEntry) { + const noneOptionElement = document.createElement("option"); + noneOptionElement.value = " "; + noneOptionElement.setAttribute("hidden", true); + noneOptionElement.setAttribute("selected", true); + selectElement.prepend(noneOptionElement); + removeEmptyEntry = () => { + noneOptionElement.remove(); + selectElement.removeEventListener("input", removeEmptyEntry); + removeEmptyEntry = null; + }; + selectElement.addEventListener("input", removeEmptyEntry); + } + const getValue = isExport => { + const name = isExport ? "value" : "textContent"; + const { + options, + multiple + } = selectElement; + if (!multiple) { + return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; + } + return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + }; + let selectedValues = getValue(false); + const getItems = event => { + const options = event.target.options; + return Array.prototype.map.call(options, option => { + return { + displayValue: option.textContent, + exportValue: option.value + }; + }); + }; + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + var _removeEmptyEntry; + (_removeEmptyEntry = removeEmptyEntry) === null || _removeEmptyEntry === void 0 ? void 0 : _removeEmptyEntry(); + const value = event.detail.value; + const values = new Set(Array.isArray(value) ? value : [value]); + for (const option of selectElement.options) { + option.selected = values.has(option.value); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + multipleSelection(event) { + selectElement.multiple = true; + }, + remove(event) { + const options = selectElement.options; + const index = event.detail.remove; + options[index].selected = false; + selectElement.remove(index); + if (options.length > 0) { + const i = Array.prototype.findIndex.call(options, option => option.selected); + if (i === -1) { + options[0].selected = true; + } + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + clear(event) { + while (selectElement.length !== 0) { + selectElement.remove(0); + } + storage.setValue(id, { + value: null, + items: [] + }); + selectedValues = getValue(false); + }, + insert(event) { + const { + index, + displayValue, + exportValue + } = event.detail.insert; + const selectChild = selectElement.children[index]; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + if (selectChild) { + selectChild.before(optionElement); + } else { + selectElement.append(optionElement); + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + items(event) { + const { + items + } = event.detail; + while (selectElement.length !== 0) { + selectElement.remove(0); + } + for (const item of items) { + const { + displayValue, + exportValue + } = item; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + selectElement.append(optionElement); + } + if (selectElement.options.length > 0) { + selectElement.options[0].selected = true; + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + indices(event) { + const indices = new Set(event.detail.indices); + for (const option of event.target.options) { + option.selected = indices.has(option.index); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + editable(event) { + event.target.disabled = !event.detail.editable; + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + selectElement.addEventListener("input", event => { + var _this$linkService$eve9; + const exportValue = getValue(true); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + (_this$linkService$eve9 = this.linkService.eventBus) === null || _this$linkService$eve9 === void 0 ? void 0 : _this$linkService$eve9.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"]], event => event.target.checked); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(true) + }); + }); + } + if (this.data.combo) { + this._setTextStyle(selectElement); + } else {} + this._setBackgroundColor(selectElement); + this._setDefaultPropertiesFromJS(selectElement); + this.container.append(selectElement); + return this.container; + } +} +class PopupAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _data$titleObj, _data$contentsObj, _data$richText; + const { + data + } = parameters; + const isRenderable = !PopupAnnotationElement.IGNORE_TYPES.has(data.parentType) && !!((_data$titleObj = data.titleObj) !== null && _data$titleObj !== void 0 && _data$titleObj.str || (_data$contentsObj = data.contentsObj) !== null && _data$contentsObj !== void 0 && _data$contentsObj.str || (_data$richText = data.richText) !== null && _data$richText !== void 0 && _data$richText.str); + super(parameters, { + isRenderable + }); + } + render() { + this.container.className = "popupAnnotation"; + const parentElements = this.layer.querySelectorAll(`[data-annotation-id="${this.data.parentId}"]`); + if (parentElements.length === 0) { + return this.container; + } + const popup = new PopupElement({ + container: this.container, + trigger: Array.from(parentElements), + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText + }); + const page = this.page; + const rect = _util.Util.normalizeRect([this.data.parentRect[0], page.view[3] - this.data.parentRect[1] + page.view[1], this.data.parentRect[2], page.view[3] - this.data.parentRect[3] + page.view[1]]); + const popupLeft = rect[0] + this.data.parentRect[2] - this.data.parentRect[0]; + const popupTop = rect[1]; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = this.viewport.rawDims; + this.container.style.left = `${100 * (popupLeft - pageX) / pageWidth}%`; + this.container.style.top = `${100 * (popupTop - pageY) / pageHeight}%`; + this.container.append(popup.render()); + return this.container; + } +} +_defineProperty(PopupAnnotationElement, "IGNORE_TYPES", new Set(["Line", "Square", "Circle", "PolyLine", "Polygon", "Ink"])); +class PopupElement { + constructor(parameters) { + this.container = parameters.container; + this.trigger = parameters.trigger; + this.color = parameters.color; + this.titleObj = parameters.titleObj; + this.modificationDate = parameters.modificationDate; + this.contentsObj = parameters.contentsObj; + this.richText = parameters.richText; + this.hideWrapper = parameters.hideWrapper || false; + this.pinned = false; + } + render() { + var _this$richText, _this$contentsObj; + const BACKGROUND_ENLIGHT = 0.7; + const wrapper = document.createElement("div"); + wrapper.className = "popupWrapper"; + this.hideElement = this.hideWrapper ? wrapper : this.container; + this.hideElement.hidden = true; + const popup = document.createElement("div"); + popup.className = "popup"; + const color = this.color; + if (color) { + const r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; + const g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; + const b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; + popup.style.backgroundColor = _util.Util.makeHexColor(r | 0, g | 0, b | 0); + } + const title = document.createElement("h1"); + title.dir = this.titleObj.dir; + title.textContent = this.titleObj.str; + popup.append(title); + const dateObject = _display_utils.PDFDateString.toDateObject(this.modificationDate); + if (dateObject) { + const modificationDate = document.createElement("span"); + modificationDate.className = "popupDate"; + modificationDate.textContent = "{{date}}, {{time}}"; + modificationDate.dataset.l10nId = "annotation_date_string"; + modificationDate.dataset.l10nArgs = JSON.stringify({ + date: dateObject.toLocaleDateString(), + time: dateObject.toLocaleTimeString() + }); + popup.append(modificationDate); + } + if ((_this$richText = this.richText) !== null && _this$richText !== void 0 && _this$richText.str && (!((_this$contentsObj = this.contentsObj) !== null && _this$contentsObj !== void 0 && _this$contentsObj.str) || this.contentsObj.str === this.richText.str)) { + _xfa_layer.XfaLayer.render({ + xfaHtml: this.richText.html, + intent: "richText", + div: popup + }); + popup.lastChild.className = "richText popupContent"; + } else { + const contents = this._formatContents(this.contentsObj); + popup.append(contents); + } + if (!Array.isArray(this.trigger)) { + this.trigger = [this.trigger]; + } + for (const element of this.trigger) { + element.addEventListener("click", this._toggle.bind(this)); + element.addEventListener("mouseover", this._show.bind(this, false)); + element.addEventListener("mouseout", this._hide.bind(this, false)); + } + popup.addEventListener("click", this._hide.bind(this, true)); + wrapper.append(popup); + return wrapper; + } + _formatContents(_ref) { + let { + str, + dir + } = _ref; + const p = document.createElement("p"); + p.className = "popupContent"; + p.dir = dir; + const lines = str.split(/(?:\r\n?|\n)/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + return p; + } + _toggle() { + if (this.pinned) { + this._hide(true); + } else { + this._show(true); + } + } + _show() { + let pin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (pin) { + this.pinned = true; + } + if (this.hideElement.hidden) { + this.hideElement.hidden = false; + this.container.style.zIndex = parseInt(this.container.style.zIndex) + 1000; + } + } + _hide() { + let unpin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + if (unpin) { + this.pinned = false; + } + if (!this.hideElement.hidden && !this.pinned) { + this.hideElement.hidden = true; + this.container.style.zIndex = parseInt(this.container.style.zIndex) - 1000; + } + } +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl2, _parameters$data$cont2, _parameters$data$rich2; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl2 = parameters.data.titleObj) !== null && _parameters$data$titl2 !== void 0 && _parameters$data$titl2.str || (_parameters$data$cont2 = parameters.data.contentsObj) !== null && _parameters$data$cont2 !== void 0 && _parameters$data$cont2.str || (_parameters$data$rich2 = parameters.data.richText) !== null && _parameters$data$rich2 !== void 0 && _parameters$data$rich2.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + this.textContent = parameters.data.textContent; + } + render() { + this.container.className = "freeTextAnnotation"; + if (this.textContent) { + const content = document.createElement("div"); + content.className = "annotationTextContent"; + content.setAttribute("role", "comment"); + for (const line of this.textContent) { + const lineSpan = document.createElement("span"); + lineSpan.textContent = line; + content.append(lineSpan); + } + this.container.append(content); + } + if (!this.data.hasPopup) { + this._createPopup(null, this.data); + } + return this.container; + } +} +class LineAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl3, _parameters$data$cont3, _parameters$data$rich3; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl3 = parameters.data.titleObj) !== null && _parameters$data$titl3 !== void 0 && _parameters$data$titl3.str || (_parameters$data$cont3 = parameters.data.contentsObj) !== null && _parameters$data$cont3 !== void 0 && _parameters$data$cont3.str || (_parameters$data$rich3 = parameters.data.richText) !== null && _parameters$data$rich3 !== void 0 && _parameters$data$rich3.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + } + render() { + this.container.className = "lineAnnotation"; + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const line = this.svgFactory.createElement("svg:line"); + line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); + line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); + line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); + line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); + line.setAttribute("stroke-width", data.borderStyle.width || 1); + line.setAttribute("stroke", "transparent"); + line.setAttribute("fill", "transparent"); + svg.append(line); + this.container.append(svg); + this._createPopup(line, data); + return this.container; + } +} +class SquareAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl4, _parameters$data$cont4, _parameters$data$rich4; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl4 = parameters.data.titleObj) !== null && _parameters$data$titl4 !== void 0 && _parameters$data$titl4.str || (_parameters$data$cont4 = parameters.data.contentsObj) !== null && _parameters$data$cont4 !== void 0 && _parameters$data$cont4.str || (_parameters$data$rich4 = parameters.data.richText) !== null && _parameters$data$rich4 !== void 0 && _parameters$data$rich4.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + } + render() { + this.container.className = "squareAnnotation"; + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.svgFactory.createElement("svg:rect"); + square.setAttribute("x", borderWidth / 2); + square.setAttribute("y", borderWidth / 2); + square.setAttribute("width", width - borderWidth); + square.setAttribute("height", height - borderWidth); + square.setAttribute("stroke-width", borderWidth || 1); + square.setAttribute("stroke", "transparent"); + square.setAttribute("fill", "transparent"); + svg.append(square); + this.container.append(svg); + this._createPopup(square, data); + return this.container; + } +} +class CircleAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl5, _parameters$data$cont5, _parameters$data$rich5; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl5 = parameters.data.titleObj) !== null && _parameters$data$titl5 !== void 0 && _parameters$data$titl5.str || (_parameters$data$cont5 = parameters.data.contentsObj) !== null && _parameters$data$cont5 !== void 0 && _parameters$data$cont5.str || (_parameters$data$rich5 = parameters.data.richText) !== null && _parameters$data$rich5 !== void 0 && _parameters$data$rich5.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + } + render() { + this.container.className = "circleAnnotation"; + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.svgFactory.createElement("svg:ellipse"); + circle.setAttribute("cx", width / 2); + circle.setAttribute("cy", height / 2); + circle.setAttribute("rx", width / 2 - borderWidth / 2); + circle.setAttribute("ry", height / 2 - borderWidth / 2); + circle.setAttribute("stroke-width", borderWidth || 1); + circle.setAttribute("stroke", "transparent"); + circle.setAttribute("fill", "transparent"); + svg.append(circle); + this.container.append(svg); + this._createPopup(circle, data); + return this.container; + } +} +class PolylineAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl6, _parameters$data$cont6, _parameters$data$rich6; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl6 = parameters.data.titleObj) !== null && _parameters$data$titl6 !== void 0 && _parameters$data$titl6.str || (_parameters$data$cont6 = parameters.data.contentsObj) !== null && _parameters$data$cont6 !== void 0 && _parameters$data$cont6.str || (_parameters$data$rich6 = parameters.data.richText) !== null && _parameters$data$rich6 !== void 0 && _parameters$data$rich6.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.className = this.containerClassName; + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (const coordinate of data.vertices) { + const x = coordinate.x - data.rect[0]; + const y = data.rect[3] - coordinate.y; + points.push(x + "," + y); + } + points = points.join(" "); + const polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", data.borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + this._createPopup(polyline, data); + return this.container; + } +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl7, _parameters$data$cont7, _parameters$data$rich7; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl7 = parameters.data.titleObj) !== null && _parameters$data$titl7 !== void 0 && _parameters$data$titl7.str || (_parameters$data$cont7 = parameters.data.contentsObj) !== null && _parameters$data$cont7 !== void 0 && _parameters$data$cont7.str || (_parameters$data$rich7 = parameters.data.richText) !== null && _parameters$data$rich7 !== void 0 && _parameters$data$rich7.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + } + render() { + this.container.className = "caretAnnotation"; + if (!this.data.hasPopup) { + this._createPopup(null, this.data); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl8, _parameters$data$cont8, _parameters$data$rich8; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl8 = parameters.data.titleObj) !== null && _parameters$data$titl8 !== void 0 && _parameters$data$titl8.str || (_parameters$data$cont8 = parameters.data.contentsObj) !== null && _parameters$data$cont8 !== void 0 && _parameters$data$cont8.str || (_parameters$data$rich8 = parameters.data.richText) !== null && _parameters$data$rich8 !== void 0 && _parameters$data$rich8.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.className = this.containerClassName; + const data = this.data; + const { + width, + height + } = getRectDims(data.rect); + const svg = this.svgFactory.create(width, height, true); + for (const inkList of data.inkLists) { + let points = []; + for (const coordinate of inkList) { + const x = coordinate.x - data.rect[0]; + const y = data.rect[3] - coordinate.y; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", data.borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + this._createPopup(polyline, data); + svg.append(polyline); + } + this.container.append(svg); + return this.container; + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl9, _parameters$data$cont9, _parameters$data$rich9; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl9 = parameters.data.titleObj) !== null && _parameters$data$titl9 !== void 0 && _parameters$data$titl9.str || (_parameters$data$cont9 = parameters.data.contentsObj) !== null && _parameters$data$cont9 !== void 0 && _parameters$data$cont9.str || (_parameters$data$rich9 = parameters.data.richText) !== null && _parameters$data$rich9 !== void 0 && _parameters$data$rich9.str); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.hasPopup) { + this._createPopup(null, this.data); + } + if (this.quadrilaterals) { + return this._renderQuadrilaterals("highlightAnnotation"); + } + this.container.className = "highlightAnnotation"; + return this.container; + } +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl10, _parameters$data$cont10, _parameters$data$rich10; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl10 = parameters.data.titleObj) !== null && _parameters$data$titl10 !== void 0 && _parameters$data$titl10.str || (_parameters$data$cont10 = parameters.data.contentsObj) !== null && _parameters$data$cont10 !== void 0 && _parameters$data$cont10.str || (_parameters$data$rich10 = parameters.data.richText) !== null && _parameters$data$rich10 !== void 0 && _parameters$data$rich10.str); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.hasPopup) { + this._createPopup(null, this.data); + } + if (this.quadrilaterals) { + return this._renderQuadrilaterals("underlineAnnotation"); + } + this.container.className = "underlineAnnotation"; + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl11, _parameters$data$cont11, _parameters$data$rich11; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl11 = parameters.data.titleObj) !== null && _parameters$data$titl11 !== void 0 && _parameters$data$titl11.str || (_parameters$data$cont11 = parameters.data.contentsObj) !== null && _parameters$data$cont11 !== void 0 && _parameters$data$cont11.str || (_parameters$data$rich11 = parameters.data.richText) !== null && _parameters$data$rich11 !== void 0 && _parameters$data$rich11.str); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.hasPopup) { + this._createPopup(null, this.data); + } + if (this.quadrilaterals) { + return this._renderQuadrilaterals("squigglyAnnotation"); + } + this.container.className = "squigglyAnnotation"; + return this.container; + } +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl12, _parameters$data$cont12, _parameters$data$rich12; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl12 = parameters.data.titleObj) !== null && _parameters$data$titl12 !== void 0 && _parameters$data$titl12.str || (_parameters$data$cont12 = parameters.data.contentsObj) !== null && _parameters$data$cont12 !== void 0 && _parameters$data$cont12.str || (_parameters$data$rich12 = parameters.data.richText) !== null && _parameters$data$rich12 !== void 0 && _parameters$data$rich12.str); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.hasPopup) { + this._createPopup(null, this.data); + } + if (this.quadrilaterals) { + return this._renderQuadrilaterals("strikeoutAnnotation"); + } + this.container.className = "strikeoutAnnotation"; + return this.container; + } +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _parameters$data$titl13, _parameters$data$cont13, _parameters$data$rich13; + const isRenderable = !!(parameters.data.hasPopup || (_parameters$data$titl13 = parameters.data.titleObj) !== null && _parameters$data$titl13 !== void 0 && _parameters$data$titl13.str || (_parameters$data$cont13 = parameters.data.contentsObj) !== null && _parameters$data$cont13 !== void 0 && _parameters$data$cont13.str || (_parameters$data$rich13 = parameters.data.richText) !== null && _parameters$data$rich13 !== void 0 && _parameters$data$rich13.str); + super(parameters, { + isRenderable, + ignoreBorder: true + }); + } + render() { + this.container.className = "stampAnnotation"; + if (!this.data.hasPopup) { + this._createPopup(null, this.data); + } + return this.container; + } +} +class FileAttachmentAnnotationElement extends AnnotationElement { + constructor(parameters) { + var _this$linkService$eve10; + super(parameters, { + isRenderable: true + }); + const { + filename, + content + } = this.data.file; + this.filename = (0, _display_utils.getFilenameFromUrl)(filename, true); + this.content = content; + (_this$linkService$eve10 = this.linkService.eventBus) === null || _this$linkService$eve10 === void 0 ? void 0 : _this$linkService$eve10.dispatch("fileattachmentannotation", { + source: this, + filename, + content + }); + } + render() { + var _this$data$titleObj, _this$data$contentsOb; + this.container.className = "fileAttachmentAnnotation"; + let trigger; + if (this.data.hasAppearance) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(this.data.name) ? "paperclip" : "pushpin"}.svg`; + } + trigger.className = "popupTriggerArea"; + trigger.addEventListener("dblclick", this._download.bind(this)); + if (!this.data.hasPopup && ((_this$data$titleObj = this.data.titleObj) !== null && _this$data$titleObj !== void 0 && _this$data$titleObj.str || (_this$data$contentsOb = this.data.contentsObj) !== null && _this$data$contentsOb !== void 0 && _this$data$contentsOb.str || this.data.richText)) { + this._createPopup(trigger, this.data); + } + this.container.append(trigger); + return this.container; + } + _download() { + var _this$downloadManager2; + (_this$downloadManager2 = this.downloadManager) === null || _this$downloadManager2 === void 0 ? void 0 : _this$downloadManager2.openOrDownloadData(this.container, this.content, this.filename); + } +} +class AnnotationLayer { + static render(params) { + const { + annotations, + div, + viewport, + accessibilityManager + } = params; + (0, _display_utils.setLayerDimensions)(div, viewport); + const elementParams = { + data: null, + layer: div, + page: params.page, + viewport, + linkService: params.linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new _display_utils.DOMSVGFactory(), + annotationStorage: params.annotationStorage || new _annotation_storage.AnnotationStorage(), + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects + }; + let zIndex = 0; + for (const data of annotations) { + if (data.annotationType !== _util.AnnotationType.POPUP) { + const { + width, + height + } = getRectDims(data.rect); + if (width <= 0 || height <= 0) { + continue; + } + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + if (Array.isArray(rendered)) { + for (const renderedElement of rendered) { + renderedElement.style.zIndex = zIndex++; + _classStaticPrivateMethodGet(AnnotationLayer, AnnotationLayer, _appendElement).call(AnnotationLayer, renderedElement, data.id, div, accessibilityManager); + } + } else { + rendered.style.zIndex = zIndex++; + if (element instanceof PopupAnnotationElement) { + div.prepend(rendered); + } else { + _classStaticPrivateMethodGet(AnnotationLayer, AnnotationLayer, _appendElement).call(AnnotationLayer, rendered, data.id, div, accessibilityManager); + } + } + } + _classStaticPrivateMethodGet(this, AnnotationLayer, _setAnnotationCanvasMap).call(this, div, params.annotationCanvasMap); + } + static update(params) { + const { + annotationCanvasMap, + div, + viewport + } = params; + (0, _display_utils.setLayerDimensions)(div, { + rotation: viewport.rotation + }); + _classStaticPrivateMethodGet(this, AnnotationLayer, _setAnnotationCanvasMap).call(this, div, annotationCanvasMap); + div.hidden = false; + } +} +exports.AnnotationLayer = AnnotationLayer; +function _appendElement(element, id, div, accessibilityManager) { + const contentElement = element.firstChild || element; + contentElement.id = `${_display_utils.AnnotationPrefix}${id}`; + div.append(element); + accessibilityManager === null || accessibilityManager === void 0 ? void 0 : accessibilityManager.moveElementInDOM(div, element, contentElement, false); +} +function _setAnnotationCanvasMap(div, annotationCanvasMap) { + if (!annotationCanvasMap) { + return; + } + for (const [id, canvas] of annotationCanvasMap) { + const element = div.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; + } + const { + firstChild + } = element; + if (!firstChild) { + element.append(canvas); + } else if (firstChild.nodeName === "CANVAS") { + firstChild.replaceWith(canvas); + } else { + firstChild.before(canvas); + } + } + annotationCanvasMap.clear(); +} + +/***/ }), +/* 158 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ColorConverters = void 0; +function makeColorComp(n) { + return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +} +class ColorConverters { + static CMYK_G(_ref) { + let [c, y, m, k] = _ref; + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK(_ref2) { + let [g] = _ref2; + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB(_ref3) { + let [g] = _ref3; + return ["RGB", g, g, g]; + } + static G_HTML(_ref4) { + let [g] = _ref4; + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G(_ref5) { + let [r, g, b] = _ref5; + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_HTML(_ref6) { + let [r, g, b] = _ref6; + const R = makeColorComp(r); + const G = makeColorComp(g); + const B = makeColorComp(b); + return `#${R}${G}${B}`; + } + static T_HTML() { + return "#00000000"; + } + static CMYK_RGB(_ref7) { + let [c, y, m, k] = _ref7; + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK(_ref8) { + let [r, g, b] = _ref8; + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} +exports.ColorConverters = ColorConverters; + +/***/ }), +/* 159 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XfaLayer = void 0; +var _xfa_text = __w_pdfjs_require__(149); +class XfaLayer { + static setupStorage(html, id, element, storage, intent) { + const storedData = storage.getValue(id, { + value: null + }); + switch (element.name) { + case "textarea": + if (storedData.value !== null) { + html.textContent = storedData.value; + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + break; + case "input": + if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { + if (storedData.value === element.attributes.xfaOn) { + html.setAttribute("checked", true); + } else if (storedData.value === element.attributes.xfaOff) { + html.removeAttribute("checked"); + } + if (intent === "print") { + break; + } + html.addEventListener("change", event => { + storage.setValue(id, { + value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") + }); + }); + } else { + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + } + break; + case "select": + if (storedData.value !== null) { + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } + } + } + html.addEventListener("input", event => { + const options = event.target.options; + const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; + storage.setValue(id, { + value + }); + }); + break; + } + } + static setAttributes(_ref) { + let { + html, + element, + storage = null, + intent, + linkService + } = _ref; + const { + attributes + } = element; + const isHTMLAnchorElement = html instanceof HTMLAnchorElement; + if (attributes.type === "radio") { + attributes.name = `${attributes.name}-${intent}`; + } + for (const [key, value] of Object.entries(attributes)) { + if (value === null || value === undefined) { + continue; + } + switch (key) { + case "class": + if (value.length) { + html.setAttribute(key, value.join(" ")); + } + break; + case "dataId": + break; + case "id": + html.setAttribute("data-element-id", value); + break; + case "style": + Object.assign(html.style, value); + break; + case "textContent": + html.textContent = value; + break; + default: + if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { + html.setAttribute(key, value); + } + } + } + if (isHTMLAnchorElement) { + linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); + } + if (storage && attributes.dataId) { + this.setupStorage(html, attributes.dataId, element, storage); + } + } + static render(parameters) { + const storage = parameters.annotationStorage; + const linkService = parameters.linkService; + const root = parameters.xfaHtml; + const intent = parameters.intent || "display"; + const rootHtml = document.createElement(root.name); + if (root.attributes) { + this.setAttributes({ + html: rootHtml, + element: root, + intent, + linkService + }); + } + const stack = [[root, -1, rootHtml]]; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (intent !== "richText") { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + while (stack.length > 0) { + var _child$attributes; + const [parent, i, html] = stack.at(-1); + if (i + 1 === parent.children.length) { + stack.pop(); + continue; + } + const child = parent.children[++stack.at(-1)[1]]; + if (child === null) { + continue; + } + const { + name + } = child; + if (name === "#text") { + const node = document.createTextNode(child.value); + textDivs.push(node); + html.append(node); + continue; + } + let childHtml; + if (child !== null && child !== void 0 && (_child$attributes = child.attributes) !== null && _child$attributes !== void 0 && _child$attributes.xmlns) { + childHtml = document.createElementNS(child.attributes.xmlns, name); + } else { + childHtml = document.createElement(name); + } + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children && child.children.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (_xfa_text.XfaText.shouldBuildText(name)) { + textDivs.push(node); + } + childHtml.append(node); + } + } + for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { + el.setAttribute("readOnly", true); + } + return { + textDivs + }; + } + static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + parameters.div.style.transform = transform; + parameters.div.hidden = false; + } +} +exports.XfaLayer = XfaLayer; + +/***/ }), +/* 160 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.SVGGraphics = void 0; +var _display_utils = __w_pdfjs_require__(137); +var _util = __w_pdfjs_require__(1); +var _is_node = __w_pdfjs_require__(3); +let SVGGraphics = class { + constructor() { + (0, _util.unreachable)("Not implemented: SVGGraphics"); + } +}; +exports.SVGGraphics = SVGGraphics; +{ + const SVG_DEFAULTS = { + fontStyle: "normal", + fontWeight: "normal", + fillColor: "#000000" + }; + const XML_NS = "http://www.w3.org/XML/1998/namespace"; + const XLINK_NS = "http://www.w3.org/1999/xlink"; + const LINE_CAP_STYLES = ["butt", "round", "square"]; + const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; + const createObjectURL = function (data) { + let contentType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + let forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (URL.createObjectURL && typeof Blob !== "undefined" && !forceDataSchema) { + return URL.createObjectURL(new Blob([data], { + type: contentType + })); + } + const digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + let buffer = `data:${contentType};base64,`; + for (let i = 0, ii = data.length; i < ii; i += 3) { + const b1 = data[i] & 0xff; + const b2 = data[i + 1] & 0xff; + const b3 = data[i + 2] & 0xff; + const d1 = b1 >> 2, + d2 = (b1 & 3) << 4 | b2 >> 4; + const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64; + const d4 = i + 2 < ii ? b3 & 0x3f : 64; + buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; + } + return buffer; + }; + const convertImgDataToPng = function () { + const PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); + const CHUNK_WRAPPER_SIZE = 12; + const crcTable = new Int32Array(256); + for (let i = 0; i < 256; i++) { + let c = i; + for (let h = 0; h < 8; h++) { + if (c & 1) { + c = 0xedb88320 ^ c >> 1 & 0x7fffffff; + } else { + c = c >> 1 & 0x7fffffff; + } + } + crcTable[i] = c; + } + function crc32(data, start, end) { + let crc = -1; + for (let i = start; i < end; i++) { + const a = (crc ^ data[i]) & 0xff; + const b = crcTable[a]; + crc = crc >>> 8 ^ b; + } + return crc ^ -1; + } + function writePngChunk(type, body, data, offset) { + let p = offset; + const len = body.length; + data[p] = len >> 24 & 0xff; + data[p + 1] = len >> 16 & 0xff; + data[p + 2] = len >> 8 & 0xff; + data[p + 3] = len & 0xff; + p += 4; + data[p] = type.charCodeAt(0) & 0xff; + data[p + 1] = type.charCodeAt(1) & 0xff; + data[p + 2] = type.charCodeAt(2) & 0xff; + data[p + 3] = type.charCodeAt(3) & 0xff; + p += 4; + data.set(body, p); + p += body.length; + const crc = crc32(data, offset + 4, p); + data[p] = crc >> 24 & 0xff; + data[p + 1] = crc >> 16 & 0xff; + data[p + 2] = crc >> 8 & 0xff; + data[p + 3] = crc & 0xff; + } + function adler32(data, start, end) { + let a = 1; + let b = 0; + for (let i = start; i < end; ++i) { + a = (a + (data[i] & 0xff)) % 65521; + b = (b + a) % 65521; + } + return b << 16 | a; + } + function deflateSync(literals) { + if (!_is_node.isNodeJS) { + return deflateSyncUncompressed(literals); + } + try { + let input; + if (parseInt(process.versions.node) >= 8) { + input = literals; + } else { + input = Buffer.from(literals); + } + const output = require("zlib").deflateSync(input, { + level: 9 + }); + return output instanceof Uint8Array ? output : new Uint8Array(output); + } catch (e) { + (0, _util.warn)("Not compressing PNG because zlib.deflateSync is unavailable: " + e); + } + return deflateSyncUncompressed(literals); + } + function deflateSyncUncompressed(literals) { + let len = literals.length; + const maxBlockLength = 0xffff; + const deflateBlocks = Math.ceil(len / maxBlockLength); + const idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); + let pi = 0; + idat[pi++] = 0x78; + idat[pi++] = 0x9c; + let pos = 0; + while (len > maxBlockLength) { + idat[pi++] = 0x00; + idat[pi++] = 0xff; + idat[pi++] = 0xff; + idat[pi++] = 0x00; + idat[pi++] = 0x00; + idat.set(literals.subarray(pos, pos + maxBlockLength), pi); + pi += maxBlockLength; + pos += maxBlockLength; + len -= maxBlockLength; + } + idat[pi++] = 0x01; + idat[pi++] = len & 0xff; + idat[pi++] = len >> 8 & 0xff; + idat[pi++] = ~len & 0xffff & 0xff; + idat[pi++] = (~len & 0xffff) >> 8 & 0xff; + idat.set(literals.subarray(pos), pi); + pi += literals.length - pos; + const adler = adler32(literals, 0, literals.length); + idat[pi++] = adler >> 24 & 0xff; + idat[pi++] = adler >> 16 & 0xff; + idat[pi++] = adler >> 8 & 0xff; + idat[pi++] = adler & 0xff; + return idat; + } + function encode(imgData, kind, forceDataSchema, isMask) { + const width = imgData.width; + const height = imgData.height; + let bitDepth, colorType, lineSize; + const bytes = imgData.data; + switch (kind) { + case _util.ImageKind.GRAYSCALE_1BPP: + colorType = 0; + bitDepth = 1; + lineSize = width + 7 >> 3; + break; + case _util.ImageKind.RGB_24BPP: + colorType = 2; + bitDepth = 8; + lineSize = width * 3; + break; + case _util.ImageKind.RGBA_32BPP: + colorType = 6; + bitDepth = 8; + lineSize = width * 4; + break; + default: + throw new Error("invalid format"); + } + const literals = new Uint8Array((1 + lineSize) * height); + let offsetLiterals = 0, + offsetBytes = 0; + for (let y = 0; y < height; ++y) { + literals[offsetLiterals++] = 0; + literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals); + offsetBytes += lineSize; + offsetLiterals += lineSize; + } + if (kind === _util.ImageKind.GRAYSCALE_1BPP && isMask) { + offsetLiterals = 0; + for (let y = 0; y < height; y++) { + offsetLiterals++; + for (let i = 0; i < lineSize; i++) { + literals[offsetLiterals++] ^= 0xff; + } + } + } + const ihdr = new Uint8Array([width >> 24 & 0xff, width >> 16 & 0xff, width >> 8 & 0xff, width & 0xff, height >> 24 & 0xff, height >> 16 & 0xff, height >> 8 & 0xff, height & 0xff, bitDepth, colorType, 0x00, 0x00, 0x00]); + const idat = deflateSync(literals); + const pngLength = PNG_HEADER.length + CHUNK_WRAPPER_SIZE * 3 + ihdr.length + idat.length; + const data = new Uint8Array(pngLength); + let offset = 0; + data.set(PNG_HEADER, offset); + offset += PNG_HEADER.length; + writePngChunk("IHDR", ihdr, data, offset); + offset += CHUNK_WRAPPER_SIZE + ihdr.length; + writePngChunk("IDATA", idat, data, offset); + offset += CHUNK_WRAPPER_SIZE + idat.length; + writePngChunk("IEND", new Uint8Array(0), data, offset); + return createObjectURL(data, "image/png", forceDataSchema); + } + return function convertImgDataToPng(imgData, forceDataSchema, isMask) { + const kind = imgData.kind === undefined ? _util.ImageKind.GRAYSCALE_1BPP : imgData.kind; + return encode(imgData, kind, forceDataSchema, isMask); + }; + }(); + class SVGExtraState { + constructor() { + this.fontSizeScale = 1; + this.fontWeight = SVG_DEFAULTS.fontWeight; + this.fontSize = 0; + this.textMatrix = _util.IDENTITY_MATRIX; + this.fontMatrix = _util.FONT_IDENTITY_MATRIX; + this.leading = 0; + this.textRenderingMode = _util.TextRenderingMode.FILL; + this.textMatrixScale = 1; + this.x = 0; + this.y = 0; + this.lineX = 0; + this.lineY = 0; + this.charSpacing = 0; + this.wordSpacing = 0; + this.textHScale = 1; + this.textRise = 0; + this.fillColor = SVG_DEFAULTS.fillColor; + this.strokeColor = "#000000"; + this.fillAlpha = 1; + this.strokeAlpha = 1; + this.lineWidth = 1; + this.lineJoin = ""; + this.lineCap = ""; + this.miterLimit = 0; + this.dashArray = []; + this.dashPhase = 0; + this.dependencies = []; + this.activeClipUrl = null; + this.clipGroup = null; + this.maskId = ""; + } + clone() { + return Object.create(this); + } + setCurrentPoint(x, y) { + this.x = x; + this.y = y; + } + } + function opListToTree(opList) { + let opTree = []; + const tmp = []; + for (const opListElement of opList) { + if (opListElement.fn === "save") { + opTree.push({ + fnId: 92, + fn: "group", + items: [] + }); + tmp.push(opTree); + opTree = opTree.at(-1).items; + continue; + } + if (opListElement.fn === "restore") { + opTree = tmp.pop(); + } else { + opTree.push(opListElement); + } + } + return opTree; + } + function pf(value) { + if (Number.isInteger(value)) { + return value.toString(); + } + const s = value.toFixed(10); + let i = s.length - 1; + if (s[i] !== "0") { + return s; + } + do { + i--; + } while (s[i] === "0"); + return s.substring(0, s[i] === "." ? i : i + 1); + } + function pm(m) { + if (m[4] === 0 && m[5] === 0) { + if (m[1] === 0 && m[2] === 0) { + if (m[0] === 1 && m[3] === 1) { + return ""; + } + return `scale(${pf(m[0])} ${pf(m[3])})`; + } + if (m[0] === m[3] && m[1] === -m[2]) { + const a = Math.acos(m[0]) * 180 / Math.PI; + return `rotate(${pf(a)})`; + } + } else { + if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { + return `translate(${pf(m[4])} ${pf(m[5])})`; + } + } + return `matrix(${pf(m[0])} ${pf(m[1])} ${pf(m[2])} ${pf(m[3])} ${pf(m[4])} ` + `${pf(m[5])})`; + } + let clipCount = 0; + let maskCount = 0; + let shadingCount = 0; + exports.SVGGraphics = SVGGraphics = class { + constructor(commonObjs, objs) { + let forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + (0, _display_utils.deprecated)("The SVG back-end is no longer maintained and *may* be removed in the future."); + this.svgFactory = new _display_utils.DOMSVGFactory(); + this.current = new SVGExtraState(); + this.transformMatrix = _util.IDENTITY_MATRIX; + this.transformStack = []; + this.extraStack = []; + this.commonObjs = commonObjs; + this.objs = objs; + this.pendingClip = null; + this.pendingEOFill = false; + this.embedFonts = false; + this.embeddedFonts = Object.create(null); + this.cssStyle = null; + this.forceDataSchema = !!forceDataSchema; + this._operatorIdMapping = []; + for (const op in _util.OPS) { + this._operatorIdMapping[_util.OPS[op]] = op; + } + } + getObject(data) { + let fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + if (typeof data === "string") { + return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); + } + return fallback; + } + save() { + this.transformStack.push(this.transformMatrix); + const old = this.current; + this.extraStack.push(old); + this.current = old.clone(); + } + restore() { + this.transformMatrix = this.transformStack.pop(); + this.current = this.extraStack.pop(); + this.pendingClip = null; + this.tgrp = null; + } + group(items) { + this.save(); + this.executeOpTree(items); + this.restore(); + } + loadDependencies(operatorList) { + const fnArray = operatorList.fnArray; + const argsArray = operatorList.argsArray; + for (let i = 0, ii = fnArray.length; i < ii; i++) { + if (fnArray[i] !== _util.OPS.dependency) { + continue; + } + for (const obj of argsArray[i]) { + const objsPool = obj.startsWith("g_") ? this.commonObjs : this.objs; + const promise = new Promise(resolve => { + objsPool.get(obj, resolve); + }); + this.current.dependencies.push(promise); + } + } + return Promise.all(this.current.dependencies); + } + transform(a, b, c, d, e, f) { + const transformMatrix = [a, b, c, d, e, f]; + this.transformMatrix = _util.Util.transform(this.transformMatrix, transformMatrix); + this.tgrp = null; + } + getSVG(operatorList, viewport) { + this.viewport = viewport; + const svgElement = this._initialize(viewport); + return this.loadDependencies(operatorList).then(() => { + this.transformMatrix = _util.IDENTITY_MATRIX; + this.executeOpTree(this.convertOpList(operatorList)); + return svgElement; + }); + } + convertOpList(operatorList) { + const operatorIdMapping = this._operatorIdMapping; + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + const opList = []; + for (let i = 0, ii = fnArray.length; i < ii; i++) { + const fnId = fnArray[i]; + opList.push({ + fnId, + fn: operatorIdMapping[fnId], + args: argsArray[i] + }); + } + return opListToTree(opList); + } + executeOpTree(opTree) { + for (const opTreeElement of opTree) { + const fn = opTreeElement.fn; + const fnId = opTreeElement.fnId; + const args = opTreeElement.args; + switch (fnId | 0) { + case _util.OPS.beginText: + this.beginText(); + break; + case _util.OPS.dependency: + break; + case _util.OPS.setLeading: + this.setLeading(args); + break; + case _util.OPS.setLeadingMoveText: + this.setLeadingMoveText(args[0], args[1]); + break; + case _util.OPS.setFont: + this.setFont(args); + break; + case _util.OPS.showText: + this.showText(args[0]); + break; + case _util.OPS.showSpacedText: + this.showText(args[0]); + break; + case _util.OPS.endText: + this.endText(); + break; + case _util.OPS.moveText: + this.moveText(args[0], args[1]); + break; + case _util.OPS.setCharSpacing: + this.setCharSpacing(args[0]); + break; + case _util.OPS.setWordSpacing: + this.setWordSpacing(args[0]); + break; + case _util.OPS.setHScale: + this.setHScale(args[0]); + break; + case _util.OPS.setTextMatrix: + this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + case _util.OPS.setTextRise: + this.setTextRise(args[0]); + break; + case _util.OPS.setTextRenderingMode: + this.setTextRenderingMode(args[0]); + break; + case _util.OPS.setLineWidth: + this.setLineWidth(args[0]); + break; + case _util.OPS.setLineJoin: + this.setLineJoin(args[0]); + break; + case _util.OPS.setLineCap: + this.setLineCap(args[0]); + break; + case _util.OPS.setMiterLimit: + this.setMiterLimit(args[0]); + break; + case _util.OPS.setFillRGBColor: + this.setFillRGBColor(args[0], args[1], args[2]); + break; + case _util.OPS.setStrokeRGBColor: + this.setStrokeRGBColor(args[0], args[1], args[2]); + break; + case _util.OPS.setStrokeColorN: + this.setStrokeColorN(args); + break; + case _util.OPS.setFillColorN: + this.setFillColorN(args); + break; + case _util.OPS.shadingFill: + this.shadingFill(args[0]); + break; + case _util.OPS.setDash: + this.setDash(args[0], args[1]); + break; + case _util.OPS.setRenderingIntent: + this.setRenderingIntent(args[0]); + break; + case _util.OPS.setFlatness: + this.setFlatness(args[0]); + break; + case _util.OPS.setGState: + this.setGState(args[0]); + break; + case _util.OPS.fill: + this.fill(); + break; + case _util.OPS.eoFill: + this.eoFill(); + break; + case _util.OPS.stroke: + this.stroke(); + break; + case _util.OPS.fillStroke: + this.fillStroke(); + break; + case _util.OPS.eoFillStroke: + this.eoFillStroke(); + break; + case _util.OPS.clip: + this.clip("nonzero"); + break; + case _util.OPS.eoClip: + this.clip("evenodd"); + break; + case _util.OPS.paintSolidColorImageMask: + this.paintSolidColorImageMask(); + break; + case _util.OPS.paintImageXObject: + this.paintImageXObject(args[0]); + break; + case _util.OPS.paintInlineImageXObject: + this.paintInlineImageXObject(args[0]); + break; + case _util.OPS.paintImageMaskXObject: + this.paintImageMaskXObject(args[0]); + break; + case _util.OPS.paintFormXObjectBegin: + this.paintFormXObjectBegin(args[0], args[1]); + break; + case _util.OPS.paintFormXObjectEnd: + this.paintFormXObjectEnd(); + break; + case _util.OPS.closePath: + this.closePath(); + break; + case _util.OPS.closeStroke: + this.closeStroke(); + break; + case _util.OPS.closeFillStroke: + this.closeFillStroke(); + break; + case _util.OPS.closeEOFillStroke: + this.closeEOFillStroke(); + break; + case _util.OPS.nextLine: + this.nextLine(); + break; + case _util.OPS.transform: + this.transform(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + case _util.OPS.constructPath: + this.constructPath(args[0], args[1]); + break; + case _util.OPS.endPath: + this.endPath(); + break; + case 92: + this.group(opTreeElement.items); + break; + default: + (0, _util.warn)(`Unimplemented operator ${fn}`); + break; + } + } + } + setWordSpacing(wordSpacing) { + this.current.wordSpacing = wordSpacing; + } + setCharSpacing(charSpacing) { + this.current.charSpacing = charSpacing; + } + nextLine() { + this.moveText(0, this.current.leading); + } + setTextMatrix(a, b, c, d, e, f) { + const current = this.current; + current.textMatrix = current.lineMatrix = [a, b, c, d, e, f]; + current.textMatrixScale = Math.hypot(a, b); + current.x = current.lineX = 0; + current.y = current.lineY = 0; + current.xcoords = []; + current.ycoords = []; + current.tspan = this.svgFactory.createElement("svg:tspan"); + current.tspan.setAttributeNS(null, "font-family", current.fontFamily); + current.tspan.setAttributeNS(null, "font-size", `${pf(current.fontSize)}px`); + current.tspan.setAttributeNS(null, "y", pf(-current.y)); + current.txtElement = this.svgFactory.createElement("svg:text"); + current.txtElement.append(current.tspan); + } + beginText() { + const current = this.current; + current.x = current.lineX = 0; + current.y = current.lineY = 0; + current.textMatrix = _util.IDENTITY_MATRIX; + current.lineMatrix = _util.IDENTITY_MATRIX; + current.textMatrixScale = 1; + current.tspan = this.svgFactory.createElement("svg:tspan"); + current.txtElement = this.svgFactory.createElement("svg:text"); + current.txtgrp = this.svgFactory.createElement("svg:g"); + current.xcoords = []; + current.ycoords = []; + } + moveText(x, y) { + const current = this.current; + current.x = current.lineX += x; + current.y = current.lineY += y; + current.xcoords = []; + current.ycoords = []; + current.tspan = this.svgFactory.createElement("svg:tspan"); + current.tspan.setAttributeNS(null, "font-family", current.fontFamily); + current.tspan.setAttributeNS(null, "font-size", `${pf(current.fontSize)}px`); + current.tspan.setAttributeNS(null, "y", pf(-current.y)); + } + showText(glyphs) { + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + if (fontSize === 0) { + return; + } + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const defaultVMetrics = font.defaultVMetrics; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + let x = 0; + for (const glyph of glyphs) { + if (glyph === null) { + x += fontDirection * wordSpacing; + continue; + } else if (typeof glyph === "number") { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + let scaledX, scaledY; + let width = glyph.width; + if (vertical) { + let vx; + const vmetric = glyph.vmetric || defaultVMetrics; + vx = glyph.vmetric ? vmetric[1] : width * 0.5; + vx = -vx * widthAdvanceScale; + const vy = vmetric[2] * widthAdvanceScale; + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; + } else { + scaledX = x / fontSizeScale; + scaledY = 0; + } + if (glyph.isInFont || font.missingFile) { + current.xcoords.push(current.x + scaledX); + if (vertical) { + current.ycoords.push(-current.y + scaledY); + } + current.tspan.textContent += character; + } else {} + let charWidth; + if (vertical) { + charWidth = width * widthAdvanceScale - spacing * fontDirection; + } else { + charWidth = width * widthAdvanceScale + spacing * fontDirection; + } + x += charWidth; + } + current.tspan.setAttributeNS(null, "x", current.xcoords.map(pf).join(" ")); + if (vertical) { + current.tspan.setAttributeNS(null, "y", current.ycoords.map(pf).join(" ")); + } else { + current.tspan.setAttributeNS(null, "y", pf(-current.y)); + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + current.tspan.setAttributeNS(null, "font-family", current.fontFamily); + current.tspan.setAttributeNS(null, "font-size", `${pf(current.fontSize)}px`); + if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { + current.tspan.setAttributeNS(null, "font-style", current.fontStyle); + } + if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { + current.tspan.setAttributeNS(null, "font-weight", current.fontWeight); + } + const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + if (current.fillColor !== SVG_DEFAULTS.fillColor) { + current.tspan.setAttributeNS(null, "fill", current.fillColor); + } + if (current.fillAlpha < 1) { + current.tspan.setAttributeNS(null, "fill-opacity", current.fillAlpha); + } + } else if (current.textRenderingMode === _util.TextRenderingMode.ADD_TO_PATH) { + current.tspan.setAttributeNS(null, "fill", "transparent"); + } else { + current.tspan.setAttributeNS(null, "fill", "none"); + } + if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + const lineWidthScale = 1 / (current.textMatrixScale || 1); + this._setStrokeAttributes(current.tspan, lineWidthScale); + } + let textMatrix = current.textMatrix; + if (current.textRise !== 0) { + textMatrix = textMatrix.slice(); + textMatrix[5] += current.textRise; + } + current.txtElement.setAttributeNS(null, "transform", `${pm(textMatrix)} scale(${pf(textHScale)}, -1)`); + current.txtElement.setAttributeNS(XML_NS, "xml:space", "preserve"); + current.txtElement.append(current.tspan); + current.txtgrp.append(current.txtElement); + this._ensureTransformGroup().append(current.txtElement); + } + setLeadingMoveText(x, y) { + this.setLeading(-y); + this.moveText(x, y); + } + addFontStyle(fontObj) { + if (!fontObj.data) { + throw new Error("addFontStyle: No font data available, " + 'ensure that the "fontExtraProperties" API parameter is set.'); + } + if (!this.cssStyle) { + this.cssStyle = this.svgFactory.createElement("svg:style"); + this.cssStyle.setAttributeNS(null, "type", "text/css"); + this.defs.append(this.cssStyle); + } + const url = createObjectURL(fontObj.data, fontObj.mimetype, this.forceDataSchema); + this.cssStyle.textContent += `@font-face { font-family: "${fontObj.loadedName}";` + ` src: url(${url}); }\n`; + } + setFont(details) { + const current = this.current; + const fontObj = this.commonObjs.get(details[0]); + let size = details[1]; + current.font = fontObj; + if (this.embedFonts && !fontObj.missingFile && !this.embeddedFonts[fontObj.loadedName]) { + this.addFontStyle(fontObj); + this.embeddedFonts[fontObj.loadedName] = fontObj; + } + current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + current.fontSize = size; + current.fontFamily = fontObj.loadedName; + current.fontWeight = bold; + current.fontStyle = italic; + current.tspan = this.svgFactory.createElement("svg:tspan"); + current.tspan.setAttributeNS(null, "y", pf(-current.y)); + current.xcoords = []; + current.ycoords = []; + } + endText() { + var _current$txtElement; + const current = this.current; + if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && (_current$txtElement = current.txtElement) !== null && _current$txtElement !== void 0 && _current$txtElement.hasChildNodes()) { + current.element = current.txtElement; + this.clip("nonzero"); + this.endPath(); + } + } + setLineWidth(width) { + if (width > 0) { + this.current.lineWidth = width; + } + } + setLineCap(style) { + this.current.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(style) { + this.current.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(limit) { + this.current.miterLimit = limit; + } + setStrokeAlpha(strokeAlpha) { + this.current.strokeAlpha = strokeAlpha; + } + setStrokeRGBColor(r, g, b) { + this.current.strokeColor = _util.Util.makeHexColor(r, g, b); + } + setFillAlpha(fillAlpha) { + this.current.fillAlpha = fillAlpha; + } + setFillRGBColor(r, g, b) { + this.current.fillColor = _util.Util.makeHexColor(r, g, b); + this.current.tspan = this.svgFactory.createElement("svg:tspan"); + this.current.xcoords = []; + this.current.ycoords = []; + } + setStrokeColorN(args) { + this.current.strokeColor = this._makeColorN_Pattern(args); + } + setFillColorN(args) { + this.current.fillColor = this._makeColorN_Pattern(args); + } + shadingFill(args) { + const width = this.viewport.width; + const height = this.viewport.height; + const inv = _util.Util.inverseTransform(this.transformMatrix); + const bl = _util.Util.applyTransform([0, 0], inv); + const br = _util.Util.applyTransform([0, height], inv); + const ul = _util.Util.applyTransform([width, 0], inv); + const ur = _util.Util.applyTransform([width, height], inv); + const x0 = Math.min(bl[0], br[0], ul[0], ur[0]); + const y0 = Math.min(bl[1], br[1], ul[1], ur[1]); + const x1 = Math.max(bl[0], br[0], ul[0], ur[0]); + const y1 = Math.max(bl[1], br[1], ul[1], ur[1]); + const rect = this.svgFactory.createElement("svg:rect"); + rect.setAttributeNS(null, "x", x0); + rect.setAttributeNS(null, "y", y0); + rect.setAttributeNS(null, "width", x1 - x0); + rect.setAttributeNS(null, "height", y1 - y0); + rect.setAttributeNS(null, "fill", this._makeShadingPattern(args)); + if (this.current.fillAlpha < 1) { + rect.setAttributeNS(null, "fill-opacity", this.current.fillAlpha); + } + this._ensureTransformGroup().append(rect); + } + _makeColorN_Pattern(args) { + if (args[0] === "TilingPattern") { + return this._makeTilingPattern(args); + } + return this._makeShadingPattern(args); + } + _makeTilingPattern(args) { + const color = args[1]; + const operatorList = args[2]; + const matrix = args[3] || _util.IDENTITY_MATRIX; + const [x0, y0, x1, y1] = args[4]; + const xstep = args[5]; + const ystep = args[6]; + const paintType = args[7]; + const tilingId = `shading${shadingCount++}`; + const [tx0, ty0, tx1, ty1] = _util.Util.normalizeRect([..._util.Util.applyTransform([x0, y0], matrix), ..._util.Util.applyTransform([x1, y1], matrix)]); + const [xscale, yscale] = _util.Util.singularValueDecompose2dScale(matrix); + const txstep = xstep * xscale; + const tystep = ystep * yscale; + const tiling = this.svgFactory.createElement("svg:pattern"); + tiling.setAttributeNS(null, "id", tilingId); + tiling.setAttributeNS(null, "patternUnits", "userSpaceOnUse"); + tiling.setAttributeNS(null, "width", txstep); + tiling.setAttributeNS(null, "height", tystep); + tiling.setAttributeNS(null, "x", `${tx0}`); + tiling.setAttributeNS(null, "y", `${ty0}`); + const svg = this.svg; + const transformMatrix = this.transformMatrix; + const fillColor = this.current.fillColor; + const strokeColor = this.current.strokeColor; + const bbox = this.svgFactory.create(tx1 - tx0, ty1 - ty0); + this.svg = bbox; + this.transformMatrix = matrix; + if (paintType === 2) { + const cssColor = _util.Util.makeHexColor(...color); + this.current.fillColor = cssColor; + this.current.strokeColor = cssColor; + } + this.executeOpTree(this.convertOpList(operatorList)); + this.svg = svg; + this.transformMatrix = transformMatrix; + this.current.fillColor = fillColor; + this.current.strokeColor = strokeColor; + tiling.append(bbox.childNodes[0]); + this.defs.append(tiling); + return `url(#${tilingId})`; + } + _makeShadingPattern(args) { + if (typeof args === "string") { + args = this.objs.get(args); + } + switch (args[0]) { + case "RadialAxial": + const shadingId = `shading${shadingCount++}`; + const colorStops = args[3]; + let gradient; + switch (args[1]) { + case "axial": + const point0 = args[4]; + const point1 = args[5]; + gradient = this.svgFactory.createElement("svg:linearGradient"); + gradient.setAttributeNS(null, "id", shadingId); + gradient.setAttributeNS(null, "gradientUnits", "userSpaceOnUse"); + gradient.setAttributeNS(null, "x1", point0[0]); + gradient.setAttributeNS(null, "y1", point0[1]); + gradient.setAttributeNS(null, "x2", point1[0]); + gradient.setAttributeNS(null, "y2", point1[1]); + break; + case "radial": + const focalPoint = args[4]; + const circlePoint = args[5]; + const focalRadius = args[6]; + const circleRadius = args[7]; + gradient = this.svgFactory.createElement("svg:radialGradient"); + gradient.setAttributeNS(null, "id", shadingId); + gradient.setAttributeNS(null, "gradientUnits", "userSpaceOnUse"); + gradient.setAttributeNS(null, "cx", circlePoint[0]); + gradient.setAttributeNS(null, "cy", circlePoint[1]); + gradient.setAttributeNS(null, "r", circleRadius); + gradient.setAttributeNS(null, "fx", focalPoint[0]); + gradient.setAttributeNS(null, "fy", focalPoint[1]); + gradient.setAttributeNS(null, "fr", focalRadius); + break; + default: + throw new Error(`Unknown RadialAxial type: ${args[1]}`); + } + for (const colorStop of colorStops) { + const stop = this.svgFactory.createElement("svg:stop"); + stop.setAttributeNS(null, "offset", colorStop[0]); + stop.setAttributeNS(null, "stop-color", colorStop[1]); + gradient.append(stop); + } + this.defs.append(gradient); + return `url(#${shadingId})`; + case "Mesh": + (0, _util.warn)("Unimplemented pattern Mesh"); + return null; + case "Dummy": + return "hotpink"; + default: + throw new Error(`Unknown IR type: ${args[0]}`); + } + } + setDash(dashArray, dashPhase) { + this.current.dashArray = dashArray; + this.current.dashPhase = dashPhase; + } + constructPath(ops, args) { + const current = this.current; + let x = current.x, + y = current.y; + let d = []; + let j = 0; + for (const op of ops) { + switch (op | 0) { + case _util.OPS.rectangle: + x = args[j++]; + y = args[j++]; + const width = args[j++]; + const height = args[j++]; + const xw = x + width; + const yh = y + height; + d.push("M", pf(x), pf(y), "L", pf(xw), pf(y), "L", pf(xw), pf(yh), "L", pf(x), pf(yh), "Z"); + break; + case _util.OPS.moveTo: + x = args[j++]; + y = args[j++]; + d.push("M", pf(x), pf(y)); + break; + case _util.OPS.lineTo: + x = args[j++]; + y = args[j++]; + d.push("L", pf(x), pf(y)); + break; + case _util.OPS.curveTo: + x = args[j + 4]; + y = args[j + 5]; + d.push("C", pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y)); + j += 6; + break; + case _util.OPS.curveTo2: + d.push("C", pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3])); + x = args[j + 2]; + y = args[j + 3]; + j += 4; + break; + case _util.OPS.curveTo3: + x = args[j + 2]; + y = args[j + 3]; + d.push("C", pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y)); + j += 4; + break; + case _util.OPS.closePath: + d.push("Z"); + break; + } + } + d = d.join(" "); + if (current.path && ops.length > 0 && ops[0] !== _util.OPS.rectangle && ops[0] !== _util.OPS.moveTo) { + d = current.path.getAttributeNS(null, "d") + d; + } else { + current.path = this.svgFactory.createElement("svg:path"); + this._ensureTransformGroup().append(current.path); + } + current.path.setAttributeNS(null, "d", d); + current.path.setAttributeNS(null, "fill", "none"); + current.element = current.path; + current.setCurrentPoint(x, y); + } + endPath() { + const current = this.current; + current.path = null; + if (!this.pendingClip) { + return; + } + if (!current.element) { + this.pendingClip = null; + return; + } + const clipId = `clippath${clipCount++}`; + const clipPath = this.svgFactory.createElement("svg:clipPath"); + clipPath.setAttributeNS(null, "id", clipId); + clipPath.setAttributeNS(null, "transform", pm(this.transformMatrix)); + const clipElement = current.element.cloneNode(true); + if (this.pendingClip === "evenodd") { + clipElement.setAttributeNS(null, "clip-rule", "evenodd"); + } else { + clipElement.setAttributeNS(null, "clip-rule", "nonzero"); + } + this.pendingClip = null; + clipPath.append(clipElement); + this.defs.append(clipPath); + if (current.activeClipUrl) { + current.clipGroup = null; + for (const prev of this.extraStack) { + prev.clipGroup = null; + } + clipPath.setAttributeNS(null, "clip-path", current.activeClipUrl); + } + current.activeClipUrl = `url(#${clipId})`; + this.tgrp = null; + } + clip(type) { + this.pendingClip = type; + } + closePath() { + const current = this.current; + if (current.path) { + const d = `${current.path.getAttributeNS(null, "d")}Z`; + current.path.setAttributeNS(null, "d", d); + } + } + setLeading(leading) { + this.current.leading = -leading; + } + setTextRise(textRise) { + this.current.textRise = textRise; + } + setTextRenderingMode(textRenderingMode) { + this.current.textRenderingMode = textRenderingMode; + } + setHScale(scale) { + this.current.textHScale = scale / 100; + } + setRenderingIntent(intent) {} + setFlatness(flatness) {} + setGState(states) { + for (const [key, value] of states) { + switch (key) { + case "LW": + this.setLineWidth(value); + break; + case "LC": + this.setLineCap(value); + break; + case "LJ": + this.setLineJoin(value); + break; + case "ML": + this.setMiterLimit(value); + break; + case "D": + this.setDash(value[0], value[1]); + break; + case "RI": + this.setRenderingIntent(value); + break; + case "FL": + this.setFlatness(value); + break; + case "Font": + this.setFont(value); + break; + case "CA": + this.setStrokeAlpha(value); + break; + case "ca": + this.setFillAlpha(value); + break; + default: + (0, _util.warn)(`Unimplemented graphic state operator ${key}`); + break; + } + } + } + fill() { + const current = this.current; + if (current.element) { + current.element.setAttributeNS(null, "fill", current.fillColor); + current.element.setAttributeNS(null, "fill-opacity", current.fillAlpha); + this.endPath(); + } + } + stroke() { + const current = this.current; + if (current.element) { + this._setStrokeAttributes(current.element); + current.element.setAttributeNS(null, "fill", "none"); + this.endPath(); + } + } + _setStrokeAttributes(element) { + let lineWidthScale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + const current = this.current; + let dashArray = current.dashArray; + if (lineWidthScale !== 1 && dashArray.length > 0) { + dashArray = dashArray.map(function (value) { + return lineWidthScale * value; + }); + } + element.setAttributeNS(null, "stroke", current.strokeColor); + element.setAttributeNS(null, "stroke-opacity", current.strokeAlpha); + element.setAttributeNS(null, "stroke-miterlimit", pf(current.miterLimit)); + element.setAttributeNS(null, "stroke-linecap", current.lineCap); + element.setAttributeNS(null, "stroke-linejoin", current.lineJoin); + element.setAttributeNS(null, "stroke-width", pf(lineWidthScale * current.lineWidth) + "px"); + element.setAttributeNS(null, "stroke-dasharray", dashArray.map(pf).join(" ")); + element.setAttributeNS(null, "stroke-dashoffset", pf(lineWidthScale * current.dashPhase) + "px"); + } + eoFill() { + var _this$current$element; + (_this$current$element = this.current.element) === null || _this$current$element === void 0 ? void 0 : _this$current$element.setAttributeNS(null, "fill-rule", "evenodd"); + this.fill(); + } + fillStroke() { + this.stroke(); + this.fill(); + } + eoFillStroke() { + var _this$current$element2; + (_this$current$element2 = this.current.element) === null || _this$current$element2 === void 0 ? void 0 : _this$current$element2.setAttributeNS(null, "fill-rule", "evenodd"); + this.fillStroke(); + } + closeStroke() { + this.closePath(); + this.stroke(); + } + closeFillStroke() { + this.closePath(); + this.fillStroke(); + } + closeEOFillStroke() { + this.closePath(); + this.eoFillStroke(); + } + paintSolidColorImageMask() { + const rect = this.svgFactory.createElement("svg:rect"); + rect.setAttributeNS(null, "x", "0"); + rect.setAttributeNS(null, "y", "0"); + rect.setAttributeNS(null, "width", "1px"); + rect.setAttributeNS(null, "height", "1px"); + rect.setAttributeNS(null, "fill", this.current.fillColor); + this._ensureTransformGroup().append(rect); + } + paintImageXObject(objId) { + const imgData = this.getObject(objId); + if (!imgData) { + (0, _util.warn)(`Dependent image with object ID ${objId} is not ready yet`); + return; + } + this.paintInlineImageXObject(imgData); + } + paintInlineImageXObject(imgData, mask) { + const width = imgData.width; + const height = imgData.height; + const imgSrc = convertImgDataToPng(imgData, this.forceDataSchema, !!mask); + const cliprect = this.svgFactory.createElement("svg:rect"); + cliprect.setAttributeNS(null, "x", "0"); + cliprect.setAttributeNS(null, "y", "0"); + cliprect.setAttributeNS(null, "width", pf(width)); + cliprect.setAttributeNS(null, "height", pf(height)); + this.current.element = cliprect; + this.clip("nonzero"); + const imgEl = this.svgFactory.createElement("svg:image"); + imgEl.setAttributeNS(XLINK_NS, "xlink:href", imgSrc); + imgEl.setAttributeNS(null, "x", "0"); + imgEl.setAttributeNS(null, "y", pf(-height)); + imgEl.setAttributeNS(null, "width", pf(width) + "px"); + imgEl.setAttributeNS(null, "height", pf(height) + "px"); + imgEl.setAttributeNS(null, "transform", `scale(${pf(1 / width)} ${pf(-1 / height)})`); + if (mask) { + mask.append(imgEl); + } else { + this._ensureTransformGroup().append(imgEl); + } + } + paintImageMaskXObject(img) { + const imgData = this.getObject(img.data, img); + if (imgData.bitmap) { + (0, _util.warn)("paintImageMaskXObject: ImageBitmap support is not implemented, " + "ensure that the `isOffscreenCanvasSupported` API parameter is disabled."); + return; + } + const current = this.current; + const width = imgData.width; + const height = imgData.height; + const fillColor = current.fillColor; + current.maskId = `mask${maskCount++}`; + const mask = this.svgFactory.createElement("svg:mask"); + mask.setAttributeNS(null, "id", current.maskId); + const rect = this.svgFactory.createElement("svg:rect"); + rect.setAttributeNS(null, "x", "0"); + rect.setAttributeNS(null, "y", "0"); + rect.setAttributeNS(null, "width", pf(width)); + rect.setAttributeNS(null, "height", pf(height)); + rect.setAttributeNS(null, "fill", fillColor); + rect.setAttributeNS(null, "mask", `url(#${current.maskId})`); + this.defs.append(mask); + this._ensureTransformGroup().append(rect); + this.paintInlineImageXObject(imgData, mask); + } + paintFormXObjectBegin(matrix, bbox) { + if (Array.isArray(matrix) && matrix.length === 6) { + this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); + } + if (bbox) { + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + const cliprect = this.svgFactory.createElement("svg:rect"); + cliprect.setAttributeNS(null, "x", bbox[0]); + cliprect.setAttributeNS(null, "y", bbox[1]); + cliprect.setAttributeNS(null, "width", pf(width)); + cliprect.setAttributeNS(null, "height", pf(height)); + this.current.element = cliprect; + this.clip("nonzero"); + this.endPath(); + } + } + paintFormXObjectEnd() {} + _initialize(viewport) { + const svg = this.svgFactory.create(viewport.width, viewport.height); + const definitions = this.svgFactory.createElement("svg:defs"); + svg.append(definitions); + this.defs = definitions; + const rootGroup = this.svgFactory.createElement("svg:g"); + rootGroup.setAttributeNS(null, "transform", pm(viewport.transform)); + svg.append(rootGroup); + this.svg = rootGroup; + return svg; + } + _ensureClipGroup() { + if (!this.current.clipGroup) { + const clipGroup = this.svgFactory.createElement("svg:g"); + clipGroup.setAttributeNS(null, "clip-path", this.current.activeClipUrl); + this.svg.append(clipGroup); + this.current.clipGroup = clipGroup; + } + return this.current.clipGroup; + } + _ensureTransformGroup() { + if (!this.tgrp) { + this.tgrp = this.svgFactory.createElement("svg:g"); + this.tgrp.setAttributeNS(null, "transform", pm(this.transformMatrix)); + if (this.current.activeClipUrl) { + this._ensureClipGroup().append(this.tgrp); + } else { + this.svg.append(this.tgrp); + } + } + return this.tgrp; + } + }; +} + +/***/ }), +/* 161 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PDFNodeStream = void 0; +var _util = __w_pdfjs_require__(1); +var _network_utils = __w_pdfjs_require__(162); +; +const fs = require("fs"); +const http = require("http"); +const https = require("https"); +const url = require("url"); +const fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//; +function parseUrl(sourceUrl) { + const parsedUrl = url.parse(sourceUrl); + if (parsedUrl.protocol === "file:" || parsedUrl.host) { + return parsedUrl; + } + if (/^[a-z]:[/\\]/i.test(sourceUrl)) { + return url.parse(`file:///${sourceUrl}`); + } + if (!parsedUrl.host) { + parsedUrl.protocol = "file:"; + } + return parsedUrl; +} +class PDFNodeStream { + constructor(source) { + this.source = source; + this.url = parseUrl(source.url); + this.isHttp = this.url.protocol === "http:" || this.url.protocol === "https:"; + this.isFsUrl = this.url.protocol === "file:"; + this.httpHeaders = this.isHttp && source.httpHeaders || {}; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + var _this$_fullRequestRea; + return ((_this$_fullRequestRea = this._fullRequestReader) === null || _this$_fullRequestRea === void 0 ? void 0 : _this$_fullRequestRea._loaded) ?? 0; + } + getFullReader() { + (0, _util.assert)(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); + this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this); + return this._fullRequestReader; + } + getRangeReader(start, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end); + this._rangeRequestReaders.push(rangeReader); + return rangeReader; + } + cancelAllRequests(reason) { + var _this$_fullRequestRea2; + (_this$_fullRequestRea2 = this._fullRequestReader) === null || _this$_fullRequestRea2 === void 0 ? void 0 : _this$_fullRequestRea2.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +exports.PDFNodeStream = PDFNodeStream; +class BaseFullReader { + constructor(stream) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + const source = stream.source; + this._contentLength = source.length; + this._loaded = 0; + this._filename = null; + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._readableStream = null; + this._readCapability = (0, _util.createPromiseCapability)(); + this._headersCapability = (0, _util.createPromiseCapability)(); + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + var _this$onProgress; + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = (0, _util.createPromiseCapability)(); + return this.read(); + } + this._loaded += chunk.length; + (_this$onProgress = this.onProgress) === null || _this$onProgress === void 0 ? void 0 : _this$onProgress.call(this, { + loaded: this._loaded, + total: this._contentLength + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (!this._isStreamingSupported && this._isRangeSupported) { + this._error(new _util.AbortException("streaming is disabled")); + } + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +class BaseRangeReader { + constructor(stream) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + this._loaded = 0; + this._readableStream = null; + this._readCapability = (0, _util.createPromiseCapability)(); + const source = stream.source; + this._isStreamingSupported = !source.disableStream; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + var _this$onProgress2; + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = (0, _util.createPromiseCapability)(); + return this.read(); + } + this._loaded += chunk.length; + (_this$onProgress2 = this.onProgress) === null || _this$onProgress2 === void 0 ? void 0 : _this$onProgress2.call(this, { + loaded: this._loaded + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +function createRequestOptions(parsedUrl, headers) { + return { + protocol: parsedUrl.protocol, + auth: parsedUrl.auth, + host: parsedUrl.hostname, + port: parsedUrl.port, + path: parsedUrl.path, + method: "GET", + headers + }; +} +class PDFNodeStreamFullReader extends BaseFullReader { + constructor(stream) { + super(stream); + const handleResponse = response => { + if (response.statusCode === 404) { + const error = new _util.MissingPDFException(`Missing PDF "${this._url}".`); + this._storedError = error; + this._headersCapability.reject(error); + return; + } + this._headersCapability.resolve(); + this._setReadableStream(response); + const getResponseHeader = name => { + return this._readableStream.headers[name.toLowerCase()]; + }; + const { + allowRangeRequests, + suggestedLength + } = (0, _network_utils.validateRangeRequestCapabilities)({ + getResponseHeader, + isHttp: stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); + }; + this._request = null; + if (this._url.protocol === "http:") { + this._request = http.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); + } else { + this._request = https.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); + } + this._request.on("error", reason => { + this._storedError = reason; + this._headersCapability.reject(reason); + }); + this._request.end(); + } +} +class PDFNodeStreamRangeReader extends BaseRangeReader { + constructor(stream, start, end) { + super(stream); + this._httpHeaders = {}; + for (const property in stream.httpHeaders) { + const value = stream.httpHeaders[property]; + if (value === undefined) { + continue; + } + this._httpHeaders[property] = value; + } + this._httpHeaders.Range = `bytes=${start}-${end - 1}`; + const handleResponse = response => { + if (response.statusCode === 404) { + const error = new _util.MissingPDFException(`Missing PDF "${this._url}".`); + this._storedError = error; + return; + } + this._setReadableStream(response); + }; + this._request = null; + if (this._url.protocol === "http:") { + this._request = http.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); + } else { + this._request = https.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); + } + this._request.on("error", reason => { + this._storedError = reason; + }); + this._request.end(); + } +} +class PDFNodeStreamFsFullReader extends BaseFullReader { + constructor(stream) { + super(stream); + let path = decodeURIComponent(this._url.path); + if (fileUriRegex.test(this._url.href)) { + path = path.replace(/^\//, ""); + } + fs.lstat(path, (error, stat) => { + if (error) { + if (error.code === "ENOENT") { + error = new _util.MissingPDFException(`Missing PDF "${path}".`); + } + this._storedError = error; + this._headersCapability.reject(error); + return; + } + this._contentLength = stat.size; + this._setReadableStream(fs.createReadStream(path)); + this._headersCapability.resolve(); + }); + } +} +class PDFNodeStreamFsRangeReader extends BaseRangeReader { + constructor(stream, start, end) { + super(stream); + let path = decodeURIComponent(this._url.path); + if (fileUriRegex.test(this._url.href)) { + path = path.replace(/^\//, ""); + } + this._setReadableStream(fs.createReadStream(path, { + start, + end: end - 1 + })); + } +} + +/***/ }), +/* 162 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.createResponseStatusError = createResponseStatusError; +exports.extractFilenameFromHeader = extractFilenameFromHeader; +exports.validateRangeRequestCapabilities = validateRangeRequestCapabilities; +exports.validateResponseStatus = validateResponseStatus; +var _util = __w_pdfjs_require__(1); +var _content_disposition = __w_pdfjs_require__(163); +var _display_utils = __w_pdfjs_require__(137); +function validateRangeRequestCapabilities(_ref) { + let { + getResponseHeader, + isHttp, + rangeChunkSize, + disableRange + } = _ref; + const returnValues = { + allowRangeRequests: false, + suggestedLength: undefined + }; + const length = parseInt(getResponseHeader("Content-Length"), 10); + if (!Number.isInteger(length)) { + return returnValues; + } + returnValues.suggestedLength = length; + if (length <= 2 * rangeChunkSize) { + return returnValues; + } + if (disableRange || !isHttp) { + return returnValues; + } + // if (getResponseHeader("Accept-Ranges") !== "bytes") { + // return returnValues; + // } + // const contentEncoding = getResponseHeader("Content-Encoding") || "identity"; + // if (contentEncoding !== "identity") { + // return returnValues; + // } + returnValues.allowRangeRequests = true; + return returnValues; +} +function extractFilenameFromHeader(getResponseHeader) { + const contentDisposition = getResponseHeader("Content-Disposition"); + if (contentDisposition) { + let filename = (0, _content_disposition.getFilenameFromContentDispositionHeader)(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch (ex) {} + } + if ((0, _display_utils.isPdfFile)(filename)) { + return filename; + } + } + return null; +} +function createResponseStatusError(status, url) { + if (status === 404 || status === 0 && url.startsWith("file:")) { + return new _util.MissingPDFException('Missing PDF "' + url + '".'); + } + return new _util.UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status); +} +function validateResponseStatus(status) { + return status === 200 || status === 206; +} + +/***/ }), +/* 163 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getFilenameFromContentDispositionHeader = getFilenameFromContentDispositionHeader; +var _util = __w_pdfjs_require__(1); +function getFilenameFromContentDispositionHeader(contentDisposition) { + let needsEncodingFixup = true; + let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = unescape(filename); + filename = rfc5987decode(filename); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + tmp = rfc2231getparam(contentDisposition); + if (tmp) { + const filename = rfc2047decode(tmp); + return fixupEncoding(filename); + } + tmp = toParamRegExp("filename", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + function toParamRegExp(attributePattern, flags) { + return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + } + function textdecode(encoding, value) { + if (encoding) { + if (!/^[\x00-\xFF]+$/.test(value)) { + return value; + } + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = (0, _util.stringToBytes)(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch (e) {} + } + return value; + } + function fixupEncoding(value) { + if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { + value = textdecode("utf-8", value); + if (needsEncodingFixup) { + value = textdecode("iso-8859-1", value); + } + } + return value; + } + function rfc2231getparam(contentDispositionStr) { + const matches = []; + let match; + const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); + while ((match = iter.exec(contentDispositionStr)) !== null) { + let [, n, quot, part] = match; + n = parseInt(n, 10); + if (n in matches) { + if (n === 0) { + break; + } + continue; + } + matches[n] = [quot, part]; + } + const parts = []; + for (let n = 0; n < matches.length; ++n) { + if (!(n in matches)) { + break; + } + let [quot, part] = matches[n]; + part = rfc2616unquote(part); + if (quot) { + part = unescape(part); + if (n === 0) { + part = rfc5987decode(part); + } + } + parts.push(part); + } + return parts.join(""); + } + function rfc2616unquote(value) { + if (value.startsWith('"')) { + const parts = value.slice(1).split('\\"'); + for (let i = 0; i < parts.length; ++i) { + const quotindex = parts[i].indexOf('"'); + if (quotindex !== -1) { + parts[i] = parts[i].slice(0, quotindex); + parts.length = i + 1; + } + parts[i] = parts[i].replace(/\\(.)/g, "$1"); + } + value = parts.join('"'); + } + return value; + } + function rfc5987decode(extvalue) { + const encodingend = extvalue.indexOf("'"); + if (encodingend === -1) { + return extvalue; + } + const encoding = extvalue.slice(0, encodingend); + const langvalue = extvalue.slice(encodingend + 1); + const value = langvalue.replace(/^[^']*'/, ""); + return textdecode(encoding, value); + } + function rfc2047decode(value) { + if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { + return value; + } + return value.replace(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replace(/_/g, " "); + text = text.replace(/=([0-9a-fA-F]{2})/g, function (match, hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch (e) {} + return textdecode(charset, text); + }); + } + return ""; +} + +/***/ }), +/* 164 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PDFNetworkStream = void 0; +var _util = __w_pdfjs_require__(1); +var _network_utils = __w_pdfjs_require__(162); +; +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function getArrayBuffer(xhr) { + const data = xhr.response; + if (typeof data !== "string") { + return data; + } + const array = (0, _util.stringToBytes)(data); + return array.buffer; +} +class NetworkManager { + constructor(url) { + let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.url = url; + this.isHttp = /^https?:/i.test(url); + this.httpHeaders = this.isHttp && args.httpHeaders || Object.create(null); + this.withCredentials = args.withCredentials || false; + this.getXhr = args.getXhr || function NetworkManager_getXhr() { + return new XMLHttpRequest(); + }; + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + } + requestRange(begin, end, listeners) { + const args = { + begin, + end + }; + for (const prop in listeners) { + args[prop] = listeners[prop]; + } + return this.request(args); + } + requestFull(listeners) { + return this.request(listeners); + } + request(args) { + const xhr = this.getXhr(); + const xhrId = this.currXhrId++; + const pendingRequest = this.pendingRequests[xhrId] = { + xhr + }; + xhr.open("GET", this.url); + xhr.withCredentials = this.withCredentials; + for (const property in this.httpHeaders) { + const value = this.httpHeaders[property]; + if (value === undefined) { + continue; + } + xhr.setRequestHeader(property, value); + } + if (this.isHttp && "begin" in args && "end" in args) { + xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); + pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; + } else { + pendingRequest.expectedStatus = OK_RESPONSE; + } + xhr.responseType = "arraybuffer"; + if (args.onError) { + xhr.onerror = function (evt) { + args.onError(xhr.status); + }; + } + xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); + xhr.onprogress = this.onProgress.bind(this, xhrId); + pendingRequest.onHeadersReceived = args.onHeadersReceived; + pendingRequest.onDone = args.onDone; + pendingRequest.onError = args.onError; + pendingRequest.onProgress = args.onProgress; + xhr.send(null); + return xhrId; + } + onProgress(xhrId, evt) { + var _pendingRequest$onPro; + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + (_pendingRequest$onPro = pendingRequest.onProgress) === null || _pendingRequest$onPro === void 0 ? void 0 : _pendingRequest$onPro.call(pendingRequest, evt); + } + onStateChange(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + const xhr = pendingRequest.xhr; + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + if (xhr.readyState !== 4) { + return; + } + if (!(xhrId in this.pendingRequests)) { + return; + } + delete this.pendingRequests[xhrId]; + if (xhr.status === 0 && this.isHttp) { + var _pendingRequest$onErr; + (_pendingRequest$onErr = pendingRequest.onError) === null || _pendingRequest$onErr === void 0 ? void 0 : _pendingRequest$onErr.call(pendingRequest, xhr.status); + return; + } + const xhrStatus = xhr.status || OK_RESPONSE; + const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { + var _pendingRequest$onErr2; + (_pendingRequest$onErr2 = pendingRequest.onError) === null || _pendingRequest$onErr2 === void 0 ? void 0 : _pendingRequest$onErr2.call(pendingRequest, xhr.status); + return; + } + const chunk = getArrayBuffer(xhr); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + pendingRequest.onDone({ + begin: parseInt(matches[1], 10), + chunk + }); + } else if (chunk) { + pendingRequest.onDone({ + begin: 0, + chunk + }); + } else { + var _pendingRequest$onErr3; + (_pendingRequest$onErr3 = pendingRequest.onError) === null || _pendingRequest$onErr3 === void 0 ? void 0 : _pendingRequest$onErr3.call(pendingRequest, xhr.status); + } + } + getRequestXhr(xhrId) { + return this.pendingRequests[xhrId].xhr; + } + isPendingRequest(xhrId) { + return xhrId in this.pendingRequests; + } + abortRequest(xhrId) { + const xhr = this.pendingRequests[xhrId].xhr; + delete this.pendingRequests[xhrId]; + xhr.abort(); + } +} +class PDFNetworkStream { + constructor(source) { + this._source = source; + this._manager = new NetworkManager(source.url, { + httpHeaders: source.httpHeaders, + withCredentials: source.withCredentials + }); + this._rangeChunkSize = source.rangeChunkSize; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + _onRangeRequestReaderClosed(reader) { + const i = this._rangeRequestReaders.indexOf(reader); + if (i >= 0) { + this._rangeRequestReaders.splice(i, 1); + } + } + getFullReader() { + (0, _util.assert)(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); + reader.onClosed = this._onRangeRequestReaderClosed.bind(this); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + var _this$_fullRequestRea; + (_this$_fullRequestRea = this._fullRequestReader) === null || _this$_fullRequestRea === void 0 ? void 0 : _this$_fullRequestRea.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +exports.PDFNetworkStream = PDFNetworkStream; +class PDFNetworkStreamFullRequestReader { + constructor(manager, source) { + this._manager = manager; + const args = { + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = source.url; + this._fullRequestId = manager.requestFull(args); + this._headersReceivedCapability = (0, _util.createPromiseCapability)(); + this._disableRange = source.disableRange || false; + this._contentLength = source.length; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = false; + this._isRangeSupported = false; + this._cachedChunks = []; + this._requests = []; + this._done = false; + this._storedError = undefined; + this._filename = null; + this.onProgress = null; + } + _onHeadersReceived() { + const fullRequestXhrId = this._fullRequestId; + const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); + const getResponseHeader = name => { + return fullRequestXhr.getResponseHeader(name); + }; + const { + allowRangeRequests, + suggestedLength + } = (0, _network_utils.validateRangeRequestCapabilities)({ + getResponseHeader, + isHttp: this._manager.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + if (allowRangeRequests) { + this._isRangeSupported = true; + } + this._contentLength = suggestedLength || this._contentLength; + this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); + if (this._isRangeSupported) { + this._manager.abortRequest(fullRequestXhrId); + } + this._headersReceivedCapability.resolve(); + } + _onDone(data) { + if (data) { + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: data.chunk, + done: false + }); + } else { + this._cachedChunks.push(data.chunk); + } + } + this._done = true; + if (this._cachedChunks.length > 0) { + return; + } + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + _onError(status) { + this._storedError = (0, _network_utils.createResponseStatusError)(status, this._url); + this._headersReceivedCapability.reject(this._storedError); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._cachedChunks.length = 0; + } + _onProgress(evt) { + var _this$onProgress; + (_this$onProgress = this.onProgress) === null || _this$onProgress === void 0 ? void 0 : _this$onProgress.call(this, { + loaded: evt.loaded, + total: evt.lengthComputable ? evt.total : this._contentLength + }); + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get contentLength() { + return this._contentLength; + } + get headersReady() { + return this._headersReceivedCapability.promise; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._cachedChunks.length > 0) { + const chunk = this._cachedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = (0, _util.createPromiseCapability)(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + this._headersReceivedCapability.reject(reason); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._fullRequestId)) { + this._manager.abortRequest(this._fullRequestId); + } + this._fullRequestReader = null; + } +} +class PDFNetworkStreamRangeRequestReader { + constructor(manager, begin, end) { + this._manager = manager; + const args = { + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = manager.url; + this._requestId = manager.requestRange(begin, end, args); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this._storedError = undefined; + this.onProgress = null; + this.onClosed = null; + } + _close() { + var _this$onClosed; + (_this$onClosed = this.onClosed) === null || _this$onClosed === void 0 ? void 0 : _this$onClosed.call(this, this); + } + _onDone(data) { + const chunk = data.chunk; + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._close(); + } + _onError(status) { + this._storedError = (0, _network_utils.createResponseStatusError)(status, this._url); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._queuedChunk = null; + } + _onProgress(evt) { + if (!this.isStreamingSupported) { + var _this$onProgress2; + (_this$onProgress2 = this.onProgress) === null || _this$onProgress2 === void 0 ? void 0 : _this$onProgress2.call(this, { + loaded: evt.loaded + }); + } + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._queuedChunk !== null) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = (0, _util.createPromiseCapability)(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._requestId)) { + this._manager.abortRequest(this._requestId); + } + this._close(); + } +} + +/***/ }), +/* 165 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PDFFetchStream = void 0; +var _util = __w_pdfjs_require__(1); +var _network_utils = __w_pdfjs_require__(162); +; +function createFetchOptions(headers, withCredentials, abortController) { + return { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" + }; +} +function createHeaders(httpHeaders) { + const headers = new Headers(); + for (const property in httpHeaders) { + const value = httpHeaders[property]; + if (value === undefined) { + continue; + } + headers.append(property, value); + } + return headers; +} +class PDFFetchStream { + constructor(source) { + this.source = source; + this.isHttp = /^https?:/i.test(source.url); + this.httpHeaders = this.isHttp && source.httpHeaders || {}; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + var _this$_fullRequestRea; + return ((_this$_fullRequestRea = this._fullRequestReader) === null || _this$_fullRequestRea === void 0 ? void 0 : _this$_fullRequestRea._loaded) ?? 0; + } + getFullReader() { + (0, _util.assert)(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFFetchStreamReader(this); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFFetchStreamRangeReader(this, begin, end); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + var _this$_fullRequestRea2; + (_this$_fullRequestRea2 = this._fullRequestReader) === null || _this$_fullRequestRea2 === void 0 ? void 0 : _this$_fullRequestRea2.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +exports.PDFFetchStream = PDFFetchStream; +class PDFFetchStreamReader { + constructor(stream) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + this._filename = null; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._contentLength = source.length; + this._headersCapability = (0, _util.createPromiseCapability)(); + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._abortController = new AbortController(); + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._headers = createHeaders(this._stream.httpHeaders); + const url = source.url; + fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { + if (!(0, _network_utils.validateResponseStatus)(response.status)) { + throw (0, _network_utils.createResponseStatusError)(response.status, url); + } + this._reader = response.body.getReader(); + this._headersCapability.resolve(); + const getResponseHeader = name => { + return response.headers.get(name); + }; + const { + allowRangeRequests, + suggestedLength + } = (0, _network_utils.validateRangeRequestCapabilities)({ + getResponseHeader, + isHttp: this._stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new _util.AbortException("Streaming is disabled.")); + } + }).catch(this._headersCapability.reject); + this.onProgress = null; + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + var _this$onProgress; + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + (_this$onProgress = this.onProgress) === null || _this$onProgress === void 0 ? void 0 : _this$onProgress.call(this, { + loaded: this._loaded, + total: this._contentLength + }); + const buffer = new Uint8Array(value).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + var _this$_reader; + (_this$_reader = this._reader) === null || _this$_reader === void 0 ? void 0 : _this$_reader.cancel(reason); + this._abortController.abort(); + } +} +class PDFFetchStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._readCapability = (0, _util.createPromiseCapability)(); + this._isStreamingSupported = !source.disableStream; + this._abortController = new AbortController(); + this._headers = createHeaders(this._stream.httpHeaders); + this._headers.append("Range", `bytes=${begin}-${end - 1}`); + const url = source.url; + fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { + if (!(0, _network_utils.validateResponseStatus)(response.status)) { + throw (0, _network_utils.createResponseStatusError)(response.status, url); + } + this._readCapability.resolve(); + this._reader = response.body.getReader(); + }).catch(this._readCapability.reject); + this.onProgress = null; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + var _this$onProgress2; + await this._readCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + (_this$onProgress2 = this.onProgress) === null || _this$onProgress2 === void 0 ? void 0 : _this$onProgress2.call(this, { + loaded: this._loaded + }); + const buffer = new Uint8Array(value).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + var _this$_reader2; + (_this$_reader2 = this._reader) === null || _this$_reader2 === void 0 ? void 0 : _this$_reader2.cancel(reason); + this._abortController.abort(); + } +} + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __w_pdfjs_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +var exports = __webpack_exports__; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "AbortException", ({ + enumerable: true, + get: function () { + return _util.AbortException; + } +})); +Object.defineProperty(exports, "AnnotationEditorLayer", ({ + enumerable: true, + get: function () { + return _annotation_editor_layer.AnnotationEditorLayer; + } +})); +Object.defineProperty(exports, "AnnotationEditorParamsType", ({ + enumerable: true, + get: function () { + return _util.AnnotationEditorParamsType; + } +})); +Object.defineProperty(exports, "AnnotationEditorType", ({ + enumerable: true, + get: function () { + return _util.AnnotationEditorType; + } +})); +Object.defineProperty(exports, "AnnotationEditorUIManager", ({ + enumerable: true, + get: function () { + return _tools.AnnotationEditorUIManager; + } +})); +Object.defineProperty(exports, "AnnotationLayer", ({ + enumerable: true, + get: function () { + return _annotation_layer.AnnotationLayer; + } +})); +Object.defineProperty(exports, "AnnotationMode", ({ + enumerable: true, + get: function () { + return _util.AnnotationMode; + } +})); +Object.defineProperty(exports, "CMapCompressionType", ({ + enumerable: true, + get: function () { + return _util.CMapCompressionType; + } +})); +Object.defineProperty(exports, "GlobalWorkerOptions", ({ + enumerable: true, + get: function () { + return _worker_options.GlobalWorkerOptions; + } +})); +Object.defineProperty(exports, "InvalidPDFException", ({ + enumerable: true, + get: function () { + return _util.InvalidPDFException; + } +})); +Object.defineProperty(exports, "MissingPDFException", ({ + enumerable: true, + get: function () { + return _util.MissingPDFException; + } +})); +Object.defineProperty(exports, "OPS", ({ + enumerable: true, + get: function () { + return _util.OPS; + } +})); +Object.defineProperty(exports, "PDFDataRangeTransport", ({ + enumerable: true, + get: function () { + return _api.PDFDataRangeTransport; + } +})); +Object.defineProperty(exports, "PDFDateString", ({ + enumerable: true, + get: function () { + return _display_utils.PDFDateString; + } +})); +Object.defineProperty(exports, "PDFWorker", ({ + enumerable: true, + get: function () { + return _api.PDFWorker; + } +})); +Object.defineProperty(exports, "PasswordResponses", ({ + enumerable: true, + get: function () { + return _util.PasswordResponses; + } +})); +Object.defineProperty(exports, "PermissionFlag", ({ + enumerable: true, + get: function () { + return _util.PermissionFlag; + } +})); +Object.defineProperty(exports, "PixelsPerInch", ({ + enumerable: true, + get: function () { + return _display_utils.PixelsPerInch; + } +})); +Object.defineProperty(exports, "RenderingCancelledException", ({ + enumerable: true, + get: function () { + return _display_utils.RenderingCancelledException; + } +})); +Object.defineProperty(exports, "SVGGraphics", ({ + enumerable: true, + get: function () { + return _svg.SVGGraphics; + } +})); +Object.defineProperty(exports, "UNSUPPORTED_FEATURES", ({ + enumerable: true, + get: function () { + return _util.UNSUPPORTED_FEATURES; + } +})); +Object.defineProperty(exports, "UnexpectedResponseException", ({ + enumerable: true, + get: function () { + return _util.UnexpectedResponseException; + } +})); +Object.defineProperty(exports, "Util", ({ + enumerable: true, + get: function () { + return _util.Util; + } +})); +Object.defineProperty(exports, "VerbosityLevel", ({ + enumerable: true, + get: function () { + return _util.VerbosityLevel; + } +})); +Object.defineProperty(exports, "XfaLayer", ({ + enumerable: true, + get: function () { + return _xfa_layer.XfaLayer; + } +})); +Object.defineProperty(exports, "build", ({ + enumerable: true, + get: function () { + return _api.build; + } +})); +Object.defineProperty(exports, "createPromiseCapability", ({ + enumerable: true, + get: function () { + return _util.createPromiseCapability; + } +})); +Object.defineProperty(exports, "createValidAbsoluteUrl", ({ + enumerable: true, + get: function () { + return _util.createValidAbsoluteUrl; + } +})); +Object.defineProperty(exports, "getDocument", ({ + enumerable: true, + get: function () { + return _api.getDocument; + } +})); +Object.defineProperty(exports, "getFilenameFromUrl", ({ + enumerable: true, + get: function () { + return _display_utils.getFilenameFromUrl; + } +})); +Object.defineProperty(exports, "getPdfFilenameFromUrl", ({ + enumerable: true, + get: function () { + return _display_utils.getPdfFilenameFromUrl; + } +})); +Object.defineProperty(exports, "getXfaPageViewport", ({ + enumerable: true, + get: function () { + return _display_utils.getXfaPageViewport; + } +})); +Object.defineProperty(exports, "isDataScheme", ({ + enumerable: true, + get: function () { + return _display_utils.isDataScheme; + } +})); +Object.defineProperty(exports, "isPdfFile", ({ + enumerable: true, + get: function () { + return _display_utils.isPdfFile; + } +})); +Object.defineProperty(exports, "loadScript", ({ + enumerable: true, + get: function () { + return _display_utils.loadScript; + } +})); +Object.defineProperty(exports, "renderTextLayer", ({ + enumerable: true, + get: function () { + return _text_layer.renderTextLayer; + } +})); +Object.defineProperty(exports, "setLayerDimensions", ({ + enumerable: true, + get: function () { + return _display_utils.setLayerDimensions; + } +})); +Object.defineProperty(exports, "shadow", ({ + enumerable: true, + get: function () { + return _util.shadow; + } +})); +Object.defineProperty(exports, "updateTextLayer", ({ + enumerable: true, + get: function () { + return _text_layer.updateTextLayer; + } +})); +Object.defineProperty(exports, "version", ({ + enumerable: true, + get: function () { + return _api.version; + } +})); +var _util = __w_pdfjs_require__(1); +var _api = __w_pdfjs_require__(133); +var _display_utils = __w_pdfjs_require__(137); +var _text_layer = __w_pdfjs_require__(151); +var _annotation_editor_layer = __w_pdfjs_require__(152); +var _tools = __w_pdfjs_require__(136); +var _annotation_layer = __w_pdfjs_require__(157); +var _worker_options = __w_pdfjs_require__(144); +var _is_node = __w_pdfjs_require__(3); +var _svg = __w_pdfjs_require__(160); +var _xfa_layer = __w_pdfjs_require__(159); +const pdfjsVersion = '3.2.146'; +const pdfjsBuild = '3fd2a3548'; +{ + if (_is_node.isNodeJS) { + const { + PDFNodeStream + } = __w_pdfjs_require__(161); + (0, _api.setPDFNetworkStreamFactory)(params => { + return new PDFNodeStream(params); + }); + } else { + const { + PDFNetworkStream + } = __w_pdfjs_require__(164); + const { + PDFFetchStream + } = __w_pdfjs_require__(165); + (0, _api.setPDFNetworkStreamFactory)(params => { + if ((0, _display_utils.isValidFetchUrl)(params.url)) { + return new PDFFetchStream(params); + } + return new PDFNetworkStream(params); + }); + } +} +})(); + +/******/ return __webpack_exports__; +/******/ })() +; +}); +//# sourceMappingURL=pdf.js.map diff --git a/src/assets/pdf-annotation/build/pdf.sandbox.js b/src/assets/pdf-annotation/build/pdf.sandbox.js new file mode 100755 index 0000000..5ff0ff1 --- /dev/null +++ b/src/assets/pdf-annotation/build/pdf.sandbox.js @@ -0,0 +1,281 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2022 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define("pdfjs-dist/build/pdf.sandbox", [], factory); + else if(typeof exports === 'object') + exports["pdfjs-dist/build/pdf.sandbox"] = factory(); + else + root["pdfjs-dist/build/pdf.sandbox"] = root.pdfjsSandbox = factory(); +})(globalThis, () => { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack_module, exports) => { + +Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var Module=(()=>{var _scriptDir=typeof document!=='undefined'&&document.currentScript?document.currentScript.src:undefined;return function(Module){Module=Module||{};var c;c||(c=typeof Module!=='undefined'?Module:{});var h,n;c.ready=new Promise(function(a,b){h=a;n=b;});var r=Object.assign({},c),t="";"undefined"!=typeof document&&document.currentScript&&(t=document.currentScript.src);_scriptDir&&(t=_scriptDir);0!==t.indexOf("blob:")?t=t.substr(0,t.replace(/[?#].*/,"").lastIndexOf("/")+1):t="";var aa=c.print||console.log.bind(console),u=c.printErr||console.warn.bind(console);Object.assign(c,r);r=null;var v;c.wasmBinary&&(v=c.wasmBinary);var noExitRuntime=c.noExitRuntime||!0;"object"!=typeof WebAssembly&&w("no native wasm support detected");var x,y=!1;function z(a,b,d,e){var f={string:function(l){var p=0;if(null!==l&&void 0!==l&&0!==l){var S=(l.length<<2)+1;p=A(S);B(l,C,p,S);}return p;},array:function(l){var p=A(l.length);D.set(l,p);return p;}};a=c["_"+a];var g=[],k=0;if(e)for(var m=0;m=d);)++e;if(16f?d+=String.fromCharCode(f):(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023));}}else d+=String.fromCharCode(f);}return d;}function G(a){return a?I(C,a):"";}function B(a,b,d,e){if(0=g){var k=a.charCodeAt(++f);g=65536+((g&1023)<<10)|k&1023;}if(127>=g){if(d>=e)break;b[d++]=g;}else{if(2047>=g){if(d+1>=e)break;b[d++]=192|g>>6;}else{if(65535>=g){if(d+2>=e)break;b[d++]=224|g>>12;}else{if(d+3>=e)break;b[d++]=240|g>>18;b[d++]=128|g>>12&63;}b[d++]=128|g>>6&63;}b[d++]=128|g&63;}}b[d]=0;}}function J(a){for(var b=0,d=0;d=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++d)&1023);127>=e?++b:b=2047>=e?b+2:65535>=e?b+3:b+4;}return b;}function K(a){var b=J(a)+1,d=L(b);d&&B(a,D,d,b);return d;}var M,D,C,N;function ba(){var a=x.buffer;M=a;c.HEAP8=D=new Int8Array(a);c.HEAP16=new Int16Array(a);c.HEAP32=N=new Int32Array(a);c.HEAPU8=C=new Uint8Array(a);c.HEAPU16=new Uint16Array(a);c.HEAPU32=new Uint32Array(a);c.HEAPF32=new Float32Array(a);c.HEAPF64=new Float64Array(a);}var O,ca=[],da=[],ea=[];function fa(){var a=c.preRun.shift();ca.unshift(a);}var P=0,Q=null,R=null;function w(a){if(c.onAbort)c.onAbort(a);a="Aborted("+a+")";u(a);y=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");n(a);throw a;}function T(a){return a.startsWith("data:application/octet-stream;base64,");}var U;U="data:application/octet-stream;base64,AGFzbQEAAAAByQZtYAR/fn9/AX5gA39/fwF/YAJ/fwF/YAJ/fwBgAX8Bf2AFf35/f38BfmADf39/AGABfwBgAXwBfGACf34BfmAEf39/fwF/YAJ/fgBgAn9/AX5gAn9+AX9gA39/fgF/YAN/fn8BfmABfgF/YAN/fn8AYAZ/fn9/f38BfmADf35/AX9gBX9/f39/AX9gBn9+fn9/fwF+YAN/fn4BfmAEf39/fwBgBH9/fn8Bf2ADf39/AX5gBH9/f38BfmAGf39/f39/AX9gBX9+fn5+AGABfwF+YAN/fn4Bf2ACfHwBfGABfgF+YAV/fn9+fwF/YAV/fn5/fwF+YAd/fn9+fn5/AX9gAABgBX9/f39/AGAEf35+fwBgBX9+fn5/AX9gB39/f39/f38Bf2AGf35/fn5/AX9gBH9+f34BfmACfn8Bf2AEf35+fwF/YAJ+fwBgCX9/f39/f39/fwF/YAR/fn5/AX5gBn9/f39/fwF+YAN/fn4AYAR/fn9/AX9gBX9+fn9/AGACfn4BfmAHf35/f39/fwF+YAF/AXxgA39/fgBgBH9+f38AYAR/fn9+AX9gBH9+fn4Bf2AEf39/fgF/YAh/f39/f39/fwF/YAd/f39/f39/AGACfH8BfGADfn9/AX9gA3x8fwF8YAR/f35/AGAEf35+fgF+YAABf2AGf3x/f39/AX9gAAF8YAV/fn9+fwF+YAF8AX5gAX4BfGAFf39+f38Bf2AGf39+fn5+AX9gBn9/f39/fwBgAn98AGAEf39+fwF+YAR/fn9+AGAFf39/f34BfmAHf35+fn9/fwF+YAR+fn5+AX9gCn9/f39/f39/f38Bf2AHf39/f39/fgF+YAd8f39/f39/AGADf39+AX5gBX9/f39/AX5gBX9+f39/AGAFf3x/f38BfmAGf35+fn5/AX9gBH98f38Bf2AGf35/f39/AX9gBX9/fn5/AX9gBX9+f39/AX9gBn9/fn5/fwF/YAV/fn5+fgF/YAJ/fwF8YAR/f35+AX9gBX9/fn5+AX5gB39/f35+fn8Bf2AEf39/fgF+YAJ8fwF/YAJ8fAF/YAh/fn5+fn9+fgF+YAN/fnwBfmAAAX5gAn5+AXxgA35+fgF/YAN/f3wAAkkMAWEBYQAXAWEBYgAkAWEBYwAKAWEBZABFAWEBZQADAWEBZgAGAWEBZwADAWEB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QgBSDwsgAactAAUhAiAAIAEQDCACQX9zQYABcUEHdg8LIANBB2tBbU0EQCABEEkiBUQAAAAAAAAAAGIgBb1C////////////AINCgYCAgICAgPj/AFRxDwsgACABEAxBASECCyACCwsAIAAgAUEAEKAECxkAIAAoAhAgARDoASIBRQRAIAAQyQELIAELPwEBfyMAQRBrIgIkAAJ/IAEgACgCEEcEQCACIAE2AgAgAEG8/QAgAhAVQX8MAQsgABARCyEAIAJBEGokACAACygBAX8jAEEQayICJAAgAiABOwEOIAAgAkEOakECEIoBGiACQRBqJAALCwAgACABQQEQ4gULxQoCBX8PfiMAQeAAayIFJAAgBEL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhCiACQv///////z+DIg1CIIghDiAEQjCIp0H//wFxIQcCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAHQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIgtCgICAgICAwP//AFQgC0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEKDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQogAyEBDAILIAEgC0KAgICAgIDA//8AhYRQBEAgAiADhFAEQEKAgICAgIDg//8AIQpCACEBDAMLIApCgICAgICAwP//AIQhCkIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQCABIAuEIQJCACEBIAJQBEBCgICAgICA4P//ACEKDAMLIApCgICAgICAwP//AIQhCgwCCyABIAuEUARAQgAhAQwCCyACIAOEUARAQgAhAQwCCyALQv///////z9YBEAgBUHQAGogASANIAEgDSANUCIGG3kgBkEGdK18pyIGQQ9rEHNBECAGayEGIAUpA1giDUIgiCEOIAUpA1AhAQsgAkL///////8/Vg0AIAVBQGsgAyAMIAMgDCAMUCIIG3kgCEEGdK18pyIIQQ9rEHMgBiAIa0EQaiEGIAUpA0ghDCAFKQNAIQMLIANCD4YiC0KAgP7/D4MiAiABQiCIIgR+IhAgC0IgiCITIAFC/////w+DIgF+fCIPQiCGIhEgASACfnwiCyARVK0gAiANQv////8PgyINfiIVIAQgE358IhEgDEIPhiADQjGIhCISQv////8PgyIDIAF+fCIUIA8gEFStQiCGIA9CIIiEfCIPIAIgDkKAgASEIgx+IhYgDSATfnwiDiASQiCIQoCAgIAIhCICIAF+fCIQIAMgBH58IhJCIIZ8Ihd8IQEgByAJaiAGakH//wBrIQYCQCACIAR+IhggDCATfnwiBCAYVK0gBCAEIAMgDX58IgRWrXwgAiAMfnwgBCAEIBEgFVStIBEgFFatfHwiBFatfCADIAx+IgMgAiANfnwiAiADVK1CIIYgAkIgiIR8IAQgAkIghnwiAiAEVK18IAIgAiAQIBJWrSAOIBZUrSAOIBBWrXx8QiCGIBJCIIiEfCICVq18IAIgAiAPIBRUrSAPIBdWrXx8IgJWrXwiBEKAgICAgIDAAINQRQRAIAZBAWohBgwBCyALQj+IIQMgBEIBhiACQj+IhCEEIAJCAYYgAUI/iIQhAiALQgGGIQsgAyABQgGGhCEBCyAGQf//AU4EQCAKQoCAgICAgMD//wCEIQpCACEBDAELAn4gBkEATARAQQEgBmsiB0GAAU8EQEIAIQEMAwsgBUEwaiALIAEgBkH/AGoiBhBzIAVBIGogAiAEIAYQcyAFQRBqIAsgASAHEKECIAUgAiAEIAcQoQIgBSkDMCAFKQM4hEIAUq0gBSkDICAFKQMQhIQhCyAFKQMoIAUpAxiEIQEgBSkDACECIAUpAwgMAQsgBEL///////8/gyAGrUIwhoQLIAqEIQogC1AgAUIAWSABQoCAgICAgICAgH9RG0UEQCAKIAJCAXwiASACVK18IQoMAQsgCyABQoCAgICAgICAgH+FhFBFBEAgAiEBDAELIAogAiACQgGDfCIBIAJUrXwhCgsgACABNwMAIAAgCjcDCCAFQeAAaiQAC2oBAn8CQCAAKALYAiIDRQ0AIAAoAuACIgQgACgC3AJODQAgACgC6AIgAUsNACAAKALkAiACRg0AIAMgBEEDdGoiAyACNgIEIAMgATYCACAAIAE2AugCIAAgBEEBajYC4AIgACACNgLkAgsLDAAgACgCQEF/ENADCyEAIAAgASACQoCAgIAwIAMgBEECEOMBIQIgACABEAwgAgsZACABBEAgACABQRBrrUKAgICAkH+EEAwLC28BAn8gAUIgiKciAyABpyICQQBIckUEQCACEJUBDwsgA0F4RgRAIAAgACgCECACENYCEBkPC0EAIQIgACABEJgEIgEQDQR/QQAFIAFCgICAgHCDQoCAgICAf1EEQCAAIAEQmAIPCyAAIAGnEKUECwvrAQICfwF+QoCAgIDgACEDIAAoAhQEfkKAgICA4AAFIAAoAgQhASAAKAIIIgJFBEAgACgCACABEBogAEEANgIEIAAoAgBBLxAyDwsgACgCDCACSgRAIAAoAgAoAhAgASACIAAoAhAiAXQgAWtBEWoQ5wEiAUUEQCAAKAIEIQELIAAgATYCBAsgASAAKAIQIgIEfyACBSABIAAoAghqQQA6ABAgACgCEAtBH3StIAEpAgRC/////3eDhCIDNwIEIAEgA0KAgICAeIMgADUCCEL/////B4OENwIEIABBADYCBCABrUKAgICAkH+ECwsPACAAKAJAQYACaiABEB4LSwECfyABQoCAgIBwWgR/IAGnIgMvAQYiAkENRgRAQQEPCyACQSlGBEAgAygCIC0AEA8LIAAoAhAoAkQgAkEYbGooAhBBAEcFQQALCxAAIAAgACgCKCkDCEEBEFMLFAEBfiAAIAEQLiECIAAgARAMIAILcgEBfwJ/IAAoAggiAiAAKAIMTgRAQX8gACACQQFqIAEQ1QINARoLAkAgACgCEARAIAAgACgCCCICQQFqNgIIIAAoAgQgAkEBdGogATsBEAwBCyAAIAAoAggiAkEBajYCCCACIAAoAgRqIAE6ABALQQALCywBAX8jAEEQayIDJAAgAyACNgIMIABB3ABqQYABIAEgAhDZAhogA0EQaiQACygBAX8CQCAAQoCAgIBwVA0AIAEgAKciAS8BBkcNACABKAIgIQILIAILKAAgACACQTAgAkEAEBQiAhANBEAgAUIANwMAQX8PCyAAIAEgAhCwAQsNACAAIAEgAkEAEKoDC38BA38gACEBAkAgAEEDcQRAA0AgAS0AAEUNAiABQQFqIgFBA3ENAAsLA0AgASICQQRqIQEgAigCACIDQX9zIANBgYKECGtxQYCBgoR4cUUNAAsgA0H/AXFFBEAgAiAAaw8LA0AgAi0AASEDIAJBAWoiASECIAMNAAsLIAEgAGsLFQAgACgCACAAKAIEEBogAEEANgIECwoAIABBMGtBCkkLIwECfyAAKAIAIgEgACgC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EBAPCyAAIAJBOWtB/wFxEBAPCyAAIAJBNWtB/wFxEBAPCyAAIAJBMWtB/wFxEBAPCyAAIAJBLWtB/wFxEBAPCyAAIAJBKWtB/wFxEBAPCyAAIAJBJWtB/wFxEBAPCyAAIAJBIWtB/wFxEBAPCyAAIAJBHWtB/wFxEBAPCyACQf8BSw0BAkACQAJAIAFB2ABrDgMAAQIECyAAQcABEBAMBQsgAEHBARAQDAQLIABBwgEQEAwDCyABQSJGDQELIAAgAUH/AXEQECAAIAJB//8DcRAxDwsgACACQRRrQf8BcRAQDwsgACACQf8BcRAQCxsBAX8gACABEDsEf0EABSAAQak2QQAQFkF/CwsZAQF/IAEgAhBAIgNFBEAgACACEJwDCyADCyYBAX8jAEEQayICJAAgAkEANgIMIABBASABQQAQqwMgAkEQaiQACxkAIAAoAhAgARCcAiIBRQRAIAAQyQELIAELbQEBfyMAQYACayIFJAAgBEGAwARxIAIgA0xyRQRAIAUgAUH/AXEgAiADayICQYACIAJBgAJJIgEbEEsaIAFFBEADQCAAIAVBgAIQZyACQYACayICQf8BSw0ACwsgACAFIAIQZwsgBUGAAmokAAsPACAAKAJAQYACaiABEBALbwIBfgF/IAAhBAJAAkAgARASDQAgACABQTsgAUEAEBQiAxANBEAgAw8LIAMQIg0BIAAgAxAMIAAgARCPAyIEDQBCgICAgOAADwsgBCgCKCACQQN0aikDABAPIQMLIAAgAyACEFMhASAAIAMQDCABCzEAIAAgASACQoCAgIAIfEL/////D1gEfiACQv////8PgwUgArkQFwsgA0GHgAEQzQILEAAgACAANgIEIAAgADYCAAt1AQF+IAAgASAEfiACIAN+fCADQiCIIgIgAUIgiCIEfnwgA0L/////D4MiAyABQv////8PgyIBfiIFQiCIIAMgBH58IgNCIIh8IAEgAn4gA0L/////D4N8IgFCIIh8NwMIIAAgBUL/////D4MgAUIghoQ3AwALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLYgACQAJAIAFBAEgNACAAKAKsAiABTA0AIAAoAqQCIAFBFGxqIgAg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GnZxIAAgBnFyEJ8DGyEHDAILIAAgBkHG0QAQeSEHDAELQX8hBwsgCkEQaiQAIAcLTAECfyMAQRBrIgMkAAJAIAFBgIABcUUEQCABQYCAAnFFDQEgABD7AUUNAQsgA0EANgIMIABBBCACQQAQqwNBfyEECyADQRBqJAAgBAvMAQECfwJAIAFCgICAgHBaBEAgAachAwNAAkAgAy0ABUEEcUUNACAAKAIQKAJEIAMvAQZBGGxqKAIUIgRFDQAgBCgCEEUNACAAIAOtQoCAgIBwhBAPIgEgAiAEKAIQERMAIQIgACABEAwgAg8LIAOtQoCAgIBwhBAPIQEgAEEAIAMgAhBPIQQgACABEAwgBA0CAkAgAy8BBkEVa0H//wNxQQhLDQAgACACEKUDIgRFDQAgBEEfdQ8LIAMoAhAoAiwiAw0ACwtBACEECyAECxoAIAAgASACQQBOBH4gAq0FIAK4EBcLEKEBCwsAIABB/////wdxC8cJAgR+BH8jAEHwAGsiCiQAIARC////////////AIMhBQJAAkAgAVAiCSACQv///////////wCDIgZCgICAgICAwP//AH1CgICAgICAwICAf1QgBlAbRQRAIANCAFIgBUKAgICAgIDA//8AfSIIQoCAgICAgMCAgH9WIAhCgICAgICAwICAf1EbDQELIAkgBkKAgICAgIDA//8AVCAGQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQQgASEDDAILIANQIAVCgICAgICAwP//AFQgBUKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEEDAILIAEgBkKAgICAgIDA//8AhYRQBEBCgICAgICA4P//ACACIAEgA4UgAiAEhUKAgICAgICAgIB/hYRQIgkbIQRCACABIAkbIQMMAgsgAyAFQoCAgICAgMD//wCFhFANASABIAaEUARAIAMgBYRCAFINAiABIAODIQMgAiAEgyEEDAILIAMgBYRQRQ0AIAEhAyACIQQMAQsgAyABIAEgA1QgBSAGViAFIAZRGyIMGyEFIAQgAiAMGyIIQv///////z+DIQYgAiAEIAwbIgdCMIinQf//AXEhCyAIQjCIp0H//wFxIglFBEAgCkHgAGogBSAGIAUgBiAGUCIJG3kgCUEGdK18pyIJQQ9rEHMgCikDaCEGIAopA2AhBUEQIAlrIQkLIAEgAyAMGyEDIAdC////////P4MhBCALRQRAIApB0ABqIAMgBCADIAQgBFAiCxt5IAtBBnStfKciC0EPaxBzQRAgC2shCyAKKQNYIQQgCikDUCEDCyAEQgOGIANCPYiEQoCAgICAgIAEhCECIAZCA4YgBUI9iIQhBCADQgOGIQEgByAIhSEDAkAgCSALRg0AIAkgC2siC0H/AEsEQEIAIQJCASEBDAELIApBQGsgASACQYABIAtrEHMgCkEwaiABIAIgCxChAiAKKQMwIAopA0AgCikDSIRCAFKthCEBIAopAzghAgsgBEKAgICAgICABIQhByAFQgOGIQYCQCADQgBTBEBCACEDQgAhBCABIAaFIAIgB4WEUA0CIAYgAX0hBSAHIAJ9IAEgBlatfSIEQv////////8DVg0BIApBIGogBSAEIAUgBCAEUCILG3kgC0EGdK18p0EMayILEHMgCSALayEJIAopAyghBCAKKQMgIQUMAQsgASAGfCIFIAFUrSACIAd8fCIEQoCAgICAgIAIg1ANACAFQgGDIARCP4YgBUIBiISEIQUgCUEBaiEJIARCAYghBAsgCEKAgICAgICAgIB/gyEBIAlB//8BTgRAIAFCgICAgICAwP//AIQhBEIAIQMMAQtBACELAkAgCUEASgRAIAkhCwwBCyAKQRBqIAUgBCAJQf8AahBzIAogBSAEQQEgCWsQoQIgCikDACAKKQMQIAopAxiEQgBSrYQhBSAKKQMIIQQLIARCPYYgBUIDiIQiAiAFp0EHcSIJQQRLrXwiAyACVK0gBEIDiEL///////8/gyALrUIwhoQgAYR8IQQCQCAJQQRGBEAgBCADQgGDIgEgA3wiAyABVK18IQQMAQsgCUUNAQsLIAAgAzcDACAAIAQ3AwggCkHwAGokAAvJBQEFfyMAQeAAayIDJAAgAyABNgJcAkACQAJAAkACQAJAAkACQAJAAkACQANAIAJBFGwiBCADakEUayEFA0ACQCADIAMoAlwiAUEEajYCXAJAAkACQAJAAkAgASgCACIGDggAAQIDAwMECAULIAJBBE4NECADIAFBCGo2AlwgASgCBCEBIAMgBGoiBCAAKAIMIAAoAhAQiAEgAkEBaiECIAQgARC2BEUNBgwJCyACQQRODQ4gAyABQQhqNgJcIAEoAgQhASADIARqIgQg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A0EIaiACEI4ERQRAQQAhBCABIAMpAwgiAkKAgICAgICAEFoEfiAAQb8OEGtBfyEEQgAFIAILNwMACyADQRBqJAAgBAsNACAAIAEgAhAPEM4FC8wBAgF/AXwCfwNAAkACQAJ/AkACQCACEFYOCAAAAAAEBAQBBAsgAqcMAQsgAhBJIgS9IgJCNIinQf8PcSIDQZ0ISw0BIASZRAAAAAAAAOBBYwRAIASqDAELQYCAgIB4CyEAQQAMAwtBACEAQQAgA0HSCEsNAhpBACACQv////////8Hg0KAgICAgICACIQgA0GTCGuthkIgiKciAGsgACACQgBTGyEAQQAMAgsgACACEKABIgIQDUUNAAtBACEAQX8LIQMgASAANgIAIAMLCwAgACABIAIQkwILLwEBfyMAQdAAayIDJAAgAyAAIANBEGogARCJATYCACAAIAIgAxAWIANB0ABqJAALLAEBfyAAKAIQIgEtAIgBRQRAIAFBAToAiAEgAEHaC0EAEFAgAUEAOgCIAQsLDQAgACABIAEQQxCtAwsWACAAIAEgAiADIAQgBSAAKQMwEIsCCxsAIAAgAUH/AXEQECAAIAIgACgCBGtBBGsQHguOAQECfyMAQRBrIgIkAAJ/IAEEQCAAQSBqIAAgAEHBAGtBGkkbIABB/wBNDQEaIAJBBGogAEECELcDGiACKAIEDAELIABBIGsgACAAQeEAa0EaSRsgAEH/AE0NABogAkEEaiAAQQAQtwMhASACKAIEIgMgACADQf8ASxsgACABQQFGGwshACACQRBqJAAgAAtmAQF/An9BACAAKAIIIgIgAU8NABpBfyAAKAIMDQAaIAAoAhQgACgCACACQQNsQQF2IgIgASABIAJJGyIBIAAoAhARAQAiAkUEQCAAQQE2AgxBfw8LIAAgATYCCCAAIAI2AgBBAAsLVQECfwJAIAFCgICAgHBUDQAgAaciAy8BBiIEQQpLQQEgBHRB8AlxRXINACAAIAMpAyAQDCADIAI3AyAPCyAAIAIQDCABEA1FBEAgAEGszABBABAWCwsnACAAIAApA8ABIAIgARAPIgFBAxDsARogACABIAMQ7gUgACABEAwLIAEBfiAAIAAgAiABIANBBEEAEMsBIgUgASAEENABIAULjgIBAn8jAEEwayIFJAACfyACIAEoAgBPBEAgBSACNgIkIAUg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ARAOIAAgBi0AOBBuIABBDhAOIAAoAhBBPUcNACAAQREQDiAAQQYQDiAAQasBEA4gAEHpAEF/EB0hBCAAEBENBiAAQQ4QDiAAEGINBiAGKAIwIghBtgFHIAhBPEdxRQRAIAAgBigCNBCtAQsgACAEECALIAAgBigCMCAGKAIsIAYoAjQgBigCPEEBIAwQ1AELIAAoAhBB3QBGDQAgB0Glf0YEQEHOzAAhCAwECyAAQSwQMEUNAQwFCwsgAEGDARAOIAAoAkAQqgEgABARDQMLAkAgBUUNACAAKAIQQT1HDQBBfyEHIABB6wBBfxAdIQEgABARDQQgACAKECAgAwRAIABBDhAOCyAAEGINBCAAQesAIAsQHRogACABECBBASEHDAQLIANFBEAgAEGAOUEAEBUMAwsgACgCQCgCgAIgDWpBsQEgDiANaxBLGiAAKAJAKAKkAiAKQRRsaiIAIAAoAgBBAWs2AgBBACEHDAMLIAAgCEEAEBUMAQsgACgCACAGKAI0EBMLQX8hBwsgBkFAayQAIAcLKwAgACgCQCgCpAFBAE4EQCAAQQYQDiAAQdkAEA4gACAAKAJALwGkARAYCwsSACAAQYN/RiAAQdUAakEuSXILEwAgACABIAIgAyAEQQBBABCKAgusAQIBfwF+IAApAgQiBKdB/////wdxIQMCQAJAIARCgICAgAiDUEUEQCACIAMgAiADShshAyAAQRBqIQADQCACIANGDQIgACACQQF0ai8BACABRg0DIAJBAWohAgwACwALIAFB/wFLDQAgAiADIAIgA0obIQMgAEEQaiEAIAFB/wFxIQEDQCACIANGDQEgACACai0AACABRg0CIAJBAWohAgwACwALQX8hAgsgAguNAQEBfyMAQRBrIgMkACADIAI3AwgCQCAAIAFBhgEgAUEAEBQiAhANDQAgACACEDsEQCAAIAIgAUEBIANBCGoQNiICEA0NASACECINASACECgNASAAIAIQDCAAQco8QQAQFkKAgICA4AAhAgwBCyAAIAIQDCAAIAFBASADQQhqEJAFIQILIANBEGokACACC6MBAgN/AX4gAEEQaiECIAEoAgAiBEEBaiEDAkAgACkCBCIFQoCAgIAIg1BFBEAgAiAEQQF0ai8BACIAQYD4A3FBgLADRyADIAWnQf////8HcU5yDQEgAiADQQF0ai8B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BiAHQQhrIggpAwA3AwAMyQELIAkgB0EYayIGKQMAEAwgBiAHQRBrIgYpAwA3AwAgBiAHQQhrIggpAwA3AwAMyAELIAcgB0EIaykDABAPNwMAIAdBCGohCAzHAQsgByAHQRBrKQMAEA83AwAgByAHQQhrKQMAEA83AwggB0EQaiEIDMYBCyAHIAdBGGspAwAQDzcDACAHIAdBEGspAwAQDzcDCCAHIAdBCGspAwAQDzcDECAHQRhqIQgMxQELIAcgB0EIayIGKQMANwMAIAYgB0EQaykDABAPNwMAIAdBCGohCAzEAQsgByAHQQhrIgYpAwAiATcDACAGIAdBEGsiBikDADcDACAGIAEQDzcDACAHQQhqIQgMwwELIAcgB0EIayIGKQMAIgE3AwAgB0EQayIIKQMAIScgCCAHQRhrIggpAwA3AwAgBiAnNwMAIAggARAPNwMAIAdBCGohCAzCAQsgByAHQQhrIgYpAwAiATcDACAHQRBrIggpAwAhJyAIIAdBGGsiCCkDADcDACAGICc3AwAgCCAHQSBrIgYpAwA3AwAgBiABEA83AwAgB0EIaiEIDMEBCyAHQRBrIgYpAwAhASAGIAdBGGsiBikDADcDACAGIAE3AwAMvwELIAdBGGsiBikDACEBIAYgB0EQayIGKQMANwMAIAdBCGsiCCkDACEnIAggATcDACAGICc3AwAMvgELIAdBIGsiBikDACEBIAYgB0EYayIGKQMANwMAIAdBEGsiCCkDACEnIAggB0EIayIIKQMANwMAIAYgJzcDACAIIAE3AwAMvQELIAdBKGsiBikDACEBIAYgB0EgayIGKQMANwMAIAdBGGsiCCkDACEnIAggB0EQayIIKQMANwMAIAYgJzcDACAIIAdBCGsiBikDADcDACAGIAE3AwAMvAELIAdBCGsiBikDACEBIAYgB0EQayIGKQMANwMAIAdBGGsiCCkDACEnIAggATcDACAGICc3AwAMuwELIAdBEGsiBikDACEBIAYgB0EYayIGKQMANwMAIAdBIGsiCCkDACEnIAggATcDACAGICc3AwAMugELIAdBEGsiBikDACEBIAYgB0EYayIGKQMANwMAIAdBIGsiCCkDACEnIAggB0EoayIIKQMANwMAIAYgJzcDACAIIAE3AwAMuQELIAdBCGsiBikDACEBIAYgB0EQayIG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gIB4RiABQv////8PVnJFBEAgCCABQgF9Qv////8PgzcDAAwoCyARIAEQDzcDGCAJICFBjgEQkgINLCAJIAggESkDGBAfDCcLIAdBCGsiCCkDACIBQv////8PWARAIAggAUL/////D4U3AwAgByEIDCgLIAchCCMAQRBrIgokACAJIApBDGogB0EIayINKQMAEMYBIQwgDUKAgICAMCAKNQIMQv////8PhSAMGzcDACAKQRBqJABBf0EAIAwbRQ0nDCsLIAdBCGsiCCkDACIBIAdBEGsiCikDACInhEL/////D1gEQCAKICenIAGndK03AwAMJwsgCSAHQaABEMgCRQ0mDCoLIAdBCGsiCCkDACIBIAdBEGsiCikDACInhEL/////D1gEQCAKAn4gJ6cgAad2IgZBAE4EQCAGrQwBCyAGuBAXCzcDAAwmCyMAQRBrIgokACAHQQhrIg0pAwAhAQJ/AkAgCSAKQQxqIAdBEGsiDCkDABDpAwRAIAkgARAMDAELIAkgCkEIaiABEOkDDQAgDAJ+IAooAgwgCigCCHYiDEEATgRAIAytDAELIAy4EBcLNwMAQQAMAQsgDEKAgICAMDcDACANQoCAgIAwNwMAQX8LIQwgCkEQaiQAIAxFDSUMKQsgB0EIayIIKQMAIgEgB0EQayIKKQMAIieEQv////8PWARAIAogJ6cgAad1rTcDAAwlCyAJIAdBoQEQyAJFDSQMKAsgB0EIayIIKQMAIgEgB0EQayIKKQMAIieEQv////8PWARAIAogASAngzcDAAwkCyAJIAdBrQEQyAJFDSMMJwsgB0EIayIIKQMAIAdBEGsiCikDAIQiAUL/////D1gEQCAKIAE3AwAMIwsgCSAHQa8BEMgCRQ0iDCYLIAdBCGsiCCkDACIBIAdBEGsiCikDACInhEL/////D1gEQCAKIAEgJ4VC/////w+DNwMADCILIAkgB0GuARDIAkUNIQwlCyAHQQhrIggpAwAiASAHQRBrIgopAwAiJ4RC/////w9YBEAgCiAnpyABp0itQoCAgIAQhDcDAAwhCyAJIAdBowEQlgNFDSAMJAsgB0EIayIIKQMAIgEgB0EQayIKKQMAIieEQv////8PWARAIAogJ6cgAadMrUKAgICAEIQ3AwAMIAsgCSAHQaQBEJYDRQ0fDCMLIAdBCGsiCCkDACIB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ACACAn9BACACKAIQIgFBO0YNABpBACABQf0ARg0AGkEAIAIoAjANABogAhCZAQ0dQQELEPYCIAIQvQENHAweCyACEBENGyACKAIwBEAgAkGIEEEAEBUMHAsgAhCZAQ0bIAJBLxAOIAIQvQFFDRwMGwsgAhARDRogAhCFARogAhDWASACEIgCDRogAkHpAEF/EB0hACACIAIoAkAtAG5Bf3NBAXEiARDxAQ0aAkAgAigCEEGvf0cEQCAAIQMMAQsgAkHrAEF/EB0hAyACEBENGyACIAAQICACIAEQ8QENGwsgAiADECAMFwsgAhA1IQAgAhA1IQEgAigCQCAHQRBqIAsgASAAQQAQqwEgAhARDRkgAhDWASACIAAQICACEIgCDRkgAkHpACABEB0aIAIQuAINGSACQesAIAAQHRogAiABECAgAigCQBCqAQwaCyACEDUhACACEDUhASACEDUhAyACKAJAIAdBEGogCyABIABBABCrASACEBENGCACIAMQICACENYBIAIQuAINGCACIAAQICACQbp/EDANGCACEIgCDRggAigCEEE7RgRAIAIQEQ0ZCyACQeoAIAMQHRogAiABECAgAigCQBCqAQwZCyACEBENFyACENYBQQAhASAHQQA2AgwCQCACKAIQIgBBWEcEQCAAQShHDQEgAiAHQQxqQQAQqQEaDAELIAIoAkAtAGxBAnFFBEAgAkHwIUEAEBUMGQsgAhARDRhBASEBCyACQSgQMA0XIActAAxBAXFFBEAgASEEIwBBQGoiBSQAIAIoAgAhDSACKAJAIg4oArwBIRAgAhA1IQMgAhA1IREgAhA1IRIgAhA1IRMgAhCFARpBASEIIAIoAkAgBUEQaiALIBIgA0EBEKsBIAUgEDYCKCACQesAQX8QHSEUIAIoAkAoAoQCIQkgAiATECAgAigCECEAQVEhAUF/IQoCQAJAAkACQAJAAkACQAJAAkAgAkEEENYDDgIAAQgLIABBSUYhDCAAQVFGIgEhCCABIABBsX9GckUgAEFJR3ENASAAIQELIAIQEQ0EAkAgAigCECIAQfsARiAAQdsARnJFBEAgAEGDf0YEQCACKAIoRQ0CCyACQZLfAEEAEBUMBgtBASEIIAIgAUEAQQFBf0EAENUBQQBIDQcgBUEANgI8DAMLIAUgDSACKAIgEBkiBjYCPCACEBEE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/wFxakEBayEGIAoLIQcgDiAPaiIOIBBNDQALCyAJQRBqJAAgBSAAIAgoAkAQogQiBkHt7wAgBhs2AhAgBUHIAGpBlyggBUEQahCEAiAAIAYQNyAEQX9HBEAgBSAENgIAIAVByABqQYHjACAFEIQCCyAFQcgAakEpEBAMAQtBACEDIAVByABqQcP3AEEAEIQCCyAFQcgAakEKEBAgA0UNAAsLIAVByABqQQAQEEKAgICAICERIAUoAlRFBEAgACAFKAJIEHYhEQsgBUHIAGoQlwEgACABQTUgEUEDEBsaIAVB4ABqJAAL7AECAn8BfiMAQRBrIgMkACABQQhrIgQpAwAhBQJ/AkAgACADQQxqIAFBEGsiASkDABDGAQRAIAAgBRAMDAELIAAgA0EIaiAFEMYBDQAgAQJ/AkACQAJAAkACQAJAIAJBrQFrDgMBAwIACwJAIAJBoAFrDgIFAAQLIAMoAgwgAygCCHUMBQsgAygCCCADKAIMcQwECyADKAIIIAMoAgxyDAMLIAMoAgggAygCDHMMAgsQAQALIAMoAgwgAygCCHQLrTcDAEEADAELIAFCgICAgDA3AwAgBEKAgICAMDcDAEF/CyEAIANBEGokACAAC+oEAgd/An4CQCABQoCAgIBwg0KAgICAkH9SBEBCgICAgOAAIQogACABED0iARANDQELAkAgAkKAgICAcINCgICAgJB/UQ0AQoCAgIDgACEKIAAgAhA9IgIQDUUNACABIQIMAQsCQCACpyIFKQIEIgpC/////weDUA0AAkAgAaciAygCAEEBRw0AIAMpAgQgCoVCgICAgAiDQgBSDQAgACgCECADEKMEIAUoAgQiBkH/////B3EiCCADKAIEIgRB/////wdxIgdqIAZBH3Z0IARBH3YiCWtBEWpJDQAgA0EQaiEEIAkEQCAEIAdBAXRqIAVBEGogBkEBdBAlGiADIAMpAgQiCiAFKQIEfEL/////B4MgCkKAgICAeIOENwIEDAILIAQgB2ogBUEQaiAIECUaIAMgAykCBCIKIAUpAgR8Qv////8HgyILIApCgICAgHiDhDcCBCAEIAunakEAOgAADAELAn4CQAJAIAUpAgQiCqdB/////wdxIAMpAgQiC6dB/////wdxaiIGQYCAgIAETwRAIABBmsMAQQAQUAwBCyAAIAYgCiALhKciCEEfdhD9ASIHDQELQoCAgIDgAAwBCyAHQRBqIQQCQCAIQQBOBEAgBCADQRBqIAMoAgRB/////wdxECUiBCADKAIEQf////8HcWogBUEQaiAFKAIEQf////8HcRAlGiAEIAZqQQA6AAAMAQsgBCADIAMoAgRB/////wdxEJQFIAQgAygCBEEBdGogBSAFKAIEQf////8HcRCUBQsgB61CgICAgJB/hAshCiAAIAEQDAwBCyABIQoLIAAgAhAMIAoLQAAgAAJ/An8gAwRAIAEoAiQgAkEDdGpBBGoMAQtBACABKAIgIgNFDQEaIAMgAS8BKCACakEEdGoLKAIACxDiAQsLACAAQZ8JQQAQFguBDAINfwR+IwBBgAFrIgskACALIQUjAEHgAWsiCCQAAkAgAb0iEkKAgICAgICA+P8Ag0KAgICAgICA+P8AUQRAIBJC////////////AINCgYCAgICAgPj/AFoEQCAFQc7CuQI2AAAMAgsgAUQAAAAAAAAAAGMEQCAFQS06AAAgBUEBaiEFCyAFQdkLLQAAOgAIIAVB0QspAAA3AAAMAQsCQCAERQRAAn4gAZlEAAAAAAAA4ENjBEAgAbAMAQtCgICAgICAgICAfwsiE0KAgICAgICAEH1CgYCAgICAgGBUIBO5IAFicg0BIAhB1QFqIgNBADoAACATIBNCP4ciEoUgEn0hEiACrSEUA0AgAyICQQFrIgNBMEHXACASIBIgFIAiFSAUfn2nIgRBCkgbIARqOgAAIBIgFFohBCAVIRIgBA0ACyATQgBTBEAgAkECayIDQS06AAALIAUgAxCBBgwCC0QAAAAAAAAAACABIAFEAAAAAAAAAABhGyEBIARBAkcNACMAQYACayICJAACQCACQYABaiABIANBAWoiBEEAEIcDIAJqLQB/QTVHDQAgAkGAAWogASAEQYAIEIcDIgYgAiABIARBgBAQhwNHDQAgAkGAAWogAiAGEHcNAEGACEGAECACLQCAAUEtRhshCQsgBSABIAMgCRCHAxogAkGAAmokAAwBCyADIQIgCEEIaiENIAhBDGohDiAIQRBqIQwjAEGQA2siByQAAkAgBEEDcUEBRiIPRQRAQREhAkEBIQoDQCACIApNBEBBACEJDAMLIAEgAiAKakEBdiIJIA0gDiAMQQAgB0GQAmoiBhC+AiAGEPoFIAFhBEAg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AgAiAEECdGooAgAiAiABRg0BIAJBDGohAiAADQALQdX1AEG+4wBB+BRBrQ4QAAALIAAL8wYCBn8BfgJAAkACQAJ/IAJBAkwEQCACIAEpAgQiCUI+iKdGBEAgACABENYCIgMQ8gFFDQUgASABKAIAQQFrNgIAIAMPCyAAKAI0IAAoAiRBAWsgASACEOUFQf////8DcSIHcSIIQQJ0aiEDIAmnQf////8HcSEFA0AgAiADKAIAIgNFDQIaAkAgACgCOCADQQJ0aigCACIEKQIEIglCIIinQf////8DcSAHRyAJQj6IpyACR3IgCadB/////wdxIAVHcg0AIAQgASAFEOQFDQAgAxDyAQ0EIAQgBCgCAEEBajYCAAwECyAEQQxqIQMMAAsACyACQQNHIQdBAwshBQJAIAAoAjwNAEEAIQNB0wEgACgCLEEDbEECbRBKIgRB/////wNLDQEgACAAKAI4IARBAnQQ5wEiBkUNASAAKAIsIgJFBEAgAEEQEJwCIgJFBEAgACAGECEMAwsgAkEBNgIAIAIgAikCBEKAgICAgICAgECENwIEIAYgAjYCACAAIAAoAihBAWo2AihBASECCyAAIAI2AjwgACAGNgI4IAAgBDYCLCAEQQFrIQYDQCACIARPDQEgACgCOCACQQJ0akEAIAJBAWoiAyACIAZGGxDjBTYCACADIQIMAAsACwJAIAEEQCABKQIEIglC//////////8/WARAIAEgCSAFrUI+hoQ3AgQMAgsgACAJpyICQR91IAJB/////wdxIAJBH3Z0akERahDoASICRQRAQQAhAwwECyACQQE2AgAgAiACKQIEQv////93gyABKQIEQoCAgIAIg4QiCTcCBCACIAlCgICAgHiDIAEpAgRC/////weDhDcCBCACQRBqIAFBEGogASgCBCIDQR91IANB/////wdxIANBH3Z0akEBahAlGiAAIAEQpAQgAiEBDAELIABBEBDoASIBRQRAQQAPCyABQoGAgICAgICAgH83AgALIAAgACgCOCAAKAI8IgNBAnRqIgIoAgBBAXY2AjwgAiABNgIAIAEgAzYCDCABIAE1AgQgB61CIIaEIAWtQj6GhDcCBCAAIAAoAihBAWo2AiggBUEDRg0CIAEgACgCNCAIQQJ0aiIBKAIANgIMIAEgAzYCACAAKAIoIAAoAjBIDQIgACAAKAIkQQF0EMAFGgwCCyABRQ0BCyAAIAEQpAQgAw8LIAMLRgAgAkEATARAIABBLxAyDwsgACACQQAQ/QEiAEUEQEKAgICA4AAPCyAAQRBqIAEgAhAlIAJqQQA6AAAgAK1CgICAgJB/hAuiAQECfyMAQaABayIEJABBfyEFIAQgAUEBa0EAIAEbNgKUASAEIAAgBEGeAWogARsiADYCkAEgBEEAQZABEEsiBEF/NgJMIARB9wI2AiQgBEF/NgJQIAQgBEGfAWo2AiwgBCAEQZABajYCVAJAIAFBAEgEQEHEswRBPTYCAAwBCyAAQQA6AAAgBCACIANB9QJB9gIQqQQhBQsgBEGgAWokACAFC50DAwF+A38DfAJAAkACQAJAIAC9IgFCAFkEQCABQiCIpyICQf//P0sNAQsgAUL///////////8Ag1AEQEQAAAAAAADwvyAAIACiow8LIAFCAFkNASAAIAChRAAAAAAAAAAAow8LIAJB//+//wdLDQJBgIDA/wMhA0GBeCEEIAJBgIDA/wNHBEAgAiEDDAILIAGnDQFEAAAAAAAAAAAPCyAARAAAAAAAAFBDor0iAUIgiKchA0HLdyEECyAEIANB4r4laiICQRR2arciBkQAAOD+Qi7mP6IgAUL/////D4MgAkH//z9xQZ7Bmv8Daq1CIIaEv0QAAAAAAADwv6AiACAAIABEAAAAAAAAAECgoyIFIAAgAEQAAAAAAADgP6KiIgcgBSAFoiIFIAWiIgAgACAARJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgBSAAIAAgAEREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgBkR2PHk17znqPaKgIAehoKAhAAsgAAuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAMgAKIhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAUgBKKhoiABoSAERElVVVVVVcU/oqChC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAsrACAAQYABTwR/IABBzwFNBEAgAEGABWoPCyAAQQF0QdypA2ovAQAFIAALCxAAIAAvAAAgAC0AAkEQdHILvQIBB38CQCABRQ0AA0AgAkEDRgRAIAFBAXEiBUUgAUEGcUVyIQcDQCAEQfICRg0DAkACQCADIARBAnRBwOEBaigCACICQQR2QQ9xIgZ2QQFxRQ0AIAJBD3YhASACQQh2Qf8AcSEIAkACQAJAIAZBBGsOAgABAgsgB0UNASABIAVqIQZBACECA0AgAiAITw0DIAIgBmohASACQQJqIQIgACABIAFBAWoQf0UNAAsMAwsgB0UNACABQQFqIQIgBUUEQCAAIAEgAhB/DQMLIAAgAiABQQJqIgIQf0UEQCAFRQ0CIAAgAiABQQNqEH9FDQILQX8PCyAAIAEgASAIahB/DQELIARBAWohBAwBCwtBfw8FIAEgAnZBAXEEQCACQQJ0QYziA2ooAgAgA3IhAwsgAkEBaiECDAELAAsAC0EAC00BAX8gASAAKAIEIgJKBEAgACgCDCAAKAIIIAEgAkEDbEECbRBKIgFBAnQgACgCEBEBACICRQRAQX8PCyAAIAE2AgQgACACNgIIC0EAC5QCAQJ/IwBBEGsiBCQAAkAgBEEMaiAAIAIgAxC8BCICQQBIDQAgASACaiECA0AgAkEBaiEBAkAgAi0AACIDQT9NBEAgBCgCDCADQQN2akEBaiICIABLDQMgBCADQQdxIAJqQQFqIgM2AgwgBUEBcyEFDAELIANBGHRBGHVBAEgEQCAEIAMgBCgCDGpB/wBrIgM2AgwMAQsgA0HfAE0EQCAEIAQoAgwgAi0AASADQQh0cmpB//8AayIDNgIMIAJBAmohAQwBCyAEIAQoAgwgAi0AAiADQRB0IAItAAFBCHRycmpB////AmsiAzYCDCACQQNqIQELIAAgA0kNASAFQQFzIQUgASECDAALAAsgBEEQaiQAIAULTAECfyMAQRBrIgMkAAJ/IAIgASgCACIELQAARwRAIAMgAjYCACAAQbz9ACADED9BfwwBCyABIARBAWo2AgBBAAshAiADQRBqJAAgAgseACAAQTBrQQpJIABBX3FBwQBrQRpJciAAQd8ARnILrQEBA38gACgCQBoCQCAAKAIEIQMgACABEMYEDQBBBSADayEEA0AgACgCGCICLQAAQfwARwRAQQAPCyAAIAJBAWo2AhggACgCBCECIAAgA0EFEOsBBEAgABCsAkF/DwsgACgCACADakEJOgAAIAAoAgAgA2pBAWogAiAEahBdIABBB0EAELoBIQIgACABEMYEDQEgACgCACACaiAAKAIEIAJrQQRrEF0MAAsAC0F/C0gBAn8CQANAIAFBCkYNASABQQJ0QZLgAWovAQAgAEoNASABQQF0IQIgAUEBaiEBIAJBAXRBlOABai8BACAATA0AC0EBDwtBAAukAgEBfwJ/An8gAUH/AE0EQCAAIAE6AAAgAEEBagwBCwJAIAFB/w9NBEAgACABQQZ2QcABcjoAACAAIQIMAQsCfyABQf//A00EQCAAIAFBDHZB4AFyOgAAIABBAWoMAQsCQCABQf///wBNBEAgACABQRJ2QfABcjoAACAAIQIMAQsCfyABQf///x9NBEAgACABQRh2QfgBcjoAACAAQQFqDAELQQAgAUEASA0FGiAAIAFBHnZB/AFyOgAAIAAgAUEYdkE/cUGAAXI6AAEgAEECagsiAiABQRJ2QT9xQYABcjoAAAsgAiABQQx2QT9xQYABcjoAASACQQJqCyICIAFBBnZBP3FBgAFyOgAACyACIAFBP3FBgAFyOgABIAJBAmoLIABrCwskACAAQgA3AgAgACABNgIUIABCADcCCCAAIAJB4QIgAhs2AhALJwECfwJAIAAgAUEAEJsBIgMEQCADEJoBRQ0BIAAQdQtBfyECCyACC8kBAgN/AX4jAEEQayIFJAACQCAAIAFBAhBvIgEQDQ0AAkACQCACQQFHDQAgAykDACIHEJABRQ0AIAAgBUEMaiAHEA9BARDOAg0BIAAgAUEwAn4gBSgCDCICQQBOBEAgAq0MAQsgArgQFwsQSEEASA0BDAILIAJBACACQQBKGyECA0AgAiAERg0CIAAgASAEIAMgBEEDdGopAwAQDxCWAiEGIARBAWohBCAGQQBODQALCyAAIAEQDEKAgICA4AAhAQsgBUEQaiQAIAELEQAgACABIAIgAyAEIAUQywELDQAgAEEGQX9BBRDrBQt8AgJ+AX8gACACKQMA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CgIBBgYGBgYCAwAECyAApyEBDAULIACnQQAQ5QUhAQwECyAAp0HbGGwhAQwDCyAAp0HbGGy3DAELIAJBB0cNAUQAAAAAAAD4fyAAEEkiAyADvUL///////////8Ag0KAgICAgICA+P8AVhsLvSIAQiCIIACFp0HbGGwhAQsgASACcwsHACAAQQFxCy4BAX8gACAAIAEgACACEMoBIgIgAUEAEBQiARCmASEDIAAgARAMIAAgAhATIAMLEgAgAEEIdCAAQQh2ckH//wNxC1ABAX8gAEEgEC8iAgRAIAJBATYCACACQoCAgIDAAEKAgICAMCABGzcDGCACIAJBGGo2AhAgAiACLQAFQQFyOgAFIAAoAhAgAkEDEL4BCyACCwoAIAAoAgQgAEYLMgACQCAAIAIgAUEAQQAQJCICEA0NACACECINACAAIAIQDCAAEClCgICAgOAAIQILIAILCwAgACABIAIQxgELCwAgAEG2PEEAEBYLdQECfyMAQZABayIEJABB3PsAIQUCQAJAAkACQCABQQFqDgUDAgIAAQILQZ37ACEFDAELQdseIQULIAAgBEHQAGogAxCJASEBIAQgACAEQRBqIAIoAgQQiQE2AgQgBCABNgIAIAAgBSAEENMCCyAEQZABaiQAC2kBAn8jAEEQayIFJAAgBUEANgIIIAVCADcDACAAIAEgAiADIAQgBRChBSECA0AgBSgCACEBIAYgBSgCCE5FBEAgACABIAZBA3RqKAIEEBMgBkEBaiEGDAELCyAAIAEQGiAFQRBqJAAgAgseACABKAIAQQRHBEAgACABQQhqEIsDIAFBBDYCAAsLpQEBBX8jAEEQayIDJABBfyECAkAgACgCFA0AIAAoAgAgACgCBCABQQF0QRBqIANBDGoQtwEiBEUEQCAAEIoDDAELIARBEGohBSAAKAIIIQIgAygCDCEGA0AgAkEATEUEQCAFIAJBAWsiAkEBdGogAiAFai0AADsBAAwBCwsgAEEBNgIQIAAgBDYCBCAAIAZBAXYgAWo2AgxBACECCyADQRBqJAAgAgtUAQJ/IAAgASkDGCACECMgACABKQMAIAIQIwJAIAEoAjwiBEUNACABKAIgIQMDQCADIARPDQEgACADKQMAIAIQIyADQQhqIQMgASgCPCEEDAALAAsLGgEBfyABpygCICIDBEAgACADKQMA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BCQAAkACQCAAIARBCGogAUHiABCHASICRQ0AIAQpAwgiARASBEAgACACKQMAEJkEIQMMAgsgACABIAIpAwhBASACEDYiARANDQAgACABEC0iA0UEQEEAIQMMAgsgACACKQMAEKIBIgJBAEgNACACRQ0BIABB6iJBABAWC0F/IQMLIARBEGokACADDwsgAiACLQAFQf4BcToABUEBCy4BAX8gAKcpAyAiAEKAgICAcINCgICAgJB/UQR/IACnKAIEQf////8HcQVBAAsLCgAgACgCAEF8cQszACAAIAJBARD9ASIARQRAQoCAgIDgAA8LIABBEGogASACQQF0ECUaIACtQoCAgICQf4QLZQICfwF+QQQhAkKAgICAICEEAkACQAJAAkACQAJAIAEQViIDQQhqDgoDAgUFBQUFBQQBAAsgA0EHRg0DDAQLQQYhAgwCC0EFIQIMAQtBByECCyAAKAIoIAJBA3RqKQMAIQQLIAQLYAEBfCAAKQIEQv//////////P1gEQCABIAErAwhEAAAAAAAA8D8gACgCALciAqOgOQMIIAEgASsDECAAKAIEIgBBH3UgAEH/////B3EgAEEfdnRqQRFquCACo6A5AxALC+kGAQV/AkACQAJAAkACQAJAAkACQAJAIAEtAARBD3EOBgABBAIDBgULIAAgASgCECIHIAIRAwAgBxAqIQUDQCAHKAIgIANKBEACQCAFKAIERQ0AIAEoAhQgA0EDdGohBAJAAkACQAJAIAUoAgBBHnZBAWsOAwABAgMLIAQoAgAiBgRAIAAgBiACEQMACyAEKAIEIgRFDQMgACAEIAIRAwAMAwsgBCgCACIELQAFQQFxRQ0CIAAgBCACEQMADAILIAAgBBCbBCACEQMADAELIAAgBCkDACACECMLIANBAWohAyAFQQhqIQUMAQsLIAEvAQYiA0EBRg0GIAAoAkQgA0EYbGooAgwiA0UNBiAAIAGtQoCAgIBwhCACIAMREQAPCwNAIAEoAjggA0oEQCAAIAEoAjQgA0EDdGopAwAgAhAjIANBAWohAwwBCwsgASgCMCIBRQ0FIAAgASACEQMADwsgAS0ABUEBcUUNBSAAIAEoAhApAwAgAhAjDwsgASgCIARAIAAgAUEoaiACEO8DCyAAIAEpAxAgAhAjIAAgASkDGCACECMPCyABKAIsIgFFDQIgACABIAIRAwAPCxABAAsgAUHkAWohAyABQeABaiEHA0AgByADKAIAIgVHBEAgBUEIayEDQQAhBANAIAMoAiAgBEoEQAJAIAMoAhwgBEEUbGoiBigCCA0AIAYoAgQiBkUNACAAIAYgAhEDAAsgBEEBaiEEDAELCyAAIAMpA0AgAhAjIAAgAykDSCACECMgACADKQNgIAIQIyAAIAMpA2ggAhAjIAVBBGohAwwBCwsgACABKQPAASACECMgACABKQPIASACECMgACABKQOwASACECMgACABKQO4ASACECMgACABKQOoASACECNBACEDA0AgA0EIRgRAQQAhAwNAIAAoAkAgA0oEQCAAIAEoAiggA0EDdGopAwAgAhAjIANBAWohAwwBCwsgACABKQOYASACECMgACABKQOgASACECMgACABKQNQIAIQIyAAIAEpA0AgAhAjIAAgASkDSCACECMgACABKQM4IAIQIyAAIAEpAzAgAhAjIAEoAiQiAQRAIAAgASACEQMACwUgACABIANBA3RqKQNYIAIQIyADQQFqIQMMAQsLCw8LQZniAEG+4wBBjixB0joQAAALiAICAX4CfyMAQTBrIgQkAEHK5gAhBUKAgICA4AAhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQCABEFZBCGoOEAUGCQkJCQoEAAECAwkJCwgJCyAEIAE+AgAgBEEQaiIFQSBBnOMAIAQQVxoMCQsgAEEDQQIgAacbEDIhAwwJCyAAQQEQMiEDDAgLIABBxQAQMiEDDAcLIAAgAUEAEJsDIgEQDQRAIAEhAwwHCyAAIAEgAhCgBCEDIAAgARAMDAYLIAJFDQELIAEQDyEDDAQLIABBw8MAQQAQFgwDCyAAIAEQSUEKQQBBABDMAiEDDAILQbfmACEFCyAAIAUQdiEDCyAEQTBqJAAgAwutBAIIfwF+AkACQAJAAkACQCACQoCAgIBwg0KAgICAkH9SBEAgACACEC4iAhANRQ0BDAILIAIQDyECCyACpyIEQRBqIQcgBCkCBCIMp0H/////B3EhBgJAIAxCgICAgAiDUARAQQAhBANAIAQgBkZFBEAgBSAEIAdqLQAAQQd2aiEFIARBAWohBAwBCwsgBUUEQCAHIQQgAQ0EDAYLIAAgBSAGakEAEP0BIghFDQIgCEEQaiEEQQAhBQNAIAUgBkYN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C1QAIwBBEGsiAiQAIAAgAkEIaiADKQMAEEcEfkKAgICA4AAFIAIpAwhC////////////AINCgICAgICAgPj/AFatQoCAgIAQhAshASACQRBqJAAgAQv4AgIDfwN+IwBBMGsiCCQAIANCACADQgBVGyENIAVBAWshCiAFQQBMIQVCACEDA0ACQCADIA1RBEAgBCEMDAELQn8hDCAAIAIgAyAIQShqEIwBIglBAEgNAAJAIAlFDQAgBhASRQRAIAggCCkDKDcDACADIQsgA0KAgICACFoEQCADuRAXIQsLIAggAjcDECAIIAs3AwggCCAAIAYgB0EDIAgQJCILNwMoIAAgCCkDABAMIAAgCCkDCBAMIAsQDQ0CCwJAAkACQCAFDQAgACAIKQMoIgsQwgEiCUEASA0BIAlFDQAgACAIQSBqIAsQQUEASA0BIAAgASALIAgpAyAgBCAKQoCAgIAwQoCAgIAwENQEIgRCAFMNASAAIAsQDAwDCyAEQv////////8PUw0BIABBi8MAQQAQFiAIKQMoIQsLIAAgCxAMDAILIAAgASAEIAgpAygQcEEASA0BIARCAXwhBAsgA0IBfCEDDAELCyAIQTBqJAAgDAsMACAAQgAgAEIAVRsLKAACQCABEBJFBEAgARAoRQ0BCyAAIAEQPQ8LIAAgAUE4QQBBABC6AgujAgIGfwF+IwBBMGsiAiQAAkACQCADKQMAIgEQIkUNAEKAgICA4AAhCyAAIAEQmQQiA0EASA0BIANFBEAgAEHdygBBABAWDAILIAAgAkEsaiACQShqIAGnIglBAxCSAQ0BIAIoAiwhBiACKAIoIQdBACEDAkADQCADIAdHBEAgBiADQQN0aigCBCEIQYCCASEFAkAgBEUNACAAIAJBCGogCSAIEE8iCkEASA0DIApFDQAgAigCCCEFIAAgAkEIahBOQYCGAUGAggEgBUECcRshBQsgACABIAhCgICAgDBCgICAgDBCgICAgDAgBRB4QQBIDQIgA0EBaiEDDAELCyAAIAYgBxBmDAELIAAgBiAHEGYMAQsgARAPIQsLIAJBMGokACALC+sBAQF+AkACQCABECgEQCAAQek9EHYhBAwBCyABEBIEQCAAQf/gABB2IQQMAQsgACABECsiARANDQEgACABEMIBIgNBAEgEQCAAIAEQDEKAgICA4AAPCwJ/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RQRAIAUgAigCDCABGyEDIAYhAQwCCyADQQZrDgICAAYLIABBiNgAQQAQFQwECyACQShqIAQQwAFFDQEMAwsLIABBnzNBABAVDAELIABBxDNBABAVCyACQShqEEQgAkEQahBECyACQUBrJAAgCAszAQF/A0ACQCABQQBOBH8gASACRw0BQQEFQQALDwsgACgCzAEgAUEDdGooAgAhAQwACwALQwECfyAAKAKIASECQX8hAwJAA0AgAkEATA0BIAAoAoABIAJBAWsiAkEEdGooAgAgAUcNAAsgAkGAgICAAnIhAwsgAwuDAwEGfyABKAI4IQMCQAJAAkAgAS0AbkEBcQRAIANFBEBBry4hAyABKAJADQMLQdbVACEDIAJBOkYgAkHNAEZyDQJBACECIAEoAogBIgNBACADQQBKGyEEA0AgAiAERg0CQbHVACEDIAEoAoABIAJBBHRqKAIAIgZBOkYgBkHNAEZyDQMgAkEBaiECDAALAAsgA0UNACABLwFsIgJBggxGDQAgAkEIdkEDaw4EAAICAAILQQAhBCABKAKIASICQQAgAkEAShshCEEAIQMDQCADIAhGDQJBACECAkAgASgCgAEiBSADQQR0aigCACIGRQ0AA0ACQCACIANGBEBBACECIAEoAnwiBUEAIAVBAEobIQUDQCACIAVGDQQgBiABKAJ0IAJBBHRqIgcoAgBGBEAgBygCBEUNAwsgAkEBaiECDAALAAsgAkEEdCEHIAJBAWohAiAFIAdqKAIAIAZHDQELC0GvEiEDDAILIANBAWohAwwACwALIAAgA0EAEBVBfyEECyAEC2EBAX8gAEG2ARAOIABB9gAQHCAAIAAoAkAvAbwBEBggAEEREA4gAEHpAEF/EB0hASAAQbYBEA4gAEEIEBwgAEEAEBggAEEbEA4gAEEkEA4gAEEAEBggACABECAgAEEOEA4LUQECf0F/IQJBASEDA0ACQCAAIAEQuwENACADRQRAIAAoAkBBfzYCmAILIAAoAhBBLEcEQEEAIQIMAQsgABARDQAgAEEOEA5BACEDDAELCyACCykBAX4gACABEMoBIgFFBEBCgICAgOAADwsgACABEDIhAiAAIAEQEyACC9sCAQR/IwBBoAFrIgUkACABKAIAIQcgBUGAATYCCCAFIAVBEGo2AgwgBAR/IAVBIzoAEEEBBUEACyEE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DEEHEBsLIQogACAFEBMgB0EBaiEHIApBAE4NAAsMAQsgACAGIAgQZkEAIQYgACACEGAiDBANDQAgBCALNwMYIAQgDDcDECAAIAMgAUECIARBEGoQJCEBIAAgDBAMIAAgCxAMDAELIAAgBiAEKAIMEGYgACALEAxCgICAgOAAIQELIARBIGokACABC+sCAQN/IwBBQGoiAyQAAkAgACABEGMiARANDQACQCAAIANBIGogAaciBCgCBEH/////B3FBAmoQQg0AIANBIGpBIhA+DQAgA0EANgI8A0AgBCgCBEH/////B3EgAkoEQAJAAkACQAJAAkACQAJAAkACQAJAIAQgA0E8ahDbASICQQhrDgYFAgQBBgMACyACQSJGIAJB3ABGcg0GCyACQYBwcUGAsANHIAJBIE9xDQYgAyACNgIAIANBEGoiAkEQQcAPIAMQVxogA0EgaiACEI4BDQoMBwtB9AAhAgwEC0HyACECDAMLQe4AIQIMAgtB4gAhAgwBC0HmACECCyADQSBqQdwAED4NBCADQSBqIAIQPkUNAQwECyADQSBqIAIQwAENAwsgAygCPCECDAELCyADQSBqQSIQPg0AIAAgARAMIANBIGoQOSEBDAELIAAgARAMIANBIGoQREKAgICA4AAhAQsgA0FAayQAIAELbgEEf0F/IQZBfyACKAIAIgRBAXYgBGogBEGp1arVeksbIQUCQAJAIAMgASgCACIHRgRAIAAgBRAvIgBFDQIgACADIAQQJRoMAQsgACAHIAUQmgIiAEUNAQsgASAANgIAIAIgBTYCAEEAIQYLIAYLYQECfwNAIAAoAigiAUEATEUEQCAAIAFBAWsiATYCKCAAKAIAIAAoAgQgAUEDdGopAwAQDAwBCwsgACgCBCIBIABBCGoiAkcEQCAAKAIAIAEQGgsgAEEENgIsIAAgAjYCBAukBQILfwV+IwBBMGsiAiQAIAEpAyAhDyABKQMYIQ4gASkDCCENIAEpAwAhEAJ+AkACQCABKQMoIhEQngEEQCANEJ4BDQELIABB/MMAQQAQFgwBCyAAIAJBCGpBABBCGiACQQA2AiQCQCAOEBJFBEAgACACQSRqIA4Q3AENAQsgACACQShqIBAQ3AENACAAIAJBLGogASkDEBDHAUEASA0AIA2nIQcgAigCLCIKIAIoAihqIQsgEaciBCgC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CwsNACAAIAEgAkEAEN8BC0MAAnwgAb1CgICAgICAgPj/AINCgICAgICAgPj/AFEEQEQAAAAAAAD4fyAAmUQAAAAAAADwP2ENARoLIAAgARCCBgsLewEBfgJAAn4gBEEEcQRAQSYhAiAAIAEQYwwBC0ElIQIgACABECsLIgEQDQ0AIAAgAhCkASIFEA0NACAAQRAQLyICBEAgAkEANgIMIAIgBEEDcTYCCCACIAE3AwAgBSACEI0BIAUPCyAAIAUQDAsgACABEAxCgICAgOAAC5UBAgJ+AX8gACABEDIhAwJAIAEQXg0AQQAgACgCECgCOCABQQJ0aigCACkCBCICQoCAgICAgICAQINCgICAgICAgICAf1IgAkKAgICA8P///z+DUCACQv//////////v39WcRsNACACp0F/c0EfdkEBIAJC/////weDUBshBAsgBAR+IABBhOcAIANBgucAEL8BBSADCwvcAwEFfyAAQeAAaiIEEHEgAEHQAGohBSAAKAJUIQECQAJAA0AgASAFRwRAIAFBBGstAABBEE8NAiABKAIEIQIgACABQQhrIgNBBhCfBCADIAMtAARBD3FBEHI6AAQgAiEBIAMoAgANASADQQhqIgIQRiACIAQQTAwBCwsMAQtB+vQAQb7jAEHELEG6xgAQAAALIABB1ABqIQEgAEHQAGohAwJAAkADQCADIAEoAgAiAkcEQCACQQhrIgEoAgBBAEwNAiABIAEtAARBD3E6AAQgACABQQcQnwQgAkEEaiEBDAELCyAAQeQAaiEBIABB4ABqIQIDQCACIAEoAgAiAUcEQCAAIAFBCGtBCBCfBCABQQRqIQEMAQsLDAELQZfzAEG+4wBB5yxB7DsQAAALIAAiAkECOgBoIABB2ABqIQMgAEHgAGohBANAIAQgAigCZCIARwRAIABBCGshASAAQQRrLQAAQQ5xBEAgAUEIaiIAEEYgACADEEwFIAIgARDeBQsMAQsLIAJBADoAaCACKAJcIQACQAJAA0AgACADRwRAIABBBGstAABBDnENAiAAKAIEIQEgAiAAQQhrECEgASEADAELCyADEHEMAQtBv+0AQb7jAEGdLUGwJRAAAAsLpwEBBX8gAKciAygCECIBIAEoAhhBf3NBAnRBpH5yaigCACECIAEQKiEBA0AgAkUEQEEADwsgASACQQFrIgRB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AyACNgLIBQsgA0KOgICAcDcDgAEgA0GIBWogAygCkAUgA0GAAWoQLARAIAMoApQFIgJBAEgNFyADIAI2AsgFDBcLIAEgAygCtAUgAygCyAUQNCADQbAFakEAIAdrEMcDDBYLIANCjoCAgHA3A3AgA0GIBWogBCADQfAAahAsBEAgAygClAUiAkEASA0WIAMgAjYCyAUMFgsgA0Lp1IGAcDcDYCADQYgFaiAEIANB4ABqECwEQCAHQQBHIQgMDQsgASADKAK0BSADKALIBRA0IANBsAVqIAcQxwMgBCECDBkLIAkoAAEiB0H/AUoNDyABIAMoArQFIAMoAsgFEDQgA0GwBWoiAiAFQcUAa0H/AXEQECACIAdB/wFxEBAgBCECDBgLIAkoAAEhAiADQo6AgIBwNwOgASADQYgFaiAEIANBoAFqECwEQCAAIAIQEyADKAKUBSICQQBIDRQgAyACNgLIBQwUCyACQS9HDQ4gAEEvEBMgASADKAK0BSADKALIBRA0IANBsAVqQb8BEBAgBCECDBcLIANCyYCAgHA3A9gBIANC2Lb5gnA3A9ABIANBiAVqIAQiAiADQdABahAsDRYgA0F/NgLIASADQoGEkICQCTcDwAEgA0GIBWogAiADQcABahAsDRYgA0F/NgK4ASADQoaOqMiQCTcDsAEgA0GIBWogBCADQbABahAsDRYMDQsgA0KOgICAcDcDoAIgA0GIBWogBCADQaACahAsBEAgAygClAUiAkEASA0SIAMgAjYCyAUMEgsgA0KogICAcDcDkAIgA0GIBWogBCADQZACahAsBEACQCADKAKUBSICQQBIBEAgAygCyAUhAgwBCyADIAI2AsgFCyABIAMoArQFIAIQNCADQbAFakEpEBAMEgsgA0Lp1IGAcDcDgAJBACEIIANBiAVqIAQgA0GAAmoQLA0IIANCq4GAgHA3A/ABIANBiAVqIAQgA0HwAWoQLARAAkAgAygClAUiAkEASARAIAMoAsgFIQIMAQsgAyACNgLIBQsgASADKAK0BSACEDQgA0GwBWpB8AEQEAwSCyADQX82AugBIANCrIGAgJDNGjcD4AEgA0GIBWogBCADQeABahAsRQ0MAkAgAygClAUiBUEASARAIAMoAsgFIQUMAQsgAyAFNgLIBQsgASADKAK0BSAFEDQgA0GwBWpB8AEQECAD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ACAKIAIgCmoiBDYCFCAKIAEoAoQCIgI2AhggBCABKAKAAiACECUaIAAgASgCgAIQGiABQQA2AoACIAogASgCcDYCHCABKAJ8IgcgASgCiAEiBGpBAEwNBiABLQBuQQJxRQ0EIAEoAkQNBEEAIQIDQCACIAdOBEBBACECA0AgASgCiAEgAkwEQEEAIQIDQCACIAEoAsACTg0KIAAgAkEDdCIEIAEoAsgCaigCBBATIAEoAsgCIARqQQA2AgQgAkEBaiECDAALAAUgACABKAKAASACQQR0aigCABATIAJBAWohAgwBCwALAAUgACABKAJ0IAJBBHRqKAIAEBMgAkEBaiECIAEoAnwhBwwBCwALAAtB1fMAQb7jAEGD/gFBizYQAAALBSABKAJ0IAJBBHRqIgQgASgCzAEgBCgCBEEDdGoiBCgCBDYCCCAEIAI2AgQgAkEBaiECDAELCyAAIAEQjQNCgICAgOAADAMLIAogBSAKaiICNgIgIAIgASgCgAEgBEEEdBAlGiAKKAIgIAEoAogBQQR0aiABKAJ0IAEoAnxBBHQQJRoLIAogASgCfDsBKiAKIAEoAogBOwEoIAogASgCjAE7ASwgACABKAKAARAaIAAgASgCdBAaCyAKIAEoArgCIgQ2AjggBARAIAogCCAKaiICNgI0IAIgASgCtAIgBEEDdBAlGgsgACABKAK0AhAaIAFBADYCtAIgCiAUKAIMOwEuAkAgAS0AbkECcQRAIAAgASgC7AIQEyABQfQCahCXAQwBCyAKIAovABFBgAhyOwARIAogASgC7AI2AkAgCiABKALwAjYCRCAKIAAgASgC9AIgASgC+AIQmgIiAjYCUCACRQRAIAogASgC9AI2AlALIAogASgC+AI2AkwgCiABKAKMAzYCVCAKIAEoApADNgJICyABKALMASICIAFB0AFqRwRAIAAgAhAaCyAKIAEoAsACIgQ2AjwgBARAIAogBiAKaiICNgIkIAIgASgCyAIgBEEDdBAlGgsgACABKALIAhAaIAFBADYCyAIgCiAKLwARQX5xIAEvATRBAXFyIgI7ABEgCiABLwE4QQF0QQJxIAJBfXFyIgI7ABEgCiABLQBuOgAQIAogAS8BYEECdEEEcSACQXtxciICOwARIAogAkFPcSABLwFsQQR0QTBxciICOwARIAogASgCtAFBAEgE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DAELCyAGQQEgA2tBA3RqIgNBBGohByADKAIIIQQDQCAEIAdGDQEgBCgCBCEDIAQQRiAAKAIQIAQQvAIgAyEEDAALAAsgBUEwaiQAC8ECAgN+An8jAEEQayICJABCgICAgDAhBQJAAkAgACACQQhqIAAgARArIgEQQQ0AAkAgAikDCCIHQgBXBEAMAQsgB0IBfSEGAkACQAJAAkAgASACQQRqIAIQjgJFDQAgByACKAIAIgitUg0AIAGnIQkgAigCBCEDIARFDQEgAykDACEFIAMgA0EIaiAIQQN0QQhrEIECDAILAkAgBARAIAAgAUIAEGQiBRANDQYgACABQgBCASAGQQEQggNFDQEMBgsgACABIAYQZCIFEA0NBQsgACABIAYQlAJBAE4NAgwECyAIQQN0IANqQQhrKQMAIQULIAkgCSgCKEEBazYCKAsgB0KBgICACFQNACAGuRAXIQYLIAAgAUEwIAYQSEEATg0BCyAAIAUQDEKAgICA4AAhBQsgACABEAwgAkEQaiQAIAULEAAgACADKQMAQREgBBCBAwuuAgIFfgF/IwBBEGsiCiQAAn4CQCAAIApBCGogACABECsiBRBBDQAgCikDCCIBIAKsIgh8IgZCgICAgICAgBBZBEAgAEGqwwBBABAWDAELAkAgBEUgAkEATHJFBEAgACAFIAhCACABQX8QggMNAgwBCyABIQcLIAJBACACQQBKG60hCEIAIQEDQCABIAhSBEAgASAHfCEJIAGnIQIgAUIBfCEBIAAgBSAJIAMgAkEDdGopAwAQDxCRAUEATg0BDAILCyAAIAVBMCAGQoCAgIAIfCIHQv////8PWAR+IAZC/////w+DBSAGuRAXCxBIQQBIDQAgACAFEAwgBkL/////D4MgB0L/////D1gNARogBrkQFwwBCyAAIAUQDEKAgICA4AALIQEgCkEQaiQAIAELPAAgAUEAQdAAEEsiASAENgIMIAEgADYCACABIAIgA2o2AjwgASACNgI4IAFBATYCCCABQqCAgIAQNwMQC38BBH8gAS0AAEHbAEYEQCABQQFqIgMQQ0EBayECIAAoAhAoAjghBEHCASEBA0AgAUHPAUcEQAJAIAQgAUECdGooAgAiBSgCBEH/////B3EgAkcNACAFQRBqIAMgAhB3DQAgACABEBkPCyABQQFqIQEMAQsLEAEA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CyADKQMAEA8hBQwBCyAAEHUMAQsCQCAAIAEgBBBvIgcQDQRAIAAgBRAMDAELIAAgByAFIAYgCBDzA0UNASAAIAcQDAtCgICAgOAAIQcLIAJBEGokACAHC9IDAgJ+An8jAEEgayIEJAACQCABQv///////////wCDIgNCgICAgICAwIA8fSADQoCAgICAgMD/wwB9VARAIAFCBIYgAEI8iIQhAyAAQv//////////D4MiAEKBgICAgICAgAhaBEAgA0KBgICAgICAgMAAfCECDAILIANCgICAgICAgIBAfSECIABCgICAgICAgIAIUg0BIAIgA0IBg3whAgwBCyAAUCADQoCAgICAgMD//wBUIANCgICAgICAwP//AFEbRQRAIAFCBIYgAEI8iIRC/////////wODQoCAgICAgID8/wCEIQIMAQtCgICAgICAgPj/ACECIANC////////v//DAFYNAEIAIQIgA0IwiKciBUGR9wBJDQAgBEEQaiAAIAFC////////P4NCgICAgICAwACEIgIgBUGB9wBrEHMgBCAAIAJBgfgAIAVrEKECIAQpAwhCBIYgBCkDACIAQjyIhCECIAQpAxAgBCkDGIRCAFKtIABC//////////8Pg4QiAEKBgICAgICAgAhaBEAgAkIBfCECDAELIABCgICAgICAgIAIUg0AIAJCAYMgAnwhAgsgBEEgaiQAIAIgAUKAgICAgICAgIB/g4S/Cw8AIAAgASACQQBBAxCCAguiDwIFfw5+IwBB0AJrIgUkACAEQv///////z+DIQogAkL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhDSAEQjCIp0H//wFxIQgCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAIQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIg9CgICAgICAwP//AFQgD0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCENDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQ0gAyEBDAILIAEgD0KAgICAgIDA//8AhYRQBEAgAyACQoCAgICAgMD//wCFhFAEQEIAIQFCgICAgICA4P//ACENDAMLIA1CgICAgICAwP//AIQhDUIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQEIAIQEMAgsgASAPhFAEQEKAgICAgIDg//8AIA0gAiADhFAbIQ1CACEBDAILIAIgA4RQBEAgDUKAgICAgIDA//8AhCENQgAhAQwCCyAPQv///////z9YBEAgBUHAAmogASAMIAEgDCAMUCIGG3kgBkEGdK18pyIGQQ9rEHNBECAGayEGIAUpA8gCIQwgBSkDwAIhAQsgAkL///////8/Vg0AIAVBsAJqIAMgCiADIAogClAiBxt5IAdBBnStfKciB0EPaxBzIAYgB2pBEGshBiAFKQO4AiEKIAUpA7ACIQMLIAVBoAJqIApCgICAgICAwACEIhJCD4YgA0IxiIQiAkIAQoCAgICw5ryC9QAgAn0iBEIAEHIgBUGQAmpCACAFKQOoAn1CACAEQgAQciAFQYACaiAFKQOYAkIBhiAFKQOQAkI/iIQiBEIAIAJCABByIAVB8AFqIARCAEIAIAUpA4gCfUIAEHIgBUHgAWogBSkD+AFCAYYgBSkD8AFCP4iEIgRCACACQgAQciAFQdABaiAEQgBCACAFKQPoAX1CABByIAVBwAFqIAUpA9gBQgGGIAUpA9ABQj+IhCIEQgAgAkIAEHIgBUGwAWogBEIAQgAgBSkDyAF9QgAQciAFQaABaiACQgAgBSkDuAFCAYYgBSkDsAFCP4iEQgF9IgJCABByIAVBkAFqIANCD4ZCACACQgAQciAFQfAAaiACQgBCACAFKQOoASAFKQOgASIPIAUpA5gBfCIEIA9UrXwgBEIBVq18fUIAEHIgBUGAAWpCASAEfUIAIAJCABByIAYgCSAIa2ohBgJ/IAUpA3AiEEIBhiIUIAUpA4gBIg5CAYYgBSkDgAFCP4iEfCILQufsAH0iFUIgiCICIAxCgICAgICAwACEIhZCAYYgAUI/iIQiDEIgiCIEfiIRIAFCAYYiD0IgiCIKIAsgFVatIAsgFFStIAUpA3hCAYYgEEI/iIQgDkI/iHx8fEIBfSIQQiCIIgt+fCIOIBFUrSAOIA4gEEL/////D4MiECAMQv////8PgyIUfnwiDlatfCAEIAt+fCAEIBB+IhMgCyAUfnwiESATVK1CIIYgEUIgiIR8IA4gDiARQiCGfCIOVq18IA4gDiAVQv////8PgyIVIBR+IhMgAiAKfnwiESATVK0gESARIBAgD0L+////D4MiE358IhFWrXx8Ig5WrXwgDiAEIBV+IhcgCyATfnwiBCACIBR+fCILIAogEH58IhBCIIggCyAQVq0gBCAXVK0gBCALVq18fEIghoR8IgQgDlStfCAEIBEgAiATfiICIAogFX58IgpCIIggAiAKVq1CIIaEfCICIBFUrSACIBBCIIZ8IAJUrXx8IgIgBFStfCIEQv////////8AWARAIAVB0ABqIAIgBCADIBIQciABQjGGIAUpA1h9IAUpA1AiAUIAUq19IQtCACABfSEKIAZB/v8AagwBCyAFQeAAaiAEQj+GIAJCAYiEIgIgBEIBiCIEIAMgEhByIAFCMIYgBSkDaH0gBSkDYCIMQgBSrX0hC0IAIAx9IQogASEPIBYhDCAGQf//AGoLIgZB//8BTgRAIA1CgICAgICAwP//AIQhDUIAIQEMAQsCfiAGQQBKBEAgC0IBhiAKQj+IhCELIARC////////P4MgBq1CMIaEIQwgCkIBhgwBCyAGQY9/TARAQgAhAQwCCyAFQUBrIAIgBEEBIAZrEKECIAVBMGogDyAMIAZB8ABqEHMgBUEgaiADIBIgBSkDQCICIAUpA0giDBByIAUpAzggBSkDKEIBhiAFKQMgIgFCP4iEfSAFKQMwIgQgAUIBhiIBVK19IQsgBCABfQshBCAFQRBqIAMgEkIDQgAQciAFIAMgEkIFQgAQciAMIAIgAiADIAJCAYMiASAEfCIDVCALIAEgA1atfCIBIBJWIAEgElEbrXwiAlatfCIEIAIgAiAEQoCAgICAgMD//wBUIAMgBSkDEFYgASAFKQMYIgRWIAEgBFEbca18IgJWrXwiBCACIARCgICAgICAwP//AFQgAyAFKQMAViABIAUpAwgiA1YgASADURtxrXwiASACVK18IA2EIQ0LIAAgATcDACAAIA03AwggBUHQAmokAAvEAQIBfwJ+QX8hAwJAIABCAFIgAUL///////////8AgyIEQoCAgICAgMD//wBWIARCgICAgICAwP//AFEbDQBBACACQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AURsNACAAIAQgBYSEUARAQQAPCyABIAKDQgBZBEBBACABIAJTIAEgAlEbDQEgACABIAKFhEIAUg8LIABCAFIgASAC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QT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMBAsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMBAsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMBAsLQcSzBEEZNgIAQX8FQQELDAELIAAgAToAAEEBCwsWACAARQRAQQAPC0HEswQgADYCAEF/C8QCAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBCWsOEgAKCwwKCwIDBAUMCwwMCgsHCAkLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LAAsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsACyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAErAwA5AwAPCyAAIAIgAxEDAAsPCyACIAIoAgAiAUEEajYCACAAIAE0AgA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE1AgA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAEpAwA3AwALawEEfyAAKAIALAAAEEVFBEBBAA8LA0AgACgCACEDQX8hASACQcyZs+YATQRAQX8gAywAAEEwayIEIAJBCmwiAWogBEH/////ByABa0obIQELIAAgA0EBajYCACABIQIgAywAARBFDQALIAIL8RICEX8BfiMAQdAAayIHJAAgByABNgJMIAdBN2ohFiAHQThqIRJBACEBAkACQAJAAkADQCABQf////8HIA1rSg0BIAEgDWohDSAHKAJMIgwhAQJAAkACQCAMLQAAIgsEQANAAkACQCALQf8BcSIIRQRAIAEhCwwBCyAIQSVHDQEgASELA0AgAS0AAUElRw0BIAcgAUECaiIINgJMIAtBAWohCyABLQACIQogCCEBIApBJUYNAAsLIAsgDGsiAUH/////ByANayIXSg0HIAAEQCAAIAwgARBnCyABDQZBfyEQQQEhCCAH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AhDvBSAFKQMIIQIgBSkDACEEDAELIAEgAkL///////8/gyAGrUIwhoQiCiADIARC////////P4MgBEIwiKdB//8BcSIHrUIwhoQiCRD/AUEATARAIAEgCiADIAkQ/wEEQCABIQQMAgsgBUHwAGogASACQgBCABAzIAUpA3ghAiAFKQNwIQQMAQsgBgR+IAEFIAVB4ABqIAEgCkIAQoCAgICAgMC7wAAQMyAFKQNoIgpCMIinQfgAayEGIAUpA2ALIQQgB0UEQCAFQdAAaiADIAlCAEKAgICAgIDAu8AAEDMgBSkDWCIJQjCIp0H4AGshByAFKQNQIQMLIAlC////////P4NCgICAgICAwACEIQkgCkL///////8/g0KAgICAgIDAAIQhCiAGIAdKBEADQAJ+IAogCX0gAyAEVq19IgtCAFkEQCALIAQgA30iBIRQBEAgBUEgaiABIAJCAEIAEDMgBSkDKCECIAUpAyAhBAwFCyALQgGGIARCP4iEDAELIApCAYYgBEI/iIQLIQogBEIBhiEEIAZBAWsiBiAHSg0ACyAHIQYLAkAgCiAJfSADIARWrX0iCUIAUwRAIAohCQwBCyAJIAQgA30iBIRCAFINACAFQTBqIAEgAkIAQgAQMyAFKQM4IQIgBSkDMCEEDAELIAlC////////P1gEQANAIARCP4ghASAGQQFrIQYgBEIBhiEEIAEgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhBgIACcSEHIAZBAEwEQCAFQUBrIAQgCUL///////8/gyAGQfgAaiAHcq1CMIaEQgBCgICAgICAwMM/EDMgBSkDSCECIAUpA0AhBAwBCyAJQv///////z+DIAYgB3KtQjCGhCECCyAAIAQ3AwAgACACNwMIIAVBgAFqJAALvwIBAX8jAEHQAGsiBCQAAkAgA0GAgAFOBEAgBEEgaiABIAJCAEKAgICAgICA//8AEDMgBCkDKCECIAQpAyAhASADQf//AUkEQCADQf//AGshAwwCCyAEQRBqIAEgAkIAQoCAgICAgID//wAQMyADQf3/AiADQf3/AkgbQf7/AWshAyAEKQMYIQIgBCkDECEBDAELIANBgYB/Sg0AIARBQGsgASACQgBCgICAgICAgDkQMyAEKQNIIQIgBCkDQCEBIANB9IB+SwRAIANBjf8AaiEDDAELIARB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AykDCBA4IgJFDQAgACABIAIgBhAPIARBABCIBCEDIAAgAhATIANBAEgNACADQQBHrUKAgICAEIQhBQsgBQsqACADKQMAIgFC/////29YBEAgABApQoCAgIDgAA8LIAAgAUEDQQAQgQMLYwEBfiADKQMAIgRC/////29YBEAgABApQoCAgIDgAA8LQoCAgIDgACEBAkAgACADKQMIEDgiAkUNACAAIAQgAhB6IQMgACACEBMgA0EASA0AIANBAEetQoCAgIAQhCEBCyABC2MBAn4CQAJAIAMpAwAiAUL/////b1gEQCAAECkMAQsgAykDCCEFIAEhBCACQQNOBEAgAykDECEECyAAIAUQOCICDQELQoCAgIDgAA8LIAAgASACIARBABAUIQEgACACEBMgAQtmAQF+IAMpAwAiBEL/////b1gEQCAAEClCgICAgOAADwtCgICAgOAAIQECQCAAIAMpAwgQOCICRQ0AIAAgBCACQQAQ3gEhAyAAIAIQEyADQQBIDQAgA0EAR61CgICAgBCEIQELIAELigECAX8CfiMAQRBrIgQkACADKQMIIQUgAykDACIGIQECQAJAAkACQCACQQNIDQAgAykDECIBELUBDQAgAEHfKUEAEBYMAQsgACAEQQxqIAUQiwQiAg0BC0KAgICA4AAhAQwBCyAAIAYgASAEKAIMIgMgAhCOAyEBIAAgAiADEJgDCyAEQRBqJAAgAQscACAAIAMpAwBBACACQQFrEEogA0EIakECEJoDC0MAIwBBEGsiAiQAAn5CgICAgOAAIAAgAkEMaiADKQMAEMcBDQAaQiAgAigCDCIARQ0AGiAAZ60LIQEgAkEQaiQAIAELUAAjAEEQayICJABCgICAgOAAIQECQCAAIAJBDGogAykDABCTAg0AIAAgAkEIaiADKQMIEJMCDQAgAigCCCACKAIMbK0hAQsgAkEQaiQAIAELBgAgALa7C1AAIAAgACkD0AEiAUIMiCABhSIBQhmGIAGFIgFCG4ggAYUiATcD0AEgAUKdurP7lJL9oiV+QgyIQoCAgICAgID4P4S/RAAAAAAAAPC/oBAXC/UDAwN8BX8DfiMAQRBrIggkACAIQgA3AwgCQAJAIAJBAEwNAEKAgICA4AAhASAAIAhBCGogAykDABBHDQFBASEJIAgrAwghBCACQQFHBEADQCACIAlGDQIgACAIIAMgCUEDdGopAwAQRw0DIAlBAWohCSAIKwMAIQUjAEEgayIHJAAgBL1C////////////AIMiDSAFvUL///////////8AgyIMIAwgDVYbIg6/IQQCQCAOQjSIpyIKQf8PRg0AIA0gDCAMIA1UGyIMvyEFAkAgDlANACAMQjSIpyILQf8PRg0AIAsgCmtBwQBOBEAgBSAEoCEEDAILAnwgC0H+C08EQCAERAAAAAAAADAUoiEEIAVEAAAAAAAAMBSiIQVEAAAAAAAAsGsMAQtEAAAAAAAA8D8gCkG8BEsNABogBEQAAAAAAACwa6IhBCAFRAAAAAAAALBroiEFRAAAAAAAADAUCyEGIAdBGGogB0EQaiAFEIQGIAdBCGogByAEEIQGIAYgBysDACAHKwMQoCAHKwMIoCAHKwMYoJ+iIQQMAQsgBSEECyAHQSBqJAAMAAsACyAEmSEECyAEvQJ/IASZRAAAAAAAAOBBYwRAIASqDAELQYCAgIB4CyIAt71RBEAgAK0hAQwBCyAEEBchAQsgCEEQaiQAIAELTgAgACAARAAAAAAAAPC/RAAAAAAAAPA/IABEAAAAAAAAAABjGyAAvUL///////////8Ag0KAgICAgICA+P8AVhsgAEQAAAAAAAAAAGEbC4MBAgJ+AX8gAL0iAUI0iKdB/w9xIgNB/gdNBEAgAUKAgICAgICAgIB/gyECIANB/gdHIAFCgICAgICAgPC/f1FyRQRAIAJCgICAgICAgPg/hL8PCyACvw8LIANBsghNBHwgAUI/hyABfEIBQbMIIANrrYYiAUIBiHxCACABfYO/BSAACwvdBAICfAV/IwBBEGsiCCQAAn4gAkUEQEQAAAAAAADw/0QAAAAAAADwfyAEGxAXDAELAnwgAykDACIBQv////8PWARAIAJBASACQQFKGyELIAGnIQlBASEHA0AgByALRwRAIAm3IAMgB0EDdGopAwAiAUKAgICAEFoNAxogAachCgJ/IAQEQCAJIAoQSgwBCyAJIAoQtAELIQkgB0EBaiEHDAELCyAJrQwCC0KAgICA4AAgACAIQQhqIAEQRw0BGkEBIQcgCCsDCAshBSAHIAIgAiAHSBshAgNAIAIgB0cEQEKAgICA4AAgACAIIAMgB0EDdGopAwAQRw0CGgJAIAW9Qv///////////wCDQoCAgICAgID4/wBWDQAgCCsDACIGvUL///////////8Ag0KAgICAgICA+P8AVgRAIAYhBQwBCyAEBEAgBSAFIAalIAa9Qv///////////wCDQoCAgICAgID4/wBWGyAGIAW9Qv///////////wCDQoCAgICAgID4/wBYGyAGvSAFvYO/IAVEAAAAAAAAAABiIAZEAAAAAAAAAABichshBQwBCyAFIAUgBqQgBr1C////////////AINCgICAgICAgPj/AFYbIAYgBb1C////////////AINCgICAgICAgPj/AFgbIAa9IAW9hL8gBUQAAAAAAAAAAGIgBkQAAAAAAAAAAGJyGyEFCyAHQQFqIQcMAQsLIAW9An8gBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIgC3vVEEQCAArQwBCyAFEBcLIQEgCEEQaiQAIAEL0AEBAn8jAEEQayICJAACfiAAIAFBJhBqIgNFBEAgBEEANgIAQoCAgIDgAAwBCwJAIAMpAwAiARASRQRAIAIgAygCDCIFNgIMIAUgAaciBigCBEH/////B3FJDQEgACABEAwgA0KAgICAMDcDAAsgBEEBNgIAQoCAgIAwDAELIAYgAkEMahDbASEHIAMgAigCDDYCDCAEQQA2AgAgB0H//wNNBEAgACAHQf//A3EQpgMMAQsgACAGIAVBAXRqQRBqQQIQnAQLIQEgAkEQaiQAIAELxwICAn8CfiMAQSBrIgIkAEKAgICA4AAhBwJAIAAgARBjIgEQDQ0AIAAgAkEIaiIFQQcQQhogBUE8ED4aIAUgBEEDdCIFQfDKAWooAgAiBhCOARpBnj0gBHZBAXFFBEAgAkEIaiIEQSAQPhogBCAFQfTKAWooAgAQjgEaIARByv4AEI4BGiAAIAMpAwAQYyIIEA0EQCAAIAEQDCACQQhqEEQMAgsgCKchA0EAIQQDQCAEIAMoAgRB/////wdxT0UEQAJAIAMgBBBNIgVBIkYEQCACQQhqQfTvABCOARoMAQsgAkEIaiAFEJYBGgsgBEEBaiEEDAELCyAAIAgQDCACQQhqQSIQPhoLIAJBCGoiAEE+ED4aIAAgARCPARogAEH29QAQjgEaIAAgBhCOARogAkEIakE+ED4aIAAQOSEHCyACQSBqJAAgBwu7BAEIfyMAQTBrIgIkAAJAIAAgARBjIgEQ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IAQgCSkDCBBwQQBIDQcLIARCAXwhBCABQgF8IQEMAAsACyAEQv7///////8PVQ0DIAAgBSAEIAYQDxBwQQBIDQQgBEIBfCEECyAKQQFqIQoMAQsLIAAgBUEwIARCgICAgAh8Qv////8PWAR+IARC/////w+DBSAEuRAXCxBIQQBIDQEMAgsgAEGqwwBBABAWCyAAIAUQDEKAgICA4AAhBQsgACAIEAwgCUEQaiQAIAULLQEBfkKAgICAMCECAkAgARCoAyIARQ0AIAAtABJBBHFFDQAgADUCRCECCyACCzMCAX4Bf0KAgICAMCECAkAgARCoAyIDRQ0AIAMtABJBBHFFDQAgACADKAJAEDIhAgsgAgsoAEKAgICA4AAgACADKQMAIAEQ2QUiAEEAR61CgICAgBCEIABBAEgbC6sBAgF+An9CgICAgOAAIQQgACABEGkEfkKAgICA4AAFQeb+ACECAkAgAaciAy8BBhD4AUUNAAJAIAMoAiAiAy8AESIFQYAIcUUNACADKAJUIgZFDQAgACAGIAMoAkgQ/gEPCyAFQQR2QQNxQQFrIgNBAksNACADQQJ0QaDdAWooAgAhAgsgACACIAAgAUE2IAFBABAUIgEQEgR+IABBLxAyBSABC0GeCBC/AQsLhwQDA34EfwN8AkAgACABEGkNACAAIAApAzBBDhBTIgUQDQ0AIAWnIgkgARC1AUEEdEEQcSAJLQAFQe8BcXI6AAUCQCAAQQAgAkEBaxBKIgJBA3RBGGoQLyIHRQ0AIAcgARAPIgE3AwAgAykDABAPIQQgByACNgIQIAcgBDcDCCACQQAgAkEAShshCgNAIAggCkcEQCAHIAhBA3RqIAMgCEEBaiIIQQN0aikDABAPNwMYDAELCyAJIAc2AiACfyABQv////9vWARAIAAQKUF/DAELIABBACABp0EwEE8LIgNBAEgNAAJAIANFDQAgACABQTAgAUEAEBQiBBANDQEgBEL/////D1gEQCAEpyIDIAJrQQAgAiADSButIQYMAQsgBBBWQQdGBEACQCAEEEkiDL1C////////////AINCgICAgICAgPj/AFYNACAMnSIMIAK3Ig1lDQAgDCANoSELCyALvQJ/IAuZRAAAAAAAAOBBYwRAIAuqDAELQYCAgIB4CyICt71RBEAgAq0hBgwCCyALEBchBgwBCyAA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EIQhAQsgACAGIAcQZgsgAkEwaiQAIAELnQECAX4Bf0KAgICAMCEBAkACQCAAIAMpAwAQKyIEEA0NACACQQEgAkEBShshBUEBIQIDQCACIAVGDQICQCADIAJBA3RqKQMAIgEQKA0AIAEQEg0AIAAgARArIgEQDQ0CIAAgBCABQoCAgIAwQQEQxgUNAiAAIAEQDAsgAkEBaiECDAALAAsgACAEEAwgACABEAxCgICAgOAAIQQLIAQLGAAgACADKQMAIAMpAwgQWq1CgICAgBCEC5sCAgN+A38jAEEgayICJABCgICAgOAAIQQgACADKQMAECsiBRANRQRAQoCAgIAwIQECfgJAIAAgAkEcaiACQRhqIAWnQQMQkgENACAAEDwiARANDQAgAigCHCEHIAIoAhghCEEAIQMDQCADIAhHBEAgACAHIANBA3RqIgkoAgQQYCIGEA0NAiACIAY3AwggAiAFNwMAIABCgICAgDBBAiACQQAQ2QQhBCAAIAYQDCAEEA0NAiAEEBJFBEAgACABIAkoAgQgBEGHgAEQG0EASA0DCyADQQFqIQMMAQsLIAAgByAIEGYgAQwBCyAAIAIoAhwgAigCGBBmIAAgBRAMIAEhBUKAgICA4AALIQQgACAFEAwLIAJBIGokACAEC20AAn4CQCADKQMAIgFC/////29YBEAgBEUNASAAEClCgICAgOAADwtCgICAgOAAIAAgARCZBCICQQBIDQEaIAQEQCACQQBHrUKAgICAEIQPCyACDQAgAEHdygBBABAWQoCAgIDgAA8LIAEQDwsLTwACQAJAIAMpAwAiAUL/////b1gEQCAERQRAQoCAgIAQDwsgABApDAELIAAgARCiASIAQQBODQELQoCAgIDgAA8LIABBAEetQoCAgIAQhAsQACAAIAMpAwBBAkEAEIEDCxAAIAAgAykDAEEBQQAQgQMLLQEBfkKAgICA4AAhASAAIAMpAwAiBCADKQMIENwEBH5CgICAgOAABSAEEA8LC30BAn4gAykDACIBQv////9vWARAIAAQKUKAgICA4AAPCyADKQMQIQZCgICAgOAAIQUCQCAAIAMpAwgQOCICRQ0AIAAgASACIAYgBEVBDnQQ2gQhAyAAIAIQEyADQQBIDQAgBARAIANBAEetQoCAgIAQhA8LIAEQDyEFCyAFCycAIAAgAykDACIB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QRBqJAAgAAtGAQJ+IAIgACgCABAyIQNBACEAIAIgASgCABAyIQQCQCADEA0NACAEEA0NACADpyAEpxCVAiEACyACIAMQDCACIAQQDCAAC2sBAX4CQAJAAkACQAJAIAMtAAUiAQ4EAwICAAELIAAgAygCCBD2BA8LIAFBCEYNAgsQAQALIAAgAygCDCADKAIAIAMtAAggAy0ACSADLgEGEMsBDwsgACAAEDwiBCADKAIIIAMoAgwQJiAECwkAIAAgAxCJAws8AQF+IAAQPCIEEA1FBEAgACAEQTwgAa1CgICAgHCEEA9BAxAbQQBOBEAgBA8LIAAgBBAMC0KAgICA4AALXwEBfwJAIAFFBEAgAkUNASAAIAIQpQUPCyACRQRAIAAgACgCAEEBazYCACAAIAAoAgRBCGs2AgQgARDpAQwBCyAAKAIIIAAoAgQgAmpPBH8gASACEPIFBUEACw8LQQALJgAgAQRAIAAgACgCAEEBazYCACAAIAAoAgRBCGs2AgQgARDpAQsLKAEBfwJAIAGnKAIgIgNFDQAgAygCAEEERg0AIAAgA0EIaiACEO8DCwscAQF/IAFBKBBAIgIEQCAAIAIQ7QMgACACECELCyUBAX8gAacoAiAiAwRAIAAgAykDACACECMgACADKQMIIAIQIwsLJwEBfyABpygCICICBEAgACACKQMAECcgACACKQMIECcgACACECELCx4BAX8gAacoAiAiAgRAIAAgAikDABAnIAAgAhAhCwtDAQJ/IAGnKAIgIgIEQAJAIAIpAwAiARDdBUUNACACKAIMIgNFDQAgACADEPEDIAIpAwAhAQsgACABECcgACACECELC1gBA38CQCABpygCICIERQ0AIARBCGohAyAEQQRqIQUDQCADKAIAIgMgBUYNASAEKAIARQRAIAAgAykDECACECMLIAAgAykDGCACECMgA0EEaiEDDAALAAsLgQEBBX8gAacoAiAiAgRAIAJBBGohBSACKAIIIQMDQCADIAVHBEAgAygCBCEGIANBEGshBCADQQxrKAIARQRAAkAgAigCAARAIAQQpgUMAQsgACAEKQMgECcLIAAgBCkDKBAnCyAAIAQQISAGIQMMAQsLIAAgAigCEBAhIAAgAhAhCwshAQF/IAGnKAIgIgMEQCAAIAM1AgxCgICAgHCEIAIQIwsLQAEBfyABpygCICICBEAgACACNQIMQoCAgIBwhCIBEN0FBH4gAhBGIAI1AgxCgICAgHCEBSABCxAnIAAgAhAhCwtbAQJ/IAGnKAIgIgIEQAJAAkAgAi0ABUUNACAAKAK8ASIDRQ0AIAAoAsQBIAIoAgggAxEDAAwBCyACKAIYIgNFDQAgACACKAIUIAIoAgggAxEGAAsgACACECELCykBAX8gACABpyICNQIkQoCAgICQf4QQJyAAIAI1AiBCgICAgJB/hBAnCxEAIAAgAacoAiApAwAgAhAjCxkBAX8gACABpygCICICKQMAECcgACACECELOgECfwJAIAFBDxBAIgRFDQADQCADIAQtAAVPDQEgACAEIANBA3RqKQMIIAIQIyADQQFqIQMMAAsACws8AQJ/IAFBDxBAIgMEQANAIAIgAy0ABU9FBEAgACADIAJBA3RqKQMIECcgAkEBaiECDAELCyAAIAMQIQsLSQECfyAAIAGnKAIgIgQpAwAgAhAjIAAgBCkDCCACECMDQCADIAQoAhBORQRAIAAgBCADQQN0aikDGCACECMgA0EBaiEDDAELCwtJAQJ/IAAgAacoAiAiAikDABAnIAAgAikDCBAnA0AgAyACKAIQTkUEQCAAIAIgA0EDdGopAxgQJyADQQFqIQMMAQsLIAAgAhAhC44BAQR/IAGnIgMoAiQhBSADKAIgIQQgAygCKCIDBEAgACADrUKAgICAcIQgAhAjCyAEBEACQCAFRQ0AQQAhAwNAIAMgBCgCPE4NAQJAIAUgA0ECdGooAgAiBkUNACAGLQAFQQFxRQ0AIAAgBiACEQMACyADQQFqIQMMAAsACyAAIAStQoCAgIBghCACECMLC3MBA38gAaciAigCKCIDBEAgACADrUKAgICAcIQQJwsgAigCICIDBEAgAigCJCIEBEBBACECA0AgAiADKAI8TkUEQCAAIAQgAkECdGooAgAQ+gEgAkEBaiECDAELCyAAIAQQIQsgACADrUKAgICAYIQQJwsLEgAgAacoAiAiAARAIAAQrgMLCw4AIAAgAacpAyAgAhAjCxkAIAAgAaciACkDIBAnIABCgICAgDA3AyALNQECfyABpyEEA0AgAyAEKAIoT0UEQCAAIAQoAiQgA0EDdGopAwAgAhAjIANBAWohAwwBCwsLPQEDfyABpyEDA0AgAygCJCEEIAIg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KQwBCyABIQgLIAAgBhAMIAAgBxAMCyAKQSBqJAAgCCEGDAELQoCAgIDgACEGIAAgCUEYaiABQdoAEIcBIgVFDQAgCSkDGCEHIAUtABBFBEAgACAHEAwgAEGpNkEAEBYMAQsgBxASBEAgACAFKQMAIAIgAyAEECQhBgwBCyAAIAMgBBCRAyIIEA1FBEAgBSkDACEBIAkgCDcDECAJIAI3AwggCSABNwMAIAAgByAFKQMIQQMgCRAkIQYLIAAgBxAMIAAgCBAMCyAJQSBqJAAgBgsFACAAmwuDAgMCfAJ/AX4gAL0iBUIgiKdB/////wdxIgNBgIDA/wdPBEAgACAAoA8LQZPx/dQCIQQCQCADQf//P00EQEGT8f3LAiEEIABEAAAAAAAAUEOivSIFQiCIp0H/////B3EiA0UNAQsgBUKAgICAgICAgIB/gyADQQNuIARqrUIghoS/IgIgAqIgAiAAo6IiASABIAGioiABRNft5NQAsMI/okTZUee+y0Tov6CiIAEgAUTC1klKYPH5P6JEICTwkuAo/r+gokSS5mEP5gP+P6CgIAKivUKAgICACHxCgICAgHyDvyIBIAAgASABoqMiACABoSABIAGgIACgo6IgAaAhAAsgAAuHAQMBfgF/AXwgAL0iAUL///////////8Ag78hAAJAAnwgAUI0iKdB/w9xIgJB/QdNBEAgAkHfB0kNAiAAIACgIgMgAyAAokQAAAAAAADwPyAAoaOgDAELIABEAAAAAAAA8D8gAKGjIgAgAKALELMDRAAAAAAAAOA/oiEACyAAmiAAIAFCAFMbC6gDAgV/AX4gAL1C////////////AINCgYCAgICAgPj/AFQgAb1C////////////AINCgICAgICAgPj/AFhxRQRAIAAgAaAPCyABvSIHQiCIpyICQYCAwP8DayAHpyIFckUEQCAAELIEDwsgAkEedkECcSIGIAC9IgdCP4inciEDAkAgB0IgiKdB/////wdxIgQgB6dyRQRAAkACQCADQQJrDgIAAQMLRBgtRFT7IQlADwtEGC1EVPshCcAPCyACQf////8HcSICIAVyRQRARBgtRFT7Ifk/IACmDwsCQCACQYCAwP8HRgRAIARBgIDA/wdHDQEgA0EDdEHQhARqKwMADwsgBEGAgMD/B0cgAkGAgIAgaiAET3FFBEBEGC1EVPsh+T8gAKYPCwJ8IAYEQEQAAAAAAAAAACAEQYCAgCBqIAJJDQEaCyAAIAGjmRCyBAshAAJAAkACQCADDgMEAAECCyAAmg8LRBgtRFT7IQlAIABEB1wUMyamobygoQ8LIABEB1wUMyamobygRBgtRFT7IQnAoA8LIANBA3RB8IQEaisDACEACyAAC7IBAwF+AX8BfCAAvSIBQv///////////wCDvyEAAkAgAUI0iKdB/w9xIgJBmQhPBEAgABDaAkTvOfr+Qi7mP6AhAAwBCyACQYAITwRAIAAgAKBEAAAAAAAA8D8gACAAokQAAAAAAADwP6CfIACgo6AQ2gIhAAwBCyACQeUHSQ0AIAAgAKIiAyADRAAAAAAAAPA/oJ9EAAAAAAAA8D+goyAAoBCzAyEACyAAmiAAIAFCAFMbC7kCAwF/A3wBfiAAvSIFQiCIp0H/////B3EiAUGAgMD/A08EQCAFpyABQYCAwP8Da3JFBEAgAEQYLURU+yH5P6JEAAAAAAAAcDigDwtEAAAAAAAAAAAgACAAoaMPCwJAIAFB/////gNNBEAgAUGAgEBqQYCAgPIDSQ0BIAAgACAAohCnAqIgAKAPC0QAAAAAAADwPyAAmaFEAAAAAAAA4D+iIgOfIQAgAxCnAiEEAnwgAUGz5rz/A08EQEQYLURU+yH5PyAAIASiIACgIgAgAKBEB1wUMyamkbygoQwBC0QYLURU+yHpPyAAvUKAgICAcIO/IgIgAqChIAAgAKAgBKJEB1wUMyamkTwgAyACIAKioSAAIAKgoyIAIACgoaGhRBgtRFT7Iek/oAsiAJogACAFQgBTGyEACyAAC3YBAX8gAL1CNIinQf8PcSIBQf8HTQRAIABEAAAAAAAA8L+gIgAgACAAoiAAIACgoJ+gELMDDwsgAUGYCE0EQCAAIACgRAAAAAAAAPC/IAAgAKJEAAAAAAAA8L+gnyAAoKOgENoCDwsgABDaAkTvOfr+Qi7mP6ALWgIBfwF+AkBBsLMEKAIABEBBtLMEKAIAIQIMAQtBsLMEENYFIgI2AgBBtLMEIAIQ4AQiAjYCAAsgAiAAIAAQQ0Gt7wAQtgUiAyABEKcDGkG0swQoAgAgAxAMCwuvpgRRAEGACAvheygpe30AKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt9ACgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQBjYW5ub3QgbWl4ID8/IHdpdGggJiYgb3IgfHwAcHJveHk6IHByb3BlcnR5IG5vdCBwcmVzZW50IGluIHRhcmdldCB3ZXJlIHJldHVybmVkIGJ5IG5vbiBleHRlbnNpYmxlIHByb3h5AHJldm9rZWQgcHJveHkAUHJveHkAYWRkX3Byb3BlcnR5AHByb3h5OiBjYW5ub3Qgc2V0IHByb3BlcnR5AG5vIHNldHRlciBmb3IgcHJvcGVydHkAdmFsdWUgaGFzIG5vIHByb3BlcnR5AGNvdWxkIG5vdCBkZWxldGUgcHJvcGVydHkAcHJveHk6IGR1cGxpY2F0ZSBwcm9wZXJ0eQBKU19EZWZpbmVBdXRvSW5pdFByb3BlcnR5AGhhc093blByb3BlcnR5AHByb3h5OiBpbmNvbnNpc3RlbnQgZGVsZXRlUHJvcGVydHkAcHJveHk6IGluY29uc2lzdGVudCBkZWZpbmVQcm9wZXJ0eQBKU19EZWZpbmVQcm9wZXJ0eQAhbXItPmVtcHR5AGluZmluaXR5AEluZmluaXR5AG91dCBvZiBtZW1vcnkAdW5rbm93biB1bmljb2RlIGdlbmVyYWwgY2F0ZWdvcnkAR2VuZXJhbF9DYXRlZ29yeQBldmVyeQBhbnkAYXBwbHkAJyVzJyBpcyByZWFkLW9ubHkAZXhwZWN0aW5nIGNhdGNoIG9yIGZpbmFsbHkAc3RpY2t5AHN0cmluZ2lmeQBzdWJhcnJheQBlbXB0eSBhcnJheQBub24gaW50ZWdlciBpbmRleCBpbiB0eXBlZCBhcnJheQBuZWdhdGl2ZSBpbmRleCBpbiB0eXBlZCBhcnJheQBvdXQtb2YtYm91bmQgaW5kZXggaW4gdHlwZWQgYXJyYXkAY2Fubm90IGNyZWF0ZSBudW1lcmljIGluZGV4IGluIHR5cGVkIGFycmF5AGlzQXJyYXkAVHlwZWRBcnJheQBnZXREYXkAZ2V0VVRDRGF5AGpzX2dldF9hdG9tX2luZGV4AGludmFsaWQgYXJyYXkgaW5kZXgAb3V0LW9mLWJvdW5kIG51bWVyaWMgaW5kZXgASlNfQXRvbUlzQXJyYXlJbmRleABmaW5kSW5kZXgAaW52YWxpZCBleHBvcnQgc3ludGF4AGludmFsaWQgYXNzaWdubWVudCBzeW50YXgAbWF4AFx1JTA0eABpbnZhbGlkIG9wY29kZTogcGM9JXUgb3Bjb2RlPTB4JTAyeAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AGxpbmUgdGVybWluYXRvciBub3QgYWxsb3dlZCBhZnRlciB0aHJvdwBwb3cAbm93AHN0YWNrIG92ZXJmbG93AG11c3QgYmUgY2FsbGVkIHdpdGggbmV3AGlzVmlldwBEYXRhVmlldwByYXcAJXUAY2xhc3MgZGVjbGFyYXRpb25zIGNhbid0IGFwcGVhciBpbiBzaW5nbGUtc3RhdGVtZW50IGNvbnRleHQAZnVuY3Rpb24gZGVjbGFyYXRpb25zIGNhbid0IGFwcGVhciBpbiBzaW5nbGUtc3RhdGVtZW50IGNvbnRleHQAbGV4aWNhbCBkZWNsYXJhdGlvbnMgY2FuJ3QgYXBwZWFyIGluIHNpbmdsZS1zdGF0ZW1lbnQgY29udGV4dABkdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0AGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0AGltcG9ydC5tZXRhIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb250ZXh0AEpTX0ZyZWVDb250ZXh0AEpTQ29udGV4dABqc19tYXBfaXRlcmF0b3JfbmV4dABqc19hc3luY19nZW5lcmF0b3JfcmVzdW1lX25leHQAdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQAdHQAZXhwb3J0ZWQgdmFyaWFibGUgJyVzJyBkb2VzIG5vdCBleGlzdABwcml2YXRlIGNsYXNzIGZpZWxkICclcycgZG9lcyBub3QgZXhpc3QAdGVzdABhc3NpZ25tZW50IHJlc3QgcHJvcGVydHkgbXVzdCBiZSBsYXN0AHNxcnQAc29ydABjYnJ0AHRyaW1TdGFydABwYWRTdGFydAB1bmtub3duIHVuaWNvZGUgc2NyaXB0AFNjcmlwdABoeXBvdABmcmVlX3plcm9fcmVmY291bnQAc3RyX2luZGV4ID09IG51bV9rZXlzX2NvdW50ICsgc3RyX2tleXNfY291bnQAbnVtX2luZGV4ID09IG51bV9rZXlzX2NvdW50AHN5bV9pbmRleCA9PSBhdG9tX2NvdW50AGxhYmVsID49IDAgJiYgbGFiZWwgPCBzLT5sYWJlbF9jb3VudABsYWIxID49IDAgJiYgbGFiMSA8IHMtPmxhYmVsX2NvdW50AHZhbCA8IHMtPmNhcHR1cmVfY291bnQAdmFsMiA8IHMtPmNhcHR1cmVfY291bnQAaW52YWxpZCByZXBlYXQgY291bnQAaW52YWxpZCByZXBldGl0aW9uIGNvdW50AGZvbnQAaW52YWxpZCBjb2RlIHBvaW50AGZyb21Db2RlUG9pbnQAaW52YWxpZCBoaW50AGVuY29kZVVSSUNvbXBvbmVudABkZWNvZGVVUklDb21wb25lbnQAdW5leHBlY3RlZCBlbmQgb2YgY29tbWVudABpbnZhbGlkIHN3aXRjaCBzdGF0ZW1lbnQAcGFyc2VJbnQAZHVwbGljYXRlIGRlZmF1bHQAc3BsaXQAZXhwZWN0aW5nIGhleCBkaWdpdAB0cmltUmlnaHQAcmVkdWNlUmlnaHQAdW5zaGlmdAB0cmltTGVmdABpbnZhbGlkIG9mZnNldABpbnZhbGlkIGJ5dGVPZmZzZXQAZ2V0VGltZXpvbmVPZmZzZXQAcmVzb2x2aW5nIGZ1bmN0aW9uIGFscmVhZHkgc2V0AHByb3h5OiBpbmNvbnNpc3RlbnQgc2V0AGZpbmRfanVtcF90YXJnZXQAZXhwZWN0aW5nIHRhcmdldABpbnZhbGlkIGRlc3RydWN0dXJpbmcgdGFyZ2V0AHByb3h5OiBpbmNvbnNpc3RlbnQgZ2V0AFdlYWtTZXQAY29uc3RydWN0AEpTX0ZyZWVBdG9tU3RydWN0AHVzZSBzdHJpY3QAUmVmbGVjdAByZWplY3QAbm90IGFuIEFzeW5jR2VuZXJhdG9yIG9iamVjdABjYW5ub3QgY29udmVydCB0byBvYmplY3QAaW52YWxpZCBicmFuZCBvbiBvYmplY3QAb3BlcmFuZCAncHJvdG90eXBlJyBwcm9wZXJ0eSBpcyBub3QgYW4gb2JqZWN0AHJlY2VpdmVyIGlzIG5vdCBhbiBvYmplY3QAaXRlcmF0b3IgbXVzdCByZXR1cm4gYW4gb2JqZWN0AG5vdCBhIERhdGUgb2JqZWN0AG5vdCBhIG9iamVjdABKU09iamVjdABwYXJzZUZsb2F0AGZsYXQAbm90aGluZyB0byByZXBlYXQAY29uY2F0AGNvZGVQb2ludEF0AGNoYXJBdABjaGFyQ29kZUF0AGtleXMAcHJveHk6IHRhcmdldCBwcm9wZXJ0eSBtdXN0IGJlIHByZXNlbnQgaW4gcHJveHkgb3duS2V5cwAgIGZhc3QgYXJyYXlzAGV4cG9ydCAnJXMnIGluIG1vZHVsZSAnJXMnIGlzIGFtYmlndW91cwBwcml2YXRlIGNsYXNzIGZpZWxkICclcycgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgYXJndW1lbnRzAFRvbyBtYW55IGNhbGwgYXJndW1lbnRzACAgZWxlbWVudHMAaW52YWxpZCBudW1iZXIgb2YgZGlnaXRzAGJpbmFyeSBvYmplY3RzAGludmFsaWQgcHJvcGVydHkgYWNjZXNzAGpzX29wX2RlZmluZV9jbGFzcwBmZC0+Ynl0ZV9jb2RlLmJ1ZltkZWZpbmVfY2xhc3NfcG9zXSA9PSBPUF9kZWZpbmVfY2xhc3MAX19nZXRDbGFzcwBzZXRIb3VycwBnZXRIb3VycwBzZXRVVENIb3VycwBnZXRVVENIb3VycwBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzAHRvbyBtYW55IGltYnJpY2F0ZWQgcXVhbnRpZmllcnMAdW5pY29kZV9wcm9wX29wcwBhY29zAGZvciBhd2FpdCBpcyBvbmx5IHZhbGlkIGluIGFzeW5jaHJvbm91cyBmdW5jdGlvbnMAbmV3LnRhcmdldCBvbmx5IGFsbG93ZWQgd2l0aGluIGZ1bmN0aW9ucwBieXRlY29kZSBmdW5jdGlvbnMAQyBmdW5jdGlvbnMAcHJveHk6IGluY29uc2lzdGVudCBwcmV2ZW50RXh0ZW5zaW9ucwBTY3JpcHRfRXh0ZW5zaW9ucwBhdG9tcwBwcm94eTogcHJvcGVydGllcyBtdXN0IGJlIHN0cmluZ3Mgb3Igc3ltYm9scwBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMAcmVzb2x2ZV9sYWJlbHMASlNfRXZhbFRoaXMAc3RyaW5ncwBpbnZhbGlkIGRlc2NyaXB0b3IgZmxhZ3MAaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MAdmFsdWVzAHNldE1pbnV0ZXMAZ2V0TWludXRlcwBzZXRVVENNaW51dGVzAGdldFVUQ01pbnV0ZXMAdG9vIG1hbnkgY2FwdHVyZXMAICBzaGFwZXMAZ2V0T3duUHJvcGVydHlOYW1lcwBnY19mcmVlX2N5Y2xlcwBhZGRfZXZhbF92YXJpYWJsZXMAcmVzb2x2ZV92YXJpYWJsZXMAdG9vIG1hbnkgbG9jYWwgdmFyaWFibGVzAHRvbyBtYW55IGNsb3N1cmUgdmFyaWFibGVzAGNvbXBhY3RfcHJvcGVydGllcwAgIHByb3BlcnRpZXMAZGVmaW5lUHJvcGVydGllcwBlbnRyaWVzAGZyb21FbnRyaWVzAHRvbyBtYW55IHJhbmdlcwBpbmNsdWRlcwBzZXRNaWxsaXNlY29uZHMAZ2V0TWlsbGlzZWNvbmRzAHNldFVUQ01pbGxpc2Vjb25kcwBnZXRVVENNaWxsaXNlY29uZHMAc2V0U2Vjb25kcwBnZXRTZWNvbmRzAHNldFVUQ1NlY29uZHMAZ2V0VVRDU2Vjb25kcwBpdGFsaWNzAGFicwBwcm94eTogaW5jb25zaXN0ZW50IGhhcwAlLipzACAoJXMAc2V0ICVzAGdldCAlcwAgICAgYXQgJXMAbm90IGEgJXMAdW5zdXBwb3J0ZWQga2V5d29yZDogJXMAc3Vic3RyAHByb3h5OiBpbmNvbnNpc3RlbnQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yAHN1cGVyKCkgaXMgb25seSB2YWxpZCBpbiBhIGRlcml2ZWQgY2xhc3MgY29uc3RydWN0b3IAcGFyZW50IGNsYXNzIG11c3QgYmUgY29uc3RydWN0b3IAbm90IGEgY29uc3RydWN0b3IAQXJyYXkgSXRlcmF0b3IAU2V0IEl0ZXJhdG9yAE1hcCBJdGVyYXRvcgBSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yAG5vdCBhbiBBc3luYy1mcm9tLVN5bmMgSXRlcmF0b3IAY2Fubm90IGludm9rZSBhIHJ1bm5pbmcgZ2VuZXJhdG9yAG5vdCBhIGdlbmVyYXRvcgBBc3luY0dlbmVyYXRvcgBzeW50YXggZXJyb3IAU3ludGF4RXJyb3IARXZhbEVycm9yAEludGVybmFsRXJyb3IAQWdncmVnYXRlRXJyb3IAVHlwZUVycm9yAFJhbmdlRXJyb3IAUmVmZXJlbmNlRXJyb3IAVVJJRXJyb3IAZmxvb3IAZm9udGNvbG9yAGFuY2hvcgBmb3IAa2V5Rm9yAGV4cGVjdGluZyBzdXJyb2dhdGUgcGFpcgBhIGRlY2xhcmF0aW9uIGluIHRoZSBoZWFkIG9mIGEgZm9yLSVzIGxvb3AgY2FuJ3QgaGF2ZSBhbiBpbml0aWFsaXplcgAnYXJndW1lbnRzJyBpZGVudGlmaWVyIGlzIG5vdCBhbGxvd2VkIGluIGNsYXNzIGZpZWxkIGluaXRpYWxpemVyAGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZ2V0dGVyIG9yIHNldHRlcgBpbnZhbGlkIHNldHRlcgBpbnZhbGlkIGdldHRlcgBmaWx0ZXIAbWlzc2luZyBmb3JtYWwgcGFyYW1ldGVyACJ1c2Ugc3RyaWN0IiBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiB3aXRoIGRlZmF1bHQgb3IgZGVzdHJ1Y3R1cmluZyBwYXJhbWV0ZXIAaW52YWxpZCBjaGFyYWN0ZXIAdW5leHBlY3RlZCBjaGFyYWN0ZXIAcHJpdmF0ZSBjbGFzcyBmaWVsZCBmb3JiaWRkZW4gYWZ0ZXIgc3VwZXIAaW52YWxpZCByZWRlZmluaXRpb24gb2YgbGV4aWNhbCBpZGVudGlmaWVyACdsZXQnIGlzIG5vdCBhIHZhbGlkIGxleGljYWwgaWRlbnRpZmllcgBpbnZhbGlkIHJlZGVmaW5pdGlvbiBvZiBnbG9iYWwgaWRlbnRpZmllcgB5aWVsZCBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAJyVzJyBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAb3RoZXIAYXRvbTFfaXNfaW50ZWdlciAmJiBhdG9tMl9pc19pbnRlZ2VyAGlzSW50ZWdlcgBpc1NhZmVJbnRlZ2VyAGJ1ZmZlcgBTaGFyZWRBcnJheUJ1ZmZlcgBjYW5ub3QgdXNlIGlkZW50aWNhbCBBcnJheUJ1ZmZlcgBjYW5ub3QgY29udmVydCBzeW1ib2wgdG8gbnVtYmVyAG5vdCBhIG51bWJlcgBsaW5lTnVtYmVyAG1hbGZvcm1lZCB1bmljb2RlIGNoYXIAY2xlYXIAc2V0WWVhcgBnZXRZZWFyAHNldEZ1bGxZZWFyAGdldEZ1bGxZZWFyAHNldFVUQ0Z1bGxZZWFyAGdldFVUQ0Z1bGxZZWFyAHVuZXhwZWN0ZWQgbGluZSB0ZXJtaW5hdG9yIGluIHJlZ2V4cAB1bmV4cGVjdGVkIGVuZCBvZiByZWdleHAAUmVnRXhwAHN1cABpbnZhbGlkIGdyb3VwAHBvcABjb250aW51ZSBtdXN0IGJlIGluc2lkZSBsb29wAGR1bXAAbnVtX2tleXNfY21wAHVzZSBzdHJpcABtYXAAZmxhdE1hcABXZWFrTWFwAGV4cGVjdGluZyAneycgYWZ0ZXIgXHAAbG9nMXAAaGFzT3duAGl0ZXJhdG9yX2Nsb3NlX3JldHVybgBwcm9taXNlIHNlbGYgcmVzb2x1dGlvbgBvdXQgb2YgbWVtb3J5IGluIHJlZ2V4cCBleGVjdXRpb24AZGVzY3JpcHRpb24AcHJveHk6IGRlZmluZVByb3BlcnR5IGV4Y2VwdGlvbgBqc19hc3luY19nZW5lcmF0b3JfcmVzb2x2ZV9mdW5jdGlvbgBqc19jcmVhdGVfZnVuY3Rpb24Ac2V0L2FkZCBpcyBub3QgYSBmdW5jdGlvbgByZXR1cm4gbm90IGluIGEgZnVuY3Rpb24AQXN5bmNHZW5lcmF0b3JGdW5jdGlvbgBjYWxsRXh0ZXJuYWxGdW5jdGlvbgBBc3luY0Z1bmN0aW9uAGF3YWl0IGluIGRlZmF1bHQgZXhwcmVzc2lvbgB5aWVsZCBpbiBkZWZhdWx0IGV4cHJlc3Npb24AaW52YWxpZCBkZWNpbWFsIGVzY2FwZSBpbiByZWd1bGFyIGV4cHJlc3Npb24AYmFjayByZWZlcmVuY2Ugb3V0IG9mIHJhbmdlIGluIHJlZ3VsYXIgZXhwcmVzc2lvbgBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpbiByZWd1bGFyIGV4cHJlc3Npb24AZXhwZWN0ZWQgJ29mJyBvciAnaW4nIGluIGZvciBjb250cm9sIGV4cHJlc3Npb24AdG9vIGNvbXBsaWNhdGVkIGRlc3RydWN0dXJpbmcgZXhwcmVzc2lvbgBleHBlY3RlZCAnfScgYWZ0ZXIgdGVtcGxhdGUgZXhwcmVzc2lvbgB0b1ByZWNpc2lvbgBhc2luAGpvaW4AbWluAGNvcHlXaXRoaW4AdGVtcGxhdGUgbGl0ZXJhbCBjYW5ub3QgYXBwZWFyIGluIGFuIG9wdGlvbmFsIGNoYWluAGNpcmN1bGFyIHByb3RvdHlwZSBjaGFpbgBhc3NpZ24AaXNGcm96ZW4AbWFya19jaGlsZHJlbgAocG9zICsgbGVuKSA8PSBiY19idWZfbGVuAHVuZXhwZWN0ZWQgZWxsaXBzaXMgdG9rZW4AdGhlbgBzZXR0ZXIgaXMgZm9yYmlkZGVuAG51bGwgb3IgdW5kZWZpbmVkIGFyZSBmb3JiaWRkZW4AYXRhbgBuYW4Abm90IGEgYm9vbGVhbgBCb29sZWFuAGdjX3NjYW4AYmFkIG5vcm1hbGl6YXRpb24gZm9ybQBKU19OZXdTeW1ib2xGcm9tQXRvbQBmcm9tAHJhbmRvbQB0cmltAGltdWwAbm90IGEgc3ltYm9sAFN5bWJvbABSZWdFeHAgZXhlYyBtZXRob2QgbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIG51bGwAcGFyZW50IHByb3RvdHlwZSBtdXN0IGJlIGFuIG9iamVjdCBvciBudWxsAGNhbm5vdCBzZXQgcHJvcGVydHkgJyVzJyBvZiBudWxsAGNhbm5vdCByZWFkIHByb3BlcnR5ICclcycgb2YgbnVsbABOdWxsAGZpbGwAbmV3IEFycmF5QnVmZmVyIGlzIHRvbyBzbWFsbABUeXBlZEFycmF5IGxlbmd0aCBpcyB0b28gc21hbGwAY2FsbABkb3RBbGwAbWF0Y2hBbGwAcmVwbGFjZUFsbABjZWlsAHVwZGF0ZV9sYWJlbABiY19idWZbcG9zXSA9PSBPUF9sYWJlbABldmFsAGludmFsaWQgbnVtYmVyIGxpdGVyYWwAbWFsZm9ybWVkIGVzY2FwZSBzZXF1ZW5jZSBpbiBzdHJpbmcgbGl0ZXJhbABKU19TZXRQcm9wZXJ0eUludGVybmFsAEpTX0dldE93blByb3BlcnR5TmFtZXNJbnRlcm5hbABfX0pTX0V2YWxJbnRlcm5hbAB0b0V4cG9uZW50aWFsAHNlYWwAZ2xvYmFsAGJsaW5rAF9fZGF0ZV9jbG9jawBzdGFjawBscmVfZXhlY19iYWNrdHJhY2sAcy0+aXNfd2VhawBpAHNldE1vbnRoAGdldE1vbnRoAHNldFVUQ01vbnRoAGdldFVUQ01vbnRoAGludmFsaWQga2V5d29yZDogd2l0aABzdGFydHNXaXRoAGVuZHNXaXRoAHByb3AgPT0gSlNfQVRPTV9sZW5ndGgAaW52YWxpZCBhcnJheSBsZW5ndGgAaW52YWxpZCBhcnJheSBidWZmZXIgbGVuZ3RoAGludmFsaWQgbGVuZ3RoAGludmFsaWQgYnl0ZUxlbmd0aABNYXRoAHB1c2gAYWNvc2gASlNfUmVzaXplQXRvbUhhc2gAYXNpbmgAYXRhbmgAYnJlYWsgbXVzdCBiZSBpbnNpZGUgbG9vcCBvciBzd2l0Y2gAbWF0Y2gAY2F0Y2gAc2VhcmNoAGZvckVhY2gAbG9nAEFycmF5IHRvbyBsb25nAHN0cmluZyB0b28gbG9uZwBBcnJheSBsb28gbG9uZwBzdWJzdHJpbmcAY2Fubm90IGNvbnZlcnQgc3ltYm9sIHRvIHN0cmluZwB1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmcAbm90IGEgc3RyaW5nAGludmFsaWQgY2hhcmFjdGVyIGluIGEgSlNPTiBzdHJpbmcAdG9TdHJpbmcAdG9EYXRlU3RyaW5nAHRvTG9jYWxlRGF0ZVN0cmluZwB0b1RpbWVTdHJpbmcAdG9Mb2NhbGVUaW1lU3RyaW5nAHRvTG9jYWxlU3RyaW5nAHRvR01UU3RyaW5nAEpTU3RyaW5nAHRvSVNPU3RyaW5nAHRvVVRDU3RyaW5nAGR1cGxpY2F0ZSBpbXBvcnQgYmluZGluZwBpbnZhbGlkIGltcG9ydCBiaW5kaW5nAGJpZwByZWdleHAgbXVzdCBoYXZlIHRoZSAnZycgZmxhZwBvZgBpbmYAZGlmZiA9PSAoaW50OF90KWRpZmYAZGlmZiA9PSAoaW50MTZfdClkaWZmAGhyZWYAZ2NfZGVjcmVmAGZyZWVfdmFyX3JlZgBvcHRpbWl6ZV9zY29wZV9tYWtlX2dsb2JhbF9yZWYAcmVzZXRfd2Vha19yZWYAZGVsZXRlX3dlYWtfcmVmAG9wdGltaXplX3Njb3BlX21ha2VfcmVmAGluZGV4T2YAbGFzdEluZGV4T2YAdmFsdWVPZgBzZXRQcm90b3R5cGVPZgBnZXRQcm90b3R5cGVPZgBpc1Byb3RvdHlwZU9mACUuKmYAZm9udHNpemUAbmV3X3NpemUgPD0gc2gtPnByb3Bfc2l6ZQBkZXNjciA8IHJ0LT5hdG9tX3NpemUAYXRvbSA8IHJ0LT5hdG9tX3NpemUAY29tcHV0ZV9zdGFja19zaXplAG4gPCBidWZfc2l6ZQBub3JtYWxpemUAZnJlZXplAHJlc29sdmUAdG9QcmltaXRpdmUAcHV0X2x2YWx1ZQB1bmtub3duIHVuaWNvZGUgcHJvcGVydHkgdmFsdWUAcmVzdCBlbGVtZW50IGNhbm5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZQBpbnZhbGlkIHJldCB2YWx1ZQBfX0pTX0F0b21Ub1ZhbHVlAF9fcXVvdGUAaXNGaW5pdGUAZGVsZXRlAGNyZWF0ZQBzZXREYXRlAGdldERhdGUAc2V0VVRDRGF0ZQBnZXRVVENEYXRlAEludmFsaWQgRGF0ZQByZXZlcnNlAHBhcnNlAHByb3h5IHByZXZlbnRFeHRlbnNpb25zIGhhbmRsZXIgcmV0dXJuZWQgZmFsc2UAUHJvbWlzZQB0b0xvd2VyQ2FzZQB0b0xvY2FsZUxvd2VyQ2FzZQB0b1VwcGVyQ2FzZQB0b0xvY2FsZVVwcGVyQ2FzZQBpZ25vcmVDYXNlAGxvY2FsZUNvbXBhcmUAcHJveHk6IGluY29uc2lzdGVudCBwcm90b3R5cGUAcHJveHk6IGJhZCBwcm90b3R5cGUAbm90IGEgcHJvdG90eXBlAGludmFsaWQgb2JqZWN0IHR5cGUAdW5lc2NhcGUAbm9uZQByZXN0IGVsZW1lbnQgbXVzdCBiZSB0aGUgbGFzdCBvbmUAbXVsdGlsaW5lACAgcGMybGluZQBzb21lAEpTX0ZyZWVSdW50aW1lAEpTUnVudGltZQBzZXRUaW1lAGdldFRpbWUAc2V0X29iamVjdF9uYW1lAGV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lAHVua25vd24gdW5pY29kZSBwcm9wZXJ0eSBuYW1lAGludmFsaWQgcHJvcGVydHkgbmFtZQBkdXBsaWNhdGUgX19wcm90b19fIHByb3BlcnR5IG5hbWUAaW52YWxpZCByZWRlZmluaXRpb24gb2YgcGFyYW1ldGVyIG5hbWUAZXhwZWN0aW5nIGdyb3VwIG5hbWUAZHVwbGljYXRlIGdyb3VwIG5hbWUAaW52YWxpZCBncm91cCBuYW1lAGR1cGxpY2F0ZSBsYWJlbCBuYW1lAGludmFsaWQgZmlyc3QgY2hhcmFjdGVyIG9mIHByaXZhdGUgbmFtZQBpbnZhbGlkIGxleGljYWwgdmFyaWFibGUgbmFtZQBpbnZhbGlkIG1ldGhvZCBuYW1lAGV4cGVjdGluZyBmaWVsZCBuYW1lAGludmFsaWQgZmllbGQgbmFtZQBjbGFzcyBzdGF0ZW1lbnQgcmVxdWlyZXMgYSBuYW1lAGZpbGVOYW1lAGNvbXBpbGUAb2JqZWN0IGlzIG5vdCBleHRlbnNpYmxlAHByb3h5OiBpbmNvbnNpc3RlbnQgaXNFeHRlbnNpYmxlAGNhbm5vdCBoYXZlIHNldHRlci9nZXR0ZXIgYW5kIHZhbHVlIG9yIHdyaXRhYmxlAHByb3BlcnR5IGlzIG5vdCBjb25maWd1cmFibGUAdmFsdWUgaXMgbm90IGl0ZXJhYmxlAHByb3BlcnR5SXNFbnVtZXJhYmxlAG1pc3NpbmcgaW5pdGlhbGl6ZXIgZm9yIGNvbnN0IHZhcmlhYmxlAGxleGljYWwgdmFyaWFibGUAaW52YWxpZCByZWRlZmluaXRpb24gb2YgYSB2YXJpYWJsZQByZXZvY2FibGUAc3RyaWtlAGludmFsaWQgY2xhc3MgcmFuZ2UAbWVzc2FnZQBhc3luY19mdW5jX2ZyZWUAaW52YWxpZCBsdmFsdWUgaW4gc3RyaWN0IG1vZGUAaW52YWxpZCB2YXJpYWJsZSBuYW1lIGluIHN0cmljdCBtb2RlAGNhbm5vdCBkZWxldGUgYSBkaXJlY3QgcmVmZXJlbmNlIGluIHN0cmljdCBtb2RlAG9jdGFsIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlAG9jdGFsIGxpdGVyYWxzIGFyZSBkZXByZWNhdGVkIGluIHN0cmljdCBtb2RlAHVuaWNvZGUAICBieXRlY29kZQBKU0Z1bmN0aW9uQnl0ZWNvZGUAc2tpcF9kZWFkX2NvZGUAaW52YWxpZCBhcmd1bWVudCBuYW1lIGluIHN0cmljdCBjb2RlAGludmFsaWQgZnVuY3Rpb24gbmFtZSBpbiBzdHJpY3QgY29kZQBpbnZhbGlkIHJlZGVmaW5pdGlvbiBvZiBnbG9iYWwgaWRlbnRpZmllciBpbiBtb2R1bGUgY29kZQBpbXBvcnQubWV0YSBvbmx5IHZhbGlkIGluIG1vZHVsZSBjb2RlAGZyb21DaGFyQ29kZQBpbnZhbGlkIGZvciBpbi9vZiBsZWZ0IGhhbmQtc2lkZQBpbnZhbGlkIGFzc2lnbm1lbnQgbGVmdC1oYW5kIHNpZGUAcmVkdWNlAHNvdXJjZQAndGhpcycgY2FuIGJlIGluaXRpYWxpemVkIG9ubHkgb25jZQBwcm9wZXJ0eSBjb25zdHJ1Y3RvciBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlAGludmFsaWQgVVRGLTggc2VxdWVuY2UAY2lyY3VsYXIgcmVmZXJlbmNlAHNsaWNlAHNwbGljZQByYWNlAHJlcGxhY2UAJSsuKmUAdW5leHBlY3RlZCAnYXdhaXQnIGtleXdvcmQAdW5leHBlY3RlZCAneWllbGQnIGtleXdvcmQAbWFwX2RlY3JlZl9yZWNvcmQAaXRlcmF0b3IgZG9lcyBub3QgaGF2ZSBhIHRocm93IG1ldGhvZABvYmplY3QgbmVlZHMgdG9JU09TdHJpbmcgbWV0aG9kACdzdXBlcicgaXMgb25seSB2YWxpZCBpbiBhIG1ldGhvZABmcm91bmQAYnJlYWsvY29udGludWUgbGFiZWwgbm90IGZvdW5kAG91dCBvZiBib3VuZABmaW5kAGJpbmQAaW52YWxpZCBpbmRleCBmb3IgYXBwZW5kAGV4dHJhbmVvdXMgY2hhcmFjdGVycyBhdCB0aGUgZW5kAHVuZXhwZWN0ZWQgZGF0YSBhdCB0aGUgZW5kAHVuZXhwZWN0ZWQgZW5kAGludmFsaWQgaW5jcmVtZW50L2RlY3JlbWVudCBvcGVyYW5kAGludmFsaWQgJ2luc3RhbmNlb2YnIHJpZ2h0IG9wZXJhbmQAaW52YWxpZCAnaW4nIG9wZXJhbmQAdHJpbUVuZABwYWRFbmQAYm9sZAAlbGxkAGdjX2RlY3JlZl9jaGlsZAByZXNvbHZlX3Njb3BlX3ByaXZhdGVfZmllbGQAY2Fubm90IGRlbGV0ZSBhIHByaXZhdGUgY2xhc3MgZmllbGQAZXhwZWN0aW5nIDxicmFuZD4gcHJpdmF0ZSBmaWVsZAAlcyBpcyBub3QgaW5pdGlhbGl6ZWQAZml4ZWQAdG9GaXhlZABzZXRfb2JqZWN0X25hbWVfY29tcHV0ZWQAcmVnZXggbm90IHN1cHBvcnRlZABldmFsIGlzIG5vdCBzdXBwb3J0ZWQAUmVnRXhwIGFyZSBub3Qgc3VwcG9ydGVkAGludGVycnVwdGVkACVzIG9iamVjdCBleHBlY3RlZABpZGVudGlmaWVyIGV4cGVjdGVkAGJ5dGVjb2RlIGZ1bmN0aW9uIGV4cGVjdGVkAHN0cmluZyBleHBlY3RlZABmcm9tIGNsYXVzZSBleHBlY3RlZABmdW5jdGlvbiBuYW1lIGV4cGVjdGVkAHZhcmlhYmxlIG5hbWUgZXhwZWN0ZWQAbWV0YSBleHBlY3RlZAByZWplY3RlZABtZW1vcnkgYWxsb2NhdGVkAG1lbW9yeSB1c2VkAGRlcml2ZWQgY2xhc3MgY29uc3RydWN0b3IgbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIHVuZGVmaW5lZABjYW5ub3Qgc2V0IHByb3BlcnR5ICclcycgb2YgdW5kZWZpbmVkAGNhbm5vdCByZWFkIHByb3BlcnR5ICclcycgb2YgdW5kZWZpbmVkAGZsYWdzIG11c3QgYmUgdW5kZWZpbmVkAFVuZGVmaW5lZABwcml2YXRlIGNsYXNzIGZpZWxkIGlzIGFscmVhZHkgZGVmaW5lZAAnJXMnIGlzIG5vdCBkZWZpbmVkAGdyb3VwIG5hbWUgbm90IGRlZmluZWQAYWxsU2V0dGxlZABmdWxmaWxsZWQAY2Fubm90IGJlIGNhbGxlZABpc1NlYWxlZAAhc2gtPmlzX2hhc2hlZAB2YXJfcmVmLT5pc19kZXRhY2hlZABBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZABhZGQAJSswN2QAJTA0ZAAlMDJkJTAyZAAlMDJkLyUwMmQvJTAqZAAlLjNzICUuM3MgJTAyZCAlMCpkADolZABpbnZhbGlkIHRocm93IHZhciB0eXBlICVkAHNjAGpzX2RlZl9tYWxsb2MAdHJ1bmMAZ2MAZXhlYwAvdG1wL3F1aWNranMvcXVpY2tqcy5jAC90bXAvcXVpY2tqcy9saWJyZWdleHAuYwAvdG1wL3F1aWNranMvbGlidW5pY29kZS5jAHN1YgBwcm9taXNlX3JlYWN0aW9uX2pvYgBqc19wcm9taXNlX3Jlc29sdmVfdGhlbmFibGVfam9iAHJ3YQBfX2xvb2t1cFNldHRlcl9fAF9fZGVmaW5lU2V0dGVyX18AX19sb29rdXBHZXR0ZXJfXwBfX2RlZmluZUdldHRlcl9fAF9fcHJvdG9fXwBbU3ltYm9sLnNwbGl0XQBbU3ltYm9sLnNwZWNpZXNdAFtTeW1ib2wuaXRlcmF0b3JdAFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0AW1N5bWJvbC5tYXRjaEFsbF0AW1N5bWJvbC5tYXRjaF0AW1N5bWJvbC5zZWFyY2hdAFtTeW1ib2wudG9TdHJpbmdUYWddAFtTeW1ib2wudG9QcmltaXRpdmVdAFt1bnN1cHBvcnRlZCB0eXBlXQBbZnVuY3Rpb24gYnl0ZWNvZGVdAFtTeW1ib2wuaGFzSW5zdGFuY2VdAFtTeW1ib2wucmVwbGFjZV0AWwAlMDJkOiUwMmQ6JTAyZC4lMDNkWgBQT1NJVElWRV9JTkZJTklUWQBORUdBVElWRV9JTkZJTklUWQBwLT5jbGFzc19pZCA9PSBKU19DTEFTU19BUlJBWQBzdGFja19sZW4gPCBQT1BfU1RBQ0tfTEVOX01BWAAtJTAyZC0lMDJkVABKU19BdG9tR2V0U3RyUlQAb3Bjb2RlIDwgUkVPUF9DT1VOVABCWVRFU19QRVJfRUxFTUVOVAAlMDJkOiUwMmQ6JTAyZCBHTVQASlNfVkFMVUVfR0VUX1RBRyhzZi0+Y3VyX2Z1bmMpID09IEpTX1RBR19PQkpFQ1QAdmFyX2tpbmQgPT0gSlNfVkFSX1BSSVZBVEVfU0VUVEVSAE1BWF9TQUZFX0lOVEVHRVIATUlOX1NBRkVfSU5URUdFUgBpc05hTgBEYXRlIHZhbHVlIGlzIE5hTgB0b0pTT04ARVBTSUxPTgBOQU4AJTAyZDolMDJkOiUwMmQgJWNNAHMtPmxhYmVsX3Nsb3RzW2xhYmVsXS5maXJzdF9yZWxvYyA9PSBOVUxMAGxhYmVsX3Nsb3RzW2ldLmZpcnN0X3JlbG9jID09IE5VTEwAcHJzICE9IE5VTEwAc2YtPmN1cl9zcCAhPSBOVUxMAHNmICE9IE5VTEwAbXIxICE9IE5VTEwAdmFyX2tpbmQgIT0gSlNfVkFSX05PUk1BTABiLT5mdW5jX2tpbmQgPT0gSlNfRlVOQ19OT1JNQUwAZW5jb2RlVVJJAGRlY29kZVVSSQBQSQBzcGVjaWFsID09IFBVVF9MVkFMVUVfTk9LRUVQIHx8IHNwZWNpYWwgPT0gUFVUX0xWQUxVRV9OT0tFRVBfREVQVEgAcy0+c3RhdGUgPT0gSlNfQVNZTkNfR0VORVJBVE9SX1NUQVRFX0VYRUNVVElORwBJTkYAMDEyMzQ1Njc4OUFCQ0RFRgBTSVpFAE1BWF9WQUxVRQBNSU5fVkFMVUUATkFNRQBldmFsX3R5cGUgPT0gSlNfRVZBTF9UWVBFX0dMT0JBTCB8fCBldmFsX3R5cGUgPT0gSlNfRVZBTF9UWVBFX01PRFVMRQBwLT5nY19vYmpfdHlwZSA9PSBKU19HQ19PQkpfVFlQRV9KU19PQkpFQ1QgfHwgcC0+Z2Nfb2JqX3R5cGUgPT0gSlNfR0NfT0JKX1RZUEVfRlVOQ1RJT05fQllURUNPREUATE9HMkUATE9HMTBFAHMtPnN0YXRlID09IEpTX0FTWU5DX0dFTkVSQVRPUl9TVEFURV9BV0FJVElOR19SRVRVUk4gfHwgcy0+c3RhdGUgPT0gSlNfQVNZTkNfR0VORVJBVE9SX1NUQVRFX0NPTVBMRVRFRABVVEMAPGlucHV0PgA8aW5pdFNjcmlwdD4APGV2YWxTY3JpcHQ+ADxzZXQ+ADxhbm9ueW1vdXM+ADxjb21tRnVuPgA8Y2FsbEV4dGVybmFsRnVuY3Rpb24+ADxudWxsPgAmcXVvdDsAc2V0VWludDgAZ2V0VWludDgAc2V0SW50OABnZXRJbnQ4AG1hbGZvcm1lZCBVVEYtOAByYWRpeCBtdXN0IGJlIGJldHdlZW4gMiBhbmQgMzYAc2V0VWludDE2AGdldFVpbnQxNgBzZXRJbnQxNgBnZXRJbnQxNgBhcmdjID09IDUAc2V0RmxvYXQ2NABnZXRGbG9hdDY0AGFyZ2MgPT0gMwBhdGFuMgBsb2cyAFNRUlQxXzIAU1FSVDIATE4yAGNsejMyAHNldFVpbnQzMgBnZXRVaW50MzIAc2V0SW50MzIAZ2V0SW50MzIAc2V0RmxvYXQzMgBnZXRGbG9hdDMyAHN0YWNrX2xlbiA+PSAyAEpTX0F0b21Jc051bWVyaWNJbmRleDEAanNfZmN2dDEAZXhwbTEAbHMtPmFkZHIgPT0gLTEAc3RhY2tfbGVuID49IDEAcC0+c2hhcGUtPmhlYWRlci5yZWZfY291bnQgPT0gMQBzdGFja19sZW4gPT0gMQBqc19mcmVlX3NoYXBlMABsb2cxMABMTjEwAHAtPnJlZl9jb3VudCA+IDAAdmFyX3JlZi0+aGVhZGVyLnJlZl9jb3VudCA+IDAAc3RhY2tfc2l6ZSA+IDAAY3Bvb2xfaWR4ID49IDAAcnQtPmF0b21fY291bnQgPj0gMABscy0+cmVmX2NvdW50ID49IDAAcy0+aXNfZXZhbCB8fCBzLT5jbG9zdXJlX3Zhcl9jb3VudCA9PSAwAHAtPnJlZl9jb3VudCA9PSAwAGN0eC0+aGVhZGVyLnJlZl9jb3VudCA9PSAwAHNoLT5oZWFkZXIucmVmX2NvdW50ID09IDAAcC0+bWFyayA9PSAwAChwci0+dS5pbml0LnJlYWxtX2FuZF9pZCAmIDMpID09IDAAKG5ld19oYXNoX3NpemUgJiAobmV3X2hhc2hfc2l6ZSAtIDEpKSA9PSAwAGkgIT0gMABzaXplICE9IDAAXiRcLiorPygpW117fXwvADwvAG1pc3NpbmcgYmluZGluZyBwYXR0ZXJuLi4uAGFzeW5jIGZ1bmN0aW9uICoACn0pAGxpc3RfZW1wdHkoJnJ0LT5nY19vYmpfbGlzdCkAaiA9PSAoc2gtPnByb3BfY291bnQgLSBzaC0+ZGVsZXRlZF9wcm9wX2NvdW50KQBKU19Jc1VuZGVmaW5lZChmdW5jX3JldCkAIV9fSlNfQXRvbUlzVGFnZ2VkSW50KGRlc2NyKQAhYXRvbV9pc19mcmVlKHApAChudWxsKQAgKG5hdGl2ZSkAanNfY2xhc3NfaGFzX2J5dGVjb2RlKHAtPmNsYXNzX2lkKQB1bmNvbnNpc3RlbnQgc3RhY2sgc2l6ZTogJWQgJWQgKHBjPSVkKQBieXRlY29kZSBidWZmZXIgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgdW5kZXJmbG93IChvcD0lZCwgcGM9JWQpAGludmFsaWQgb3Bjb2RlIChvcD0lZCwgcGM9JWQpACg/OikAbm8gZnVuY3Rpb24gZmlsZW5hbWUgZm9yIGltcG9ydCgpAC1fLiF+KicoKQAgYW5vbnltb3VzKABTeW1ib2woAGV4cGVjdGluZyAnfScAY2xhc3MgY29uc3RydWN0b3JzIG11c3QgYmUgaW52b2tlZCB3aXRoICduZXcnAGV4cGVjdGluZyAnYXMnAHVuZXhwZWN0ZWQgdG9rZW4gaW4gZXhwcmVzc2lvbjogJyUuKnMnAHVuZXhwZWN0ZWQgdG9rZW46ICclLipzJwByZWRlY2xhcmF0aW9uIG9mICclcycAZHVwbGljYXRlIGV4cG9ydGVkIG5hbWUgJyVzJwBjaXJjdWxhciByZWZlcmVuY2Ugd2hlbiBsb29raW5nIGZvciBleHBvcnQgJyVzJyBpbiBtb2R1bGUgJyVzJwBDb3VsZCBub3QgZmluZCBleHBvcnQgJyVzJyBpbiBtb2R1bGUgJyVzJwBjb3VsZCBub3QgbG9hZCBtb2R1bGUgJyVzJwBjYW5ub3QgZGVmaW5lIHZhcmlhYmxlICclcycAdW5kZWZpbmVkIHByaXZhdGUgZmllbGQgJyVzJwB1bnN1cHBvcnRlZCByZWZlcmVuY2UgdG8gJ3N1cGVyJwBpbnZhbGlkIHVzZSBvZiAnc3VwZXInACdmb3IgYXdhaXQnIGxvb3Agc2hvdWxkIGJlIHVzZWQgd2l0aCAnb2YnAGV4cGVjdGluZyAnJWMnAHVucGFyZW50aGVzaXplZCB1bmFyeSBleHByZXNzaW9uIGNhbid0IGFwcGVhciBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgJyoqJwBpbnZhbGlkIHVzZSBvZiAnaW1wb3J0KCknAGV4cGVjdGluZyAlJQA7Lz86QCY9KyQsIwA9IgBzZXQgAGdldCAAW29iamVjdCAAYXN5bmMgZnVuY3Rpb24gAGJvdW5kIAAlLjNzLCAlMDJkICUuM3MgJTAqZCAAYXN5bmMgADogACAgICAgICAgICAACikgewoACkpTT2JqZWN0IGNsYXNzZXMKACUtMjBzICU4cyAlOHMKACAgJTVkICAlMi4wZCAlcwoAICAlM3UgKyAlLTJ1ICAlcwoAICBt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YWJsZQB2YWx1ZQBnZXQAc2V0AG9mAF9fcHJvdG9fXwB1bmRlZmluZWQAbnVtYmVyAGJvb2xlYW4Ac3RyaW5nAG9iamVjdABzeW1ib2wAaW50ZWdlcgB1bmtub3duAGFyZ3VtZW50cwBjYWxsZWUAY2FsbGVyADxldmFsPgA8cmV0PgA8dmFyPgA8YXJnX3Zhcj4APHdpdGg+AGxhc3RJbmRleAB0YXJnZXQAaW5kZXgAaW5wdXQAZGVmaW5lUHJvcGVydGllcwBhcHBseQBqb2luAGNvbmNhdABzcGxpdABjb25zdHJ1Y3QAZ2V0UHJvdG90eXBlT2YAc2V0UHJvdG90eXBlT2YAaXNFeHRlbnNpYmxlAHByZXZlbnRFeHRlbnNpb25zAGhhcwBkZWxldGVQcm9wZXJ0eQBkZWZpbmVQcm9wZXJ0eQBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IAb3duS2V5cwBhZGQAZG9uZQBuZXh0AHZhbHVlcwBzb3VyY2UAZmxhZ3MAZ2xvYmFsAHVuaWNvZGUAcmF3AG5ldy50YXJnZXQAdGhpcy5hY3RpdmVfZnVuYwA8aG9tZV9vYmplY3Q+ADxjb21wdXRlZF9maWVsZD4APHN0YXRpY19jb21wdXRlZF9maWVsZD4APGNsYXNzX2ZpZWxkc19pbml0PgA8YnJhbmQ+ACNjb25zdHJ1Y3RvcgBhcwBmcm9tAG1ldGEAKmRlZmF1bHQqACoATW9kdWxlAHRoZW4AcmVzb2x2ZQByZWplY3QAcHJvbWlzZQBwcm94eQByZXZva2UAYXN5bmMAZXhlYwBncm91cHMAc3RhdHVzAHJlYXNvbgBnbG9iYWxUaGlzAHRvSlNPTgBPYmplY3QAQXJyYXkARXJyb3IATnVtYmVyAFN0cmluZwBCb29sZWFuAFN5bWJvbABBcmd1bWVudHMATWF0aABKU09OAERhdGUARnVuY3Rpb24AR2VuZXJhdG9yRnVuY3Rpb24ARm9ySW5JdGVyYXRvcgBSZWdFeHAAQXJyYXlCdWZmZXIAU2hhcmVkQXJyYXlCdWZmZXIAVWludDhDbGFtcGVkQXJyYXkASW50OEFycmF5AFVpbnQ4QXJyYXkASW50MTZBcnJheQBVaW50MTZBcnJheQBJbnQzMkFycmF5AFVpbnQzMkFycmF5AEZsb2F0MzJBcnJheQBGbG9hdDY0QXJyYXkARGF0YVZpZXcATWFwAFNldABXZWFrTWFwAFdlYWtTZXQATWFwIEl0ZXJhdG9yAFNldCBJdGVyYXRvcgBBcnJheSBJdGVyYXRvcgBTdHJpbmcgSXRlcmF0b3IAUmVnRXhwIFN0cmluZyBJdGVyYXRvcgBHZW5lcmF0b3IAUHJveHkAUHJvbWlzZQBQcm9taXNlUmVzb2x2ZUZ1bmN0aW9uAFByb21pc2VSZWplY3RGdW5jdGlvbgBBc3luY0Z1bmN0aW9uAEFzeW5jRnVuY3Rpb25SZXNvbHZlAEFzeW5jRnVuY3Rpb25SZWplY3QAQXN5bmNHZW5lcmF0b3JGdW5jdGlvbgBBc3luY0dlbmVyYXRvcgBFdmFsRXJyb3IAUmFuZ2VFcnJvcgBSZWZlcmVuY2VFcnJvcgBTeW50YXhFcnJvcgBUeXBlRXJyb3IAVVJJRXJyb3IASW50ZXJuYWxFcnJvcgA8YnJhbmQ+AFN5bWJvbC50b1ByaW1pdGl2ZQBTeW1ib2wuaXRlcmF0b3IAU3ltYm9sLm1hdGNoAFN5bWJvbC5tYXRjaEFsbABTeW1ib2wucmVwbGFjZQBTeW1ib2wuc2VhcmNoAFN5bWJvbC5zcGxpdABTeW1ib2wudG9TdHJpbmdUYWcAU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZQBTeW1ib2wuaGFzSW5zdGFuY2UAU3ltYm9sLnNwZWNpZXMAU3ltYm9sLnVuc2NvcGFibGVzAFN5bWJvbC5hc3luY0l0ZXJhdG9yAAAAAAABAAAABQABFAUAARUFAAEVBQABFwUAARcBAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAEFAwABCgEBAAABAgEAAQMCAAEBAgABAgMAAQIEAAEDBgABAgMAAQMEAAEEBQABAwMAAQQEAAEFBQABAgIAAQQEAAEDAwABAwMAAQQEAAEFBQADAgENAwEBDQMBAA0DAgENAwIADQMAAQ0DAwEKAQEAAAEAAAABAQIAAQAAAAECAgABAgAAAQEAAAEBAAAGAAAYBQEBDwMCAQoBAgEAAQEBAAEBAQAFAAEXBQABFwUAARcFAQAXBQEAFwUCABcBAgMAAQMAAAYAABgGAAAYBgEAGAUBARcFAQIXBQIAFwECAQABAwAAAQMB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AFCD4wBQA+UAQJDmAACB7gBAEu8AtAH4AFCD+ABAAvoAMAH7ADCB+wBAKPwAMAEQAUASEQExAR0BQIIdATCBHgExAR8BAYIfAUCCIAEwgSEBMAEiATCBIgFACiMBAQEoAQGBKAEBASkBAIEpAQABKgEAAisBAIEsAQCBLQEBAS4BAAEwAQGBMAEAgTEBAYEyAQEBMwEAATQBAIE0AQEBNQEBgTUBAQE2AQCBNwEBgTgBAAE5AQCBOgEBgT4BAAFAAQEBQQEAgUEBAYFDAQABRAEAgUQBAAJFAQABRgEAAUkBAYFOAQEBTwFzgaIBQAS4AUACuwEAg70BMIG/ATABwwEwA8QBMAHGATACxwHQAcgBMJHIATCJ0QEAAdYBAIPWAdMB2AEAkdgBcwHhAQCJ4QEAAeYBAILmATCB5wFzAegBc4HoAXOB6gFzAesBAIHrAUAY7AFzAfgBc4H4AQAB+QEAgfkBoAH6AXOB+gFAgvsBMIH8AUAC/QEwg/4BMBAAAjAgCAIAIBgCABAoAkAiMAJANkUCMAFgAkCOYAIAgWcCQGBoAjCmmAIAprACtYHDAjEmUAgxgWMIMYFmCAAraAgAg34IEVDQCRAG+AkgBvwJdAFADnSBQA50AUEOdIFBDnQBQg50gUIOdAFDDoCBQw6AAUQOMCtIDjCDXg4BgbwOAYG+DgEBxw5AfgAPQBg/D7UBSw+2gUsPtgFMD7aBTA+3AU0PgIFNDzABTw9AYFAPAAiADzAIhA8ABogPMAaMDwAIkA8wCJQPAAiYDzAInA8ABqAPMAakD7ABqA8AgagP0wGpDwCBqQ/TAaoPAIGqD9MBqw8AgasPMIGsDzCBrQ8wga4PMIGvDwAIsA8wCLQPAAK4DwAEuQ8AArsPAQK8DwECvQ8BAr4PtwjAD2cIxA+4CMgPaAjMD7gI0A9oCNQPAALYD7kB2Q+xgdkPuQHaD7EB2w/XgdsPMALcDzAC3Q9hAd4PcwHfD7kB4Q+ygeEPugHiD7IB4w/YgeMPMATkD2IB5g8AAugP0AHpD9CB6Q+wAesP0IHrDzAC7A8wAu0PAQLwD9MB8Q/TgfEPugHyDwGB8g+wAfMP04HzDzAC9A8wAvUPMQH2D7oB+Q+ygfkPuwH6D7IB+w/ZgfsPMAL8DzAC/Q9iAf4PoAGTEKABlRCggZUQMQGZEAEBpxAxELAQARC4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iacwH4CIiq2PQZQ4h4+Jt5WAjfkqAAgwB4mvIAgniUFIg2BLaInViaWEuoaYiUP0ALYz0ICKgWBMqoFSYK2BlkIdIi85hp2DQJOCRYixQf+2g7E4jYCVII5FTzCQDgEEQQSGiIlBY4C8jUXVhuw0iVKViWwFBUDv+gYAcAkA8ApAVwwA8A1Axw8A6hcgRRsgVSAgDKhgN6oAUP4AOg0BgxEBxBQhRBkhWh1Bn7xhsNoh8AEOAAAAAEFkbGFtLEFkbG0AQWhvbSxBaG9tAEFuYXRvbGlhbl9IaWVyb2dseXBocyxIbHV3AEFyYWJpYyxBcmFiAEFybWVuaWFuLEFybW4AQXZlc3RhbixBdnN0AEJhbGluZXNlLEJhbGkAQmFtdW0sQmFtdQBCYXNzYV9WYWgsQmFzcwBCYXRhayxCYXRrAEJlbmdhbGksQmVuZwBCaGFpa3N1a2ksQmhrcwBCb3BvbW9mbyxCb3BvAEJyYWhtaSxCcmFoAEJyYWlsbGUsQnJhaQBCdWdpbmVzZSxCdWdpAEJ1aGlkLEJ1aGQAQ2FuYWRpYW5fQWJvcmlnaW5hbCxDYW5zAENhcmlhbixDYXJpAENhdWNhc2lhbl9BbGJhbmlhbixBZ2hiAENoYWttYSxDYWttAENoYW0sQ2hhbQBDaGVyb2tlZSxDaGVyAENob3Jhc21pYW4sQ2hycwBDb21tb24sWnl5eQBDb3B0aWMsQ29wdCxRYWFjAEN1bmVpZm9ybSxYc3V4AEN5cHJpb3QsQ3BydABDeXJpbGxpYyxDeXJsAEN5cHJvX01pbm9hbixDcG1uAERlc2VyZXQsRHNydABEZXZhbmFnYXJpLERldmEARGl2ZXNfQWt1cnUsRGlhawBEb2dyYSxEb2dyAER1cGxveWFuLER1cGwARWd5cHRpYW5fSGllcm9nbHlwaHMsRWd5cABFbGJhc2FuLEVsYmEARWx5bWFpYyxFbHltAEV0aGlvcGljLEV0aGkAR2VvcmdpYW4sR2VvcgBHbGFnb2xpdGljLEdsYWcAR290aGljLEdvdGgAR3JhbnRoYSxHcmFuAEdyZWVrLEdyZWsAR3VqYXJhdGksR3VqcgBHdW5qYWxhX0dvbmRpLEdvbmcAR3VybXVraGksR3VydQBIYW4sSGFuaQBIYW5ndWwsSGFuZwBIYW5pZmlfUm9oaW5neWEsUm9oZwBIYW51bm9vLEhhbm8ASGF0cmFuLEhhdHIASGVicmV3LEhlYnIASGlyYWdhbmEsSGlyYQBJbXBlcmlhbF9BcmFtYWljLEFybWkASW5oZXJpdGVkLFppbmgsUWFhaQBJbnNjcmlwdGlvbmFsX1BhaGxhdmksUGhsaQBJbnNjcmlwdGlvbmFsX1BhcnRoaWFuLFBydGkASmF2YW5lc2UsSmF2YQBLYWl0aGksS3RoaQBLYW5uYWRhLEtuZGEAS2F0YWthbmEsS2FuYQBLYXlhaF9MaSxLYWxpAEtoYXJvc2h0aGksS2hhcgBLaG1lcixLaG1yAEtob2praSxLaG9qAEtoaXRhbl9TbWFsbF9TY3JpcHQsS2l0cwBLaHVkYXdhZGksU2luZABMYW8sTGFvbwBMYXRpbixMYXRuAExlcGNoYSxMZXBjAExpbWJ1LExpbWIATGluZWFyX0EsTGluYQBMaW5lYXJfQixMaW5iAExpc3UsTGlzdQBMeWNpYW4sTHljaQBMeWRpYW4sTHlkaQBNYWthc2FyLE1ha2EATWFoYWphbmksTWFoagBNYWxheWFsYW0sTWx5bQBNYW5kYWljLE1hbmQATWFuaWNoYWVhbixNYW5pAE1hcmNoZW4sTWFyYwBNYXNhcmFtX0dvbmRpLEdvbm0ATWVkZWZhaWRyaW4sTWVkZgBNZWV0ZWlfTWF5ZWssTXRlaQBNZW5kZV9LaWtha3VpLE1lbmQATWVyb2l0aWNfQ3Vyc2l2ZSxNZXJjAE1lcm9pdGljX0hpZXJvZ2x5cGhzLE1lcm8ATWlhbyxQbHJkAE1vZGksTW9kaQBNb25nb2xpYW4sTW9uZwBNcm8sTXJvbwBNdWx0YW5pLE11bHQATXlhbm1hcixNeW1yAE5hYmF0YWVhbixOYmF0AE5hbmRpbmFnYXJpLE5hbmQATmV3X1RhaV9MdWUsVGFsdQBOZXdhLE5ld2EATmtvLE5rb28ATnVzaHUsTnNodQBOeWlha2VuZ19QdWFjaHVlX0htb25nLEhtbnAAT2doYW0sT2dhbQBPbF9DaGlraSxPbGNrAE9sZF9IdW5nYXJpYW4sSHVuZwBPbGRfSXRhbGljLEl0YWwAT2xkX05vcnRoX0FyYWJpYW4sTmFyYgBPbGRfUGVybWljLFBlcm0AT2xkX1BlcnNpYW4sWHBlbwBPbGRfU29nZGlhbixTb2dvAE9sZF9Tb3V0aF9BcmFiaWFuLFNhcmIAT2xkX1R1cmtpYyxPcmtoAE9sZF9VeWdodXIsT3VncgBPcml5YSxPcnlhAE9zYWdlLE9zZ2UAT3NtYW55YSxPc21hAFBhaGF3aF9IbW9uZyxIbW5nAFBhbG15cmVuZSxQYWxtAFBhdV9DaW5fSGF1LFBhdWMAUGhhZ3NfUGEsUGhhZwBQaG9lbmljaWFuLFBobngAUHNhbHRlcl9QYWhsYXZpLFBobHAAUmVqYW5nLFJqbmcAUnVuaWMsUnVucgBTYW1hcml0YW4sU2FtcgBTYXVyYXNodHJhLFNhdXIAU2hhcmFkYSxTaHJkAFNoYXZpYW4sU2hhdwBTaWRkaGFtLFNpZGQAU2lnbldyaXRpbmcsU2dudwBTaW5oYWxhLFNpbmgAU29nZGlhbixTb2dkAFNvcmFfU29tcGVuZyxTb3JhAFNveW9tYm8sU295bwBTdW5kYW5lc2UsU3VuZABTeWxvdGlfTmFncmksU3lsbwBTeXJpYWMsU3lyYwBUYWdhbG9nLFRnbGcAVGFnYmFud2EsVGFnYgBUYWlfTGUsVGFsZQBUYWlfVGhhbSxMYW5hAFRhaV9WaWV0LFRhdnQAVGFrcmksVGFrcgBUYW1pbCxUYW1sAFRhbmd1dCxUYW5nAFRlbHVndSxUZWx1AFRoYWFuYSxUaGFhAFRoYWksVGhhaQBUaWJldGFuLFRpYnQAVGlmaW5hZ2gsVGZuZwBUaXJodXRhLFRpcmgAVGFuZ3NhLFRuc2EAVG90byxUb3RvAFVnYXJpdGljLFVnYXIAVmFpLFZhaWkAVml0aGt1cWksVml0aABXYW5jaG8sV2NobwBXYXJhbmdfQ2l0aSxXYXJhAFllemlkaSxZZXppAFlpLFlpaWkAWmFuYWJhemFyX1NxdWFyZSxaYW5iAAAAAAAAAMAZmUaFGZlGrhmARo4ZgEaEGZZGgBmeRoAZ4WBGphmERoQZgQ2TGeAPOIMsgBmCLAGDLIAZgCwDgCyAGYAsgBmCLACALACTLAC+LI0ajyzgJB2BOOBIHQClBQGxBQGCBQC2NQeaNQOFNQqEBIAZhQSAGY0EgBmCBIAZnwSAGYkEijiZBIA44AsEgBmhBI2JALuJAYKJrwSxkw26ZAGCZK19AY59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U2MsQ3VycmVuY3lfU3ltYm9sAFNrLE1vZGlmaWVyX1N5bWJvbABTbyxPdGhlcl9TeW1ib2wAUGMsQ29ubmVjdG9yX1B1bmN0dWF0aW9uAFBkLERhc2hfUHVuY3R1YXRpb24AUHMsT3Blbl9QdW5jdHVhdGlvbgBQZSxDbG9zZV9QdW5jdHVhdGlvbgBQaSxJbml0aWFsX1B1bmN0dWF0aW9uAFBmLEZpbmFsX1B1bmN0dWF0aW9uAFBvLE90aGVyX1B1bmN0dWF0aW9uAFpzLFNwYWNlX1NlcGFyYXRvcgBabCxMaW5lX1NlcGFyYXRvcgBacCxQYXJhZ3JhcGhfU2VwYXJhdG9yAENjLENvbnRyb2wsY250cmwAQ2YsRm9ybWF0AENzLFN1cnJvZ2F0ZQBDbyxQcml2YXRlX1VzZQBMQyxDYXNlZF9MZXR0ZXIATCxMZXR0ZXIATSxNYXJrLENvbWJpbmluZ19NYXJrAE4sTnVtYmVyAFMsU3ltYm9sAFAsUHVuY3R1YXRpb24scHVuY3QAWixTZXBhcmF0b3IAQyxPdGhlcgBBoLsCC7AIDgAAAD4AAADAAQAAAA4AAADwAAAAAH8AAACAAwEAADxBU0NJSV9IZXhfRGlnaXQsQUhleABCaWRpX0NvbnRyb2wsQmlkaV9DAERhc2gARGVwcmVjYXRlZCxEZXAARGlhY3JpdGljLERpYQBFeHRlbmRlcixFeHQASGV4X0RpZ2l0LEhleABJRFNfQmluYXJ5X09wZXJhdG9yLElEU0IASURTX1RyaW5hcnlfT3BlcmF0b3IsSURTVABJZGVvZ3JhcGhpYyxJZGVvAEpvaW5fQ29udHJvbCxKb2luX0MATG9naWNhbF9PcmRlcl9FeGNlcHRpb24sTE9FAE5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50LE5DaGFyAFBhdHRlcm5fU3ludGF4LFBhdF9TeW4AUGF0dGVybl9XaGl0ZV9TcGFjZSxQYXRfV1MAUXVvdGF0aW9uX01hcmssUU1hcmsAUmFkaWNhbABSZWdpb25hbF9JbmRpY2F0b3IsUkkAU2VudGVuY2VfVGVybWluYWwsU1Rlcm0AU29mdF9Eb3R0ZWQsU0QAVGVybWluYWxfUHVuY3R1YXRpb24sVGVybQBVbmlmaWVkX0lkZW9ncmFwaCxVSWRlbwBWYXJpYXRpb25fU2VsZWN0b3IsVlMAV2hpdGVfU3BhY2Usc3BhY2UAQmlkaV9NaXJyb3JlZCxCaWRpX00ARW1vamkARW1vamlfQ29tcG9uZW50LEVDb21wAEVtb2ppX01vZGlmaWVyLEVNb2QARW1vamlfTW9kaWZpZXJfQmFzZSxFQmFzZQBFbW9qaV9QcmVzZW50YXRpb24sRVByZXMARXh0ZW5kZWRfUGljdG9ncmFwaGljLEV4dFBpY3QARGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludCxESQBJRF9TdGFydCxJRFMAQ2FzZV9JZ25vcmFibGUsQ0kAQVNDSUkAQWxwaGFiZXRpYyxBbHBoYQBBbnkAQXNzaWduZWQAQ2FzZWQAQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWQsQ1dDRgBDaGFuZ2VzX1doZW5fQ2FzZW1hcHBlZCxDV0NNAENoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkLENXTABDaGFuZ2VzX1doZW5fTkZLQ19DYXNlZm9sZGVkLENXS0NGAENoYW5nZXNfV2hlbl9UaXRsZWNhc2VkLENXVABDaGFuZ2VzX1doZW5fVXBwZXJjYXNlZCxDV1UAR3JhcGhlbWVfQmFzZSxHcl9CYXNlAEdyYXBoZW1lX0V4dGVuZCxHcl9FeHQASURfQ29udGludWUsSURDAExvd2VyY2FzZSxMb3dlcgBNYXRoAFVwcGVyY2FzZSxVcHBlcgBYSURfQ29udGludWUsWElEQwBYSURfU3RhcnQsWElEUwBB4MMCC9QVgQAoAJcAKgCBgCoAl8ArABWBLACXAC0AgUAtAJcALgAVQS4AmQEvABYgMABCCEAAQopEAEIESgCWAEwAF4FMAEICTQBCQ04AL8FPAELDUAC/QFIAQgNTAEIJVQBCCFoAlgBeAEJDXgCBwF8AQgFoAELBawCFAXEAF8NxAERIcwBEg3cAQoN5AL4CewCXQXwAQgF9AEQEfgBCDoAAQoGHAESHiQCDBKwAFwO2AIMCuAAUAtAAlgDRAIAA3QCXgN4AgIDfAJcA4QA+QeEAgMDhAL4E4gCug+oAroLyAK0B9AAuwfQAA0H1AAMD/ACBQP4APgIAAb7AAQG+AQMBvkAGAb5ADgE+AhQBvsAVAb4BFwFEgR0BREEwAUQCNAFEgTUB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QmNhbGtjYWxwAEZuAEa8A0a8A2dtAGdrAGdIAHprSHpNSHpHSHpUSHq8AxMhbQATIWQAEyFrABMhZgBtbgBtvANtbQBtYwBtawBtYwAKCk8ACk9tALIAYwAICk8KClAAClBtALMAawBtALMAbQAVInMAbQAVInMAsgBQYWtQYU1QYUdQYXJhZHJhZNFzcgBhAGQAFSJzALIAcABzbgBzvANzbQBzcABWbgBWvANWbQBWawBWTQBWcABXbgBXvANXbQBXawBXTQBXawCpA00AqQNhLm0uQnFjY2NkQ9FrZ0NvLmRCR3loYUhQaW5LS0tNa3RsbWxubG9nbHhtYm1pbG1vbFBIcC5tLlBQTVBSc3JTdldiVtFtQdFtMQDlZTEAMADlZTIAMADlZTMAMADlZWdhbEoETARDRlEmAVMBJ6c3q2sCUqtIjPRmyo7IjNFuMk7lU5yfnJ9RWdGRh1VIWfZhaXaFfz+Guof4iI+QAmobbdlw3nM9hGqR8ZmCTnVTBGsbci2GHp5QXetvzYVkicli2IEfiMpeF2dqbfxyzpCGT7dR3lLEZNNqEHLndgGABoZchu+NMpdvm/qdjHh/eaB9yYMEk3+e1orfWARfYHx+gGJyynjCjPeW2FhiXBNq2m0Pby99N35LltJSi4DcUcxRHHq+ffGDdZaAi89iAmr+ijlO51sSYIdzcHUXU/t4v0+pXw1OzGx4ZSJ9w1NeWAF3SYSqirprsI+IbP5i5YKgY2V1rk5pUclRgWjnfG+C0orPkfVSQlRzWexexWX+byp5rZVqmpeezp6bUsZmd2tij3RekGEAYppkI29JcYl0ynn0fW+AJo/uhCOQSpMXUqNSvVTIcMKIqorJXvVfe2Ouaz58dXPkTvlW51u6XRxgsnNpdJp/RoA0kvaWSJcYmItPrnm0kbiW4WCGTtpQ7ls/XJllAmrOcUJ2/IR8kI2fiGYulolSe2fzZ0FtnG4JdFl1a3gQfV6YbVEuYniWK1AZXeptKo+LX0RhF2iHc4aWKVIPVGVcE2ZOZ6ho5WwGdOJ1eX/PiOGIzJHilj9Tum4dVNBxmHT6haOWV5yfnpdny23ogct6IHuSfMBymXBYi8BONoM6UgdSpl7TYtZ8hVsebbRmO49MiE2Wi4nTXkBRwFUAAAAAWlgAAHRmAAAAAN5RKnPKdjx5XnlleY95Vpe+fL1/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";if(!T(U)){var ha=U;U=c.locateFile?c.locateFile(ha,t):t+ha;}function ia(){var a=U;try{if(a==U&&v)return new Uint8Array(v);if(T(a))try{var b=ja(a.slice(37)),d=new Uint8Array(b.length);for(a=0;a>2]=60*Math.max(f,m);N[b>>2]=Number(f!=m);a=e(g);b=e(k);a=K(a);b=K(b);m>2]=a,N[d+4>>2]=b):(N[d>>2]=b,N[d+4>>2]=a);}function W(a,b,d){W.B||(W.B=!0,la(a,b,d));}function X(a){var b=J(a)+1,d=L(b);B(a,C,d,b);return d;}function ma(){}var na=[null,[],[]];ma=(a,b,d)=>{a=G(a);b=null!==b?JSON.parse(G(b)):[];try{const e=c.externalCall(a,b);return e?X(e):null;}catch(e){return c.HEAPU8[d]=1,X(e.message);}};var ja="function"==typeof atob?atob:function(a){var b="",d=0;a=a.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++));var f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++));var g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++));var k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++));e=e<<2|f>>4;f=(f&15)<<4|g>>2;var m=(g&3)<<6|k;b+=String.fromCharCode(e);64!==g&&(b+=String.fromCharCode(f));64!==k&&(b+=String.fromCharCode(m));}while(d>2]);N[b>>2]=a.getSeconds();N[b+4>>2]=a.getMinutes();N[b+8>>2]=a.getHours();N[b+12>>2]=a.getDate();N[b+16>>2]=a.getMonth();N[b+20>>2]=a.getFullYear()-1900;N[b+24>>2]=a.getDay();var d=new Date(a.getFullYear(),0,1);N[b+28>>2]=(a.getTime()-d.getTime())/864E5|0;N[b+36>>2]=-(60*a.getTimezoneOffset());var e=new Date(a.getFullYear(),6,1).getTimezoneOffset();d=d.getTimezoneOffset();N[b+32>>2]=(e!=d&&a.getTimezoneOffset()==Math.min(d,e))|0;},f:W,b:function(){w("");},h:ma,g:function(a,b){a=G(a);let d;try{d=window.JSON.parse(a);}catch(e){d=a;}0!==b?window.alert(a):window.console.log("DUMP",d);},j:function(a){var b=C.length;a>>>=0;if(2147483648=d;d*=2){var e=b*(1+.2/d);e=Math.min(e,a+100663296);var f=Math;e=Math.max(a,e);f=f.min.call(f,2147483648,e+(65536-e%65536)%65536);a:{try{x.grow(f-M.byteLength+65535>>>16);ba();var g=1;break a;}catch(k){}g=void 0;}if(g)return!0;}return!1;},c:function(a,b,d,e){for(var f=0,g=0;g>2],m=N[b+4>>2];b+=8;for(var q=0;q>2]=f;return 0;},k:function(a){a=G(a);window.console.log(a);},i:function(a){a=G(a);return Date.parse(a);},l:function(a,b,d,e){a=G(a);b=G(b);d=G(d);d=`Quickjs -- ${a}: ${b}\n${d}`;0!==e?window.alert(d):window.console.error(d);}};(function(){function a(f){c.asm=f.exports;x=c.asm.m;ba();O=c.asm.v;da.unshift(c.asm.n);P--;c.monitorRunDependencies&&c.monitorRunDependencies(P);0==P&&(null!==Q&&(clearInterval(Q),Q=null),R&&(f=R,R=null,f()));}function b(f){a(f.instance);}function d(f){return ka().then(function(g){return WebAssembly.instantiate(g,e);}).then(function(g){return g;}).then(f,function(g){u("failed to asynchronously prepare wasm: "+g);w(g);});}var e={a:oa};P++;c.monitorRunDependencies&&c.monitorRunDependencies(P);if(c.instantiateWasm)try{return c.instantiateWasm(e,a);}catch(f){return u("Module.instantiateWasm callback failed with error: "+f),!1;}(function(){return v||"function"!=typeof WebAssembly.instantiateStreaming||T(U)||"function"!=typeof fetch?d(b):fetch(U,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){u("wasm streaming compile failed: "+g);u("falling back to ArrayBuffer instantiation");return d(b);});});})().catch(n);return{};})();c.___wasm_call_ctors=function(){return(c.___wasm_call_ctors=c.asm.n).apply(null,arguments);};c._evalInSandbox=function(){return(c._evalInSandbox=c.asm.o).apply(null,arguments);};c._nukeSandbox=function(){return(c._nukeSandbox=c.asm.p).apply(null,arguments);};c._init=function(){return(c._init=c.asm.q).apply(null,arguments);};c._commFun=function(){return(c._commFun=c.asm.r).apply(null,arguments);};c._dumpMemoryUse=function(){return(c._dumpMemoryUse=c.asm.s).apply(null,arguments);};var L=c._malloc=function(){return(L=c._malloc=c.asm.t).apply(null,arguments);};c._free=function(){return(c._free=c.asm.u).apply(null,arguments);};var E=c.stackSave=function(){return(E=c.stackSave=c.asm.w).apply(null,arguments);},F=c.stackRestore=function(){return(F=c.stackRestore=c.asm.x).apply(null,arguments);},A=c.stackAlloc=function(){return(A=c.stackAlloc=c.asm.y).apply(null,arguments);};c.ccall=z;c.cwrap=function(a,b,d,e){d=d||[];var f=d.every(function(g){return"number"===g;});return"string"!==b&&f&&!e?c["_"+a]:function(){return z(a,b,d,arguments,e);};};c.stringToNewUTF8=X;var Y;R=function pa(){Y||Z();Y||(R=pa);};function Z(){function a(){if(!Y&&(Y=!0,c.calledRun=!0,!y)){V(da);h(c);if(c.onRuntimeInitialized)c.onRuntimeInitialized();if(c.postRun)for("function"==typeof c.postRun&&(c.postRun=[c.postRun]);c.postRun.length;){var b=c.postRun.shift();ea.unshift(b);}V(ea);}}if(!(0 { + + + +class SandboxSupportBase { + constructor(win) { + this.win = win; + this.timeoutIds = new Map(); + this.commFun = null; + } + destroy() { + this.commFun = null; + for (const id of this.timeoutIds.values()) { + this.win.clearTimeout(id); + } + this.timeoutIds = null; + } + exportValueToSandbox(val) { + throw new Error("Not implemented"); + } + importValueFromSandbox(val) { + throw new Error("Not implemented"); + } + createErrorForSandbox(errorMessage) { + throw new Error("Not implemented"); + } + callSandboxFunction(name, args) { + try { + args = this.exportValueToSandbox(args); + this.commFun(name, args); + } catch (e) { + this.win.console.error(e); + } + } + createSandboxExternals() { + const externals = { + setTimeout: (callbackId, nMilliseconds) => { + if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") { + return; + } + if (callbackId === 0) { + this.win.clearTimeout(this.timeoutIds.get(callbackId)); + } + const id = this.win.setTimeout(() => { + this.timeoutIds.delete(callbackId); + this.callSandboxFunction("timeoutCb", { + callbackId, + interval: false + }); + }, nMilliseconds); + this.timeoutIds.set(callbackId, id); + }, + clearTimeout: callbackId => { + this.win.clearTimeout(this.timeoutIds.get(callbackId)); + this.timeoutIds.delete(callbackId); + }, + setInterval: (callbackId, nMilliseconds) => { + if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") { + return; + } + const id = this.win.setInterval(() => { + this.callSandboxFunction("timeoutCb", { + callbackId, + interval: true + }); + }, nMilliseconds); + this.timeoutIds.set(callbackId, id); + }, + clearInterval: callbackId => { + this.win.clearInterval(this.timeoutIds.get(callbackId)); + this.timeoutIds.delete(callbackId); + }, + alert: cMsg => { + if (typeof cMsg !== "string") { + return; + } + this.win.alert(cMsg); + }, + confirm: cMsg => { + if (typeof cMsg !== "string") { + return false; + } + return this.win.confirm(cMsg); + }, + prompt: (cQuestion, cDefault) => { + if (typeof cQuestion !== "string" || typeof cDefault !== "string") { + return null; + } + return this.win.prompt(cQuestion, cDefault); + }, + parseURL: cUrl => { + const url = new this.win.URL(cUrl); + const props = ["hash", "host", "hostname", "href", "origin", "password", "pathname", "port", "protocol", "search", "searchParams", "username"]; + return Object.fromEntries(props.map(name => [name, url[name].toString()])); + }, + send: data => { + if (!data) { + return; + } + const event = new this.win.CustomEvent("updatefromsandbox", { + detail: this.importValueFromSandbox(data) + }); + this.win.dispatchEvent(event); + } + }; + Object.setPrototypeOf(externals, null); + return (name, args) => { + try { + const result = externals[name](...args); + return this.exportValueToSandbox(result); + } catch (error) { + throw this.createErrorForSandbox((error === null || error === void 0 ? void 0 : error.toString()) ?? ""); + } + }; + } +} +{ + exports.SandboxSupportBase = SandboxSupportBase; +} + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __w_pdfjs_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +var exports = __webpack_exports__; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.QuickJSSandbox = QuickJSSandbox; +var _quickjsEval = _interopRequireDefault(__w_pdfjs_require__(1)); +var _pdfSandboxExternal = __w_pdfjs_require__(2); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const pdfjsVersion = '3.2.146'; +const pdfjsBuild = '3fd2a3548'; +class SandboxSupport extends _pdfSandboxExternal.SandboxSupportBase { + exportValueToSandbox(val) { + return JSON.stringify(val); + } + importValueFromSandbox(val) { + return val; + } + createErrorForSandbox(errorMessage) { + return new Error(errorMessage); + } +} +class Sandbox { + constructor(win, module) { + this.support = new SandboxSupport(win, this); + module.externalCall = this.support.createSandboxExternals(); + this._module = module; + this._alertOnError = 0; + } + create(data) { + const code = ['(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === \'object\' && typeof module === \'object\')\n\t\tmodule.exports = factory();\n\telse if(typeof define === \'function\' && define.amd)\n\t\tdefine("pdfjs-dist/build/pdf.scripting", [], factory);\n\telse if(typeof exports === \'object\')\n\t\texports["pdfjs-dist/build/pdf.scripting"] = factory();\n\telse\n\t\troot.pdfjsScripting = factory();\n})(globalThis, () => {\nreturn /******/ (() => { // webpackBootstrap\n/******/ \t"use strict";\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.initSandbox = initSandbox;\nvar _constants = __w_pdfjs_require__(2);\nvar _field = __w_pdfjs_require__(3);\nvar _aform = __w_pdfjs_require__(8);\nvar _app = __w_pdfjs_require__(9);\nvar _color = __w_pdfjs_require__(5);\nvar _console = __w_pdfjs_require__(15);\nvar _doc = __w_pdfjs_require__(11);\nvar _proxy = __w_pdfjs_require__(16);\nvar _util = __w_pdfjs_require__(17);\nfunction initSandbox(params) {\n delete globalThis.pdfjsScripting;\n const externalCall = globalThis.callExternalFunction;\n delete globalThis.callExternalFunction;\n const globalEval = code => globalThis.eval(code);\n const send = data => externalCall("send", [data]);\n const proxyHandler = new _proxy.ProxyHandler();\n const {\n data\n } = params;\n const doc = new _doc.Doc({\n send,\n globalEval,\n ...data.docInfo\n });\n const _document = {\n obj: doc,\n wrapped: new Proxy(doc, proxyHandler)\n };\n const app = new _app.App({\n send,\n globalEval,\n externalCall,\n _document,\n calculationOrder: data.calculationOrder,\n proxyHandler,\n ...data.appInfo\n });\n const util = new _util.Util({\n externalCall\n });\n const appObjects = app._objects;\n if (data.objects) {\n const annotations = [];\n for (const [name, objs] of Object.entries(data.objects)) {\n annotations.length = 0;\n let container = null;\n for (const obj of objs) {\n if (obj.type !== "") {\n annotations.push(obj);\n } else {\n container = obj;\n }\n }\n let obj = container;\n if (annotations.length > 0) {\n obj = annotations[0];\n obj.send = send;\n }\n obj.globalEval = globalEval;\n obj.doc = _document;\n obj.fieldPath = name;\n obj.appObjects = appObjects;\n let field;\n switch (obj.type) {\n case "radiobutton":\n {\n const otherButtons = annotations.slice(1);\n field = new _field.RadioButtonField(otherButtons, obj);\n break;\n }\n case "checkbox":\n {\n const otherButtons = annotations.slice(1);\n field = new _field.CheckboxField(otherButtons, obj);\n break;\n }\n case "text":\n if (annotations.length <= 1) {\n field = new _field.Field(obj);\n break;\n }\n obj.siblings = annotations.map(x => x.id).slice(1);\n field = new _field.Field(obj);\n break;\n default:\n field = new _field.Field(obj);\n }\n const wrapped = new Proxy(field, proxyHandler);\n const _object = {\n obj: field,\n wrapped\n };\n doc._addField(name, _object);\n for (const object of objs) {\n appObjects[object.id] = _object;\n }\n if (container) {\n appObjects[container.id] = _object;\n }\n }\n }\n const color = new _color.Color();\n globalThis.event = null;\n globalThis.global = Object.create(null);\n globalThis.app = new Proxy(app, proxyHandler);\n globalThis.color = new Proxy(color, proxyHandler);\n globalThis.console = new Proxy(new _console.Console({\n send\n }), proxyHandler);\n globalThis.util = new Proxy(util, proxyHandler);\n globalThis.border = _constants.Border;\n globalThis.cursor = _constants.Cursor;\n globalThis.display = _constants.Display;\n globalThis.font = _constants.Font;\n globalThis.highlight = _constants.Highlight;\n globalThis.position = _constants.Position;\n globalThis.scaleHow = _constants.ScaleHow;\n globalThis.scaleWhen = _constants.ScaleWhen;\n globalThis.style = _constants.Style;\n globalThis.trans = _constants.Trans;\n globalThis.zoomtype = _constants.ZoomType;\n globalThis.ADBE = {\n Reader_Value_Asked: true,\n Viewer_Value_Asked: true\n };\n const aform = new _aform.AForm(doc, app, util, color);\n for (const name of Object.getOwnPropertyNames(_aform.AForm.prototype)) {\n if (name !== "constructor" && !name.startsWith("_")) {\n globalThis[name] = aform[name].bind(aform);\n }\n }\n for (const [name, value] of Object.entries(_constants.GlobalConstants)) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: false\n });\n }\n Object.defineProperties(globalThis, {\n ColorConvert: {\n value: color.convert.bind(color),\n writable: true\n },\n ColorEqual: {\n value: color.equal.bind(color),\n writable: true\n }\n });\n const properties = Object.create(null);\n for (const name of Object.getOwnPropertyNames(_doc.Doc.prototype)) {\n if (name === "constructor" || name.startsWith("_")) {\n continue;\n }\n const descriptor = Object.getOwnPropertyDescriptor(_doc.Doc.prototype, name);\n if (descriptor.get) {\n properties[name] = {\n get: descriptor.get.bind(doc),\n set: descriptor.set.bind(doc)\n };\n } else {\n properties[name] = {\n value: _doc.Doc.prototype[name].bind(doc)\n };\n }\n }\n Object.defineProperties(globalThis, properties);\n const functions = {\n dispatchEvent: app._dispatchEvent.bind(app),\n timeoutCb: app._evalCallback.bind(app)\n };\n return (name, args) => {\n try {\n functions[name](args);\n } catch (error) {\n const value = `${error.toString()}\\n${error.stack}`;\n send({\n command: "error",\n value\n });\n }\n };\n}\n\n/***/ }),\n/* 2 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.ZoomType = exports.Trans = exports.Style = exports.ScaleWhen = exports.ScaleHow = exports.Position = exports.Highlight = exports.GlobalConstants = exports.Font = exports.Display = exports.Cursor = exports.Border = void 0;\nconst Border = Object.freeze({\n s: "solid",\n d: "dashed",\n b: "beveled",\n i: "inset",\n u: "underline"\n});\nexports.Border = Border;\nconst Cursor = Object.freeze({\n visible: 0,\n hidden: 1,\n delay: 2\n});\nexports.Cursor = Cursor;\nconst Display = Object.freeze({\n visible: 0,\n hidden: 1,\n noPrint: 2,\n noView: 3\n});\nexports.Display = Display;\nconst Font = Object.freeze({\n Times: "Times-Roman",\n TimesB: "Times-Bold",\n TimesI: "Times-Italic",\n TimesBI: "Times-BoldItalic",\n Helv: "Helvetica",\n HelvB: "Helvetica-Bold",\n HelvI: "Helvetica-Oblique",\n HelvBI: "Helvetica-BoldOblique",\n Cour: "Courier",\n CourB: "Courier-Bold",\n CourI: "Courier-Oblique",\n CourBI: "Courier-BoldOblique",\n Symbol: "Symbol",\n ZapfD: "ZapfDingbats",\n KaGo: "HeiseiKakuGo-W5-UniJIS-UCS2-H",\n KaMi: "HeiseiMin-W3-UniJIS-UCS2-H"\n});\nexports.Font = Font;\nconst Highlight = Object.freeze({\n n: "none",\n i: "invert",\n p: "push",\n o: "outline"\n});\nexports.Highlight = Highlight;\nconst Position = Object.freeze({\n textOnly: 0,\n iconOnly: 1,\n iconTextV: 2,\n textIconV: 3,\n iconTextH: 4,\n textIconH: 5,\n overlay: 6\n});\nexports.Position = Position;\nconst ScaleHow = Object.freeze({\n proportional: 0,\n anamorphic: 1\n});\nexports.ScaleHow = ScaleHow;\nconst ScaleWhen = Object.freeze({\n always: 0,\n never: 1,\n tooBig: 2,\n tooSmall: 3\n});\nexports.ScaleWhen = ScaleWhen;\nconst Style = Object.freeze({\n ch: "check",\n cr: "cross",\n di: "diamond",\n ci: "circle",\n st: "star",\n sq: "square"\n});\nexports.Style = Style;\nconst Trans = Object.freeze({\n blindsH: "BlindsHorizontal",\n blindsV: "BlindsVertical",\n boxI: "BoxIn",\n boxO: "BoxOut",\n dissolve: "Dissolve",\n glitterD: "GlitterDown",\n glitterR: "GlitterRight",\n glitterRD: "GlitterRightDown",\n random: "Random",\n replace: "Replace",\n splitHI: "SplitHorizontalIn",\n splitHO: "SplitHorizontalOut",\n splitVI: "SplitVerticalIn",\n splitVO: "SplitVerticalOut",\n wipeD: "WipeDown",\n wipeL: "WipeLeft",\n wipeR: "WipeRight",\n wipeU: "WipeUp"\n});\nexports.Trans = Trans;\nconst ZoomType = Object.freeze({\n none: "NoVary",\n fitP: "FitPage",\n fitW: "FitWidth",\n fitH: "FitHeight",\n fitV: "FitVisibleWidth",\n pref: "Preferred",\n refW: "ReflowWidth"\n});\nexports.ZoomType = ZoomType;\nconst GlobalConstants = Object.freeze({\n IDS_GREATER_THAN: "Invalid value: must be greater than or equal to % s.",\n IDS_GT_AND_LT: "Invalid value: must be greater than or equal to % s " + "and less than or equal to % s.",\n IDS_LESS_THAN: "Invalid value: must be less than or equal to % s.",\n IDS_INVALID_MONTH: "** Invalid **",\n IDS_INVALID_DATE: "Invalid date / time: please ensure that the date / time exists.Field",\n IDS_INVALID_DATE2: " should match format ",\n IDS_INVALID_VALUE: "The value entered does not match the format of the field",\n IDS_AM: "am",\n IDS_PM: "pm",\n IDS_MONTH_INFO: "January[1] February[2] March[3] April[4] May[5] " + "June[6] July[7] August[8] September[9] October[10] " + "November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] " + "Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] Dec[12]",\n IDS_STARTUP_CONSOLE_MSG: "** ^ _ ^ **",\n RE_NUMBER_ENTRY_DOT_SEP: ["[+-]?\\\\d*\\\\.?\\\\d*"],\n RE_NUMBER_COMMIT_DOT_SEP: ["[+-]?\\\\d+(\\\\.\\\\d+)?", "[+-]?\\\\.\\\\d+", "[+-]?\\\\d+\\\\."],\n RE_NUMBER_ENTRY_COMMA_SEP: ["[+-]?\\\\d*,?\\\\d*"],\n RE_NUMBER_COMMIT_COMMA_SEP: ["[+-]?\\\\d+([.,]\\\\d+)?", "[+-]?[.,]\\\\d+", "[+-]?\\\\d+[.,]"],\n RE_ZIP_ENTRY: ["\\\\d{0,5}"],\n RE_ZIP_COMMIT: ["\\\\d{5}"],\n RE_ZIP4_ENTRY: ["\\\\d{0,5}(\\\\.|[- ])?\\\\d{0,4}"],\n RE_ZIP4_COMMIT: ["\\\\d{5}(\\\\.|[- ])?\\\\d{4}"],\n RE_PHONE_ENTRY: ["\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", "\\\\(\\\\d{0,3}", "\\\\(\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", "\\\\(\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", "\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", "011(\\\\.|[- \\\\d])*"],\n RE_PHONE_COMMIT: ["\\\\d{3}(\\\\.|[- ])?\\\\d{4}", "\\\\d{3}(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}", "\\\\(\\\\d{3}\\\\)(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}", "011(\\\\.|[- \\\\d])*"],\n RE_SSN_ENTRY: ["\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,2}(\\\\.|[- ])?\\\\d{0,4}"],\n RE_SSN_COMMIT: ["\\\\d{3}(\\\\.|[- ])?\\\\d{2}(\\\\.|[- ])?\\\\d{4}"]\n});\nexports.GlobalConstants = GlobalConstants;\n\n/***/ }),\n/* 3 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.RadioButtonField = exports.Field = exports.CheckboxField = void 0;\nvar _common = __w_pdfjs_require__(4);\nvar _color = __w_pdfjs_require__(5);\nvar _pdf_object = __w_pdfjs_require__(7);\nclass Field extends _pdf_object.PDFObject {\n constructor(data) {\n super(data);\n this.alignment = data.alignment || "left";\n this.borderStyle = data.borderStyle || "";\n this.buttonAlignX = data.buttonAlignX || 50;\n this.buttonAlignY = data.buttonAlignY || 50;\n this.buttonFitBounds = data.buttonFitBounds;\n this.buttonPosition = data.buttonPosition;\n this.buttonScaleHow = data.buttonScaleHow;\n this.ButtonScaleWhen = data.buttonScaleWhen;\n this.calcOrderIndex = data.calcOrderIndex;\n this.comb = data.comb;\n this.commitOnSelChange = data.commitOnSelChange;\n this.currentValueIndices = data.currentValueIndices;\n this.defaultStyle = data.defaultStyle;\n this.defaultValue = data.defaultValue;\n this.doNotScroll = data.doNotScroll;\n this.doNotSpellCheck = data.doNotSpellCheck;\n this.delay = data.delay;\n this.display = data.display;\n this.doc = data.doc.wrapped;\n this.editable = data.editable;\n this.exportValues = data.exportValues;\n this.fileSelect = data.fileSelect;\n this.hidden = data.hidden;\n this.highlight = data.highlight;\n this.lineWidth = data.lineWidth;\n this.multiline = data.multiline;\n this.multipleSelection = !!data.multipleSelection;\n this.name = data.name;\n this.password = data.password;\n this.print = data.print;\n this.radiosInUnison = data.radiosInUnison;\n this.readonly = data.readonly;\n this.rect = data.rect;\n this.required = data.required;\n this.richText = data.richText;\n this.richValue = data.richValue;\n this.style = data.style;\n this.submitName = data.submitName;\n this.textFont = data.textFont;\n this.textSize = data.textSize;\n this.type = data.type;\n this.userName = data.userName;\n this._actions = (0, _common.createActionsMap)(data.actions);\n this._browseForFileToSubmit = data.browseForFileToSubmit || null;\n this._buttonCaption = null;\n this._buttonIcon = null;\n this._charLimit = data.charLimit;\n this._children = null;\n this._currentValueIndices = data.currentValueIndices || 0;\n this._document = data.doc;\n this._fieldPath = data.fieldPath;\n this._fillColor = data.fillColor || ["T"];\n this._isChoice = Array.isArray(data.items);\n this._items = data.items || [];\n this._hasValue = data.hasOwnProperty("value");\n this._page = data.page || 0;\n this._strokeColor = data.strokeColor || ["G", 0];\n this._textColor = data.textColor || ["G", 0];\n this._value = null;\n this._kidIds = data.kidIds || null;\n this._fieldType = (0, _common.getFieldType)(this._actions);\n this._siblings = data.siblings || null;\n this._rotation = data.rotation || 0;\n this._globalEval = data.globalEval;\n this._appObjects = data.appObjects;\n this.value = data.value || "";\n }\n get currentValueIndices() {\n if (!this._isChoice) {\n return 0;\n }\n return this._currentValueIndices;\n }\n set currentValueIndices(indices) {\n if (!this._isChoice) {\n return;\n }\n if (!Array.isArray(indices)) {\n indices = [indices];\n }\n if (!indices.every(i => typeof i === "number" && Number.isInteger(i) && i >= 0 && i < this.numItems)) {\n return;\n }\n indices.sort();\n if (this.multipleSelection) {\n this._currentValueIndices = indices;\n this._value = [];\n indices.forEach(i => {\n this._value.push(this._items[i].displayValue);\n });\n } else {\n if (indices.length > 0) {\n indices = indices.splice(1, indices.length - 1);\n this._currentValueIndices = indices[0];\n this._value = this._items[this._currentValueIndices];\n }\n }\n this._send({\n id: this._id,\n indices\n });\n }\n get fillColor() {\n return this._fillColor;\n }\n set fillColor(color) {\n if (_color.Color._isValidColor(color)) {\n this._fillColor = color;\n }\n }\n get bgColor() {\n return this.fillColor;\n }\n set bgColor(color) {\n this.fillColor = color;\n }\n get charLimit() {\n return this._charLimit;\n }\n set charLimit(limit) {\n if (typeof limit !== "number") {\n throw new Error("Invalid argument value");\n }\n this._charLimit = Math.max(0, Math.floor(limit));\n }\n get numItems() {\n if (!this._isChoice) {\n throw new Error("Not a choice widget");\n }\n return this._items.length;\n }\n set numItems(_) {\n throw new Error("field.numItems is read-only");\n }\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(color) {\n if (_color.Color._isValidColor(color)) {\n this._strokeColor = color;\n }\n }\n get borderColor() {\n return this.strokeColor;\n }\n set borderColor(color) {\n this.strokeColor = color;\n }\n get page() {\n return this._page;\n }\n set page(_) {\n throw new Error("field.page is read-only");\n }\n get rotation() {\n return this._rotation;\n }\n set rotation(angle) {\n angle = Math.floor(angle);\n if (angle % 90 !== 0) {\n throw new Error("Invalid rotation: must be a multiple of 90");\n }\n angle %= 360;\n if (angle < 0) {\n angle += 360;\n }\n this._rotation = angle;\n }\n get textColor() {\n return this._textColor;\n }\n set textColor(color) {\n if (_color.Color._isValidColor(color)) {\n this._textColor = color;\n }\n }\n get fgColor() {\n return this.textColor;\n }\n set fgColor(color) {\n this.textColor = color;\n }\n get value() {\n return this._value;\n }\n set value(value) {\n if (this._isChoice) {\n this._setChoiceValue(value);\n return;\n }\n if (value === "") {\n this._value = "";\n } else if (typeof value === "string") {\n switch (this._fieldType) {\n case _common.FieldType.none:\n this._value = !isNaN(value) ? parseFloat(value) : value;\n break;\n case _common.FieldType.number:\n case _common.FieldType.percent:\n const number = parseFloat(value);\n this._value = !isNaN(number) ? number : 0;\n break;\n default:\n this._value = value;\n }\n } else {\n this._value = value;\n }\n }\n _setChoiceValue(value) {\n if (this.multipleSelection) {\n if (!Array.isArray(value)) {\n value = [value];\n }\n const values = new Set(value);\n if (Array.isArray(this._currentValueIndices)) {\n this._currentValueIndices.length = 0;\n this._value.length = 0;\n } else {\n this._currentValueIndices = [];\n this._value = [];\n }\n this._items.forEach((item, i) => {\n if (values.has(item.exportValue)) {\n this._currentValueIndices.push(i);\n this._value.push(item.exportValue);\n }\n });\n } else {\n if (Array.isArray(value)) {\n value = value[0];\n }\n const index = this._items.findIndex(_ref => {\n let {\n exportValue\n } = _ref;\n return value === exportValue;\n });\n if (index !== -1) {\n this._currentValueIndices = index;\n this._value = this._items[index].exportValue;\n }\n }\n }\n get valueAsString() {\n return (this._value ?? "").toString();\n }\n set valueAsString(_) {}\n browseForFileToSubmit() {\n if (this._browseForFileToSubmit) {\n this._browseForFileToSubmit();\n }\n }\n buttonGetCaption() {\n let nFace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n if (this._buttonCaption) {\n return this._buttonCaption[nFace];\n }\n return "";\n }\n buttonGetIcon() {\n let nFace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n if (this._buttonIcon) {\n return this._buttonIcon[nFace];\n }\n return null;\n }\n buttonImportIcon() {\n let cPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n let nPave = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n }\n buttonSetCaption(cCaption) {\n let nFace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n if (!this._buttonCaption) {\n this._buttonCaption = ["", "", ""];\n }\n this._buttonCaption[nFace] = cCaption;\n }\n buttonSetIcon(oIcon) {\n let nFace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n if (!this._buttonIcon) {\n this._buttonIcon = [null, null, null];\n }\n this._buttonIcon[nFace] = oIcon;\n }\n checkThisBox(nWidget) {\n let bCheckIt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n }\n clearItems() {\n if (!this._isChoice) {\n throw new Error("Not a choice widget");\n }\n this._items = [];\n this._send({\n id: this._id,\n clear: null\n });\n }\n deleteItemAt() {\n let nIdx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (!this._isChoice) {\n throw new Error("Not a choice widget");\n }\n if (!this.numItems) {\n return;\n }\n if (nIdx === null) {\n nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\n nIdx = nIdx || 0;\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n this._items.splice(nIdx, 1);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n if (this._currentValueIndices[index] === nIdx) {\n this._currentValueIndices.splice(index, 1);\n }\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n --this._currentValueIndices[index];\n }\n }\n } else {\n if (this._currentValueIndices === nIdx) {\n this._currentValueIndices = this.numItems > 0 ? 0 : -1;\n } else if (this._currentValueIndices > nIdx) {\n --this._currentValueIndices;\n }\n }\n this._send({\n id: this._id,\n remove: nIdx\n });\n }\n getItemAt() {\n let nIdx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;\n let bExportValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!this._isChoice) {\n throw new Error("Not a choice widget");\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n const item = this._items[nIdx];\n return bExportValue ? item.exportValue : item.displayValue;\n }\n getArray() {\n if (this._kidIds) {\n const array = [];\n const fillArrayWithKids = kidIds => {\n for (const id of kidIds) {\n const obj = this._appObjects[id];\n if (!obj) {\n continue;\n }\n if (obj.obj._hasValue) {\n array.push(obj.wrapped);\n }\n if (obj.obj._kidIds) {\n fillArrayWithKids(obj.obj._kidIds);\n }\n }\n };\n fillArrayWithKids(this._kidIds);\n return array;\n }\n if (this._children === null) {\n this._children = this._document.obj._getTerminalChildren(this._fieldPath);\n }\n return this._children;\n }\n getLock() {\n return undefined;\n }\n isBoxChecked(nWidget) {\n return false;\n }\n isDefaultChecked(nWidget) {\n return false;\n }\n insertItemAt(cName) {\n let cExport = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n let nIdx = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n if (!this._isChoice) {\n throw new Error("Not a choice widget");\n }\n if (!cName) {\n return;\n }\n if (nIdx < 0 || nIdx > this.numItems) {\n nIdx = this.numItems;\n }\n if (this._items.some(_ref2 => {\n let {\n displayValue\n } = _ref2;\n return displayValue === cName;\n })) {\n return;\n }\n if (cExport === undefined) {\n cExport = cName;\n }\n const data = {\n displayValue: cName,\n exportValue: cExport\n };\n this._items.splice(nIdx, 0, data);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n ++this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices >= nIdx) {\n ++this._currentValueIndices;\n }\n this._send({\n id: this._id,\n insert: {\n index: nIdx,\n ...data\n }\n });\n }\n setAction(cTrigger, cScript) {\n if (typeof cTrigger !== "string" || typeof cScript !== "string") {\n return;\n }\n if (!(cTrigger in this._actions)) {\n this._actions[cTrigger] = [];\n }\n this._actions[cTrigger].push(cScript);\n }\n setFocus() {\n this._send({\n id: this._id,\n focus: true\n });\n }\n setItems(oArray) {\n if (!this._isChoice) {\n throw new Error("Not a choice widget");\n }\n this._items.length = 0;\n for (const element of oArray) {\n let displayValue, exportValue;\n if (Array.isArray(element)) {\n var _element$, _element$2;\n displayValue = ((_element$ = element[0]) === null || _element$ === void 0 ? void 0 : _element$.toString()) || "";\n exportValue = ((_element$2 = element[1]) === null || _element$2 === void 0 ? void 0 : _element$2.toString()) || "";\n } else {\n displayValue = exportValue = (element === null || element === void 0 ? void 0 : element.toString()) || "";\n }\n this._items.push({\n displayValue,\n exportValue\n });\n }\n this._currentValueIndices = 0;\n this._send({\n id: this._id,\n items: this._items\n });\n }\n setLock() {}\n signatureGetModifications() {}\n signatureGetSeedValue() {}\n signatureInfo() {}\n signatureSetSeedValue() {}\n signatureSign() {}\n signatureValidate() {}\n _isButton() {\n return false;\n }\n _reset() {\n this.value = this.defaultValue;\n }\n _runActions(event) {\n const eventName = event.name;\n if (!this._actions.has(eventName)) {\n return false;\n }\n const actions = this._actions.get(eventName);\n try {\n for (const action of actions) {\n this._globalEval(action);\n }\n } catch (error) {\n event.rc = false;\n throw error;\n }\n return true;\n }\n}\nexports.Field = Field;\nclass RadioButtonField extends Field {\n constructor(otherButtons, data) {\n super(data);\n this.exportValues = [this.exportValues];\n this._radioIds = [this._id];\n this._radioActions = [this._actions];\n for (const radioData of otherButtons) {\n this.exportValues.push(radioData.exportValues);\n this._radioIds.push(radioData.id);\n this._radioActions.push((0, _common.createActionsMap)(radioData.actions));\n if (this._value === radioData.exportValues) {\n this._id = radioData.id;\n }\n }\n this._hasBeenInitialized = true;\n this._value = data.value || "";\n }\n get value() {\n return this._value;\n }\n set value(value) {\n if (!this._hasBeenInitialized) {\n return;\n }\n if (value === null || value === undefined) {\n this._value = "";\n }\n const i = this.exportValues.indexOf(value);\n if (0 <= i && i < this._radioIds.length) {\n this._id = this._radioIds[i];\n this._value = value;\n } else if (value === "Off" && this._radioIds.length === 2) {\n const nextI = (1 + this._radioIds.indexOf(this._id)) % 2;\n this._id = this._radioIds[nextI];\n this._value = this.exportValues[nextI];\n }\n }\n checkThisBox(nWidget) {\n let bCheckIt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n if (nWidget < 0 || nWidget >= this._radioIds.length || !bCheckIt) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = this.exportValues[nWidget];\n this._send({\n id: this._id,\n value: this._value\n });\n }\n isBoxChecked(nWidget) {\n return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\n }\n isDefaultChecked(nWidget) {\n return nWidget >= 0 && nWidget < this.exportValues.length && this.defaultValue === this.exportValues[nWidget];\n }\n _getExportValue(state) {\n const i = this._radioIds.indexOf(this._id);\n return this.exportValues[i];\n }\n _runActions(event) {\n const i = this._radioIds.indexOf(this._id);\n this._actions = this._radioActions[i];\n return super._runActions(event);\n }\n _isButton() {\n return true;\n }\n}\nexports.RadioButtonField = RadioButtonField;\nclass CheckboxField extends RadioButtonField {\n get value() {\n return this._value;\n }\n set value(value) {\n if (!value || value === "Off") {\n this._value = "Off";\n } else {\n super.value = value;\n }\n }\n _getExportValue(state) {\n return state ? super._getExportValue(state) : "Off";\n }\n isBoxChecked(nWidget) {\n if (this._value === "Off") {\n return false;\n }\n return super.isBoxChecked(nWidget);\n }\n isDefaultChecked(nWidget) {\n if (this.defaultValue === "Off") {\n return this._value === "Off";\n }\n return super.isDefaultChecked(nWidget);\n }\n checkThisBox(nWidget) {\n let bCheckIt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n if (nWidget < 0 || nWidget >= this._radioIds.length) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = bCheckIt ? this.exportValues[nWidget] : "Off";\n this._send({\n id: this._id,\n value: this._value\n });\n }\n}\nexports.CheckboxField = CheckboxField;\n\n/***/ }),\n/* 4 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.FieldType = void 0;\nexports.createActionsMap = createActionsMap;\nexports.getFieldType = getFieldType;\nconst FieldType = {\n none: 0,\n number: 1,\n percent: 2,\n date: 3,\n time: 4\n};\nexports.FieldType = FieldType;\nfunction createActionsMap(actions) {\n const actionsMap = new Map();\n if (actions) {\n for (const [eventType, actionsForEvent] of Object.entries(actions)) {\n actionsMap.set(eventType, actionsForEvent);\n }\n }\n return actionsMap;\n}\nfunction getFieldType(actions) {\n let format = actions.get("Format");\n if (!format) {\n return FieldType.none;\n }\n format = format[0];\n format = format.trim();\n if (format.startsWith("AFNumber_")) {\n return FieldType.number;\n }\n if (format.startsWith("AFPercent_")) {\n return FieldType.percent;\n }\n if (format.startsWith("AFDate_")) {\n return FieldType.date;\n }\n if (format.startsWith("AFTime__")) {\n return FieldType.time;\n }\n return FieldType.none;\n}\n\n/***/ }),\n/* 5 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.Color = void 0;\nvar _scripting_utils = __w_pdfjs_require__(6);\nvar _pdf_object = __w_pdfjs_require__(7);\nclass Color extends _pdf_object.PDFObject {\n constructor() {\n super({});\n this.transparent = ["T"];\n this.black = ["G", 0];\n this.white = ["G", 1];\n this.red = ["RGB", 1, 0, 0];\n this.green = ["RGB", 0, 1, 0];\n this.blue = ["RGB", 0, 0, 1];\n this.cyan = ["CMYK", 1, 0, 0, 0];\n this.magenta = ["CMYK", 0, 1, 0, 0];\n this.yellow = ["CMYK", 0, 0, 1, 0];\n this.dkGray = ["G", 0.25];\n this.gray = ["G", 0.5];\n this.ltGray = ["G", 0.75];\n }\n static _isValidSpace(cColorSpace) {\n return typeof cColorSpace === "string" && (cColorSpace === "T" || cColorSpace === "G" || cColorSpace === "RGB" || cColorSpace === "CMYK");\n }\n static _isValidColor(colorArray) {\n if (!Array.isArray(colorArray) || colorArray.length === 0) {\n return false;\n }\n const space = colorArray[0];\n if (!Color._isValidSpace(space)) {\n return false;\n }\n switch (space) {\n case "T":\n if (colorArray.length !== 1) {\n return false;\n }\n break;\n case "G":\n if (colorArray.length !== 2) {\n return false;\n }\n break;\n case "RGB":\n if (colorArray.length !== 4) {\n return false;\n }\n break;\n case "CMYK":\n if (colorArray.length !== 5) {\n return false;\n }\n break;\n default:\n return false;\n }\n return colorArray.slice(1).every(c => typeof c === "number" && c >= 0 && c <= 1);\n }\n static _getCorrectColor(colorArray) {\n return Color._isValidColor(colorArray) ? colorArray : ["G", 0];\n }\n convert(colorArray, cColorSpace) {\n if (!Color._isValidSpace(cColorSpace)) {\n return this.black;\n }\n if (cColorSpace === "T") {\n return ["T"];\n }\n colorArray = Color._getCorrectColor(colorArray);\n if (colorArray[0] === cColorSpace) {\n return colorArray;\n }\n if (colorArray[0] === "T") {\n return this.convert(this.black, cColorSpace);\n }\n return _scripting_utils.ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\n }\n equal(colorArray1, colorArray2) {\n colorArray1 = Color._getCorrectColor(colorArray1);\n colorArray2 = Color._getCorrectColor(colorArray2);\n if (colorArray1[0] === "T" || colorArray2[0] === "T") {\n return colorArray1[0] === "T" && colorArray2[0] === "T";\n }\n if (colorArray1[0] !== colorArray2[0]) {\n colorArray2 = this.convert(colorArray2, colorArray1[0]);\n }\n return colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\n }\n}\nexports.Color = Color;\n\n/***/ }),\n/* 6 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.ColorConverters = void 0;\nfunction makeColorComp(n) {\n return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0");\n}\nclass ColorConverters {\n static CMYK_G(_ref) {\n let [c, y, m, k] = _ref;\n return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n }\n static G_CMYK(_ref2) {\n let [g] = _ref2;\n return ["CMYK", 0, 0, 0, 1 - g];\n }\n static G_RGB(_ref3) {\n let [g] = _ref3;\n return ["RGB", g, g, g];\n }\n static G_HTML(_ref4) {\n let [g] = _ref4;\n const G = makeColorComp(g);\n return `#${G}${G}${G}`;\n }\n static RGB_G(_ref5) {\n let [r, g, b] = _ref5;\n return ["G", 0.3 * r + 0.59 * g + 0.11 * b];\n }\n static RGB_HTML(_ref6) {\n let [r, g, b] = _ref6;\n const R = makeColorComp(r);\n const G = makeColorComp(g);\n const B = makeColorComp(b);\n return `#${R}${G}${B}`;\n }\n static T_HTML() {\n return "#00000000";\n }\n static CMYK_RGB(_ref7) {\n let [c, y, m, k] = _ref7;\n return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n }\n static CMYK_HTML(components) {\n const rgb = this.CMYK_RGB(components).slice(1);\n return this.RGB_HTML(rgb);\n }\n static RGB_CMYK(_ref8) {\n let [r, g, b] = _ref8;\n const c = 1 - r;\n const m = 1 - g;\n const y = 1 - b;\n const k = Math.min(c, m, y);\n return ["CMYK", c, m, y, k];\n }\n}\nexports.ColorConverters = ColorConverters;\n\n/***/ }),\n/* 7 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.PDFObject = void 0;\nclass PDFObject {\n constructor(data) {\n this._expandos = Object.create(null);\n this._send = data.send || null;\n this._id = data.id || null;\n }\n}\nexports.PDFObject = PDFObject;\n\n/***/ }),\n/* 8 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.AForm = void 0;\nvar _constants = __w_pdfjs_require__(2);\nclass AForm {\n constructor(document, app, util, color) {\n this._document = document;\n this._app = app;\n this._util = util;\n this._color = color;\n this._dateFormats = ["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"];\n this._timeFormats = ["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"];\n this._dateActionsCache = new Map();\n this._emailRegex = new RegExp("^[a-zA-Z0-9.!#$%&\'*+\\\\/=?^_`{|}~-]+" + "@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?" + "(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$");\n }\n _mkTargetName(event) {\n return event.target ? `[ ${event.target.name} ]` : "";\n }\n _tryToGuessDate(cFormat, cDate) {\n let actions = this._dateActionsCache.get(cFormat);\n if (!actions) {\n actions = [];\n this._dateActionsCache.set(cFormat, actions);\n cFormat.replace(/(d+)|(m+)|(y+)|(H+)|(M+)|(s+)/g, function (match, d, m, y, H, M, s) {\n if (d) {\n actions.push((n, date) => {\n if (n >= 1 && n <= 31) {\n date.setDate(n);\n return true;\n }\n return false;\n });\n } else if (m) {\n actions.push((n, date) => {\n if (n >= 1 && n <= 12) {\n date.setMonth(n - 1);\n return true;\n }\n return false;\n });\n } else if (y) {\n actions.push((n, date) => {\n if (n < 50) {\n n += 2000;\n } else if (n < 100) {\n n += 1900;\n }\n date.setYear(n);\n return true;\n });\n } else if (H) {\n actions.push((n, date) => {\n if (n >= 0 && n <= 23) {\n date.setHours(n);\n return true;\n }\n return false;\n });\n } else if (M) {\n actions.push((n, date) => {\n if (n >= 0 && n <= 59) {\n date.setMinutes(n);\n return true;\n }\n return false;\n });\n } else if (s) {\n actions.push((n, date) => {\n if (n >= 0 && n <= 59) {\n date.setSeconds(n);\n return true;\n }\n return false;\n });\n }\n return "";\n });\n }\n const number = /\\d+/g;\n let i = 0;\n let array;\n const date = new Date();\n while ((array = number.exec(cDate)) !== null) {\n if (i < actions.length) {\n if (!actions[i++](parseInt(array[0]), date)) {\n return null;\n }\n } else {\n break;\n }\n }\n if (i === 0) {\n return null;\n }\n return date;\n }\n _parseDate(cFormat, cDate) {\n let date = null;\n try {\n date = this._util.scand(cFormat, cDate);\n } catch (error) {}\n if (!date) {\n date = Date.parse(cDate);\n if (isNaN(date)) {\n date = this._tryToGuessDate(cFormat, cDate);\n } else {\n date = new Date(date);\n }\n }\n return date;\n }\n AFMergeChange() {\n let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : globalThis.event;\n if (event.willCommit) {\n return event.value.toString();\n }\n return this._app._eventDispatcher.mergeChange(event);\n }\n AFParseDateEx(cString, cOrder) {\n return this._parseDate(cOrder, cString);\n }\n AFExtractNums(str) {\n if (typeof str === "number") {\n return [str];\n }\n if (!str || typeof str !== "string") {\n return null;\n }\n const first = str.charAt(0);\n if (first === "." || first === ",") {\n str = `0${str}`;\n }\n const numbers = str.match(/(\\d+)/g);\n if (numbers.length === 0) {\n return null;\n }\n return numbers;\n }\n AFMakeNumber(str) {\n if (typeof str === "number") {\n return str;\n }\n if (typeof str !== "string") {\n return null;\n }\n str = str.trim().replace(",", ".");\n const number = parseFloat(str);\n if (isNaN(number) || !isFinite(number)) {\n return null;\n }\n return number;\n }\n AFMakeArrayFromList(string) {\n if (typeof string === "string") {\n return string.split(/, ?/g);\n }\n return string;\n }\n AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = "";\n return;\n }\n const sign = Math.sign(value);\n const buf = [];\n let hasParen = false;\n if (sign === -1 && bCurrencyPrepend && negStyle === 0) {\n buf.push("-");\n }\n if ((negStyle === 2 || negStyle === 3) && sign === -1) {\n buf.push("(");\n hasParen = true;\n }\n if (bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\n buf.push("%,", sepStyle, ".", nDec.toString(), "f");\n if (!bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n if (hasParen) {\n buf.push(")");\n }\n if (negStyle === 1 || negStyle === 3) {\n event.target.textColor = sign === 1 ? this._color.black : this._color.red;\n }\n if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {\n value = -value;\n }\n const formatStr = buf.join("");\n event.value = this._util.printf(formatStr, value);\n }\n AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n value = value.trim();\n let pattern;\n if (sepStyle > 1) {\n pattern = event.willCommit ? /^[+-]?(\\d+(,\\d*)?|,\\d+)$/ : /^[+-]?\\d*,?\\d*$/;\n } else {\n pattern = event.willCommit ? /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/ : /^[+-]?\\d*\\.?\\d*$/;\n }\n if (!pattern.test(value)) {\n if (event.willCommit) {\n const err = `${_constants.GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\n this._app.alert(err);\n }\n event.rc = false;\n }\n if (event.willCommit && sepStyle > 1) {\n event.value = parseFloat(value.replace(",", "."));\n }\n }\n AFPercent_Format(nDec, sepStyle) {\n let percentPrepend = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n if (typeof nDec !== "number") {\n return;\n }\n if (typeof sepStyle !== "number") {\n return;\n }\n if (nDec < 0) {\n throw new Error("Invalid nDec value in AFPercent_Format");\n }\n const event = globalThis.event;\n if (nDec > 512) {\n event.value = "%";\n return;\n }\n nDec = Math.floor(nDec);\n sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = "%";\n return;\n }\n const formatStr = `%,${sepStyle}.${nDec}f`;\n value = this._util.printf(formatStr, value * 100);\n if (percentPrepend) {\n event.value = `%${value}`;\n } else {\n event.value = `${value}%`;\n }\n }\n AFPercent_Keystroke(nDec, sepStyle) {\n this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, "", true);\n }\n AFDate_FormatEx(cFormat) {\n const event = globalThis.event;\n const value = event.value;\n if (!value) {\n return;\n }\n const date = this._parseDate(cFormat, value);\n if (date !== null) {\n event.value = this._util.printd(cFormat, date);\n }\n }\n AFDate_Format(pdf) {\n if (pdf >= 0 && pdf < this._dateFormats.length) {\n this.AFDate_FormatEx(this._dateFormats[pdf]);\n }\n }\n AFDate_KeystrokeEx(cFormat) {\n const event = globalThis.event;\n if (!event.willCommit) {\n return;\n }\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n if (this._parseDate(cFormat, value) === null) {\n const invalid = _constants.GlobalConstants.IDS_INVALID_DATE;\n const invalid2 = _constants.GlobalConstants.IDS_INVALID_DATE2;\n const err = `${invalid} ${this._mkTargetName(event)}${invalid2}${cFormat}`;\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFDate_Keystroke(pdf) {\n if (pdf >= 0 && pdf < this._dateFormats.length) {\n this.AFDate_KeystrokeEx(this._dateFormats[pdf]);\n }\n }\n AFRange_Validate(bGreaterThan, nGreaterThan, bLessThan, nLessThan) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n const value = this.AFMakeNumber(event.value);\n if (value === null) {\n return;\n }\n bGreaterThan = !!bGreaterThan;\n bLessThan = !!bLessThan;\n if (bGreaterThan) {\n nGreaterThan = this.AFMakeNumber(nGreaterThan);\n if (nGreaterThan === null) {\n return;\n }\n }\n if (bLessThan) {\n nLessThan = this.AFMakeNumber(nLessThan);\n if (nLessThan === null) {\n return;\n }\n }\n let err = "";\n if (bGreaterThan && bLessThan) {\n if (value < nGreaterThan || value > nLessThan) {\n err = this._util.printf(_constants.GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\n }\n } else if (bGreaterThan) {\n if (value < nGreaterThan) {\n err = this._util.printf(_constants.GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\n }\n } else if (value > nLessThan) {\n err = this._util.printf(_constants.GlobalConstants.IDS_LESS_THAN, nLessThan);\n }\n if (err) {\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFSimple(cFunction, nValue1, nValue2) {\n const value1 = this.AFMakeNumber(nValue1);\n if (value1 === null) {\n throw new Error("Invalid nValue1 in AFSimple");\n }\n const value2 = this.AFMakeNumber(nValue2);\n if (value2 === null) {\n throw new Error("Invalid nValue2 in AFSimple");\n }\n switch (cFunction) {\n case "AVG":\n return (value1 + value2) / 2;\n case "SUM":\n return value1 + value2;\n case "PRD":\n return value1 * value2;\n case "MIN":\n return Math.min(value1, value2);\n case "MAX":\n return Math.max(value1, value2);\n }\n throw new Error("Invalid cFunction in AFSimple");\n }\n AFSimple_Calculate(cFunction, cFields) {\n const actions = {\n AVG: args => args.reduce((acc, value) => acc + value, 0) / args.length,\n SUM: args => args.reduce((acc, value) => acc + value, 0),\n PRD: args => args.reduce((acc, value) => acc * value, 1),\n MIN: args => args.reduce((acc, value) => Math.min(acc, value), Number.MAX_VALUE),\n MAX: args => args.reduce((acc, value) => Math.max(acc, value), Number.MIN_VALUE)\n };\n if (!(cFunction in actions)) {\n throw new TypeError("Invalid function in AFSimple_Calculate");\n }\n const event = globalThis.event;\n const values = [];\n cFields = this.AFMakeArrayFromList(cFields);\n for (const cField of cFields) {\n const field = this._document.getField(cField);\n if (!field) {\n continue;\n }\n for (const child of field.getArray()) {\n const number = this.AFMakeNumber(child.value);\n if (number !== null) {\n values.push(number);\n }\n }\n }\n if (values.length === 0) {\n event.value = cFunction === "PRD" ? 1 : 0;\n return;\n }\n const res = actions[cFunction](values);\n event.value = Math.round(1e6 * res) / 1e6;\n }\n AFSpecial_Format(psf) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = "99999";\n break;\n case 1:\n formatStr = "99999-9999";\n break;\n case 2:\n if (this._util.printx("9999999999", event.value).length >= 10) {\n formatStr = "(999) 999-9999";\n } else {\n formatStr = "999-9999";\n }\n break;\n case 3:\n formatStr = "999-99-9999";\n break;\n default:\n throw new Error("Invalid psf in AFSpecial_Format");\n }\n event.value = this._util.printx(formatStr, event.value);\n }\n AFSpecial_KeystrokeEx(cMask) {\n if (!cMask) {\n return;\n }\n const event = globalThis.event;\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n const checkers = new Map([["9", char => char >= "0" && char <= "9"], ["A", char => "a" <= char && char <= "z" || "A" <= char && char <= "Z"], ["O", char => "a" <= char && char <= "z" || "A" <= char && char <= "Z" || "0" <= char && char <= "9"], ["X", char => true]]);\n function _checkValidity(_value, _cMask) {\n for (let i = 0, ii = _value.length; i < ii; i++) {\n const mask = _cMask.charAt(i);\n const char = _value.charAt(i);\n const checker = checkers.get(mask);\n if (checker) {\n if (!checker(char)) {\n return false;\n }\n } else if (mask !== char) {\n return false;\n }\n }\n return true;\n }\n const err = `${_constants.GlobalConstants.IDS_INVALID_VALUE} = "${cMask}"`;\n if (value.length > cMask.length) {\n this._app.alert(err);\n event.rc = false;\n return;\n }\n if (event.willCommit) {\n if (value.length < cMask.length) {\n this._app.alert(err);\n event.rc = false;\n return;\n }\n if (!_checkValidity(value, cMask)) {\n this._app.alert(err);\n event.rc = false;\n return;\n }\n event.value += cMask.substring(value.length);\n return;\n }\n if (value.length < cMask.length) {\n cMask = cMask.substring(0, value.length);\n }\n if (!_checkValidity(value, cMask)) {\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFSpecial_Keystroke(psf) {\n const event = globalThis.event;\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = "99999";\n break;\n case 1:\n formatStr = "99999-9999";\n break;\n case 2:\n const value = this.AFMergeChange(event);\n if (value.length > 8 || value.startsWith("(")) {\n formatStr = "(999) 999-9999";\n } else {\n formatStr = "999-9999";\n }\n break;\n case 3:\n formatStr = "999-99-9999";\n break;\n default:\n throw new Error("Invalid psf in AFSpecial_Keystroke");\n }\n this.AFSpecial_KeystrokeEx(formatStr);\n }\n AFTime_FormatEx(cFormat) {\n this.AFDate_FormatEx(cFormat);\n }\n AFTime_Format(pdf) {\n if (pdf >= 0 && pdf < this._timeFormats.length) {\n this.AFDate_FormatEx(this._timeFormats[pdf]);\n }\n }\n AFTime_KeystrokeEx(cFormat) {\n this.AFDate_KeystrokeEx(cFormat);\n }\n AFTime_Keystroke(pdf) {\n if (pdf >= 0 && pdf < this._timeFormats.length) {\n this.AFDate_KeystrokeEx(this._timeFormats[pdf]);\n }\n }\n eMailValidate(str) {\n return this._emailRegex.test(str);\n }\n AFExactMatch(rePatterns, str) {\n if (rePatterns instanceof RegExp) {\n var _str$match;\n return ((_str$match = str.match(rePatterns)) === null || _str$match === void 0 ? void 0 : _str$match[0]) === str || 0;\n }\n return rePatterns.findIndex(re => {\n var _str$match2;\n return ((_str$match2 = str.match(re)) === null || _str$match2 === void 0 ? void 0 : _str$match2[0]) === str;\n }) + 1;\n }\n}\nexports.AForm = AForm;\n\n/***/ }),\n/* 9 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.USERACTIVATION_CALLBACKID = exports.App = void 0;\nvar _color = __w_pdfjs_require__(5);\nvar _event = __w_pdfjs_require__(10);\nvar _fullscreen = __w_pdfjs_require__(13);\nvar _pdf_object = __w_pdfjs_require__(7);\nvar _thermometer = __w_pdfjs_require__(14);\nconst VIEWER_TYPE = "PDF.js";\nconst VIEWER_VARIATION = "Full";\nconst VIEWER_VERSION = 21.00720099;\nconst FORMS_VERSION = 21.00720099;\nconst USERACTIVATION_CALLBACKID = 0;\nexports.USERACTIVATION_CALLBACKID = USERACTIVATION_CALLBACKID;\nclass App extends _pdf_object.PDFObject {\n constructor(data) {\n super(data);\n this._constants = null;\n this._focusRect = true;\n this._fs = null;\n this._language = App._getLanguage(data.language);\n this._openInPlace = false;\n this._platform = App._getPlatform(data.platform);\n this._runtimeHighlight = false;\n this._runtimeHighlightColor = ["T"];\n this._thermometer = null;\n this._toolbar = false;\n this._document = data._document;\n this._proxyHandler = data.proxyHandler;\n this._objects = Object.create(null);\n this._eventDispatcher = new _event.EventDispatcher(this._document, data.calculationOrder, this._objects, data.externalCall);\n this._timeoutIds = new WeakMap();\n if (typeof FinalizationRegistry !== "undefined") {\n this._timeoutIdsRegistry = new FinalizationRegistry(this._cleanTimeout.bind(this));\n } else {\n this._timeoutIdsRegistry = null;\n }\n this._timeoutCallbackIds = new Map();\n this._timeoutCallbackId = USERACTIVATION_CALLBACKID + 1;\n this._globalEval = data.globalEval;\n this._externalCall = data.externalCall;\n }\n _dispatchEvent(pdfEvent) {\n this._eventDispatcher.dispatch(pdfEvent);\n }\n _registerTimeoutCallback(cExpr) {\n const id = this._timeoutCallbackId++;\n this._timeoutCallbackIds.set(id, cExpr);\n return id;\n }\n _unregisterTimeoutCallback(id) {\n this._timeoutCallbackIds.delete(id);\n }\n _evalCallback(_ref) {\n let {\n callbackId,\n interval\n } = _ref;\n if (callbackId === USERACTIVATION_CALLBACKID) {\n this._document.obj._userActivation = false;\n return;\n }\n const expr = this._timeoutCallbackIds.get(callbackId);\n if (!interval) {\n this._unregisterTimeoutCallback(callbackId);\n }\n if (expr) {\n this._globalEval(expr);\n }\n }\n _registerTimeout(callbackId, interval) {\n var _this$_timeoutIdsRegi;\n const timeout = Object.create(null);\n const id = {\n callbackId,\n interval\n };\n this._timeoutIds.set(timeout, id);\n (_this$_timeoutIdsRegi = this._timeoutIdsRegistry) === null || _this$_timeoutIdsRegi === void 0 ? void 0 : _this$_timeoutIdsRegi.register(timeout, id);\n return timeout;\n }\n _unregisterTimeout(timeout) {\n var _this$_timeoutIdsRegi2;\n (_this$_timeoutIdsRegi2 = this._timeoutIdsRegistry) === null || _this$_timeoutIdsRegi2 === void 0 ? void 0 : _this$_timeoutIdsRegi2.unregister(timeout);\n const data = this._timeoutIds.get(timeout);\n if (!data) {\n return;\n }\n this._timeoutIds.delete(timeout);\n this._cleanTimeout(data);\n }\n _cleanTimeout(_ref2) {\n let {\n callbackId,\n interval\n } = _ref2;\n this._unregisterTimeoutCallback(callbackId);\n if (interval) {\n this._externalCall("clearInterval", [callbackId]);\n } else {\n this._externalCall("clearTimeout", [callbackId]);\n }\n }\n static _getPlatform(platform) {\n if (typeof platform === "string") {\n platform = platform.toLowerCase();\n if (platform.includes("win")) {\n return "WIN";\n } else if (platform.includes("mac")) {\n return "MAC";\n }\n }\n return "UNIX";\n }\n static _getLanguage(language) {\n const [main, sub] = language.toLowerCase().split(/[-_]/);\n switch (main) {\n case "zh":\n if (sub === "cn" || sub === "sg") {\n return "CHS";\n }\n return "CHT";\n case "da":\n return "DAN";\n case "de":\n return "DEU";\n case "es":\n return "ESP";\n case "fr":\n return "FRA";\n case "it":\n return "ITA";\n case "ko":\n return "KOR";\n case "ja":\n return "JPN";\n case "nl":\n return "NLD";\n case "no":\n return "NOR";\n case "pt":\n if (sub === "br") {\n return "PTB";\n }\n return "ENU";\n case "fi":\n return "SUO";\n case "SV":\n return "SVE";\n default:\n return "ENU";\n }\n }\n get activeDocs() {\n return [this._document.wrapped];\n }\n set activeDocs(_) {\n throw new Error("app.activeDocs is read-only");\n }\n get calculate() {\n return this._document.obj.calculate;\n }\n set calculate(calculate) {\n this._document.obj.calculate = calculate;\n }\n get constants() {\n if (!this._constants) {\n this._constants = Object.freeze({\n align: Object.freeze({\n left: 0,\n center: 1,\n right: 2,\n top: 3,\n bottom: 4\n })\n });\n }\n return this._constants;\n }\n set constants(_) {\n throw new Error("app.constants is read-only");\n }\n get focusRect() {\n return this._focusRect;\n }\n set focusRect(val) {\n this._focusRect = val;\n }\n get formsVersion() {\n return FORMS_VERSION;\n }\n set formsVersion(_) {\n throw new Error("app.formsVersion is read-only");\n }\n get fromPDFConverters() {\n return [];\n }\n set fromPDFConverters(_) {\n throw new Error("app.fromPDFConverters is read-only");\n }\n get fs() {\n if (this._fs === null) {\n this._fs = new Proxy(new _fullscreen.FullScreen({\n send: this._send\n }), this._proxyHandler);\n }\n return this._fs;\n }\n set fs(_) {\n throw new Error("app.fs is read-only");\n }\n get language() {\n return this._language;\n }\n set language(_) {\n throw new Error("app.language is read-only");\n }\n get media() {\n return undefined;\n }\n set media(_) {\n throw new Error("app.media is read-only");\n }\n get monitors() {\n return [];\n }\n set monitors(_) {\n throw new Error("app.monitors is read-only");\n }\n get numPlugins() {\n return 0;\n }\n set numPlugins(_) {\n throw new Error("app.numPlugins is read-only");\n }\n get openInPlace() {\n return this._openInPlace;\n }\n set openInPlace(val) {\n this._openInPlace = val;\n }\n get platform() {\n return this._platform;\n }\n set platform(_) {\n throw new Error("app.platform is read-only");\n }\n get plugins() {\n return [];\n }\n set plugins(_) {\n throw new Error("app.plugins is read-only");\n }\n get printColorProfiles() {\n return [];\n }\n set printColorProfiles(_) {\n throw new Error("app.printColorProfiles is read-only");\n }\n get printerNames() {\n return [];\n }\n set printerNames(_) {\n throw new Error("app.printerNames is read-only");\n }\n get runtimeHighlight() {\n return this._runtimeHighlight;\n }\n set runtimeHighlight(val) {\n this._runtimeHighlight = val;\n }\n get runtimeHighlightColor() {\n return this._runtimeHighlightColor;\n }\n set runtimeHighlightColor(val) {\n if (_color.Color._isValidColor(val)) {\n this._runtimeHighlightColor = val;\n }\n }\n get thermometer() {\n if (this._thermometer === null) {\n this._thermometer = new Proxy(new _thermometer.Thermometer({\n send: this._send\n }), this._proxyHandler);\n }\n return this._thermometer;\n }\n set thermometer(_) {\n throw new Error("app.thermometer is read-only");\n }\n get toolbar() {\n return this._toolbar;\n }\n set toolbar(val) {\n this._toolbar = val;\n }\n get toolbarHorizontal() {\n return this.toolbar;\n }\n set toolbarHorizontal(value) {\n this.toolbar = value;\n }\n get toolbarVertical() {\n return this.toolbar;\n }\n set toolbarVertical(value) {\n this.toolbar = value;\n }\n get viewerType() {\n return VIEWER_TYPE;\n }\n set viewerType(_) {\n throw new Error("app.viewerType is read-only");\n }\n get viewerVariation() {\n return VIEWER_VARIATION;\n }\n set viewerVariation(_) {\n throw new Error("app.viewerVariation is read-only");\n }\n get viewerVersion() {\n return VIEWER_VERSION;\n }\n set viewerVersion(_) {\n throw new Error("app.viewerVersion is read-only");\n }\n addMenuItem() {}\n addSubMenu() {}\n addToolButton() {}\n alert(cMsg) {\n let nIcon = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n let nType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n let cTitle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "PDF.js";\n let oDoc = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n let oCheckbox = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n if (!this._document.obj._userActivation) {\n return 0;\n }\n this._document.obj._userActivation = false;\n if (cMsg && typeof cMsg === "object") {\n nType = cMsg.nType;\n cMsg = cMsg.cMsg;\n }\n cMsg = (cMsg || "").toString();\n nType = typeof nType !== "number" || isNaN(nType) || nType < 0 || nType > 3 ? 0 : nType;\n if (nType >= 2) {\n return this._externalCall("confirm", [cMsg]) ? 4 : 3;\n }\n this._externalCall("alert", [cMsg]);\n return 1;\n }\n beep() {}\n beginPriv() {}\n browseForDoc() {}\n clearInterval(oInterval) {\n this._unregisterTimeout(oInterval);\n }\n clearTimeOut(oTime) {\n this._unregisterTimeout(oTime);\n }\n endPriv() {}\n execDialog() {}\n execMenuItem(item) {\n if (!this._document.obj._userActivation) {\n return;\n }\n this._document.obj._userActivation = false;\n switch (item) {\n case "SaveAs":\n if (this._document.obj._disableSaving) {\n return;\n }\n this._send({\n command: item\n });\n break;\n case "FirstPage":\n case "LastPage":\n case "NextPage":\n case "PrevPage":\n case "ZoomViewIn":\n case "ZoomViewOut":\n this._send({\n command: item\n });\n break;\n case "FitPage":\n this._send({\n command: "zoom",\n value: "page-fit"\n });\n break;\n case "Print":\n if (this._document.obj._disablePrinting) {\n return;\n }\n this._send({\n command: "print"\n });\n break;\n }\n }\n getNthPlugInName() {}\n getPath() {}\n goBack() {}\n goForward() {}\n hideMenuItem() {}\n hideToolbarButton() {}\n launchURL() {}\n listMenuItems() {}\n listToolbarButtons() {}\n loadPolicyFile() {}\n mailGetAddrs() {}\n mailMsg() {}\n newDoc() {}\n newCollection() {}\n newFDF() {}\n openDoc() {}\n openFDF() {}\n popUpMenu() {}\n popUpMenuEx() {}\n removeToolButton() {}\n response(cQuestion) {\n let cTitle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";\n let cDefault = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";\n let bPassword = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";\n let cLabel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "";\n if (cQuestion && typeof cQuestion === "object") {\n cDefault = cQuestion.cDefault;\n cQuestion = cQuestion.cQuestion;\n }\n cQuestion = (cQuestion || "").toString();\n cDefault = (cDefault || "").toString();\n return this._externalCall("prompt", [cQuestion, cDefault || ""]);\n }\n setInterval(cExpr) {\n let nMilliseconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n if (cExpr && typeof cExpr === "object") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== "string") {\n throw new TypeError("First argument of app.setInterval must be a string");\n }\n if (typeof nMilliseconds !== "number") {\n throw new TypeError("Second argument of app.setInterval must be a number");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall("setInterval", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, true);\n }\n setTimeOut(cExpr) {\n let nMilliseconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n if (cExpr && typeof cExpr === "object") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== "string") {\n throw new TypeError("First argument of app.setTimeOut must be a string");\n }\n if (typeof nMilliseconds !== "number") {\n throw new TypeError("Second argument of app.setTimeOut must be a number");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall("setTimeout", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, false);\n }\n trustedFunction() {}\n trustPropagatorFunction() {}\n}\nexports.App = App;\n\n/***/ }),\n/* 10 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.EventDispatcher = exports.Event = void 0;\nvar _doc = __w_pdfjs_require__(11);\nconst USERACTIVATION_MAXTIME_VALIDITY = 5000;\nclass Event {\n constructor(data) {\n this.change = data.change || "";\n this.changeEx = data.changeEx || null;\n this.commitKey = data.commitKey || 0;\n this.fieldFull = data.fieldFull || false;\n this.keyDown = data.keyDown || false;\n this.modifier = data.modifier || false;\n this.name = data.name;\n this.rc = true;\n this.richChange = data.richChange || [];\n this.richChangeEx = data.richChangeEx || [];\n this.richValue = data.richValue || [];\n this.selEnd = data.selEnd ?? -1;\n this.selStart = data.selStart ?? -1;\n this.shift = data.shift || false;\n this.source = data.source || null;\n this.target = data.target || null;\n this.targetName = "";\n this.type = "Field";\n this.value = data.value || "";\n this.willCommit = data.willCommit || false;\n }\n}\nexports.Event = Event;\nclass EventDispatcher {\n constructor(document, calculationOrder, objects, externalCall) {\n this._document = document;\n this._calculationOrder = calculationOrder;\n this._objects = objects;\n this._externalCall = externalCall;\n this._document.obj._eventDispatcher = this;\n this._isCalculating = false;\n }\n mergeChange(event) {\n let value = event.value;\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value !== "string") {\n value = value.toString();\n }\n const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : "";\n const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : "";\n return `${prefix}${event.change}${postfix}`;\n }\n userActivation() {\n this._document.obj._userActivation = true;\n this._externalCall("setTimeout", [_doc.USERACTIVATION_CALLBACKID, USERACTIVATION_MAXTIME_VALIDITY]);\n }\n dispatch(baseEvent) {\n const id = baseEvent.id;\n if (!(id in this._objects)) {\n let event;\n if (id === "doc" || id === "page") {\n event = globalThis.event = new Event(baseEvent);\n event.source = event.target = this._document.wrapped;\n event.name = baseEvent.name;\n }\n if (id === "doc") {\n const eventName = event.name;\n if (eventName === "Open") {\n this._document.obj._initActions();\n this.formatAll();\n }\n if (!["DidPrint", "DidSave", "WillPrint", "WillSave"].includes(eventName)) {\n this.userActivation();\n }\n this._document.obj._dispatchDocEvent(event.name);\n } else if (id === "page") {\n this.userActivation();\n this._document.obj._dispatchPageEvent(event.name, baseEvent.actions, baseEvent.pageNumber);\n } else if (id === "app" && baseEvent.name === "ResetForm") {\n this.userActivation();\n for (const fieldId of baseEvent.ids) {\n const obj = this._objects[fieldId];\n obj === null || obj === void 0 ? void 0 : obj.obj._reset();\n }\n }\n return;\n }\n const name = baseEvent.name;\n const source = this._objects[id];\n const event = globalThis.event = new Event(baseEvent);\n let savedChange;\n this.userActivation();\n if (source.obj._isButton()) {\n source.obj._id = id;\n event.value = source.obj._getExportValue(event.value);\n if (name === "Action") {\n source.obj._value = event.value;\n }\n }\n switch (name) {\n case "Keystroke":\n savedChange = {\n value: event.value,\n changeEx: event.changeEx,\n change: event.change,\n selStart: event.selStart,\n selEnd: event.selEnd\n };\n break;\n case "Blur":\n case "Focus":\n Object.defineProperty(event, "value", {\n configurable: false,\n writable: false,\n enumerable: true,\n value: event.value\n });\n break;\n case "Validate":\n this.runValidation(source, event);\n return;\n case "Action":\n this.runActions(source, source, event, name);\n this.runCalculate(source, event);\n return;\n }\n this.runActions(source, source, event, name);\n if (name !== "Keystroke") {\n return;\n }\n if (event.rc) {\n if (event.willCommit) {\n this.runValidation(source, event);\n } else {\n if (source.obj._isChoice) {\n source.obj.value = savedChange.changeEx;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: source.obj.value\n });\n return;\n }\n const value = source.obj.value = this.mergeChange(event);\n let selStart, selEnd;\n if (event.selStart !== savedChange.selStart || event.selEnd !== savedChange.selEnd) {\n selStart = event.selStart;\n selEnd = event.selEnd;\n } else {\n selEnd = selStart = savedChange.selStart + event.change.length;\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value,\n selRange: [selStart, selEnd]\n });\n }\n } else if (!event.willCommit) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedChange.value,\n selRange: [savedChange.selStart, savedChange.selEnd]\n });\n } else {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: "",\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n }\n formatAll() {\n const event = globalThis.event = new Event({});\n for (const source of Object.values(this._objects)) {\n event.value = source.obj.value;\n if (this.runActions(source, source, event, "Format")) {\n var _event$value, _event$value$toString, _event$value2;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n formattedValue: (_event$value = event.value) === null || _event$value === void 0 ? void 0 : (_event$value$toString = (_event$value2 = _event$value).toString) === null || _event$value$toString === void 0 ? void 0 : _event$value$toString.call(_event$value2)\n });\n }\n }\n }\n runValidation(source, event) {\n const didValidateRun = this.runActions(source, source, event, "Validate");\n if (event.rc) {\n source.obj.value = event.value;\n this.runCalculate(source, event);\n const savedValue = event.value = source.obj.value;\n let formattedValue = null;\n if (this.runActions(source, source, event, "Format")) {\n var _event$value3, _event$value3$toStrin;\n formattedValue = (_event$value3 = event.value) === null || _event$value3 === void 0 ? void 0 : (_event$value3$toStrin = _event$value3.toString) === null || _event$value3$toStrin === void 0 ? void 0 : _event$value3$toStrin.call(_event$value3);\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedValue,\n formattedValue\n });\n event.value = savedValue;\n } else if (didValidateRun) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: "",\n formattedValue: null,\n selRange: [0, 0],\n focus: true\n });\n }\n }\n runActions(source, target, event, eventName) {\n event.source = source.wrapped;\n event.target = target.wrapped;\n event.name = eventName;\n event.targetName = target.obj.name;\n event.rc = true;\n return target.obj._runActions(event);\n }\n calculateNow() {\n if (!this._calculationOrder || this._isCalculating || !this._document.obj.calculate) {\n return;\n }\n this._isCalculating = true;\n const first = this._calculationOrder[0];\n const source = this._objects[first];\n globalThis.event = new Event({});\n try {\n this.runCalculate(source, globalThis.event);\n } catch (error) {\n this._isCalculating = false;\n throw error;\n }\n this._isCalculating = false;\n }\n runCalculate(source, event) {\n if (!this._calculationOrder || !this._document.obj.calculate) {\n return;\n }\n for (const targetId of this._calculationOrder) {\n if (!(targetId in this._objects)) {\n continue;\n }\n if (!this._document.obj.calculate) {\n break;\n }\n event.value = null;\n const target = this._objects[targetId];\n let savedValue = target.obj.value;\n this.runActions(source, target, event, "Calculate");\n if (!event.rc) {\n continue;\n }\n if (event.value !== null) {\n target.obj.value = event.value;\n }\n event.value = target.obj.value;\n this.runActions(target, target, event, "Validate");\n if (!event.rc) {\n if (target.obj.value !== savedValue) {\n target.wrapped.value = savedValue;\n }\n continue;\n }\n savedValue = event.value = target.obj.value;\n let formattedValue = null;\n if (this.runActions(target, target, event, "Format")) {\n var _event$value4, _event$value4$toStrin, _event$value5;\n formattedValue = (_event$value4 = event.value) === null || _event$value4 === void 0 ? void 0 : (_event$value4$toStrin = (_event$value5 = _event$value4).toString) === null || _event$value4$toStrin === void 0 ? void 0 : _event$value4$toStrin.call(_event$value5);\n }\n target.obj._send({\n id: target.obj._id,\n siblings: target.obj._siblings,\n value: savedValue,\n formattedValue\n });\n }\n }\n}\nexports.EventDispatcher = EventDispatcher;\n\n/***/ }),\n/* 11 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.Doc = void 0;\nvar _common = __w_pdfjs_require__(4);\nvar _pdf_object = __w_pdfjs_require__(7);\nvar _print_params = __w_pdfjs_require__(12);\nvar _constants = __w_pdfjs_require__(2);\nconst DOC_EXTERNAL = false;\nclass InfoProxyHandler {\n static get(obj, prop) {\n return obj[prop.toLowerCase()];\n }\n static set(obj, prop, value) {\n throw new Error(`doc.info.${prop} is read-only`);\n }\n}\nclass Doc extends _pdf_object.PDFObject {\n constructor(data) {\n super(data);\n this._expandos = globalThis;\n this._baseURL = data.baseURL || "";\n this._calculate = true;\n this._delay = false;\n this._dirty = false;\n this._disclosed = false;\n this._media = undefined;\n this._metadata = data.metadata || "";\n this._noautocomplete = undefined;\n this._nocache = undefined;\n this._spellDictionaryOrder = [];\n this._spellLanguageOrder = [];\n this._printParams = null;\n this._fields = new Map();\n this._fieldNames = [];\n this._event = null;\n this._author = data.Author || "";\n this._creator = data.Creator || "";\n this._creationDate = this._getDate(data.CreationDate) || null;\n this._docID = data.docID || ["", ""];\n this._documentFileName = data.filename || "";\n this._filesize = data.filesize || 0;\n this._keywords = data.Keywords || "";\n this._layout = data.layout || "";\n this._modDate = this._getDate(data.ModDate) || null;\n this._numFields = 0;\n this._numPages = data.numPages || 1;\n this._pageNum = data.pageNum || 0;\n this._producer = data.Producer || "";\n this._securityHandler = data.EncryptFilterName || null;\n this._subject = data.Subject || "";\n this._title = data.Title || "";\n this._URL = data.URL || "";\n this._info = new Proxy({\n title: this._title,\n author: this._author,\n authors: data.authors || [this._author],\n subject: this._subject,\n keywords: this._keywords,\n creator: this._creator,\n producer: this._producer,\n creationdate: this._creationDate,\n moddate: this._modDate,\n trapped: data.Trapped || "Unknown"\n }, InfoProxyHandler);\n this._zoomType = _constants.ZoomType.none;\n this._zoom = data.zoom || 100;\n this._actions = (0, _common.createActionsMap)(data.actions);\n this._globalEval = data.globalEval;\n this._pageActions = new Map();\n this._userActivation = false;\n this._disablePrinting = false;\n this._disableSaving = false;\n }\n _initActions() {\n const dontRun = new Set(["WillClose", "WillSave", "DidSave", "WillPrint", "DidPrint", "OpenAction"]);\n this._disableSaving = true;\n for (const actionName of this._actions.keys()) {\n if (!dontRun.has(actionName)) {\n this._runActions(actionName);\n }\n }\n this._runActions("OpenAction");\n this._disableSaving = false;\n }\n _dispatchDocEvent(name) {\n if (name === "Open") {\n this._disableSaving = true;\n this._runActions("OpenAction");\n this._disableSaving = false;\n } else if (name === "WillPrint") {\n this._disablePrinting = true;\n this._runActions(name);\n this._disablePrinting = false;\n } else if (name === "WillSave") {\n this._disableSaving = true;\n this._runActions(name);\n this._disableSaving = false;\n } else {\n this._runActions(name);\n }\n }\n _dispatchPageEvent(name, actions, pageNumber) {\n var _this$_pageActions$ge;\n if (name === "PageOpen") {\n if (!this._pageActions.has(pageNumber)) {\n this._pageActions.set(pageNumber, (0, _common.createActionsMap)(actions));\n }\n this._pageNum = pageNumber - 1;\n }\n actions = (_this$_pageActions$ge = this._pageActions.get(pageNumber)) === null || _this$_pageActions$ge === void 0 ? void 0 : _this$_pageActions$ge.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n _runActions(name) {\n const actions = this._actions.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n _addField(name, field) {\n this._fields.set(name, field);\n this._fieldNames.push(name);\n this._numFields++;\n }\n _getDate(date) {\n if (!date || date.length < 15 || !date.startsWith("D:")) {\n return date;\n }\n date = date.substring(2);\n const year = date.substring(0, 4);\n const month = date.substring(4, 6);\n const day = date.substring(6, 8);\n const hour = date.substring(8, 10);\n const minute = date.substring(10, 12);\n const o = date.charAt(12);\n let second, offsetPos;\n if (o === "Z" || o === "+" || o === "-") {\n second = "00";\n offsetPos = 12;\n } else {\n second = date.substring(12, 14);\n offsetPos = 14;\n }\n const offset = date.substring(offsetPos).replaceAll("\'", "");\n return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\n }\n get author() {\n return this._author;\n }\n set author(_) {\n throw new Error("doc.author is read-only");\n }\n get baseURL() {\n return this._baseURL;\n }\n set baseURL(baseURL) {\n this._baseURL = baseURL;\n }\n get bookmarkRoot() {\n return undefined;\n }\n set bookmarkRoot(_) {\n throw new Error("doc.bookmarkRoot is read-only");\n }\n get calculate() {\n return this._calculate;\n }\n set calculate(calculate) {\n this._calculate = calculate;\n }\n get creator() {\n return this._creator;\n }\n set creator(_) {\n throw new Error("doc.creator is read-only");\n }\n get dataObjects() {\n return [];\n }\n set dataObjects(_) {\n throw new Error("doc.dataObjects is read-only");\n }\n get delay() {\n return this._delay;\n }\n set delay(delay) {\n this._delay = delay;\n }\n get dirty() {\n return this._dirty;\n }\n set dirty(dirty) {\n this._dirty = dirty;\n }\n get disclosed() {\n return this._disclosed;\n }\n set disclosed(disclosed) {\n this._disclosed = disclosed;\n }\n get docID() {\n return this._docID;\n }\n set docID(_) {\n throw new Error("doc.docID is read-only");\n }\n get documentFileName() {\n return this._documentFileName;\n }\n set documentFileName(_) {\n throw new Error("doc.documentFileName is read-only");\n }\n get dynamicXFAForm() {\n return false;\n }\n set dynamicXFAForm(_) {\n throw new Error("doc.dynamicXFAForm is read-only");\n }\n get external() {\n return DOC_EXTERNAL;\n }\n set external(_) {\n throw new Error("doc.external is read-only");\n }\n get filesize() {\n return this._filesize;\n }\n set filesize(_) {\n throw new Error("doc.filesize is read-only");\n }\n get hidden() {\n return false;\n }\n set hidden(_) {\n throw new Error("doc.hidden is read-only");\n }\n get hostContainer() {\n return undefined;\n }\n set hostContainer(_) {\n throw new Error("doc.hostContainer is read-only");\n }\n get icons() {\n return undefined;\n }\n set icons(_) {\n throw new Error("doc.icons is read-only");\n }\n get info() {\n return this._info;\n }\n set info(_) {\n throw new Error("doc.info is read-only");\n }\n get innerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerAppWindowRect(_) {\n throw new Error("doc.innerAppWindowRect is read-only");\n }\n get innerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerDocWindowRect(_) {\n throw new Error("doc.innerDocWindowRect is read-only");\n }\n get isModal() {\n return false;\n }\n set isModal(_) {\n throw new Error("doc.isModal is read-only");\n }\n get keywords() {\n return this._keywords;\n }\n set keywords(_) {\n throw new Error("doc.keywords is read-only");\n }\n get layout() {\n return this._layout;\n }\n set layout(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== "string") {\n return;\n }\n if (value !== "SinglePage" && value !== "OneColumn" && value !== "TwoColumnLeft" && value !== "TwoPageLeft" && value !== "TwoColumnRight" && value !== "TwoPageRight") {\n value = "SinglePage";\n }\n this._send({\n command: "layout",\n value\n });\n this._layout = value;\n }\n get media() {\n return this._media;\n }\n set media(media) {\n this._media = media;\n }\n get metadata() {\n return this._metadata;\n }\n set metadata(metadata) {\n this._metadata = metadata;\n }\n get modDate() {\n return this._modDate;\n }\n set modDate(_) {\n throw new Error("doc.modDate is read-only");\n }\n get mouseX() {\n return 0;\n }\n set mouseX(_) {\n throw new Error("doc.mouseX is read-only");\n }\n get mouseY() {\n return 0;\n }\n set mouseY(_) {\n throw new Error("doc.mouseY is read-only");\n }\n get noautocomplete() {\n return this._noautocomplete;\n }\n set noautocomplete(noautocomplete) {\n this._noautocomplete = noautocomplete;\n }\n get nocache() {\n return this._nocache;\n }\n set nocache(nocache) {\n this._nocache = nocache;\n }\n get numFields() {\n return this._numFields;\n }\n set numFields(_) {\n throw new Error("doc.numFields is read-only");\n }\n get numPages() {\n return this._numPages;\n }\n set numPages(_) {\n throw new Error("doc.numPages is read-only");\n }\n get numTemplates() {\n return 0;\n }\n set numTemplates(_) {\n throw new Error("doc.numTemplates is read-only");\n }\n get outerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerAppWindowRect(_) {\n throw new Error("doc.outerAppWindowRect is read-only");\n }\n get outerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerDocWindowRect(_) {\n throw new Error("doc.outerDocWindowRect is read-only");\n }\n get pageNum() {\n return this._pageNum;\n }\n set pageNum(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== "number" || value < 0 || value >= this._numPages) {\n return;\n }\n this._send({\n command: "page-num",\n value\n });\n this._pageNum = value;\n }\n get pageWindowRect() {\n return [0, 0, 0, 0];\n }\n set pageWindowRect(_) {\n throw new Error("doc.pageWindowRect is read-only");\n }\n get path() {\n return "";\n }\n set path(_) {\n throw new Error("doc.path is read-only");\n }\n get permStatusReady() {\n return true;\n }\n set permStatusReady(_) {\n throw new Error("doc.permStatusReady is read-only");\n }\n get producer() {\n return this._producer;\n }\n set producer(_) {\n throw new Error("doc.producer is read-only");\n }\n get requiresFullSave() {\n return false;\n }\n set requiresFullSave(_) {\n throw new Error("doc.requiresFullSave is read-only");\n }\n get securityHandler() {\n return this._securityHandler;\n }\n set securityHandler(_) {\n throw new Error("doc.securityHandler is read-only");\n }\n get selectedAnnots() {\n return [];\n }\n set selectedAnnots(_) {\n throw new Error("doc.selectedAnnots is read-only");\n }\n get sounds() {\n return [];\n }\n set sounds(_) {\n throw new Error("doc.sounds is read-only");\n }\n get spellDictionaryOrder() {\n return this._spellDictionaryOrder;\n }\n set spellDictionaryOrder(spellDictionaryOrder) {\n this._spellDictionaryOrder = spellDictionaryOrder;\n }\n get spellLanguageOrder() {\n return this._spellLanguageOrder;\n }\n set spellLanguageOrder(spellLanguageOrder) {\n this._spellLanguageOrder = spellLanguageOrder;\n }\n get subject() {\n return this._subject;\n }\n set subject(_) {\n throw new Error("doc.subject is read-only");\n }\n get templates() {\n return [];\n }\n set templates(_) {\n throw new Error("doc.templates is read-only");\n }\n get title() {\n return this._title;\n }\n set title(_) {\n throw new Error("doc.title is read-only");\n }\n get URL() {\n return this._URL;\n }\n set URL(_) {\n throw new Error("doc.URL is read-only");\n }\n get viewState() {\n return undefined;\n }\n set viewState(_) {\n throw new Error("doc.viewState is read-only");\n }\n get xfa() {\n return this._xfa;\n }\n set xfa(_) {\n throw new Error("doc.xfa is read-only");\n }\n get XFAForeground() {\n return false;\n }\n set XFAForeground(_) {\n throw new Error("doc.XFAForeground is read-only");\n }\n get zoomType() {\n return this._zoomType;\n }\n set zoomType(type) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof type !== "string") {\n return;\n }\n switch (type) {\n case _constants.ZoomType.none:\n this._send({\n command: "zoom",\n value: 1\n });\n break;\n case _constants.ZoomType.fitP:\n this._send({\n command: "zoom",\n value: "page-fit"\n });\n break;\n case _constants.ZoomType.fitW:\n this._send({\n command: "zoom",\n value: "page-width"\n });\n break;\n case _constants.ZoomType.fitH:\n this._send({\n command: "zoom",\n value: "page-height"\n });\n break;\n case _constants.ZoomType.fitV:\n this._send({\n command: "zoom",\n value: "auto"\n });\n break;\n case _constants.ZoomType.pref:\n case _constants.ZoomType.refW:\n break;\n default:\n return;\n }\n this._zoomType = type;\n }\n get zoom() {\n return this._zoom;\n }\n set zoom(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== "number" || value < 8.33 || value > 6400) {\n return;\n }\n this._send({\n command: "zoom",\n value: value / 100\n });\n }\n addAnnot() {}\n addField() {}\n addIcon() {}\n addLink() {}\n addRecipientListCryptFilter() {}\n addRequirement() {}\n addScript() {}\n addThumbnails() {}\n addWatermarkFromFile() {}\n addWatermarkFromText() {}\n addWeblinks() {}\n bringToFront() {}\n calculateNow() {\n this._eventDispatcher.calculateNow();\n }\n closeDoc() {}\n colorConvertPage() {}\n createDataObject() {}\n createTemplate() {}\n deletePages() {}\n deleteSound() {}\n embedDocAsDataObject() {}\n embedOutputIntent() {}\n encryptForRecipients() {}\n encryptUsingPolicy() {}\n exportAsFDF() {}\n exportAsFDFStr() {}\n exportAsText() {}\n exportAsXFDF() {}\n exportAsXFDFStr() {}\n exportDataObject() {}\n exportXFAData() {}\n extractPages() {}\n flattenPages() {}\n getAnnot() {}\n getAnnots() {}\n getAnnot3D() {}\n getAnnots3D() {}\n getColorConvertAction() {}\n getDataObject() {}\n getDataObjectContents() {}\n _getField(cName) {\n if (cName && typeof cName === "object") {\n cName = cName.cName;\n }\n if (typeof cName !== "string") {\n throw new TypeError("Invalid field name: must be a string");\n }\n const searchedField = this._fields.get(cName);\n if (searchedField) {\n return searchedField;\n }\n const parts = cName.split("#");\n let childIndex = NaN;\n if (parts.length === 2) {\n childIndex = Math.floor(parseFloat(parts[1]));\n cName = parts[0];\n }\n for (const [name, field] of this._fields.entries()) {\n if (name.endsWith(cName)) {\n if (!isNaN(childIndex)) {\n const children = this._getChildren(name);\n if (childIndex < 0 || childIndex >= children.length) {\n childIndex = 0;\n }\n if (childIndex < children.length) {\n this._fields.set(cName, children[childIndex]);\n return children[childIndex];\n }\n }\n this._fields.set(cName, field);\n return field;\n }\n }\n return null;\n }\n getField(cName) {\n const field = this._getField(cName);\n if (!field) {\n return null;\n }\n return field.wrapped;\n }\n _getChildren(fieldName) {\n const len = fieldName.length;\n const children = [];\n const pattern = /^\\.[^.]+$/;\n for (const [name, field] of this._fields.entries()) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (pattern.test(finalPart)) {\n children.push(field);\n }\n }\n }\n return children;\n }\n _getTerminalChildren(fieldName) {\n const children = [];\n const len = fieldName.length;\n for (const [name, field] of this._fields.entries()) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (field.obj._hasValue && (finalPart === "" || finalPart.startsWith("."))) {\n children.push(field.wrapped);\n }\n }\n }\n return children;\n }\n getIcon() {}\n getLegalWarnings() {}\n getLinks() {}\n getNthFieldName(nIndex) {\n if (nIndex && typeof nIndex === "object") {\n nIndex = nIndex.nIndex;\n }\n if (typeof nIndex !== "number") {\n throw new TypeError("Invalid field index: must be a number");\n }\n if (0 <= nIndex && nIndex < this.numFields) {\n return this._fieldNames[Math.trunc(nIndex)];\n }\n return null;\n }\n getNthTemplate() {\n return null;\n }\n getOCGs() {}\n getOCGOrder() {}\n getPageBox() {}\n getPageLabel() {}\n getPageNthWord() {}\n getPageNthWordQuads() {}\n getPageNumWords() {}\n getPageRotation() {}\n getPageTransition() {}\n getPrintParams() {\n return this._printParams || (this._printParams = new _print_params.PrintParams({\n lastPage: this._numPages - 1\n }));\n }\n getSound() {}\n getTemplate() {}\n getURL() {}\n gotoNamedDest() {}\n importAnFDF() {}\n importAnXFDF() {}\n importDataObject() {}\n importIcon() {}\n importSound() {}\n importTextData() {}\n importXFAData() {}\n insertPages() {}\n mailDoc() {}\n mailForm() {}\n movePage() {}\n newPage() {}\n openDataObject() {}\n print() {\n let bUI = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n let nStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n let nEnd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n let bSilent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n let bShrinkToFit = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n let bPrintAsImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n let bReverse = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;\n let bAnnotations = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : true;\n let printParams = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;\n if (this._disablePrinting || !this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (bUI && typeof bUI === "object") {\n nStart = bUI.nStart;\n nEnd = bUI.nEnd;\n bSilent = bUI.bSilent;\n bShrinkToFit = bUI.bShrinkToFit;\n bPrintAsImage = bUI.bPrintAsImage;\n bReverse = bUI.bReverse;\n bAnnotations = bUI.bAnnotations;\n printParams = bUI.printParams;\n bUI = bUI.bUI;\n }\n if (printParams) {\n nStart = printParams.firstPage;\n nEnd = printParams.lastPage;\n }\n if (typeof nStart === "number") {\n nStart = Math.max(0, Math.trunc(nStart));\n } else {\n nStart = 0;\n }\n if (typeof nEnd === "number") {\n nEnd = Math.max(0, Math.trunc(nEnd));\n } else {\n nEnd = -1;\n }\n this._send({\n command: "print",\n start: nStart,\n end: nEnd\n });\n }\n removeDataObject() {}\n removeField() {}\n removeIcon() {}\n removeLinks() {}\n removeRequirement() {}\n removeScript() {}\n removeTemplate() {}\n removeThumbnails() {}\n removeWeblinks() {}\n replacePages() {}\n resetForm() {\n let aFields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (aFields && typeof aFields === "object") {\n aFields = aFields.aFields;\n }\n if (aFields && !Array.isArray(aFields)) {\n aFields = [aFields];\n }\n let mustCalculate = false;\n let fieldsToReset;\n if (aFields) {\n fieldsToReset = [];\n for (const fieldName of aFields) {\n if (!fieldName) {\n continue;\n }\n if (typeof fieldName !== "string") {\n fieldsToReset = null;\n break;\n }\n const field = this._getField(fieldName);\n if (!field) {\n continue;\n }\n fieldsToReset.push(field);\n mustCalculate = true;\n }\n }\n if (!fieldsToReset) {\n fieldsToReset = this._fields.values();\n mustCalculate = this._fields.size !== 0;\n }\n for (const field of fieldsToReset) {\n field.obj.value = field.obj.defaultValue;\n this._send({\n id: field.obj._id,\n siblings: field.obj._siblings,\n value: field.obj.defaultValue,\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n if (mustCalculate) {\n this.calculateNow();\n }\n }\n saveAs() {}\n scroll() {}\n selectPageNthWord() {}\n setAction() {}\n setDataObjectContents() {}\n setOCGOrder() {}\n setPageAction() {}\n setPageBoxes() {}\n setPageLabels() {}\n setPageRotations() {}\n setPageTabOrder() {}\n setPageTransitions() {}\n spawnPageFromTemplate() {}\n submitForm() {}\n syncAnnotScan() {}\n}\nexports.Doc = Doc;\n\n/***/ }),\n/* 12 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.PrintParams = void 0;\nclass PrintParams {\n constructor(data) {\n this.binaryOk = true;\n this.bitmapDPI = 150;\n this.booklet = {\n binding: 0,\n duplexMode: 0,\n subsetFrom: 0,\n subsetTo: -1\n };\n this.colorOverride = 0;\n this.colorProfile = "";\n this.constants = Object.freeze({\n bookletBindings: Object.freeze({\n Left: 0,\n Right: 1,\n LeftTall: 2,\n RightTall: 3\n }),\n bookletDuplexMode: Object.freeze({\n BothSides: 0,\n FrontSideOnly: 1,\n BasicSideOnly: 2\n }),\n colorOverrides: Object.freeze({\n auto: 0,\n gray: 1,\n mono: 2\n }),\n fontPolicies: Object.freeze({\n everyPage: 0,\n jobStart: 1,\n pageRange: 2\n }),\n handling: Object.freeze({\n none: 0,\n fit: 1,\n shrink: 2,\n tileAll: 3,\n tileLarge: 4,\n nUp: 5,\n booklet: 6\n }),\n interactionLevel: Object.freeze({\n automatic: 0,\n full: 1,\n silent: 2\n }),\n nUpPageOrders: Object.freeze({\n Horizontal: 0,\n HorizontalReversed: 1,\n Vertical: 2\n }),\n printContents: Object.freeze({\n doc: 0,\n docAndComments: 1,\n formFieldsOnly: 2\n }),\n flagValues: Object.freeze({\n applyOverPrint: 1,\n applySoftProofSettings: 1 << 1,\n applyWorkingColorSpaces: 1 << 2,\n emitHalftones: 1 << 3,\n emitPostScriptXObjects: 1 << 4,\n emitFormsAsPSForms: 1 << 5,\n maxJP2KRes: 1 << 6,\n setPageSize: 1 << 7,\n suppressBG: 1 << 8,\n suppressCenter: 1 << 9,\n suppressCJKFontSubst: 1 << 10,\n suppressCropClip: 1 << 1,\n suppressRotate: 1 << 12,\n suppressTransfer: 1 << 13,\n suppressUCR: 1 << 14,\n useTrapAnnots: 1 << 15,\n usePrintersMarks: 1 << 16\n }),\n rasterFlagValues: Object.freeze({\n textToOutline: 1,\n strokesToOutline: 1 << 1,\n allowComplexClip: 1 << 2,\n preserveOverprint: 1 << 3\n }),\n subsets: Object.freeze({\n all: 0,\n even: 1,\n odd: 2\n }),\n tileMarks: Object.freeze({\n none: 0,\n west: 1,\n east: 2\n }),\n usages: Object.freeze({\n auto: 0,\n use: 1,\n noUse: 2\n })\n });\n this.downloadFarEastFonts = false;\n this.fileName = "";\n this.firstPage = 0;\n this.flags = 0;\n this.fontPolicy = 0;\n this.gradientDPI = 150;\n this.interactive = 1;\n this.lastPage = data.lastPage;\n this.npUpAutoRotate = false;\n this.npUpNumPagesH = 2;\n this.npUpNumPagesV = 2;\n this.npUpPageBorder = false;\n this.npUpPageOrder = 0;\n this.pageHandling = 0;\n this.pageSubset = 0;\n this.printAsImage = false;\n this.printContent = 0;\n this.printerName = "";\n this.psLevel = 0;\n this.rasterFlags = 0;\n this.reversePages = false;\n this.tileLabel = false;\n this.tileMark = 0;\n this.tileOverlap = 0;\n this.tileScale = 1.0;\n this.transparencyLevel = 75;\n this.usePrinterCRD = 0;\n this.useT1Conversion = 0;\n }\n}\nexports.PrintParams = PrintParams;\n\n/***/ }),\n/* 13 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.FullScreen = void 0;\nvar _constants = __w_pdfjs_require__(2);\nvar _pdf_object = __w_pdfjs_require__(7);\nclass FullScreen extends _pdf_object.PDFObject {\n constructor(data) {\n super(data);\n this._backgroundColor = [];\n this._clickAdvances = true;\n this._cursor = _constants.Cursor.hidden;\n this._defaultTransition = "";\n this._escapeExits = true;\n this._isFullScreen = true;\n this._loop = false;\n this._timeDelay = 3600;\n this._usePageTiming = false;\n this._useTimer = false;\n }\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(_) {}\n get clickAdvances() {\n return this._clickAdvances;\n }\n set clickAdvances(_) {}\n get cursor() {\n return this._cursor;\n }\n set cursor(_) {}\n get defaultTransition() {\n return this._defaultTransition;\n }\n set defaultTransition(_) {}\n get escapeExits() {\n return this._escapeExits;\n }\n set escapeExits(_) {}\n get isFullScreen() {\n return this._isFullScreen;\n }\n set isFullScreen(_) {}\n get loop() {\n return this._loop;\n }\n set loop(_) {}\n get timeDelay() {\n return this._timeDelay;\n }\n set timeDelay(_) {}\n get transitions() {\n return ["Replace", "WipeRight", "WipeLeft", "WipeDown", "WipeUp", "SplitHorizontalIn", "SplitHorizontalOut", "SplitVerticalIn", "SplitVerticalOut", "BlindsHorizontal", "BlindsVertical", "BoxIn", "BoxOut", "GlitterRight", "GlitterDown", "GlitterRightDown", "Dissolve", "Random"];\n }\n set transitions(_) {\n throw new Error("fullscreen.transitions is read-only");\n }\n get usePageTiming() {\n return this._usePageTiming;\n }\n set usePageTiming(_) {}\n get useTimer() {\n return this._useTimer;\n }\n set useTimer(_) {}\n}\nexports.FullScreen = FullScreen;\n\n/***/ }),\n/* 14 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.Thermometer = void 0;\nvar _pdf_object = __w_pdfjs_require__(7);\nclass Thermometer extends _pdf_object.PDFObject {\n constructor(data) {\n super(data);\n this._cancelled = false;\n this._duration = 100;\n this._text = "";\n this._value = 0;\n }\n get cancelled() {\n return this._cancelled;\n }\n set cancelled(_) {\n throw new Error("thermometer.cancelled is read-only");\n }\n get duration() {\n return this._duration;\n }\n set duration(val) {\n this._duration = val;\n }\n get text() {\n return this._text;\n }\n set text(val) {\n this._text = val;\n }\n get value() {\n return this._value;\n }\n set value(val) {\n this._value = val;\n }\n begin() {}\n end() {}\n}\nexports.Thermometer = Thermometer;\n\n/***/ }),\n/* 15 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.Console = void 0;\nvar _pdf_object = __w_pdfjs_require__(7);\nclass Console extends _pdf_object.PDFObject {\n clear() {\n this._send({\n id: "clear"\n });\n }\n hide() {}\n println(msg) {\n if (typeof msg === "string") {\n this._send({\n command: "println",\n value: "PDF.js Console:: " + msg\n });\n }\n }\n show() {}\n}\nexports.Console = Console;\n\n/***/ }),\n/* 16 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.ProxyHandler = void 0;\nclass ProxyHandler {\n constructor() {\n this.nosend = new Set(["delay"]);\n }\n get(obj, prop) {\n if (prop in obj._expandos) {\n const val = obj._expandos[prop];\n if (typeof val === "function") {\n return val.bind(obj);\n }\n return val;\n }\n if (typeof prop === "string" && !prop.startsWith("_") && prop in obj) {\n const val = obj[prop];\n if (typeof val === "function") {\n return val.bind(obj);\n }\n return val;\n }\n return undefined;\n }\n set(obj, prop, value) {\n if (obj._kidIds) {\n obj._kidIds.forEach(id => {\n obj._appObjects[id].wrapped[prop] = value;\n });\n }\n if (typeof prop === "string" && !prop.startsWith("_") && prop in obj) {\n const old = obj[prop];\n obj[prop] = value;\n if (!this.nosend.has(prop) && obj._send && obj._id !== null && typeof old !== "function") {\n const data = {\n id: obj._id\n };\n data[prop] = obj[prop];\n if (!obj._siblings) {\n obj._send(data);\n } else {\n data.siblings = obj._siblings;\n obj._send(data);\n }\n }\n } else {\n obj._expandos[prop] = value;\n }\n return true;\n }\n has(obj, prop) {\n return prop in obj._expandos || typeof prop === "string" && !prop.startsWith("_") && prop in obj;\n }\n getPrototypeOf(obj) {\n return null;\n }\n setPrototypeOf(obj, proto) {\n return false;\n }\n isExtensible(obj) {\n return true;\n }\n preventExtensions(obj) {\n return false;\n }\n getOwnPropertyDescriptor(obj, prop) {\n if (prop in obj._expandos) {\n return {\n configurable: true,\n enumerable: true,\n value: obj._expandos[prop]\n };\n }\n if (typeof prop === "string" && !prop.startsWith("_") && prop in obj) {\n return {\n configurable: true,\n enumerable: true,\n value: obj[prop]\n };\n }\n return undefined;\n }\n defineProperty(obj, key, descriptor) {\n Object.defineProperty(obj._expandos, key, descriptor);\n return true;\n }\n deleteProperty(obj, prop) {\n if (prop in obj._expandos) {\n delete obj._expandos[prop];\n }\n }\n ownKeys(obj) {\n const fromExpandos = Reflect.ownKeys(obj._expandos);\n const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith("_"));\n return fromExpandos.concat(fromObj);\n }\n}\nexports.ProxyHandler = ProxyHandler;\n\n/***/ }),\n/* 17 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nexports.Util = void 0;\nvar _pdf_object = __w_pdfjs_require__(7);\nclass Util extends _pdf_object.PDFObject {\n constructor(data) {\n super(data);\n this._scandCache = new Map();\n this._months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];\n this._days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\n this.MILLISECONDS_IN_DAY = 86400000;\n this.MILLISECONDS_IN_WEEK = 604800000;\n this._externalCall = data.externalCall;\n }\n printf() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (args.length === 0) {\n throw new Error("Invalid number of params in printf");\n }\n if (typeof args[0] !== "string") {\n throw new TypeError("First argument of printf must be a string");\n }\n const pattern = /%(,[0-4])?([+ 0#]+)?(\\d+)?(\\.\\d+)?(.)/g;\n const PLUS = 1;\n const SPACE = 2;\n const ZERO = 4;\n const HASH = 8;\n let i = 0;\n return args[0].replace(pattern, function (match, nDecSep, cFlags, nWidth, nPrecision, cConvChar) {\n if (cConvChar !== "d" && cConvChar !== "f" && cConvChar !== "s" && cConvChar !== "x") {\n const buf = ["%"];\n for (const str of [nDecSep, cFlags, nWidth, nPrecision, cConvChar]) {\n if (str) {\n buf.push(str);\n }\n }\n return buf.join("");\n }\n i++;\n if (i === args.length) {\n throw new Error("Not enough arguments in printf");\n }\n const arg = args[i];\n if (cConvChar === "s") {\n return arg.toString();\n }\n let flags = 0;\n if (cFlags) {\n for (const flag of cFlags) {\n switch (flag) {\n case "+":\n flags |= PLUS;\n break;\n case " ":\n flags |= SPACE;\n break;\n case "0":\n flags |= ZERO;\n break;\n case "#":\n flags |= HASH;\n break;\n }\n }\n }\n cFlags = flags;\n if (nWidth) {\n nWidth = parseInt(nWidth);\n }\n let intPart = Math.trunc(arg);\n if (cConvChar === "x") {\n let hex = Math.abs(intPart).toString(16).toUpperCase();\n if (nWidth !== undefined) {\n hex = hex.padStart(nWidth, cFlags & ZERO ? "0" : " ");\n }\n if (cFlags & HASH) {\n hex = `0x${hex}`;\n }\n return hex;\n }\n if (nPrecision) {\n nPrecision = parseInt(nPrecision.substring(1));\n }\n nDecSep = nDecSep ? nDecSep.substring(1) : "0";\n const separators = {\n 0: [",", "."],\n 1: ["", "."],\n 2: [".", ","],\n 3: ["", ","],\n 4: ["\'", "."]\n };\n const [thousandSep, decimalSep] = separators[nDecSep];\n let decPart = "";\n if (cConvChar === "f") {\n if (nPrecision !== undefined) {\n decPart = Math.abs(arg - intPart).toFixed(nPrecision);\n } else {\n decPart = Math.abs(arg - intPart).toString();\n }\n if (decPart.length > 2) {\n decPart = `${decimalSep}${decPart.substring(2)}`;\n } else {\n if (decPart === "1") {\n intPart += Math.sign(arg);\n }\n decPart = cFlags & HASH ? "." : "";\n }\n }\n let sign = "";\n if (intPart < 0) {\n sign = "-";\n intPart = -intPart;\n } else if (cFlags & PLUS) {\n sign = "+";\n } else if (cFlags & SPACE) {\n sign = " ";\n }\n if (thousandSep && intPart >= 1000) {\n const buf = [];\n while (true) {\n buf.push((intPart % 1000).toString().padStart(3, "0"));\n intPart = Math.trunc(intPart / 1000);\n if (intPart < 1000) {\n buf.push(intPart.toString());\n break;\n }\n }\n intPart = buf.reverse().join(thousandSep);\n } else {\n intPart = intPart.toString();\n }\n let n = `${intPart}${decPart}`;\n if (nWidth !== undefined) {\n n = n.padStart(nWidth - sign.length, cFlags & ZERO ? "0" : " ");\n }\n return `${sign}${n}`;\n });\n }\n iconStreamFromIcon() {}\n printd(cFormat, oDate) {\n switch (cFormat) {\n case 0:\n return this.printd("D:yyyymmddHHMMss", oDate);\n case 1:\n return this.printd("yyyy.mm.dd HH:MM:ss", oDate);\n case 2:\n return this.printd("m/d/yy h:MM:ss tt", oDate);\n }\n const handlers = {\n mmmm: data => {\n return this._months[data.month];\n },\n mmm: data => {\n return this._months[data.month].substring(0, 3);\n },\n mm: data => {\n return (data.month + 1).toString().padStart(2, "0");\n },\n m: data => {\n return (data.month + 1).toString();\n },\n dddd: data => {\n return this._days[data.dayOfWeek];\n },\n ddd: data => {\n return this._days[data.dayOfWeek].substring(0, 3);\n },\n dd: data => {\n return data.day.toString().padStart(2, "0");\n },\n d: data => {\n return data.day.toString();\n },\n yyyy: data => {\n return data.year.toString();\n },\n yy: data => {\n return (data.year % 100).toString().padStart(2, "0");\n },\n HH: data => {\n return data.hours.toString().padStart(2, "0");\n },\n H: data => {\n return data.hours.toString();\n },\n hh: data => {\n return (1 + (data.hours + 11) % 12).toString().padStart(2, "0");\n },\n h: data => {\n return (1 + (data.hours + 11) % 12).toString();\n },\n MM: data => {\n return data.minutes.toString().padStart(2, "0");\n },\n M: data => {\n return data.minutes.toString();\n },\n ss: data => {\n return data.seconds.toString().padStart(2, "0");\n },\n s: data => {\n return data.seconds.toString();\n },\n tt: data => {\n return data.hours < 12 ? "am" : "pm";\n },\n t: data => {\n return data.hours < 12 ? "a" : "p";\n }\n };\n const data = {\n year: oDate.getFullYear(),\n month: oDate.getMonth(),\n day: oDate.getDate(),\n dayOfWeek: oDate.getDay(),\n hours: oDate.getHours(),\n minutes: oDate.getMinutes(),\n seconds: oDate.getSeconds()\n };\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\.)/g;\n return cFormat.replace(patterns, function (match, pattern) {\n if (pattern in handlers) {\n return handlers[pattern](data);\n }\n return pattern.charCodeAt(1);\n });\n }\n printx(cFormat, cSource) {\n cSource = (cSource ?? "").toString();\n const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\n const buf = [];\n let i = 0;\n const ii = cSource.length;\n let currCase = handlers[0];\n let escaped = false;\n for (const command of cFormat) {\n if (escaped) {\n buf.push(command);\n escaped = false;\n continue;\n }\n if (i >= ii) {\n break;\n }\n switch (command) {\n case "?":\n buf.push(currCase(cSource.charAt(i++)));\n break;\n case "X":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if ("a" <= char && char <= "z" || "A" <= char && char <= "Z" || "0" <= char && char <= "9") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case "A":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if ("a" <= char && char <= "z" || "A" <= char && char <= "Z") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case "9":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if ("0" <= char && char <= "9") {\n buf.push(char);\n break;\n }\n }\n break;\n case "*":\n while (i < ii) {\n buf.push(currCase(cSource.charAt(i++)));\n }\n break;\n case "\\\\":\n escaped = true;\n break;\n case ">":\n currCase = handlers[1];\n break;\n case "<":\n currCase = handlers[2];\n break;\n case "=":\n currCase = handlers[0];\n break;\n default:\n buf.push(command);\n }\n }\n return buf.join("");\n }\n scand(cFormat, cDate) {\n if (typeof cDate !== "string") {\n return new Date(cDate);\n }\n if (cDate === "") {\n return new Date();\n }\n switch (cFormat) {\n case 0:\n return this.scand("D:yyyymmddHHMMss", cDate);\n case 1:\n return this.scand("yyyy.mm.dd HH:MM:ss", cDate);\n case 2:\n return this.scand("m/d/yy h:MM:ss tt", cDate);\n }\n if (!this._scandCache.has(cFormat)) {\n const months = this._months;\n const days = this._days;\n const handlers = {\n mmmm: {\n pattern: `(${months.join("|")})`,\n action: (value, data) => {\n data.month = months.indexOf(value);\n }\n },\n mmm: {\n pattern: `(${months.map(month => month.substring(0, 3)).join("|")})`,\n action: (value, data) => {\n data.month = months.findIndex(month => month.substring(0, 3) === value);\n }\n },\n mm: {\n pattern: `(\\\\d{2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n m: {\n pattern: `(\\\\d{1,2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n dddd: {\n pattern: `(${days.join("|")})`,\n action: (value, data) => {\n data.day = days.indexOf(value);\n }\n },\n ddd: {\n pattern: `(${days.map(day => day.substring(0, 3)).join("|")})`,\n action: (value, data) => {\n data.day = days.findIndex(day => day.substring(0, 3) === value);\n }\n },\n dd: {\n pattern: "(\\\\d{2})",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n d: {\n pattern: "(\\\\d{1,2})",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n yyyy: {\n pattern: "(\\\\d{4})",\n action: (value, data) => {\n data.year = parseInt(value);\n }\n },\n yy: {\n pattern: "(\\\\d{2})",\n action: (value, data) => {\n data.year = 2000 + parseInt(value);\n }\n },\n HH: {\n pattern: "(\\\\d{2})",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n H: {\n pattern: "(\\\\d{1,2})",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n hh: {\n pattern: "(\\\\d{2})",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n h: {\n pattern: "(\\\\d{1,2})",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n MM: {\n pattern: "(\\\\d{2})",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n M: {\n pattern: "(\\\\d{1,2})",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n ss: {\n pattern: "(\\\\d{2})",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n s: {\n pattern: "(\\\\d{1,2})",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n tt: {\n pattern: "([aApP][mM])",\n action: (value, data) => {\n const char = value.charAt(0);\n data.am = char === "a" || char === "A";\n }\n },\n t: {\n pattern: "([aApP])",\n action: (value, data) => {\n data.am = value === "a" || value === "A";\n }\n }\n };\n const escapedFormat = cFormat.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, "\\\\$&");\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\n const actions = [];\n const re = escapedFormat.replace(patterns, function (match, patternElement) {\n const {\n pattern,\n action\n } = handlers[patternElement];\n actions.push(action);\n return pattern;\n });\n this._scandCache.set(cFormat, [re, actions]);\n }\n const [re, actions] = this._scandCache.get(cFormat);\n const matches = new RegExp(`^${re}$`, "g").exec(cDate);\n if (!matches || matches.length !== actions.length + 1) {\n return null;\n }\n const data = {\n year: 2000,\n month: 0,\n day: 1,\n hours: 0,\n minutes: 0,\n seconds: 0,\n am: null\n };\n actions.forEach((action, i) => action(matches[i + 1], data));\n if (data.am !== null) {\n data.hours = data.hours % 12 + (data.am ? 0 : 12);\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n spansToXML() {}\n stringFromStream() {}\n xmlToSpans() {}\n}\nexports.Util = Util;\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\nvar exports = __webpack_exports__;\n\n\nObject.defineProperty(exports, "__esModule", ({\n value: true\n}));\nObject.defineProperty(exports, "initSandbox", ({\n enumerable: true,\n get: function () {\n return _initialization.initSandbox;\n }\n}));\nvar _initialization = __w_pdfjs_require__(1);\nconst pdfjsVersion = \'3.2.146\';\nconst pdfjsBuild = \'3fd2a3548\';\n})();\n\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});']; + code.push("delete dump;"); + let success = false; + let buf = 0; + try { + const sandboxData = JSON.stringify(data); + code.push(`pdfjsScripting.initSandbox({ data: ${sandboxData} })`); + buf = this._module.stringToNewUTF8(code.join("\n")); + success = !!this._module.ccall("init", "number", ["number", "number"], [buf, this._alertOnError]); + } catch (error) { + console.error(error); + } finally { + if (buf) { + this._module.ccall("free", "number", ["number"], [buf]); + } + } + if (success) { + this.support.commFun = this._module.cwrap("commFun", null, ["string", "string"]); + } else { + this.nukeSandbox(); + throw new Error("Cannot start sandbox"); + } + } + dispatchEvent(event) { + var _this$support; + (_this$support = this.support) === null || _this$support === void 0 ? void 0 : _this$support.callSandboxFunction("dispatchEvent", event); + } + dumpMemoryUse() { + if (this._module) { + this._module.ccall("dumpMemoryUse", null, []); + } + } + nukeSandbox() { + if (this._module !== null) { + this.support.destroy(); + this.support = null; + this._module.ccall("nukeSandbox", null, []); + this._module = null; + } + } + evalForTesting(code, key) { + throw new Error("Not implemented: evalForTesting"); + } +} +function QuickJSSandbox() { + return (0, _quickjsEval.default)().then(module => { + return new Sandbox(window, module); + }); +} +})(); + +/******/ return __webpack_exports__; +/******/ })() +; +}); +//# sourceMappingURL=pdf.sandbox.js.map \ No newline at end of file diff --git a/src/assets/pdf-annotation/build/pdf.worker.js b/src/assets/pdf-annotation/build/pdf.worker.js new file mode 100755 index 0000000..2a3d856 --- /dev/null +++ b/src/assets/pdf-annotation/build/pdf.worker.js @@ -0,0 +1,68205 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2022 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define("pdfjs-dist/build/pdf.worker", [], factory); + else if(typeof exports === 'object') + exports["pdfjs-dist/build/pdf.worker"] = factory(); + else + root["pdfjs-dist/build/pdf.worker"] = root.pdfjsWorker = factory(); +})(globalThis, () => { +return /******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.WorkerTask = exports.WorkerMessageHandler = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _core_utils = __w_pdfjs_require__(135); +var _pdf_manager = __w_pdfjs_require__(137); +var _cleanup_helper = __w_pdfjs_require__(200); +var _writer = __w_pdfjs_require__(194); +var _is_node = __w_pdfjs_require__(4); +var _message_handler = __w_pdfjs_require__(231); +var _worker_stream = __w_pdfjs_require__(232); +class WorkerTask { + constructor(name) { + this.name = name; + this.terminated = false; + this._capability = (0, _util.createPromiseCapability)(); + } + get finished() { + return this._capability.promise; + } + finish() { + this._capability.resolve(); + } + terminate() { + this.terminated = true; + } + ensureNotTerminated() { + if (this.terminated) { + throw new Error("Worker task was terminated"); + } + } +} +exports.WorkerTask = WorkerTask; +class WorkerMessageHandler { + static setup(handler, port) { + let testMessageProcessed = false; + handler.on("test", function (data) { + if (testMessageProcessed) { + return; + } + testMessageProcessed = true; + handler.send("test", data instanceof Uint8Array); + }); + handler.on("configure", function (data) { + (0, _util.setVerbosityLevel)(data.verbosity); + }); + handler.on("GetDocRequest", function (data) { + return WorkerMessageHandler.createDocumentHandler(data, port); + }); + } + static createDocumentHandler(docParams, port) { + let pdfManager; + let terminated = false; + let cancelXHRs = null; + const WorkerTasks = []; + const verbosity = (0, _util.getVerbosityLevel)(); + const { + docId, + apiVersion + } = docParams; + const workerVersion = '3.2.146'; + if (apiVersion !== workerVersion) { + throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); + } + const enumerableProperties = []; + for (const property in []) { + enumerableProperties.push(property); + } + if (enumerableProperties.length) { + throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s."); + } + if (typeof ReadableStream === "undefined") { + const partialMsg = "The browser/environment lacks native support for critical " + "functionality used by the PDF.js library (e.g. `ReadableStream`); "; + if (_is_node.isNodeJS) { + throw new Error(partialMsg + "please use a `legacy`-build instead."); + } + throw new Error(partialMsg + "please update to a supported browser."); + } + const workerHandlerName = docId + "_worker"; + let handler = new _message_handler.MessageHandler(workerHandlerName, docId, port); + function ensureNotTerminated() { + if (terminated) { + throw new Error("Worker was terminated"); + } + } + function startWorkerTask(task) { + WorkerTasks.push(task); + } + function finishWorkerTask(task) { + task.finish(); + const i = WorkerTasks.indexOf(task); + WorkerTasks.splice(i, 1); + } + async function loadDocument(recoveryMode) { + await pdfManager.ensureDoc("checkHeader"); + await pdfManager.ensureDoc("parseStartXRef"); + await pdfManager.ensureDoc("parse", [recoveryMode]); + await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]); + await pdfManager.ensureDoc("checkLastPage", [recoveryMode]); + const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); + if (isPureXfa) { + const task = new WorkerTask("loadXfaFonts"); + startWorkerTask(task); + await Promise.all([pdfManager.loadXfaFonts(handler, task).catch(reason => {}).then(() => finishWorkerTask(task)), pdfManager.loadXfaImages()]); + } + const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]); + const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null; + return { + numPages, + fingerprints, + htmlForXfa + }; + } + function getPdfManager(_ref) { + let { + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions + } = _ref; + const pdfManagerCapability = (0, _util.createPromiseCapability)(); + let newPdfManager; + if (data) { + try { + newPdfManager = new _pdf_manager.LocalPdfManager(docId, data, password, handler, evaluatorOptions, enableXfa, docBaseUrl); + pdfManagerCapability.resolve(newPdfManager); + } catch (ex) { + pdfManagerCapability.reject(ex); + } + return pdfManagerCapability.promise; + } + let pdfStream, + cachedChunks = []; + try { + pdfStream = new _worker_stream.PDFWorkerStream(handler); + } catch (ex) { + pdfManagerCapability.reject(ex); + return pdfManagerCapability.promise; + } + const fullRequest = pdfStream.getFullReader(); + fullRequest.headersReady.then(function () { + if (!fullRequest.isRangeSupported) { + return; + } + disableAutoFetch = disableAutoFetch || fullRequest.isStreamingSupported; + newPdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, { + msgHandler: handler, + password, + length: fullRequest.contentLength, + disableAutoFetch, + rangeChunkSize + }, evaluatorOptions, enableXfa, docBaseUrl); + for (const chunk of cachedChunks) { + newPdfManager.sendProgressiveData(chunk); + } + cachedChunks = []; + pdfManagerCapability.resolve(newPdfManager); + cancelXHRs = null; + }).catch(function (reason) { + pdfManagerCapability.reject(reason); + cancelXHRs = null; + }); + let loaded = 0; + const flushChunks = function () { + const pdfFile = (0, _util.arraysToBytes)(cachedChunks); + if (length && pdfFile.length !== length) { + (0, _util.warn)("reported HTTP length is different from actual"); + } + try { + newPdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, password, handler, evaluatorOptions, enableXfa, docBaseUrl); + pdfManagerCapability.resolve(newPdfManager); + } catch (ex) { + pdfManagerCapability.reject(ex); + } + cachedChunks = []; + }; + new Promise(function (resolve, reject) { + const readChunk = function (_ref2) { + let { + value, + done + } = _ref2; + try { + ensureNotTerminated(); + if (done) { + if (!newPdfManager) { + flushChunks(); + } + cancelXHRs = null; + return; + } + loaded += (0, _util.arrayByteLength)(value); + if (!fullRequest.isStreamingSupported) { + handler.send("DocProgress", { + loaded, + total: Math.max(loaded, fullRequest.contentLength || 0) + }); + } + if (newPdfManager) { + newPdfManager.sendProgressiveData(value); + } else { + cachedChunks.push(value); + } + fullRequest.read().then(readChunk, reject); + } catch (e) { + reject(e); + } + }; + fullRequest.read().then(readChunk, reject); + }).catch(function (e) { + pdfManagerCapability.reject(e); + cancelXHRs = null; + }); + cancelXHRs = function (reason) { + pdfStream.cancelAllRequests(reason); + }; + return pdfManagerCapability.promise; + } + function setupDoc(data) { + function onSuccess(doc) { + ensureNotTerminated(); + handler.send("GetDoc", { + pdfInfo: doc + }); + } + function onFailure(ex) { + ensureNotTerminated(); + if (ex instanceof _util.PasswordException) { + const task = new WorkerTask(`PasswordException: response ${ex.code}`); + startWorkerTask(task); + handler.sendWithPromise("PasswordRequest", ex).then(function (_ref3) { + let { + password + } = _ref3; + finishWorkerTask(task); + pdfManager.updatePassword(password); + pdfManagerReady(); + }).catch(function () { + finishWorkerTask(task); + handler.send("DocException", ex); + }); + } else if (ex instanceof _util.InvalidPDFException || ex instanceof _util.MissingPDFException || ex instanceof _util.UnexpectedResponseException || ex instanceof _util.UnknownErrorException) { + handler.send("DocException", ex); + } else { + handler.send("DocException", new _util.UnknownErrorException(ex.message, ex.toString())); + } + } + function pdfManagerReady() { + ensureNotTerminated(); + loadDocument(false).then(onSuccess, function (reason) { + ensureNotTerminated(); + if (!(reason instanceof _core_utils.XRefParseException)) { + onFailure(reason); + return; + } + pdfManager.requestLoadedStream().then(function () { + ensureNotTerminated(); + loadDocument(true).then(onSuccess, onFailure); + }); + }); + } + ensureNotTerminated(); + getPdfManager(data).then(function (newPdfManager) { + if (terminated) { + newPdfManager.terminate(new _util.AbortException("Worker was terminated.")); + throw new Error("Worker was terminated"); + } + pdfManager = newPdfManager; + pdfManager.requestLoadedStream(true).then(stream => { + handler.send("DataLoaded", { + length: stream.bytes.byteLength + }); + }); + }).then(pdfManagerReady, onFailure); + } + handler.on("GetPage", function (data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + return Promise.all([pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "view")]).then(function (_ref4) { + let [rotate, ref, userUnit, view] = _ref4; + return { + rotate, + ref, + userUnit, + view + }; + }); + }); + }); + handler.on("GetPageIndex", function (data) { + const pageRef = _primitives.Ref.get(data.num, data.gen); + return pdfManager.ensureCatalog("getPageIndex", [pageRef]); + }); + handler.on("GetDestinations", function (data) { + return pdfManager.ensureCatalog("destinations"); + }); + handler.on("GetDestination", function (data) { + return pdfManager.ensureCatalog("getDestination", [data.id]); + }); + handler.on("GetPageLabels", function (data) { + return pdfManager.ensureCatalog("pageLabels"); + }); + handler.on("GetPageLayout", function (data) { + return pdfManager.ensureCatalog("pageLayout"); + }); + handler.on("GetPageMode", function (data) { + return pdfManager.ensureCatalog("pageMode"); + }); + handler.on("GetViewerPreferences", function (data) { + return pdfManager.ensureCatalog("viewerPreferences"); + }); + handler.on("GetOpenAction", function (data) { + return pdfManager.ensureCatalog("openAction"); + }); + handler.on("GetAttachments", function (data) { + return pdfManager.ensureCatalog("attachments"); + }); + handler.on("GetJavaScript", function (data) { + return pdfManager.ensureCatalog("javaScript"); + }); + handler.on("GetDocJSActions", function (data) { + return pdfManager.ensureCatalog("jsActions"); + }); + handler.on("GetPageJSActions", function (_ref5) { + let { + pageIndex + } = _ref5; + return pdfManager.getPage(pageIndex).then(function (page) { + return pdfManager.ensure(page, "jsActions"); + }); + }); + handler.on("GetOutline", function (data) { + return pdfManager.ensureCatalog("documentOutline"); + }); + handler.on("GetOptionalContentConfig", function (data) { + return pdfManager.ensureCatalog("optionalContentConfig"); + }); + handler.on("GetPermissions", function (data) { + return pdfManager.ensureCatalog("permissions"); + }); + handler.on("GetMetadata", function (data) { + return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]); + }); + handler.on("GetMarkInfo", function (data) { + return pdfManager.ensureCatalog("markInfo"); + }); + handler.on("GetData", function (data) { + return pdfManager.requestLoadedStream().then(function (stream) { + return stream.bytes; + }); + }); + handler.on("GetAnnotations", function (_ref6) { + let { + pageIndex, + intent + } = _ref6; + return pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); + startWorkerTask(task); + return page.getAnnotationsData(handler, task, intent).then(data => { + finishWorkerTask(task); + return data; + }, reason => { + finishWorkerTask(task); + }); + }); + }); + handler.on("GetFieldObjects", function (data) { + return pdfManager.ensureDoc("fieldObjects"); + }); + handler.on("HasJSActions", function (data) { + return pdfManager.ensureDoc("hasJSActions"); + }); + handler.on("GetCalculationOrderIds", function (data) { + return pdfManager.ensureDoc("calculationOrderIds"); + }); + handler.on("SaveDocument", function (_ref7) { + let { + isPureXfa, + numPages, + annotationStorage, + filename + } = _ref7; + const promises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("startXRef")]; + const newAnnotationsByPage = !isPureXfa ? (0, _core_utils.getNewAnnotationsMap)(annotationStorage) : null; + if (newAnnotationsByPage) { + for (const [pageIndex, annotations] of newAnnotationsByPage) { + promises.push(pdfManager.getPage(pageIndex).then(page => { + const task = new WorkerTask(`Save (editor): page ${pageIndex}`); + return page.saveNewAnnotations(handler, task, annotations).finally(function () { + finishWorkerTask(task); + }); + })); + } + } + if (isPureXfa) { + promises.push(pdfManager.serializeXfaData(annotationStorage)); + } else { + for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { + promises.push(pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`Save: page ${pageIndex}`); + return page.save(handler, task, annotationStorage).finally(function () { + finishWorkerTask(task); + }); + })); + } + } + return Promise.all(promises).then(function (_ref8) { + let [stream, acroForm, acroFormRef, xref, startXRef, ...refs] = _ref8; + let newRefs = []; + let xfaData = null; + if (isPureXfa) { + xfaData = refs[0]; + if (!xfaData) { + return stream.bytes; + } + } else { + newRefs = refs.flat(2); + if (newRefs.length === 0) { + return stream.bytes; + } + } + const needAppearances = acroFormRef && acroForm instanceof _primitives.Dict && newRefs.some(ref => ref.needAppearances); + const xfa = acroForm instanceof _primitives.Dict && acroForm.get("XFA") || null; + let xfaDatasetsRef = null; + let hasXfaDatasetsEntry = false; + if (Array.isArray(xfa)) { + for (let i = 0, ii = xfa.length; i < ii; i += 2) { + if (xfa[i] === "datasets") { + xfaDatasetsRef = xfa[i + 1]; + hasXfaDatasetsEntry = true; + } + } + if (xfaDatasetsRef === null) { + xfaDatasetsRef = xref.getNewTemporaryRef(); + } + } else if (xfa) { + (0, _util.warn)("Unsupported XFA type."); + } + let newXrefInfo = Object.create(null); + if (xref.trailer) { + const infoObj = Object.create(null); + const xrefInfo = xref.trailer.get("Info") || null; + if (xrefInfo instanceof _primitives.Dict) { + xrefInfo.forEach((key, value) => { + if (typeof value === "string") { + infoObj[key] = (0, _util.stringToPDFString)(value); + } + }); + } + newXrefInfo = { + rootRef: xref.trailer.getRaw("Root") || null, + encryptRef: xref.trailer.getRaw("Encrypt") || null, + newRef: xref.getNewTemporaryRef(), + infoRef: xref.trailer.getRaw("Info") || null, + info: infoObj, + fileIds: xref.trailer.get("ID") || null, + startXRef, + filename + }; + } + try { + return (0, _writer.incrementalUpdate)({ + originalData: stream.bytes, + xrefInfo: newXrefInfo, + newRefs, + xref, + hasXfa: !!xfa, + xfaDatasetsRef, + hasXfaDatasetsEntry, + needAppearances, + acroFormRef, + acroForm, + xfaData + }); + } finally { + xref.resetNewTemporaryRef(); + } + }); + }); + handler.on("GetOperatorList", function (data, sink) { + const pageIndex = data.pageIndex; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); + startWorkerTask(task); + const start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0; + page.getOperatorList({ + handler, + sink, + task, + intent: data.intent, + cacheKey: data.cacheKey, + annotationStorage: data.annotationStorage + }).then(function (operatorListInfo) { + finishWorkerTask(task); + if (start) { + (0, _util.info)(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`); + } + sink.close(); + }, function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }); + }); + }); + handler.on("GetTextContent", function (data, sink) { + const pageIndex = data.pageIndex; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask("GetTextContent: page " + pageIndex); + startWorkerTask(task); + const start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0; + page.extractTextContent({ + handler, + task, + sink, + includeMarkedContent: data.includeMarkedContent, + combineTextItems: data.combineTextItems + }).then(function () { + finishWorkerTask(task); + if (start) { + (0, _util.info)(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}ms`); + } + sink.close(); + }, function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }); + }); + }); + handler.on("GetStructTree", function (data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + return pdfManager.ensure(page, "getStructTree"); + }); + }); + handler.on("FontFallback", function (data) { + return pdfManager.fontFallback(data.id, handler); + }); + handler.on("Cleanup", function (data) { + return pdfManager.cleanup(true); + }); + handler.on("Terminate", function (data) { + terminated = true; + const waitOn = []; + if (pdfManager) { + pdfManager.terminate(new _util.AbortException("Worker was terminated.")); + const cleanupPromise = pdfManager.cleanup(); + waitOn.push(cleanupPromise); + pdfManager = null; + } else { + (0, _cleanup_helper.clearGlobalCaches)(); + } + if (cancelXHRs) { + cancelXHRs(new _util.AbortException("Worker was terminated.")); + } + for (const task of WorkerTasks) { + waitOn.push(task.finished); + task.terminate(); + } + return Promise.all(waitOn).then(function () { + handler.destroy(); + handler = null; + }); + }); + handler.on("Ready", function (data) { + setupDoc(docParams); + docParams = null; + }); + return workerHandlerName; + } + static initializeFromPort(port) { + const handler = new _message_handler.MessageHandler("worker", "main", port); + WorkerMessageHandler.setup(handler, port); + handler.send("ready", null); + } +} +exports.WorkerMessageHandler = WorkerMessageHandler; +function isMessagePort(maybePort) { + return typeof maybePort.postMessage === "function" && "onmessage" in maybePort; +} +if (typeof window === "undefined" && !_is_node.isNodeJS && typeof self !== "undefined" && isMessagePort(self)) { + WorkerMessageHandler.initializeFromPort(self); +} + +/***/ }), +/* 2 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.VerbosityLevel = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.UNSUPPORTED_FEATURES = exports.TextRenderingMode = exports.StreamType = exports.RenderingIntentFlag = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.LINE_FACTOR = exports.LINE_DESCENT_FACTOR = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FontType = exports.FeatureTest = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.BASELINE_FACTOR = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMode = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationEditorType = exports.AnnotationEditorPrefix = exports.AnnotationEditorParamsType = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; +exports.arrayByteLength = arrayByteLength; +exports.arraysToBytes = arraysToBytes; +exports.assert = assert; +exports.bytesToString = bytesToString; +exports.createPromiseCapability = createPromiseCapability; +exports.createValidAbsoluteUrl = createValidAbsoluteUrl; +exports.getModificationDate = getModificationDate; +exports.getVerbosityLevel = getVerbosityLevel; +exports.info = info; +exports.isArrayBuffer = isArrayBuffer; +exports.isArrayEqual = isArrayEqual; +exports.objectFromMap = objectFromMap; +exports.objectSize = objectSize; +exports.setVerbosityLevel = setVerbosityLevel; +exports.shadow = shadow; +exports.string32 = string32; +exports.stringToBytes = stringToBytes; +exports.stringToPDFString = stringToPDFString; +exports.stringToUTF8String = stringToUTF8String; +exports.unreachable = unreachable; +exports.utf8StringToString = utf8StringToString; +exports.warn = warn; +if (!globalThis._pdfjsCompatibilityChecked) { + globalThis._pdfjsCompatibilityChecked = true; + __w_pdfjs_require__(3); +} +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +exports.IDENTITY_MATRIX = IDENTITY_MATRIX; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; +const LINE_FACTOR = 1.35; +exports.LINE_FACTOR = LINE_FACTOR; +const LINE_DESCENT_FACTOR = 0.35; +exports.LINE_DESCENT_FACTOR = LINE_DESCENT_FACTOR; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +exports.BASELINE_FACTOR = BASELINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + OPLIST: 0x100 +}; +exports.RenderingIntentFlag = RenderingIntentFlag; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +exports.AnnotationMode = AnnotationMode; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +exports.AnnotationEditorPrefix = AnnotationEditorPrefix; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + INK: 15 +}; +exports.AnnotationEditorType = AnnotationEditorType; +const AnnotationEditorParamsType = { + FREETEXT_SIZE: 1, + FREETEXT_COLOR: 2, + FREETEXT_OPACITY: 3, + INK_COLOR: 11, + INK_THICKNESS: 12, + INK_OPACITY: 13 +}; +exports.AnnotationEditorParamsType = AnnotationEditorParamsType; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +exports.PermissionFlag = PermissionFlag; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +exports.TextRenderingMode = TextRenderingMode; +const ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +exports.ImageKind = ImageKind; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +exports.AnnotationType = AnnotationType; +const AnnotationStateModelType = { + MARKED: "Marked", + REVIEW: "Review" +}; +exports.AnnotationStateModelType = AnnotationStateModelType; +const AnnotationMarkedState = { + MARKED: "Marked", + UNMARKED: "Unmarked" +}; +exports.AnnotationMarkedState = AnnotationMarkedState; +const AnnotationReviewState = { + ACCEPTED: "Accepted", + REJECTED: "Rejected", + CANCELLED: "Cancelled", + COMPLETED: "Completed", + NONE: "None" +}; +exports.AnnotationReviewState = AnnotationReviewState; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +exports.AnnotationReplyType = AnnotationReplyType; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +exports.AnnotationFlag = AnnotationFlag; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +exports.AnnotationFieldFlag = AnnotationFieldFlag; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +exports.AnnotationBorderStyleType = AnnotationBorderStyleType; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +exports.AnnotationActionEventType = AnnotationActionEventType; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +exports.DocumentActionEventType = DocumentActionEventType; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +exports.PageActionEventType = PageActionEventType; +const StreamType = { + UNKNOWN: "UNKNOWN", + FLATE: "FLATE", + LZW: "LZW", + DCT: "DCT", + JPX: "JPX", + JBIG: "JBIG", + A85: "A85", + AHX: "AHX", + CCF: "CCF", + RLX: "RLX" +}; +exports.StreamType = StreamType; +const FontType = { + UNKNOWN: "UNKNOWN", + TYPE1: "TYPE1", + TYPE1STANDARD: "TYPE1STANDARD", + TYPE1C: "TYPE1C", + CIDFONTTYPE0: "CIDFONTTYPE0", + CIDFONTTYPE0C: "CIDFONTTYPE0C", + TRUETYPE: "TRUETYPE", + CIDFONTTYPE2: "CIDFONTTYPE2", + TYPE3: "TYPE3", + OPENTYPE: "OPENTYPE", + TYPE0: "TYPE0", + MMTYPE1: "MMTYPE1" +}; +exports.FontType = FontType; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +exports.VerbosityLevel = VerbosityLevel; +const CMapCompressionType = { + NONE: 0, + BINARY: 1 +}; +exports.CMapCompressionType = CMapCompressionType; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91 +}; +exports.OPS = OPS; +const UNSUPPORTED_FEATURES = { + forms: "forms", + javaScript: "javaScript", + signatures: "signatures", + smask: "smask", + shadingPattern: "shadingPattern", + errorTilingPattern: "errorTilingPattern", + errorExtGState: "errorExtGState", + errorXObject: "errorXObject", + errorFontLoadType3: "errorFontLoadType3", + errorFontState: "errorFontState", + errorFontMissing: "errorFontMissing", + errorFontTranslate: "errorFontTranslate", + errorColorSpace: "errorColorSpace", + errorOperatorList: "errorOperatorList", + errorFontToUnicode: "errorFontToUnicode", + errorFontLoadNative: "errorFontLoadNative", + errorFontBuildPath: "errorFontBuildPath", + errorFontGetPath: "errorFontGetPath", + errorMarkedContent: "errorMarkedContent", + errorContentSubStream: "errorContentSubStream" +}; +exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +exports.PasswordResponses = PasswordResponses; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + if (!url) { + return false; + } + switch (url.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url) { + let baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots && dots.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch (ex) {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch (ex) {} + return null; +} +function shadow(obj, prop, value) { + // console.log('最终处理',prop); + let nonSerializable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + // console.log('最终处理结果',value); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + if (this.constructor === BaseException) { + unreachable("Cannot initialize BaseException."); + } + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +exports.BaseException = BaseException; +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +exports.PasswordException = PasswordException; +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +exports.UnknownErrorException = UnknownErrorException; +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +exports.InvalidPDFException = InvalidPDFException; +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); + } +} +exports.MissingPDFException = MissingPDFException; +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; + } +} +exports.UnexpectedResponseException = UnexpectedResponseException; +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +exports.FormatError = FormatError; +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +exports.AbortException = AbortException; +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes === null || bytes.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function arrayByteLength(arr) { + if (arr.length !== undefined) { + return arr.length; + } + if (arr.byteLength !== undefined) { + return arr.byteLength; + } + unreachable("Invalid argument for arrayByteLength"); +} +function arraysToBytes(arr) { + const length = arr.length; + if (length === 1 && arr[0] instanceof Uint8Array) { + return arr[0]; + } + let resultLength = 0; + for (let i = 0; i < length; i++) { + resultLength += arrayByteLength(arr[i]); + } + let pos = 0; + const data = new Uint8Array(resultLength); + for (let i = 0; i < length; i++) { + let item = arr[i]; + if (!(item instanceof Uint8Array)) { + if (typeof item === "string") { + item = stringToBytes(item); + } else { + item = new Uint8Array(item); + } + } + const itemLength = item.byteLength; + data.set(item, pos); + pos += itemLength; + } + return data; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function objectFromMap(map) { + const obj = Object.create(null); + for (const [key, value] of map) { + obj[key] = value; + } + return obj; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch (e) { + return false; + } +} +class FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get platform() { + if (typeof navigator === "undefined") { + return shadow(this, "platform", { + isWin: false, + isMac: false + }); + } + return shadow(this, "platform", { + isWin: navigator.platform.includes("Win"), + isMac: navigator.platform.includes("Mac") + }); + } +} +exports.FeatureTest = FeatureTest; +const hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + } + minMax[0] *= transform[0]; + minMax[1] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + } + minMax[2] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + } + minMax[2] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + } + minMax[0] *= transform[2]; + minMax[1] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[4]; + minMax[2] += transform[5]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; + } + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = Util.applyTransform(r, m); + const p2 = Util.applyTransform(r.slice(2, 4), m); + const p3 = Util.applyTransform([r[0], r[3]], m); + const p4 = Util.applyTransform([r[2], r[1]], m); + return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + const c = m[2] * transpose[0] + m[3] * transpose[2]; + const d = m[2] * transpose[1] + m[3] * transpose[3]; + const first = (a + d) / 2; + const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3) { + const tvalues = [], + bounds = [[], []]; + let a, b, c, t, t1, t2, b2ac, sqrtb2ac; + for (let i = 0; i < 2; ++i) { + if (i === 0) { + b = 6 * x0 - 12 * x1 + 6 * x2; + a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; + c = 3 * x1 - 3 * x0; + } else { + b = 6 * y0 - 12 * y1 + 6 * y2; + a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; + c = 3 * y1 - 3 * y0; + } + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) < 1e-12) { + continue; + } + t = -c / b; + if (0 < t && t < 1) { + tvalues.push(t); + } + continue; + } + b2ac = b * b - 4 * c * a; + sqrtb2ac = Math.sqrt(b2ac); + if (b2ac < 0) { + continue; + } + t1 = (-b + sqrtb2ac) / (2 * a); + if (0 < t1 && t1 < 1) { + tvalues.push(t1); + } + t2 = (-b - sqrtb2ac) / (2 * a); + if (0 < t2 && t2 < 1) { + tvalues.push(t2); + } + } + let j = tvalues.length, + mt; + const jlen = j; + while (j--) { + t = tvalues[j]; + mt = 1 - t; + bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3; + bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3; + } + bounds[0][jlen] = x0; + bounds[1][jlen] = y0; + bounds[0][jlen + 1] = x3; + bounds[1][jlen + 1] = y3; + bounds[0].length = bounds[1].length = jlen + 2; + return [Math.min(...bounds[0]), Math.min(...bounds[1]), Math.max(...bounds[0]), Math.max(...bounds[1])]; + } +} +exports.Util = Util; +const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + return decoder.decode(buffer); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const code = PDFStringTranslateTable[str.charCodeAt(i)]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayBuffer(v) { + return typeof v === "object" && v !== null && v.byteLength !== undefined; +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate() { + let date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date(); + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +function createPromiseCapability() { + const capability = Object.create(null); + let isSettled = false; + Object.defineProperty(capability, "settled", { + get() { + return isSettled; + } + }); + capability.promise = new Promise(function (resolve, reject) { + capability.resolve = function (data) { + isSettled = true; + resolve(data); + }; + capability.reject = function (reason) { + isSettled = true; + reject(reason); + }; + }); + return capability; +} + +/***/ }), +/* 3 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + + +var _is_node = __w_pdfjs_require__(4); +(function checkNodeBtoa() { + if (globalThis.btoa || !_is_node.isNodeJS) { + return; + } + globalThis.btoa = function (chars) { + return Buffer.from(chars, "binary").toString("base64"); + }; +})(); +(function checkNodeAtob() { + if (globalThis.atob || !_is_node.isNodeJS) { + return; + } + globalThis.atob = function (input) { + return Buffer.from(input, "base64").toString("binary"); + }; +})(); +(function checkDOMMatrix() { + if (globalThis.DOMMatrix || !_is_node.isNodeJS) { + return; + } + globalThis.DOMMatrix = require("canvas").DOMMatrix; +})(); +(function checkReadableStream() { + if (globalThis.ReadableStream || !_is_node.isNodeJS) { + return; + } + globalThis.ReadableStream = require("web-streams-polyfill/dist/ponyfill.js").ReadableStream; +})(); +(function checkArrayAt() { + if (Array.prototype.at) { + return; + } + __w_pdfjs_require__(5); +})(); +(function checkTypedArrayAt() { + if (Uint8Array.prototype.at) { + return; + } + __w_pdfjs_require__(79); +})(); +(function checkStructuredClone() { + if (globalThis.structuredClone) { + return; + } + __w_pdfjs_require__(89); +})(); + +/***/ }), +/* 4 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.isNodeJS = void 0; +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +exports.isNodeJS = isNodeJS; + +/***/ }), +/* 5 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(6); +var entryUnbind = __w_pdfjs_require__(78); +module.exports = entryUnbind('Array', 'at'); + +/***/ }), +/* 6 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var $ = __w_pdfjs_require__(7); +var toObject = __w_pdfjs_require__(44); +var lengthOfArrayLike = __w_pdfjs_require__(68); +var toIntegerOrInfinity = __w_pdfjs_require__(66); +var addToUnscopables = __w_pdfjs_require__(73); +$({ + target: 'Array', + proto: true +}, { + at: function at(index) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; + return k < 0 || k >= len ? undefined : O[k]; + } +}); +addToUnscopables('at'); + +/***/ }), +/* 7 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var getOwnPropertyDescriptor = (__w_pdfjs_require__(9).f); +var createNonEnumerableProperty = __w_pdfjs_require__(48); +var defineBuiltIn = __w_pdfjs_require__(52); +var defineGlobalProperty = __w_pdfjs_require__(42); +var copyConstructorProperties = __w_pdfjs_require__(60); +var isForced = __w_pdfjs_require__(72); +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) + for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else + targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) + continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + if (options.sham || targetProperty && targetProperty.sham) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + +/***/ }), +/* 8 */ +/***/ ((module) => { + +var check = function (it) { + return it && it.Math == Math && it; +}; +module.exports = check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || check(typeof self == 'object' && self) || check(typeof global == 'object' && global) || (function () { + return this; +}()) || Function('return this')(); + +/***/ }), +/* 9 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(10); +var call = __w_pdfjs_require__(12); +var propertyIsEnumerableModule = __w_pdfjs_require__(14); +var createPropertyDescriptor = __w_pdfjs_require__(15); +var toIndexedObject = __w_pdfjs_require__(16); +var toPropertyKey = __w_pdfjs_require__(22); +var hasOwn = __w_pdfjs_require__(43); +var IE8_DOM_DEFINE = __w_pdfjs_require__(46); +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) + try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { + } + if (hasOwn(O, P)) + return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + +/***/ }), +/* 10 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +module.exports = !fails(function () { + return Object.defineProperty({}, 1, { + get: function () { + return 7; + } + })[1] != 7; +}); + +/***/ }), +/* 11 */ +/***/ ((module) => { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + +/***/ }), +/* 12 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_BIND = __w_pdfjs_require__(13); +var call = Function.prototype.call; +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + +/***/ }), +/* 13 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +module.exports = !fails(function () { + var test = function () { + }.bind(); + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + +/***/ }), +/* 14 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + +/***/ }), +/* 15 */ +/***/ ((module) => { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +/***/ }), +/* 16 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IndexedObject = __w_pdfjs_require__(17); +var requireObjectCoercible = __w_pdfjs_require__(20); +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + +/***/ }), +/* 17 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var fails = __w_pdfjs_require__(11); +var classof = __w_pdfjs_require__(19); +var $Object = Object; +var split = uncurryThis(''.split); +module.exports = fails(function () { + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split(it, '') : $Object(it); +} : $Object; + +/***/ }), +/* 18 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_BIND = __w_pdfjs_require__(13); +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + +/***/ }), +/* 19 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + +/***/ }), +/* 20 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isNullOrUndefined = __w_pdfjs_require__(21); +var $TypeError = TypeError; +module.exports = function (it) { + if (isNullOrUndefined(it)) + throw $TypeError("Can't call method on " + it); + return it; +}; + +/***/ }), +/* 21 */ +/***/ ((module) => { + +module.exports = function (it) { + return it === null || it === undefined; +}; + +/***/ }), +/* 22 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toPrimitive = __w_pdfjs_require__(23); +var isSymbol = __w_pdfjs_require__(27); +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + +/***/ }), +/* 23 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(12); +var isObject = __w_pdfjs_require__(24); +var isSymbol = __w_pdfjs_require__(27); +var getMethod = __w_pdfjs_require__(34); +var ordinaryToPrimitive = __w_pdfjs_require__(37); +var wellKnownSymbol = __w_pdfjs_require__(38); +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) + return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) + pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) + return result; + throw $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) + pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + +/***/ }), +/* 24 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(25); +var $documentAll = __w_pdfjs_require__(26); +var documentAll = $documentAll.all; +module.exports = $documentAll.IS_HTMLDDA ? function (it) { + return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll; +} : function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + +/***/ }), +/* 25 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var $documentAll = __w_pdfjs_require__(26); +var documentAll = $documentAll.all; +module.exports = $documentAll.IS_HTMLDDA ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + +/***/ }), +/* 26 */ +/***/ ((module) => { + +var documentAll = typeof document == 'object' && document.all; +var IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined; +module.exports = { + all: documentAll, + IS_HTMLDDA: IS_HTMLDDA +}; + +/***/ }), +/* 27 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(28); +var isCallable = __w_pdfjs_require__(25); +var isPrototypeOf = __w_pdfjs_require__(29); +var USE_SYMBOL_AS_UID = __w_pdfjs_require__(30); +var $Object = Object; +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + +/***/ }), +/* 28 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var isCallable = __w_pdfjs_require__(25); +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; + +/***/ }), +/* 29 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +module.exports = uncurryThis({}.isPrototypeOf); + +/***/ }), +/* 30 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_SYMBOL = __w_pdfjs_require__(31); +module.exports = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == 'symbol'; + +/***/ }), +/* 31 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var V8_VERSION = __w_pdfjs_require__(32); +var fails = __w_pdfjs_require__(11); +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol(); + return !String(symbol) || !(Object(symbol) instanceof Symbol) || !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + +/***/ }), +/* 32 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var userAgent = __w_pdfjs_require__(33); +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; +if (v8) { + match = v8.split('.'); + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) + version = +match[1]; + } +} +module.exports = version; + +/***/ }), +/* 33 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(28); +module.exports = getBuiltIn('navigator', 'userAgent') || ''; + +/***/ }), +/* 34 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var aCallable = __w_pdfjs_require__(35); +var isNullOrUndefined = __w_pdfjs_require__(21); +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + +/***/ }), +/* 35 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(25); +var tryToString = __w_pdfjs_require__(36); +var $TypeError = TypeError; +module.exports = function (argument) { + if (isCallable(argument)) + return argument; + throw $TypeError(tryToString(argument) + ' is not a function'); +}; + +/***/ }), +/* 36 */ +/***/ ((module) => { + +var $String = String; +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + +/***/ }), +/* 37 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(12); +var isCallable = __w_pdfjs_require__(25); +var isObject = __w_pdfjs_require__(24); +var $TypeError = TypeError; +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) + return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) + return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) + return val; + throw $TypeError("Can't convert object to primitive value"); +}; + +/***/ }), +/* 38 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var shared = __w_pdfjs_require__(39); +var hasOwn = __w_pdfjs_require__(43); +var uid = __w_pdfjs_require__(45); +var NATIVE_SYMBOL = __w_pdfjs_require__(31); +var USE_SYMBOL_AS_UID = __w_pdfjs_require__(30); +var WellKnownSymbolsStore = shared('wks'); +var Symbol = global.Symbol; +var symbolFor = Symbol && Symbol['for']; +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { + var description = 'Symbol.' + name; + if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { + WellKnownSymbolsStore[name] = Symbol[name]; + } else if (USE_SYMBOL_AS_UID && symbolFor) { + WellKnownSymbolsStore[name] = symbolFor(description); + } else { + WellKnownSymbolsStore[name] = createWellKnownSymbol(description); + } + } + return WellKnownSymbolsStore[name]; +}; + +/***/ }), +/* 39 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IS_PURE = __w_pdfjs_require__(40); +var store = __w_pdfjs_require__(41); +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.26.1', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)', + license: 'https://github.com/zloirock/core-js/blob/v3.26.1/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + +/***/ }), +/* 40 */ +/***/ ((module) => { + +module.exports = false; + +/***/ }), +/* 41 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var defineGlobalProperty = __w_pdfjs_require__(42); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || defineGlobalProperty(SHARED, {}); +module.exports = store; + +/***/ }), +/* 42 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var defineProperty = Object.defineProperty; +module.exports = function (key, value) { + try { + defineProperty(global, key, { + value: value, + configurable: true, + writable: true + }); + } catch (error) { + global[key] = value; + } + return value; +}; + +/***/ }), +/* 43 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var toObject = __w_pdfjs_require__(44); +var hasOwnProperty = uncurryThis({}.hasOwnProperty); +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + +/***/ }), +/* 44 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var requireObjectCoercible = __w_pdfjs_require__(20); +var $Object = Object; +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + +/***/ }), +/* 45 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + +/***/ }), +/* 46 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(10); +var fails = __w_pdfjs_require__(11); +var createElement = __w_pdfjs_require__(47); +module.exports = !DESCRIPTORS && !fails(function () { + return Object.defineProperty(createElement('div'), 'a', { + get: function () { + return 7; + } + }).a != 7; +}); + +/***/ }), +/* 47 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var isObject = __w_pdfjs_require__(24); +var document = global.document; +var EXISTS = isObject(document) && isObject(document.createElement); +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + +/***/ }), +/* 48 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(10); +var definePropertyModule = __w_pdfjs_require__(49); +var createPropertyDescriptor = __w_pdfjs_require__(15); +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +/***/ }), +/* 49 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(10); +var IE8_DOM_DEFINE = __w_pdfjs_require__(46); +var V8_PROTOTYPE_DEFINE_BUG = __w_pdfjs_require__(50); +var anObject = __w_pdfjs_require__(51); +var toPropertyKey = __w_pdfjs_require__(22); +var $TypeError = TypeError; +var $defineProperty = Object.defineProperty; +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } + return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) + try { + return $defineProperty(O, P, Attributes); + } catch (error) { + } + if ('get' in Attributes || 'set' in Attributes) + throw $TypeError('Accessors not supported'); + if ('value' in Attributes) + O[P] = Attributes.value; + return O; +}; + +/***/ }), +/* 50 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(10); +var fails = __w_pdfjs_require__(11); +module.exports = DESCRIPTORS && fails(function () { + return Object.defineProperty(function () { + }, 'prototype', { + value: 42, + writable: false + }).prototype != 42; +}); + +/***/ }), +/* 51 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isObject = __w_pdfjs_require__(24); +var $String = String; +var $TypeError = TypeError; +module.exports = function (argument) { + if (isObject(argument)) + return argument; + throw $TypeError($String(argument) + ' is not an object'); +}; + +/***/ }), +/* 52 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(25); +var definePropertyModule = __w_pdfjs_require__(49); +var makeBuiltIn = __w_pdfjs_require__(53); +var defineGlobalProperty = __w_pdfjs_require__(42); +module.exports = function (O, key, value, options) { + if (!options) + options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) + makeBuiltIn(value, name, options); + if (options.global) { + if (simple) + O[key] = value; + else + defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) + delete O[key]; + else if (O[key]) + simple = true; + } catch (error) { + } + if (simple) + O[key] = value; + else + definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } + return O; +}; + +/***/ }), +/* 53 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +var isCallable = __w_pdfjs_require__(25); +var hasOwn = __w_pdfjs_require__(43); +var DESCRIPTORS = __w_pdfjs_require__(10); +var CONFIGURABLE_FUNCTION_NAME = (__w_pdfjs_require__(54).CONFIGURABLE); +var inspectSource = __w_pdfjs_require__(55); +var InternalStateModule = __w_pdfjs_require__(56); +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var defineProperty = Object.defineProperty; +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { + }, 'length', { value: 8 }).length !== 8; +}); +var TEMPLATE = String(String).split('String'); +var makeBuiltIn = module.exports = function (value, name, options) { + if (String(name).slice(0, 7) === 'Symbol(') { + name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']'; + } + if (options && options.getter) + name = 'get ' + name; + if (options && options.setter) + name = 'set ' + name; + if (!hasOwn(value, 'name') || CONFIGURABLE_FUNCTION_NAME && value.name !== name) { + if (DESCRIPTORS) + defineProperty(value, 'name', { + value: name, + configurable: true + }); + else + value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) + defineProperty(value, 'prototype', { writable: false }); + } else if (value.prototype) + value.prototype = undefined; + } catch (error) { + } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = TEMPLATE.join(typeof name == 'string' ? name : ''); + } + return value; +}; +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + +/***/ }), +/* 54 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(10); +var hasOwn = __w_pdfjs_require__(43); +var FunctionPrototype = Function.prototype; +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; +var EXISTS = hasOwn(FunctionPrototype, 'name'); +var PROPER = EXISTS && function something() { +}.name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable); +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + +/***/ }), +/* 55 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var isCallable = __w_pdfjs_require__(25); +var store = __w_pdfjs_require__(41); +var functionToString = uncurryThis(Function.toString); +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} +module.exports = store.inspectSource; + +/***/ }), +/* 56 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var NATIVE_WEAK_MAP = __w_pdfjs_require__(57); +var global = __w_pdfjs_require__(8); +var isObject = __w_pdfjs_require__(24); +var createNonEnumerableProperty = __w_pdfjs_require__(48); +var hasOwn = __w_pdfjs_require__(43); +var shared = __w_pdfjs_require__(41); +var sharedKey = __w_pdfjs_require__(58); +var hiddenKeys = __w_pdfjs_require__(59); +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } + return state; + }; +}; +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + store.get = store.get; + store.has = store.has; + store.set = store.set; + set = function (it, metadata) { + if (store.has(it)) + throw TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) + throw TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + +/***/ }), +/* 57 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var isCallable = __w_pdfjs_require__(25); +var WeakMap = global.WeakMap; +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + +/***/ }), +/* 58 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var shared = __w_pdfjs_require__(39); +var uid = __w_pdfjs_require__(45); +var keys = shared('keys'); +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +/***/ }), +/* 59 */ +/***/ ((module) => { + +module.exports = {}; + +/***/ }), +/* 60 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var hasOwn = __w_pdfjs_require__(43); +var ownKeys = __w_pdfjs_require__(61); +var getOwnPropertyDescriptorModule = __w_pdfjs_require__(9); +var definePropertyModule = __w_pdfjs_require__(49); +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + +/***/ }), +/* 61 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(28); +var uncurryThis = __w_pdfjs_require__(18); +var getOwnPropertyNamesModule = __w_pdfjs_require__(62); +var getOwnPropertySymbolsModule = __w_pdfjs_require__(71); +var anObject = __w_pdfjs_require__(51); +var concat = uncurryThis([].concat); +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + +/***/ }), +/* 62 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var internalObjectKeys = __w_pdfjs_require__(63); +var enumBugKeys = __w_pdfjs_require__(70); +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + +/***/ }), +/* 63 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var hasOwn = __w_pdfjs_require__(43); +var toIndexedObject = __w_pdfjs_require__(16); +var indexOf = (__w_pdfjs_require__(64).indexOf); +var hiddenKeys = __w_pdfjs_require__(59); +var push = uncurryThis([].push); +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) + !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + while (names.length > i) + if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + +/***/ }), +/* 64 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toIndexedObject = __w_pdfjs_require__(16); +var toAbsoluteIndex = __w_pdfjs_require__(65); +var lengthOfArrayLike = __w_pdfjs_require__(68); +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + var index = toAbsoluteIndex(fromIndex, length); + var value; + if (IS_INCLUDES && el != el) + while (length > index) { + value = O[index++]; + if (value != value) + return true; + } + else + for (; length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) + return IS_INCLUDES || index || 0; + } + return !IS_INCLUDES && -1; + }; +}; +module.exports = { + includes: createMethod(true), + indexOf: createMethod(false) +}; + +/***/ }), +/* 65 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toIntegerOrInfinity = __w_pdfjs_require__(66); +var max = Math.max; +var min = Math.min; +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + +/***/ }), +/* 66 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var trunc = __w_pdfjs_require__(67); +module.exports = function (argument) { + var number = +argument; + return number !== number || number === 0 ? 0 : trunc(number); +}; + +/***/ }), +/* 67 */ +/***/ ((module) => { + +var ceil = Math.ceil; +var floor = Math.floor; +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + +/***/ }), +/* 68 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toLength = __w_pdfjs_require__(69); +module.exports = function (obj) { + return toLength(obj.length); +}; + +/***/ }), +/* 69 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toIntegerOrInfinity = __w_pdfjs_require__(66); +var min = Math.min; +module.exports = function (argument) { + return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; +}; + +/***/ }), +/* 70 */ +/***/ ((module) => { + +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + +/***/ }), +/* 71 */ +/***/ ((__unused_webpack_module, exports) => { + +exports.f = Object.getOwnPropertySymbols; + +/***/ }), +/* 72 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +var isCallable = __w_pdfjs_require__(25); +var replacement = /#|\.prototype\./; +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true : value == NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection; +}; +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; +module.exports = isForced; + +/***/ }), +/* 73 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(38); +var create = __w_pdfjs_require__(74); +var defineProperty = (__w_pdfjs_require__(49).f); +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; +if (ArrayPrototype[UNSCOPABLES] == undefined) { + defineProperty(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + +/***/ }), +/* 74 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var anObject = __w_pdfjs_require__(51); +var definePropertiesModule = __w_pdfjs_require__(75); +var enumBugKeys = __w_pdfjs_require__(70); +var hiddenKeys = __w_pdfjs_require__(59); +var html = __w_pdfjs_require__(77); +var documentCreateElement = __w_pdfjs_require__(47); +var sharedKey = __w_pdfjs_require__(58); +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); +var EmptyConstructor = function () { +}; +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; + return temp; +}; +var NullProtoObjectViaIFrame = function () { + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { + } + NullProtoObject = typeof document != 'undefined' ? document.domain && activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame() : NullProtoObjectViaActiveX(activeXDocument); + var length = enumBugKeys.length; + while (length--) + delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; +hiddenKeys[IE_PROTO] = true; +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + result[IE_PROTO] = O; + } else + result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + +/***/ }), +/* 75 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +var DESCRIPTORS = __w_pdfjs_require__(10); +var V8_PROTOTYPE_DEFINE_BUG = __w_pdfjs_require__(50); +var definePropertyModule = __w_pdfjs_require__(49); +var anObject = __w_pdfjs_require__(51); +var toIndexedObject = __w_pdfjs_require__(16); +var objectKeys = __w_pdfjs_require__(76); +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) + definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + +/***/ }), +/* 76 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var internalObjectKeys = __w_pdfjs_require__(63); +var enumBugKeys = __w_pdfjs_require__(70); +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + +/***/ }), +/* 77 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var getBuiltIn = __w_pdfjs_require__(28); +module.exports = getBuiltIn('document', 'documentElement'); + +/***/ }), +/* 78 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +var uncurryThis = __w_pdfjs_require__(18); +module.exports = function (CONSTRUCTOR, METHOD) { + return uncurryThis(global[CONSTRUCTOR].prototype[METHOD]); +}; + +/***/ }), +/* 79 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(80); + +/***/ }), +/* 80 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var ArrayBufferViewCore = __w_pdfjs_require__(81); +var lengthOfArrayLike = __w_pdfjs_require__(68); +var toIntegerOrInfinity = __w_pdfjs_require__(66); +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; +exportTypedArrayMethod('at', function at(index) { + var O = aTypedArray(this); + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex; + return k < 0 || k >= len ? undefined : O[k]; +}); + +/***/ }), +/* 81 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var NATIVE_ARRAY_BUFFER = __w_pdfjs_require__(82); +var DESCRIPTORS = __w_pdfjs_require__(10); +var global = __w_pdfjs_require__(8); +var isCallable = __w_pdfjs_require__(25); +var isObject = __w_pdfjs_require__(24); +var hasOwn = __w_pdfjs_require__(43); +var classof = __w_pdfjs_require__(83); +var tryToString = __w_pdfjs_require__(36); +var createNonEnumerableProperty = __w_pdfjs_require__(48); +var defineBuiltIn = __w_pdfjs_require__(52); +var defineProperty = (__w_pdfjs_require__(49).f); +var isPrototypeOf = __w_pdfjs_require__(29); +var getPrototypeOf = __w_pdfjs_require__(85); +var setPrototypeOf = __w_pdfjs_require__(87); +var wellKnownSymbol = __w_pdfjs_require__(38); +var uid = __w_pdfjs_require__(45); +var InternalStateModule = __w_pdfjs_require__(56); +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var Int8Array = global.Int8Array; +var Int8ArrayPrototype = Int8Array && Int8Array.prototype; +var Uint8ClampedArray = global.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array && getPrototypeOf(Int8Array); +var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype = Object.prototype; +var TypeError = global.TypeError; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); +var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; +var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQUIRED = false; +var NAME, Constructor, Prototype; +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; +var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 +}; +var isView = function isView(it) { + if (!isObject(it)) + return false; + var klass = classof(it); + return klass === 'DataView' || hasOwn(TypedArrayConstructorsList, klass) || hasOwn(BigIntArrayConstructorsList, klass); +}; +var getTypedArrayConstructor = function (it) { + var proto = getPrototypeOf(it); + if (!isObject(proto)) + return; + var state = getInternalState(proto); + return state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); +}; +var isTypedArray = function (it) { + if (!isObject(it)) + return false; + var klass = classof(it); + return hasOwn(TypedArrayConstructorsList, klass) || hasOwn(BigIntArrayConstructorsList, klass); +}; +var aTypedArray = function (it) { + if (isTypedArray(it)) + return it; + throw TypeError('Target is not a typed array'); +}; +var aTypedArrayConstructor = function (C) { + if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) + return C; + throw TypeError(tryToString(C) + ' is not a typed array constructor'); +}; +var exportTypedArrayMethod = function (KEY, property, forced, options) { + if (!DESCRIPTORS) + return; + if (forced) + for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) + try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { + } + } + } + if (!TypedArrayPrototype[KEY] || forced) { + defineBuiltIn(TypedArrayPrototype, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); + } +}; +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS) + return; + if (setPrototypeOf) { + if (forced) + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) + try { + delete TypedArrayConstructor[KEY]; + } catch (error) { + } + } + if (!TypedArray[KEY] || forced) { + try { + return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); + } catch (error) { + } + } else + return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + defineBuiltIn(TypedArrayConstructor, KEY, property); + } + } +}; +for (NAME in TypedArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) + enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; + else + NATIVE_ARRAY_BUFFER_VIEWS = false; +} +for (NAME in BigIntArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) + enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; +} +if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { + TypedArray = function TypedArray() { + throw TypeError('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS) + for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) + setPrototypeOf(global[NAME], TypedArray); + } +} +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) + for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) + setPrototypeOf(global[NAME].prototype, TypedArrayPrototype); + } +} +if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} +if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineProperty(TypedArrayPrototype, TO_STRING_TAG, { + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + for (NAME in TypedArrayConstructorsList) + if (global[NAME]) { + createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME); + } +} +module.exports = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + getTypedArrayConstructor: getTypedArrayConstructor, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + +/***/ }), +/* 82 */ +/***/ ((module) => { + +module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + +/***/ }), +/* 83 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var TO_STRING_TAG_SUPPORT = __w_pdfjs_require__(84); +var isCallable = __w_pdfjs_require__(25); +var classofRaw = __w_pdfjs_require__(19); +var wellKnownSymbol = __w_pdfjs_require__(38); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; +var CORRECT_ARGUMENTS = classofRaw((function () { + return arguments; +}())) == 'Arguments'; +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { + } +}; +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag : CORRECT_ARGUMENTS ? classofRaw(O) : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + +/***/ }), +/* 84 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(38); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; +test[TO_STRING_TAG] = 'z'; +module.exports = String(test) === '[object z]'; + +/***/ }), +/* 85 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var hasOwn = __w_pdfjs_require__(43); +var isCallable = __w_pdfjs_require__(25); +var toObject = __w_pdfjs_require__(44); +var sharedKey = __w_pdfjs_require__(58); +var CORRECT_PROTOTYPE_GETTER = __w_pdfjs_require__(86); +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) + return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } + return object instanceof $Object ? ObjectPrototype : null; +}; + +/***/ }), +/* 86 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +module.exports = !fails(function () { + function F() { + } + F.prototype.constructor = null; + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + +/***/ }), +/* 87 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var anObject = __w_pdfjs_require__(51); +var aPossiblePrototype = __w_pdfjs_require__(88); +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? (function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { + } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) + setter(O, proto); + else + O.__proto__ = proto; + return O; + }; +}()) : undefined); + +/***/ }), +/* 88 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(25); +var $String = String; +var $TypeError = TypeError; +module.exports = function (argument) { + if (typeof argument == 'object' || isCallable(argument)) + return argument; + throw $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + +/***/ }), +/* 89 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(90); +__w_pdfjs_require__(97); +__w_pdfjs_require__(99); +__w_pdfjs_require__(122); +__w_pdfjs_require__(124); +var path = __w_pdfjs_require__(133); +module.exports = path.structuredClone; + +/***/ }), +/* 90 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var toIndexedObject = __w_pdfjs_require__(16); +var addToUnscopables = __w_pdfjs_require__(73); +var Iterators = __w_pdfjs_require__(91); +var InternalStateModule = __w_pdfjs_require__(56); +var defineProperty = (__w_pdfjs_require__(49).f); +var defineIterator = __w_pdfjs_require__(92); +var createIterResultObject = __w_pdfjs_require__(96); +var IS_PURE = __w_pdfjs_require__(40); +var DESCRIPTORS = __w_pdfjs_require__(10); +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), + index: 0, + kind: kind + }); +}, function () { + var state = getInternalState(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return createIterResultObject(undefined, true); + } + if (kind == 'keys') + return createIterResultObject(index, false); + if (kind == 'values') + return createIterResultObject(target[index], false); + return createIterResultObject([ + index, + target[index] + ], false); +}, 'values'); +var values = Iterators.Arguments = Iterators.Array; +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); +if (!IS_PURE && DESCRIPTORS && values.name !== 'values') + try { + defineProperty(values, 'name', { value: 'values' }); + } catch (error) { + } + +/***/ }), +/* 91 */ +/***/ ((module) => { + +module.exports = {}; + +/***/ }), +/* 92 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var $ = __w_pdfjs_require__(7); +var call = __w_pdfjs_require__(12); +var IS_PURE = __w_pdfjs_require__(40); +var FunctionName = __w_pdfjs_require__(54); +var isCallable = __w_pdfjs_require__(25); +var createIteratorConstructor = __w_pdfjs_require__(93); +var getPrototypeOf = __w_pdfjs_require__(85); +var setPrototypeOf = __w_pdfjs_require__(87); +var setToStringTag = __w_pdfjs_require__(95); +var createNonEnumerableProperty = __w_pdfjs_require__(48); +var defineBuiltIn = __w_pdfjs_require__(52); +var wellKnownSymbol = __w_pdfjs_require__(38); +var Iterators = __w_pdfjs_require__(91); +var IteratorsCore = __w_pdfjs_require__(94); +var PROPER_FUNCTION_NAME = FunctionName.PROPER; +var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; +var returnThis = function () { + return this; +}; +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) + return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) + return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: + return function keys() { + return new IteratorConstructor(this, KIND); + }; + case VALUES: + return function values() { + return new IteratorConstructor(this, KIND); + }; + case ENTRIES: + return function entries() { + return new IteratorConstructor(this, KIND); + }; + } + return function () { + return new IteratorConstructor(this); + }; + }; + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] || IterablePrototype['@@iterator'] || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { + defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) + Iterators[TO_STRING_TAG] = returnThis; + } + } + if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { + createNonEnumerableProperty(IterablePrototype, 'name', VALUES); + } else { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { + return call(nativeIterator, this); + }; + } + } + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) + for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + defineBuiltIn(IterablePrototype, KEY, methods[KEY]); + } + } + else + $({ + target: NAME, + proto: true, + forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME + }, methods); + } + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); + } + Iterators[NAME] = defaultIterator; + return methods; +}; + +/***/ }), +/* 93 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var IteratorPrototype = (__w_pdfjs_require__(94).IteratorPrototype); +var create = __w_pdfjs_require__(74); +var createPropertyDescriptor = __w_pdfjs_require__(15); +var setToStringTag = __w_pdfjs_require__(95); +var Iterators = __w_pdfjs_require__(91); +var returnThis = function () { + return this; +}; +module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + +/***/ }), +/* 94 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var fails = __w_pdfjs_require__(11); +var isCallable = __w_pdfjs_require__(25); +var isObject = __w_pdfjs_require__(24); +var create = __w_pdfjs_require__(74); +var getPrototypeOf = __w_pdfjs_require__(85); +var defineBuiltIn = __w_pdfjs_require__(52); +var wellKnownSymbol = __w_pdfjs_require__(38); +var IS_PURE = __w_pdfjs_require__(40); +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; +if ([].keys) { + arrayIterator = [].keys(); + if (!('next' in arrayIterator)) + BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) + IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + return IteratorPrototype[ITERATOR].call(test) !== test; +}); +if (NEW_ITERATOR_PROTOTYPE) + IteratorPrototype = {}; +else if (IS_PURE) + IteratorPrototype = create(IteratorPrototype); +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + +/***/ }), +/* 95 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var defineProperty = (__w_pdfjs_require__(49).f); +var hasOwn = __w_pdfjs_require__(43); +var wellKnownSymbol = __w_pdfjs_require__(38); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +module.exports = function (target, TAG, STATIC) { + if (target && !STATIC) + target = target.prototype; + if (target && !hasOwn(target, TO_STRING_TAG)) { + defineProperty(target, TO_STRING_TAG, { + configurable: true, + value: TAG + }); + } +}; + +/***/ }), +/* 96 */ +/***/ ((module) => { + +module.exports = function (value, done) { + return { + value: value, + done: done + }; +}; + +/***/ }), +/* 97 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var TO_STRING_TAG_SUPPORT = __w_pdfjs_require__(84); +var defineBuiltIn = __w_pdfjs_require__(52); +var toString = __w_pdfjs_require__(98); +if (!TO_STRING_TAG_SUPPORT) { + defineBuiltIn(Object.prototype, 'toString', toString, { unsafe: true }); +} + +/***/ }), +/* 98 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __w_pdfjs_require__(84); +var classof = __w_pdfjs_require__(83); +module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + +/***/ }), +/* 99 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(100); + +/***/ }), +/* 100 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var collection = __w_pdfjs_require__(101); +var collectionStrong = __w_pdfjs_require__(119); +collection('Map', function (init) { + return function Map() { + return init(this, arguments.length ? arguments[0] : undefined); + }; +}, collectionStrong); + +/***/ }), +/* 101 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var $ = __w_pdfjs_require__(7); +var global = __w_pdfjs_require__(8); +var uncurryThis = __w_pdfjs_require__(18); +var isForced = __w_pdfjs_require__(72); +var defineBuiltIn = __w_pdfjs_require__(52); +var InternalMetadataModule = __w_pdfjs_require__(102); +var iterate = __w_pdfjs_require__(109); +var anInstance = __w_pdfjs_require__(116); +var isCallable = __w_pdfjs_require__(25); +var isNullOrUndefined = __w_pdfjs_require__(21); +var isObject = __w_pdfjs_require__(24); +var fails = __w_pdfjs_require__(11); +var checkCorrectnessOfIteration = __w_pdfjs_require__(117); +var setToStringTag = __w_pdfjs_require__(95); +var inheritIfRequired = __w_pdfjs_require__(118); +module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + var fixMethod = function (KEY) { + var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]); + defineBuiltIn(NativePrototype, KEY, KEY == 'add' ? function add(value) { + uncurriedNativeMethod(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : function set(key, value) { + uncurriedNativeMethod(this, key === 0 ? 0 : key, value); + return this; + }); + }; + var REPLACE = isForced(CONSTRUCTOR_NAME, !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + }))); + if (REPLACE) { + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.enable(); + } else if (isForced(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + var THROWS_ON_PRIMITIVES = fails(function () { + instance.has(1); + }); + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { + new NativeConstructor(iterable); + }); + var BUGGY_ZERO = !IS_WEAK && fails(function () { + var $instance = new NativeConstructor(); + var index = 5; + while (index--) + $instance[ADDER](index, index); + return !$instance.has(-0); + }); + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance(dummy, NativePrototype); + var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); + if (!isNullOrUndefined(iterable)) + iterate(iterable, that[ADDER], { + that: that, + AS_ENTRIES: IS_MAP + }); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + if (BUGGY_ZERO || HASNT_CHAINING) + fixMethod(ADDER); + if (IS_WEAK && NativePrototype.clear) + delete NativePrototype.clear; + } + exported[CONSTRUCTOR_NAME] = Constructor; + $({ + global: true, + constructor: true, + forced: Constructor != NativeConstructor + }, exported); + setToStringTag(Constructor, CONSTRUCTOR_NAME); + if (!IS_WEAK) + common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + return Constructor; +}; + +/***/ }), +/* 102 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var $ = __w_pdfjs_require__(7); +var uncurryThis = __w_pdfjs_require__(18); +var hiddenKeys = __w_pdfjs_require__(59); +var isObject = __w_pdfjs_require__(24); +var hasOwn = __w_pdfjs_require__(43); +var defineProperty = (__w_pdfjs_require__(49).f); +var getOwnPropertyNamesModule = __w_pdfjs_require__(62); +var getOwnPropertyNamesExternalModule = __w_pdfjs_require__(103); +var isExtensible = __w_pdfjs_require__(106); +var uid = __w_pdfjs_require__(45); +var FREEZING = __w_pdfjs_require__(108); +var REQUIRED = false; +var METADATA = uid('meta'); +var id = 0; +var setMetadata = function (it) { + defineProperty(it, METADATA, { + value: { + objectID: 'O' + id++, + weakData: {} + } + }); +}; +var fastKey = function (it, create) { + if (!isObject(it)) + return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!hasOwn(it, METADATA)) { + if (!isExtensible(it)) + return 'F'; + if (!create) + return 'E'; + setMetadata(it); + } + return it[METADATA].objectID; +}; +var getWeakData = function (it, create) { + if (!hasOwn(it, METADATA)) { + if (!isExtensible(it)) + return true; + if (!create) + return false; + setMetadata(it); + } + return it[METADATA].weakData; +}; +var onFreeze = function (it) { + if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) + setMetadata(it); + return it; +}; +var enable = function () { + meta.enable = function () { + }; + REQUIRED = true; + var getOwnPropertyNames = getOwnPropertyNamesModule.f; + var splice = uncurryThis([].splice); + var test = {}; + test[METADATA] = 1; + if (getOwnPropertyNames(test).length) { + getOwnPropertyNamesModule.f = function (it) { + var result = getOwnPropertyNames(it); + for (var i = 0, length = result.length; i < length; i++) { + if (result[i] === METADATA) { + splice(result, i, 1); + break; + } + } + return result; + }; + $({ + target: 'Object', + stat: true, + forced: true + }, { getOwnPropertyNames: getOwnPropertyNamesExternalModule.f }); + } +}; +var meta = module.exports = { + enable: enable, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze +}; +hiddenKeys[METADATA] = true; + +/***/ }), +/* 103 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classof = __w_pdfjs_require__(19); +var toIndexedObject = __w_pdfjs_require__(16); +var $getOwnPropertyNames = (__w_pdfjs_require__(62).f); +var arraySlice = __w_pdfjs_require__(104); +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; +var getWindowNames = function (it) { + try { + return $getOwnPropertyNames(it); + } catch (error) { + return arraySlice(windowNames); + } +}; +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && classof(it) == 'Window' ? getWindowNames(it) : $getOwnPropertyNames(toIndexedObject(it)); +}; + +/***/ }), +/* 104 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var toAbsoluteIndex = __w_pdfjs_require__(65); +var lengthOfArrayLike = __w_pdfjs_require__(68); +var createProperty = __w_pdfjs_require__(105); +var $Array = Array; +var max = Math.max; +module.exports = function (O, start, end) { + var length = lengthOfArrayLike(O); + var k = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); + var result = $Array(max(fin - k, 0)); + for (var n = 0; k < fin; k++, n++) + createProperty(result, n, O[k]); + result.length = n; + return result; +}; + +/***/ }), +/* 105 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var toPropertyKey = __w_pdfjs_require__(22); +var definePropertyModule = __w_pdfjs_require__(49); +var createPropertyDescriptor = __w_pdfjs_require__(15); +module.exports = function (object, key, value) { + var propertyKey = toPropertyKey(key); + if (propertyKey in object) + definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else + object[propertyKey] = value; +}; + +/***/ }), +/* 106 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +var isObject = __w_pdfjs_require__(24); +var classof = __w_pdfjs_require__(19); +var ARRAY_BUFFER_NON_EXTENSIBLE = __w_pdfjs_require__(107); +var $isExtensible = Object.isExtensible; +var FAILS_ON_PRIMITIVES = fails(function () { + $isExtensible(1); +}); +module.exports = FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE ? function isExtensible(it) { + if (!isObject(it)) + return false; + if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') + return false; + return $isExtensible ? $isExtensible(it) : true; +} : $isExtensible; + +/***/ }), +/* 107 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +module.exports = fails(function () { + if (typeof ArrayBuffer == 'function') { + var buffer = new ArrayBuffer(8); + if (Object.isExtensible(buffer)) + Object.defineProperty(buffer, 'a', { value: 8 }); + } +}); + +/***/ }), +/* 108 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +module.exports = !fails(function () { + return Object.isExtensible(Object.preventExtensions({})); +}); + +/***/ }), +/* 109 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var bind = __w_pdfjs_require__(110); +var call = __w_pdfjs_require__(12); +var anObject = __w_pdfjs_require__(51); +var tryToString = __w_pdfjs_require__(36); +var isArrayIteratorMethod = __w_pdfjs_require__(112); +var lengthOfArrayLike = __w_pdfjs_require__(68); +var isPrototypeOf = __w_pdfjs_require__(29); +var getIterator = __w_pdfjs_require__(113); +var getIteratorMethod = __w_pdfjs_require__(114); +var iteratorClose = __w_pdfjs_require__(115); +var $TypeError = TypeError; +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; +var ResultPrototype = Result.prototype; +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + var stop = function (condition) { + if (iterator) + iteratorClose(iterator, 'normal', condition); + return new Result(true, condition); + }; + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } + return INTERRUPTED ? fn(value, stop) : fn(value); + }; + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) + throw $TypeError(tryToString(iterable) + ' is not iterable'); + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) + return result; + } + return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) + return result; + } + return new Result(false); +}; + +/***/ }), +/* 110 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(111); +var aCallable = __w_pdfjs_require__(35); +var NATIVE_BIND = __w_pdfjs_require__(13); +var bind = uncurryThis(uncurryThis.bind); +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function () { + return fn.apply(that, arguments); + }; +}; + +/***/ }), +/* 111 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classofRaw = __w_pdfjs_require__(19); +var uncurryThis = __w_pdfjs_require__(18); +module.exports = function (fn) { + if (classofRaw(fn) === 'Function') + return uncurryThis(fn); +}; + +/***/ }), +/* 112 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(38); +var Iterators = __w_pdfjs_require__(91); +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + +/***/ }), +/* 113 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(12); +var aCallable = __w_pdfjs_require__(35); +var anObject = __w_pdfjs_require__(51); +var tryToString = __w_pdfjs_require__(36); +var getIteratorMethod = __w_pdfjs_require__(114); +var $TypeError = TypeError; +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (aCallable(iteratorMethod)) + return anObject(call(iteratorMethod, argument)); + throw $TypeError(tryToString(argument) + ' is not iterable'); +}; + +/***/ }), +/* 114 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classof = __w_pdfjs_require__(83); +var getMethod = __w_pdfjs_require__(34); +var isNullOrUndefined = __w_pdfjs_require__(21); +var Iterators = __w_pdfjs_require__(91); +var wellKnownSymbol = __w_pdfjs_require__(38); +var ITERATOR = wellKnownSymbol('iterator'); +module.exports = function (it) { + if (!isNullOrUndefined(it)) + return getMethod(it, ITERATOR) || getMethod(it, '@@iterator') || Iterators[classof(it)]; +}; + +/***/ }), +/* 115 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(12); +var anObject = __w_pdfjs_require__(51); +var getMethod = __w_pdfjs_require__(34); +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') + throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') + throw value; + if (innerError) + throw innerResult; + anObject(innerResult); + return value; +}; + +/***/ }), +/* 116 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isPrototypeOf = __w_pdfjs_require__(29); +var $TypeError = TypeError; +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) + return it; + throw $TypeError('Incorrect invocation'); +}; + +/***/ }), +/* 117 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var wellKnownSymbol = __w_pdfjs_require__(38); +var ITERATOR = wellKnownSymbol('iterator'); +var SAFE_CLOSING = false; +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + Array.from(iteratorWithReturn, function () { + throw 2; + }); +} catch (error) { +} +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) + return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { + } + return ITERATION_SUPPORT; +}; + +/***/ }), +/* 118 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var isCallable = __w_pdfjs_require__(25); +var isObject = __w_pdfjs_require__(24); +var setPrototypeOf = __w_pdfjs_require__(87); +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if (setPrototypeOf && isCallable(NewTarget = dummy.constructor) && NewTarget !== Wrapper && isObject(NewTargetPrototype = NewTarget.prototype) && NewTargetPrototype !== Wrapper.prototype) + setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + +/***/ }), +/* 119 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var defineProperty = (__w_pdfjs_require__(49).f); +var create = __w_pdfjs_require__(74); +var defineBuiltIns = __w_pdfjs_require__(120); +var bind = __w_pdfjs_require__(110); +var anInstance = __w_pdfjs_require__(116); +var isNullOrUndefined = __w_pdfjs_require__(21); +var iterate = __w_pdfjs_require__(109); +var defineIterator = __w_pdfjs_require__(92); +var createIterResultObject = __w_pdfjs_require__(96); +var setSpecies = __w_pdfjs_require__(121); +var DESCRIPTORS = __w_pdfjs_require__(10); +var fastKey = (__w_pdfjs_require__(102).fastKey); +var InternalStateModule = __w_pdfjs_require__(56); +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var Constructor = wrapper(function (that, iterable) { + anInstance(that, Prototype); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + index: create(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS) + that.size = 0; + if (!isNullOrUndefined(iterable)) + iterate(iterable, that[ADDER], { + that: that, + AS_ENTRIES: IS_MAP + }); + }); + var Prototype = Constructor.prototype; + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + if (entry) { + entry.value = value; + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) + state.first = entry; + if (previous) + previous.next = entry; + if (DESCRIPTORS) + state.size++; + else + that.size++; + if (index !== 'F') + state.index[index] = entry; + } + return that; + }; + var getEntry = function (that, key) { + var state = getInternalState(that); + var index = fastKey(key); + var entry; + if (index !== 'F') + return state.index[index]; + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) + return entry; + } + }; + defineBuiltIns(Prototype, { + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) + entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS) + state.size = 0; + else + that.size = 0; + }, + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) + prev.next = next; + if (next) + next.previous = prev; + if (state.first == entry) + state.first = next; + if (state.last == entry) + state.last = prev; + if (DESCRIPTORS) + state.size--; + else + that.size--; + } + return !!entry; + }, + forEach: function forEach(callbackfn) { + var state = getInternalState(this); + var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + while (entry && entry.removed) + entry = entry.previous; + } + }, + has: function has(key) { + return !!getEntry(this, key); + } + }); + defineBuiltIns(Prototype, IS_MAP ? { + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS) + defineProperty(Prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return Constructor; + }, + setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + while (entry && entry.removed) + entry = entry.previous; + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + state.target = undefined; + return createIterResultObject(undefined, true); + } + if (kind == 'keys') + return createIterResultObject(entry.key, false); + if (kind == 'values') + return createIterResultObject(entry.value, false); + return createIterResultObject([ + entry.key, + entry.value + ], false); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + setSpecies(CONSTRUCTOR_NAME); + } +}; + +/***/ }), +/* 120 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var defineBuiltIn = __w_pdfjs_require__(52); +module.exports = function (target, src, options) { + for (var key in src) + defineBuiltIn(target, key, src[key], options); + return target; +}; + +/***/ }), +/* 121 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var getBuiltIn = __w_pdfjs_require__(28); +var definePropertyModule = __w_pdfjs_require__(49); +var wellKnownSymbol = __w_pdfjs_require__(38); +var DESCRIPTORS = __w_pdfjs_require__(10); +var SPECIES = wellKnownSymbol('species'); +module.exports = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule.f; + if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { + defineProperty(Constructor, SPECIES, { + configurable: true, + get: function () { + return this; + } + }); + } +}; + +/***/ }), +/* 122 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +__w_pdfjs_require__(123); + +/***/ }), +/* 123 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var collection = __w_pdfjs_require__(101); +var collectionStrong = __w_pdfjs_require__(119); +collection('Set', function (init) { + return function Set() { + return init(this, arguments.length ? arguments[0] : undefined); + }; +}, collectionStrong); + +/***/ }), +/* 124 */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IS_PURE = __w_pdfjs_require__(40); +var $ = __w_pdfjs_require__(7); +var global = __w_pdfjs_require__(8); +var getBuiltin = __w_pdfjs_require__(28); +var uncurryThis = __w_pdfjs_require__(18); +var fails = __w_pdfjs_require__(11); +var uid = __w_pdfjs_require__(45); +var isCallable = __w_pdfjs_require__(25); +var isConstructor = __w_pdfjs_require__(125); +var isNullOrUndefined = __w_pdfjs_require__(21); +var isObject = __w_pdfjs_require__(24); +var isSymbol = __w_pdfjs_require__(27); +var iterate = __w_pdfjs_require__(109); +var anObject = __w_pdfjs_require__(51); +var classof = __w_pdfjs_require__(83); +var hasOwn = __w_pdfjs_require__(43); +var createProperty = __w_pdfjs_require__(105); +var createNonEnumerableProperty = __w_pdfjs_require__(48); +var lengthOfArrayLike = __w_pdfjs_require__(68); +var validateArgumentsLength = __w_pdfjs_require__(126); +var getRegExpFlags = __w_pdfjs_require__(127); +var ERROR_STACK_INSTALLABLE = __w_pdfjs_require__(129); +var V8 = __w_pdfjs_require__(32); +var IS_BROWSER = __w_pdfjs_require__(130); +var IS_DENO = __w_pdfjs_require__(131); +var IS_NODE = __w_pdfjs_require__(132); +var Object = global.Object; +var Date = global.Date; +var Error = global.Error; +var EvalError = global.EvalError; +var RangeError = global.RangeError; +var ReferenceError = global.ReferenceError; +var SyntaxError = global.SyntaxError; +var TypeError = global.TypeError; +var URIError = global.URIError; +var PerformanceMark = global.PerformanceMark; +var WebAssembly = global.WebAssembly; +var CompileError = WebAssembly && WebAssembly.CompileError || Error; +var LinkError = WebAssembly && WebAssembly.LinkError || Error; +var RuntimeError = WebAssembly && WebAssembly.RuntimeError || Error; +var DOMException = getBuiltin('DOMException'); +var Set = getBuiltin('Set'); +var Map = getBuiltin('Map'); +var MapPrototype = Map.prototype; +var mapHas = uncurryThis(MapPrototype.has); +var mapGet = uncurryThis(MapPrototype.get); +var mapSet = uncurryThis(MapPrototype.set); +var setAdd = uncurryThis(Set.prototype.add); +var objectKeys = getBuiltin('Object', 'keys'); +var push = uncurryThis([].push); +var thisBooleanValue = uncurryThis(true.valueOf); +var thisNumberValue = uncurryThis(1.0.valueOf); +var thisStringValue = uncurryThis(''.valueOf); +var thisTimeValue = uncurryThis(Date.prototype.getTime); +var PERFORMANCE_MARK = uid('structuredClone'); +var DATA_CLONE_ERROR = 'DataCloneError'; +var TRANSFERRING = 'Transferring'; +var checkBasicSemantic = function (structuredCloneImplementation) { + return !fails(function () { + var set1 = new global.Set([7]); + var set2 = structuredCloneImplementation(set1); + var number = structuredCloneImplementation(Object(7)); + return set2 == set1 || !set2.has(7) || typeof number != 'object' || number != 7; + }) && structuredCloneImplementation; +}; +var checkErrorsCloning = function (structuredCloneImplementation, $Error) { + return !fails(function () { + var error = new $Error(); + var test = structuredCloneImplementation({ + a: error, + b: error + }); + return !(test && test.a === test.b && test.a instanceof $Error && test.a.stack === error.stack); + }); +}; +var checkNewErrorsCloningSemantic = function (structuredCloneImplementation) { + return !fails(function () { + var test = structuredCloneImplementation(new global.AggregateError([1], PERFORMANCE_MARK, { cause: 3 })); + return test.name != 'AggregateError' || test.errors[0] != 1 || test.message != PERFORMANCE_MARK || test.cause != 3; + }); +}; +var nativeStructuredClone = global.structuredClone; +var FORCED_REPLACEMENT = IS_PURE || !checkErrorsCloning(nativeStructuredClone, Error) || !checkErrorsCloning(nativeStructuredClone, DOMException) || !checkNewErrorsCloningSemantic(nativeStructuredClone); +var structuredCloneFromMark = !nativeStructuredClone && checkBasicSemantic(function (value) { + return new PerformanceMark(PERFORMANCE_MARK, { detail: value }).detail; +}); +var nativeRestrictedStructuredClone = checkBasicSemantic(nativeStructuredClone) || structuredCloneFromMark; +var throwUncloneable = function (type) { + throw new DOMException('Uncloneable type: ' + type, DATA_CLONE_ERROR); +}; +var throwUnpolyfillable = function (type, action) { + throw new DOMException((action || 'Cloning') + ' of ' + type + ' cannot be properly polyfilled in this engine', DATA_CLONE_ERROR); +}; +var createDataTransfer = function () { + var dataTransfer; + try { + dataTransfer = new global.DataTransfer(); + } catch (error) { + try { + dataTransfer = new global.ClipboardEvent('').clipboardData; + } catch (error2) { + } + } + return dataTransfer && dataTransfer.items && dataTransfer.files ? dataTransfer : null; +}; +var structuredCloneInternal = function (value, map) { + if (isSymbol(value)) + throwUncloneable('Symbol'); + if (!isObject(value)) + return value; + if (map) { + if (mapHas(map, value)) + return mapGet(map, value); + } else + map = new Map(); + var type = classof(value); + var deep = false; + var C, name, cloned, dataTransfer, i, length, keys, key, source, target; + switch (type) { + case 'Array': + cloned = []; + deep = true; + break; + case 'Object': + cloned = {}; + deep = true; + break; + case 'Map': + cloned = new Map(); + deep = true; + break; + case 'Set': + cloned = new Set(); + deep = true; + break; + case 'RegExp': + cloned = new RegExp(value.source, getRegExpFlags(value)); + break; + case 'Error': + name = value.name; + switch (name) { + case 'AggregateError': + cloned = getBuiltin('AggregateError')([]); + break; + case 'EvalError': + cloned = EvalError(); + break; + case 'RangeError': + cloned = RangeError(); + break; + case 'ReferenceError': + cloned = ReferenceError(); + break; + case 'SyntaxError': + cloned = SyntaxError(); + break; + case 'TypeError': + cloned = TypeError(); + break; + case 'URIError': + cloned = URIError(); + break; + case 'CompileError': + cloned = CompileError(); + break; + case 'LinkError': + cloned = LinkError(); + break; + case 'RuntimeError': + cloned = RuntimeError(); + break; + default: + cloned = Error(); + } + deep = true; + break; + case 'DOMException': + cloned = new DOMException(value.message, value.name); + deep = true; + break; + case 'DataView': + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'BigInt64Array': + case 'BigUint64Array': + C = global[type]; + if (!isObject(C)) + throwUnpolyfillable(type); + cloned = new C(structuredCloneInternal(value.buffer, map), value.byteOffset, type === 'DataView' ? value.byteLength : value.length); + break; + case 'DOMQuad': + try { + cloned = new DOMQuad(structuredCloneInternal(value.p1, map), structuredCloneInternal(value.p2, map), structuredCloneInternal(value.p3, map), structuredCloneInternal(value.p4, map)); + } catch (error) { + if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + throwUnpolyfillable(type); + } + break; + case 'FileList': + dataTransfer = createDataTransfer(); + if (dataTransfer) { + for (i = 0, length = lengthOfArrayLike(value); i < length; i++) { + dataTransfer.items.add(structuredCloneInternal(value[i], map)); + } + cloned = dataTransfer.files; + } else if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + throwUnpolyfillable(type); + break; + case 'ImageData': + try { + cloned = new ImageData(structuredCloneInternal(value.data, map), value.width, value.height, { colorSpace: value.colorSpace }); + } catch (error) { + if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + throwUnpolyfillable(type); + } + break; + default: + if (nativeRestrictedStructuredClone) { + cloned = nativeRestrictedStructuredClone(value); + } else + switch (type) { + case 'BigInt': + cloned = Object(value.valueOf()); + break; + case 'Boolean': + cloned = Object(thisBooleanValue(value)); + break; + case 'Number': + cloned = Object(thisNumberValue(value)); + break; + case 'String': + cloned = Object(thisStringValue(value)); + break; + case 'Date': + cloned = new Date(thisTimeValue(value)); + break; + case 'ArrayBuffer': + C = global.DataView; + if (!C && typeof value.slice != 'function') + throwUnpolyfillable(type); + try { + if (typeof value.slice == 'function') { + cloned = value.slice(0); + } else { + length = value.byteLength; + cloned = new ArrayBuffer(length); + source = new C(value); + target = new C(cloned); + for (i = 0; i < length; i++) { + target.setUint8(i, source.getUint8(i)); + } + } + } catch (error) { + throw new DOMException('ArrayBuffer is detached', DATA_CLONE_ERROR); + } + break; + case 'SharedArrayBuffer': + cloned = value; + break; + case 'Blob': + try { + cloned = value.slice(0, value.size, value.type); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'DOMPoint': + case 'DOMPointReadOnly': + C = global[type]; + try { + cloned = C.fromPoint ? C.fromPoint(value) : new C(value.x, value.y, value.z, value.w); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'DOMRect': + case 'DOMRectReadOnly': + C = global[type]; + try { + cloned = C.fromRect ? C.fromRect(value) : new C(value.x, value.y, value.width, value.height); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'DOMMatrix': + case 'DOMMatrixReadOnly': + C = global[type]; + try { + cloned = C.fromMatrix ? C.fromMatrix(value) : new C(value); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'AudioData': + case 'VideoFrame': + if (!isCallable(value.clone)) + throwUnpolyfillable(type); + try { + cloned = value.clone(); + } catch (error) { + throwUncloneable(type); + } + break; + case 'File': + try { + cloned = new File([value], value.name, value); + } catch (error) { + throwUnpolyfillable(type); + } + break; + case 'CropTarget': + case 'CryptoKey': + case 'FileSystemDirectoryHandle': + case 'FileSystemFileHandle': + case 'FileSystemHandle': + case 'GPUCompilationInfo': + case 'GPUCompilationMessage': + case 'ImageBitmap': + case 'RTCCertificate': + case 'WebAssembly.Module': + throwUnpolyfillable(type); + default: + throwUncloneable(type); + } + } + mapSet(map, value, cloned); + if (deep) + switch (type) { + case 'Array': + case 'Object': + keys = objectKeys(value); + for (i = 0, length = lengthOfArrayLike(keys); i < length; i++) { + key = keys[i]; + createProperty(cloned, key, structuredCloneInternal(value[key], map)); + } + break; + case 'Map': + value.forEach(function (v, k) { + mapSet(cloned, structuredCloneInternal(k, map), structuredCloneInternal(v, map)); + }); + break; + case 'Set': + value.forEach(function (v) { + setAdd(cloned, structuredCloneInternal(v, map)); + }); + break; + case 'Error': + createNonEnumerableProperty(cloned, 'message', structuredCloneInternal(value.message, map)); + if (hasOwn(value, 'cause')) { + createNonEnumerableProperty(cloned, 'cause', structuredCloneInternal(value.cause, map)); + } + if (name == 'AggregateError') { + cloned.errors = structuredCloneInternal(value.errors, map); + } + case 'DOMException': + if (ERROR_STACK_INSTALLABLE) { + createNonEnumerableProperty(cloned, 'stack', structuredCloneInternal(value.stack, map)); + } + } + return cloned; +}; +var PROPER_TRANSFER = nativeStructuredClone && !fails(function () { + if (IS_DENO && V8 > 92 || IS_NODE && V8 > 94 || IS_BROWSER && V8 > 97) + return false; + var buffer = new ArrayBuffer(8); + var clone = nativeStructuredClone(buffer, { transfer: [buffer] }); + return buffer.byteLength != 0 || clone.byteLength != 8; +}); +var tryToTransfer = function (rawTransfer, map) { + if (!isObject(rawTransfer)) + throw TypeError('Transfer option cannot be converted to a sequence'); + var transfer = []; + iterate(rawTransfer, function (value) { + push(transfer, anObject(value)); + }); + var i = 0; + var length = lengthOfArrayLike(transfer); + var value, type, C, transferredArray, transferred, canvas, context; + if (PROPER_TRANSFER) { + transferredArray = nativeStructuredClone(transfer, { transfer: transfer }); + while (i < length) + mapSet(map, transfer[i], transferredArray[i++]); + } else + while (i < length) { + value = transfer[i++]; + if (mapHas(map, value)) + throw new DOMException('Duplicate transferable', DATA_CLONE_ERROR); + type = classof(value); + switch (type) { + case 'ImageBitmap': + C = global.OffscreenCanvas; + if (!isConstructor(C)) + throwUnpolyfillable(type, TRANSFERRING); + try { + canvas = new C(value.width, value.height); + context = canvas.getContext('bitmaprenderer'); + context.transferFromImageBitmap(value); + transferred = canvas.transferToImageBitmap(); + } catch (error) { + } + break; + case 'AudioData': + case 'VideoFrame': + if (!isCallable(value.clone) || !isCallable(value.close)) + throwUnpolyfillable(type, TRANSFERRING); + try { + transferred = value.clone(); + value.close(); + } catch (error) { + } + break; + case 'ArrayBuffer': + case 'MediaSourceHandle': + case 'MessagePort': + case 'OffscreenCanvas': + case 'ReadableStream': + case 'TransformStream': + case 'WritableStream': + throwUnpolyfillable(type, TRANSFERRING); + } + if (transferred === undefined) + throw new DOMException('This object cannot be transferred: ' + type, DATA_CLONE_ERROR); + mapSet(map, value, transferred); + } +}; +$({ + global: true, + enumerable: true, + sham: !PROPER_TRANSFER, + forced: FORCED_REPLACEMENT +}, { + structuredClone: function structuredClone(value) { + var options = validateArgumentsLength(arguments.length, 1) > 1 && !isNullOrUndefined(arguments[1]) ? anObject(arguments[1]) : undefined; + var transfer = options ? options.transfer : undefined; + var map; + if (transfer !== undefined) { + map = new Map(); + tryToTransfer(transfer, map); + } + return structuredCloneInternal(value, map); + } +}); + +/***/ }), +/* 125 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var uncurryThis = __w_pdfjs_require__(18); +var fails = __w_pdfjs_require__(11); +var isCallable = __w_pdfjs_require__(25); +var classof = __w_pdfjs_require__(83); +var getBuiltIn = __w_pdfjs_require__(28); +var inspectSource = __w_pdfjs_require__(55); +var noop = function () { +}; +var empty = []; +var construct = getBuiltIn('Reflect', 'construct'); +var constructorRegExp = /^\s*(?:class|function)\b/; +var exec = uncurryThis(constructorRegExp.exec); +var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); +var isConstructorModern = function isConstructor(argument) { + if (!isCallable(argument)) + return false; + try { + construct(noop, empty, argument); + return true; + } catch (error) { + return false; + } +}; +var isConstructorLegacy = function isConstructor(argument) { + if (!isCallable(argument)) + return false; + switch (classof(argument)) { + case 'AsyncFunction': + case 'GeneratorFunction': + case 'AsyncGeneratorFunction': + return false; + } + try { + return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); + } catch (error) { + return true; + } +}; +isConstructorLegacy.sham = true; +module.exports = !construct || fails(function () { + var called; + return isConstructorModern(isConstructorModern.call) || !isConstructorModern(Object) || !isConstructorModern(function () { + called = true; + }) || called; +}) ? isConstructorLegacy : isConstructorModern; + +/***/ }), +/* 126 */ +/***/ ((module) => { + +var $TypeError = TypeError; +module.exports = function (passed, required) { + if (passed < required) + throw $TypeError('Not enough arguments'); + return passed; +}; + +/***/ }), +/* 127 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var call = __w_pdfjs_require__(12); +var hasOwn = __w_pdfjs_require__(43); +var isPrototypeOf = __w_pdfjs_require__(29); +var regExpFlags = __w_pdfjs_require__(128); +var RegExpPrototype = RegExp.prototype; +module.exports = function (R) { + var flags = R.flags; + return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R) ? call(regExpFlags, R) : flags; +}; + +/***/ }), +/* 128 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +"use strict"; + +var anObject = __w_pdfjs_require__(51); +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.hasIndices) + result += 'd'; + if (that.global) + result += 'g'; + if (that.ignoreCase) + result += 'i'; + if (that.multiline) + result += 'm'; + if (that.dotAll) + result += 's'; + if (that.unicode) + result += 'u'; + if (that.unicodeSets) + result += 'v'; + if (that.sticky) + result += 'y'; + return result; +}; + +/***/ }), +/* 129 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var fails = __w_pdfjs_require__(11); +var createPropertyDescriptor = __w_pdfjs_require__(15); +module.exports = !fails(function () { + var error = Error('a'); + if (!('stack' in error)) + return true; + Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); + return error.stack !== 7; +}); + +/***/ }), +/* 130 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var IS_DENO = __w_pdfjs_require__(131); +var IS_NODE = __w_pdfjs_require__(132); +module.exports = !IS_DENO && !IS_NODE && typeof window == 'object' && typeof document == 'object'; + +/***/ }), +/* 131 */ +/***/ ((module) => { + +module.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'object'; + +/***/ }), +/* 132 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var classof = __w_pdfjs_require__(19); +var global = __w_pdfjs_require__(8); +module.exports = classof(global.process) == 'process'; + +/***/ }), +/* 133 */ +/***/ ((module, __unused_webpack_exports, __w_pdfjs_require__) => { + +var global = __w_pdfjs_require__(8); +module.exports = global; + +/***/ }), +/* 134 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.EOF = exports.Dict = exports.Cmd = exports.CIRCULAR_REF = void 0; +exports.clearPrimitiveCaches = clearPrimitiveCaches; +exports.isCmd = isCmd; +exports.isDict = isDict; +exports.isName = isName; +exports.isRefsEqual = isRefsEqual; +var _util = __w_pdfjs_require__(2); +const CIRCULAR_REF = Symbol("CIRCULAR_REF"); +exports.CIRCULAR_REF = CIRCULAR_REF; +const EOF = Symbol("EOF"); +exports.EOF = EOF; +const Name = function NameClosure() { + let nameCache = Object.create(null); + class Name { + constructor(name) { + this.name = name; + } + static get(name) { + return nameCache[name] || (nameCache[name] = new Name(name)); + } + static _clearCache() { + nameCache = Object.create(null); + } + } + return Name; +}(); +exports.Name = Name; +const Cmd = function CmdClosure() { + let cmdCache = Object.create(null); + class Cmd { + constructor(cmd) { + this.cmd = cmd; + } + static get(cmd) { + return cmdCache[cmd] || (cmdCache[cmd] = new Cmd(cmd)); + } + static _clearCache() { + cmdCache = Object.create(null); + } + } + return Cmd; +}(); +exports.Cmd = Cmd; +const nonSerializable = function nonSerializableClosure() { + return nonSerializable; +}; +class Dict { + constructor() { + let xref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + this._map = Object.create(null); + this.xref = xref; + this.objId = null; + this.suppressEncryption = false; + this.__nonSerializable__ = nonSerializable; + } + assignXref(newXref) { + this.xref = newXref; + } + get size() { + return Object.keys(this._map).length; + } + get(key1, key2, key3) { + let value = this._map[key1]; + if (value === undefined && key2 !== undefined) { + value = this._map[key2]; + if (value === undefined && key3 !== undefined) { + value = this._map[key3]; + } + } + if (value instanceof Ref && this.xref) { + return this.xref.fetch(value, this.suppressEncryption); + } + return value; + } + async getAsync(key1, key2, key3) { + let value = this._map[key1]; + if (value === undefined && key2 !== undefined) { + value = this._map[key2]; + if (value === undefined && key3 !== undefined) { + value = this._map[key3]; + } + } + if (value instanceof Ref && this.xref) { + return this.xref.fetchAsync(value, this.suppressEncryption); + } + return value; + } + getArray(key1, key2, key3) { + let value = this._map[key1]; + if (value === undefined && key2 !== undefined) { + value = this._map[key2]; + if (value === undefined && key3 !== undefined) { + value = this._map[key3]; + } + } + if (value instanceof Ref && this.xref) { + value = this.xref.fetch(value, this.suppressEncryption); + } + if (Array.isArray(value)) { + value = value.slice(); + for (let i = 0, ii = value.length; i < ii; i++) { + if (value[i] instanceof Ref && this.xref) { + value[i] = this.xref.fetch(value[i], this.suppressEncryption); + } + } + } + return value; + } + getRaw(key) { + return this._map[key]; + } + getKeys() { + return Object.keys(this._map); + } + getRawValues() { + return Object.values(this._map); + } + set(key, value) { + this._map[key] = value; + } + has(key) { + return this._map[key] !== undefined; + } + forEach(callback) { + for (const key in this._map) { + callback(key, this.get(key)); + } + } + static get empty() { + const emptyDict = new Dict(null); + emptyDict.set = (key, value) => { + (0, _util.unreachable)("Should not call `set` on the empty dictionary."); + }; + return (0, _util.shadow)(this, "empty", emptyDict); + } + static merge(_ref) { + let { + xref, + dictArray, + mergeSubDicts = false + } = _ref; + const mergedDict = new Dict(xref), + properties = new Map(); + for (const dict of dictArray) { + if (!(dict instanceof Dict)) { + continue; + } + for (const [key, value] of Object.entries(dict._map)) { + let property = properties.get(key); + if (property === undefined) { + property = []; + properties.set(key, property); + } else if (!mergeSubDicts || !(value instanceof Dict)) { + continue; + } + property.push(value); + } + } + for (const [name, values] of properties) { + if (values.length === 1 || !(values[0] instanceof Dict)) { + mergedDict._map[name] = values[0]; + continue; + } + const subDict = new Dict(xref); + for (const dict of values) { + for (const [key, value] of Object.entries(dict._map)) { + if (subDict._map[key] === undefined) { + subDict._map[key] = value; + } + } + } + if (subDict.size > 0) { + mergedDict._map[name] = subDict; + } + } + properties.clear(); + return mergedDict.size > 0 ? mergedDict : Dict.empty; + } +} +exports.Dict = Dict; +const Ref = function RefClosure() { + let refCache = Object.create(null); + class Ref { + constructor(num, gen) { + this.num = num; + this.gen = gen; + } + toString() { + if (this.gen === 0) { + return `${this.num}R`; + } + return `${this.num}R${this.gen}`; + } + static get(num, gen) { + const key = gen === 0 ? `${num}R` : `${num}R${gen}`; + return refCache[key] || (refCache[key] = new Ref(num, gen)); + } + static _clearCache() { + refCache = Object.create(null); + } + } + return Ref; +}(); +exports.Ref = Ref; +class RefSet { + constructor() { + let parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + this._set = new Set(parent && parent._set); + } + has(ref) { + return this._set.has(ref.toString()); + } + put(ref) { + this._set.add(ref.toString()); + } + remove(ref) { + this._set.delete(ref.toString()); + } + [Symbol.iterator]() { + return this._set.values(); + } + clear() { + this._set.clear(); + } +} +exports.RefSet = RefSet; +class RefSetCache { + constructor() { + this._map = new Map(); + } + get size() { + return this._map.size; + } + get(ref) { + return this._map.get(ref.toString()); + } + has(ref) { + return this._map.has(ref.toString()); + } + put(ref, obj) { + this._map.set(ref.toString(), obj); + } + putAlias(ref, aliasRef) { + this._map.set(ref.toString(), this.get(aliasRef)); + } + [Symbol.iterator]() { + return this._map.values(); + } + clear() { + this._map.clear(); + } +} +exports.RefSetCache = RefSetCache; +function isName(v, name) { + return v instanceof Name && (name === undefined || v.name === name); +} +function isCmd(v, cmd) { + return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); +} +function isDict(v, type) { + return v instanceof Dict && (type === undefined || isName(v.get("Type"), type)); +} +function isRefsEqual(v1, v2) { + return v1.num === v2.num && v1.gen === v2.gen; +} +function clearPrimitiveCaches() { + Cmd._clearCache(); + Name._clearCache(); + Ref._clearCache(); +} + +/***/ }), +/* 135 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XRefParseException = exports.XRefEntryException = exports.ParserEOFException = exports.PDF_VERSION_REGEXP = exports.MissingDataException = exports.DocStats = void 0; +exports.collectActions = collectActions; +exports.encodeToXmlString = encodeToXmlString; +exports.escapePDFName = escapePDFName; +exports.escapeString = escapeString; +exports.getArrayLookupTableFactory = getArrayLookupTableFactory; +exports.getInheritableProperty = getInheritableProperty; +exports.getLookupTableFactory = getLookupTableFactory; +exports.getNewAnnotationsMap = getNewAnnotationsMap; +exports.getRotationMatrix = getRotationMatrix; +exports.isAscii = isAscii; +exports.isWhiteSpace = isWhiteSpace; +exports.log2 = log2; +exports.numberToString = numberToString; +exports.parseXFAPath = parseXFAPath; +exports.readInt8 = readInt8; +exports.readUint16 = readUint16; +exports.readUint32 = readUint32; +exports.recoverJsURL = recoverJsURL; +exports.stringToUTF16HexString = stringToUTF16HexString; +exports.stringToUTF16String = stringToUTF16String; +exports.toRomanNumerals = toRomanNumerals; +exports.validateCSSFont = validateCSSFont; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _base_stream = __w_pdfjs_require__(136); +const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; +exports.PDF_VERSION_REGEXP = PDF_VERSION_REGEXP; +function getLookupTableFactory(initializer) { + let lookup; + return function () { + if (initializer) { + lookup = Object.create(null); + initializer(lookup); + initializer = null; + } + return lookup; + }; +} +function getArrayLookupTableFactory(initializer) { + let lookup; + return function () { + if (initializer) { + let arr = initializer(); + initializer = null; + lookup = Object.create(null); + for (let i = 0, ii = arr.length; i < ii; i += 2) { + lookup[arr[i]] = arr[i + 1]; + } + arr = null; + } + return lookup; + }; +} +class MissingDataException extends _util.BaseException { + constructor(begin, end) { + super(`Missing data [${begin}, ${end})`, "MissingDataException"); + this.begin = begin; + this.end = end; + } +} +exports.MissingDataException = MissingDataException; +class ParserEOFException extends _util.BaseException { + constructor(msg) { + super(msg, "ParserEOFException"); + } +} +exports.ParserEOFException = ParserEOFException; +class XRefEntryException extends _util.BaseException { + constructor(msg) { + super(msg, "XRefEntryException"); + } +} +exports.XRefEntryException = XRefEntryException; +class XRefParseException extends _util.BaseException { + constructor(msg) { + super(msg, "XRefParseException"); + } +} +exports.XRefParseException = XRefParseException; +class DocStats { + constructor(handler) { + this._handler = handler; + this._streamTypes = new Set(); + this._fontTypes = new Set(); + } + _send() { + const streamTypes = Object.create(null), + fontTypes = Object.create(null); + for (const type of this._streamTypes) { + streamTypes[type] = true; + } + for (const type of this._fontTypes) { + fontTypes[type] = true; + } + this._handler.send("DocStats", { + streamTypes, + fontTypes + }); + } + addStreamType(type) { + if (this._streamTypes.has(type)) { + return; + } + this._streamTypes.add(type); + this._send(); + } + addFontType(type) { + if (this._fontTypes.has(type)) { + return; + } + this._fontTypes.add(type); + this._send(); + } +} +exports.DocStats = DocStats; +function getInheritableProperty(_ref) { + let { + dict, + key, + getArray = false, + stopWhenFound = true + } = _ref; + let values; + const visited = new _primitives.RefSet(); + while (dict instanceof _primitives.Dict && !(dict.objId && visited.has(dict.objId))) { + if (dict.objId) { + visited.put(dict.objId); + } + const value = getArray ? dict.getArray(key) : dict.get(key); + if (value !== undefined) { + if (stopWhenFound) { + return value; + } + if (!values) { + values = []; + } + values.push(value); + } + dict = dict.get("Parent"); + } + return values; +} +const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; +function toRomanNumerals(number) { + let lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + (0, _util.assert)(Number.isInteger(number) && number > 0, "The number should be a positive integer."); + const romanBuf = []; + let pos; + while (number >= 1000) { + number -= 1000; + romanBuf.push("M"); + } + pos = number / 100 | 0; + number %= 100; + romanBuf.push(ROMAN_NUMBER_MAP[pos]); + pos = number / 10 | 0; + number %= 10; + romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); + romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); + const romanStr = romanBuf.join(""); + return lowerCase ? romanStr.toLowerCase() : romanStr; +} +function log2(x) { + if (x <= 0) { + return 0; + } + return Math.ceil(Math.log2(x)); +} +function readInt8(data, offset) { + return data[offset] << 24 >> 24; +} +function readUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; +} +function readUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; +} +function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; +} +function parseXFAPath(path) { + const positionPattern = /(.+)\[(\d+)\]$/; + return path.split(".").map(component => { + const m = component.match(positionPattern); + if (m) { + return { + name: m[1], + pos: parseInt(m[2], 10) + }; + } + return { + name: component, + pos: 0 + }; + }); +} +function escapePDFName(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`#${char.toString(16)}`); + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); +} +function escapeString(str) { + return str.replace(/([()\\\n\r])/g, match => { + if (match === "\n") { + return "\\n"; + } else if (match === "\r") { + return "\\r"; + } + return `\\${match}`; + }); +} +function _collectJS(entry, xref, list, parents) { + if (!entry) { + return; + } + let parent = null; + if (entry instanceof _primitives.Ref) { + if (parents.has(entry)) { + return; + } + parent = entry; + parents.put(parent); + entry = xref.fetch(entry); + } + if (Array.isArray(entry)) { + for (const element of entry) { + _collectJS(element, xref, list, parents); + } + } else if (entry instanceof _primitives.Dict) { + if ((0, _primitives.isName)(entry.get("S"), "JavaScript")) { + const js = entry.get("JS"); + let code; + if (js instanceof _base_stream.BaseStream) { + code = js.getString(); + } else if (typeof js === "string") { + code = js; + } + code = code && (0, _util.stringToPDFString)(code).replace(/\u0000/g, ""); + if (code) { + list.push(code); + } + } + _collectJS(entry.getRaw("Next"), xref, list, parents); + } + if (parent) { + parents.remove(parent); + } +} +function collectActions(xref, dict, eventType) { + const actions = Object.create(null); + const additionalActionsDicts = getInheritableProperty({ + dict, + key: "AA", + stopWhenFound: false + }); + if (additionalActionsDicts) { + for (let i = additionalActionsDicts.length - 1; i >= 0; i--) { + const additionalActions = additionalActionsDicts[i]; + if (!(additionalActions instanceof _primitives.Dict)) { + continue; + } + for (const key of additionalActions.getKeys()) { + const action = eventType[key]; + if (!action) { + continue; + } + const actionDict = additionalActions.getRaw(key); + const parents = new _primitives.RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions[action] = list; + } + } + } + } + if (dict.has("A")) { + const actionDict = dict.get("A"); + const parents = new _primitives.RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions.Action = list; + } + } + return (0, _util.objectSize)(actions) > 0 ? actions : null; +} +const XMLEntities = { + 0x3c: "<", + 0x3e: ">", + 0x26: "&", + 0x22: """, + 0x27: "'" +}; +function encodeToXmlString(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + if (0x20 <= char && char <= 0x7e) { + const entity = XMLEntities[char]; + if (entity) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(entity); + start = i + 1; + } + } else { + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`&#x${char.toString(16).toUpperCase()};`); + if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { + i++; + } + start = i + 1; + } + } + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); +} +function validateCSSFont(cssFontInfo) { + const DEFAULT_CSS_FONT_OBLIQUE = "14"; + const DEFAULT_CSS_FONT_WEIGHT = "400"; + const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "normal", "bold", "bolder", "lighter"]); + const { + fontFamily, + fontWeight, + italicAngle + } = cssFontInfo; + if (/^".*"$/.test(fontFamily)) { + if (/[^\\]"/.test(fontFamily.slice(1, fontFamily.length - 1))) { + (0, _util.warn)(`XFA - FontFamily contains some unescaped ": ${fontFamily}.`); + return false; + } + } else if (/^'.*'$/.test(fontFamily)) { + if (/[^\\]'/.test(fontFamily.slice(1, fontFamily.length - 1))) { + (0, _util.warn)(`XFA - FontFamily contains some unescaped ': ${fontFamily}.`); + return false; + } + } else { + for (const ident of fontFamily.split(/[ \t]+/)) { + if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { + (0, _util.warn)(`XFA - FontFamily contains some invalid : ${fontFamily}.`); + return false; + } + } + } + const weight = fontWeight ? fontWeight.toString() : ""; + cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT; + const angle = parseFloat(italicAngle); + cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : italicAngle.toString(); + return true; +} +function recoverJsURL(str) { + const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; + const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").split(".").join("\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); + const jsUrl = regex.exec(str); + if (jsUrl && jsUrl[2]) { + const url = jsUrl[2]; + let newWindow = false; + if (jsUrl[3] === "true" && jsUrl[1] === "app.launchURL") { + newWindow = true; + } + return { + url, + newWindow + }; + } + return null; +} +function numberToString(value) { + if (Number.isInteger(value)) { + return value.toString(); + } + const roundedValue = Math.round(value * 100); + if (roundedValue % 100 === 0) { + return (roundedValue / 100).toString(); + } + if (roundedValue % 10 === 0) { + return value.toFixed(1); + } + return value.toFixed(2); +} +function getNewAnnotationsMap(annotationStorage) { + if (!annotationStorage) { + return null; + } + const newAnnotationsByPage = new Map(); + for (const [key, value] of annotationStorage) { + if (!key.startsWith(_util.AnnotationEditorPrefix)) { + continue; + } + let annotations = newAnnotationsByPage.get(value.pageIndex); + if (!annotations) { + annotations = []; + newAnnotationsByPage.set(value.pageIndex, annotations); + } + annotations.push(value); + } + return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; +} +function isAscii(str) { + return /^[\x00-\x7F]*$/.test(str); +} +function stringToUTF16HexString(str) { + const buf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push((char >> 8 & 0xff).toString(16).padStart(2, "0"), (char & 0xff).toString(16).padStart(2, "0")); + } + return buf.join(""); +} +function stringToUTF16String(str) { + let bigEndian = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + const buf = []; + if (bigEndian) { + buf.push("\xFE\xFF"); + } + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff)); + } + return buf.join(""); +} +function getRotationMatrix(rotation, width, height) { + switch (rotation) { + case 90: + return [0, 1, -1, 0, width, 0]; + case 180: + return [-1, 0, 0, -1, width, height]; + case 270: + return [0, -1, 1, 0, 0, height]; + default: + throw new Error("Invalid rotation"); + } +} + +/***/ }), +/* 136 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.BaseStream = void 0; +var _util = __w_pdfjs_require__(2); +class BaseStream { + constructor() { + if (this.constructor === BaseStream) { + (0, _util.unreachable)("Cannot initialize BaseStream."); + } + } + get length() { + (0, _util.unreachable)("Abstract getter `length` accessed"); + } + get isEmpty() { + (0, _util.unreachable)("Abstract getter `isEmpty` accessed"); + } + get isDataLoaded() { + return (0, _util.shadow)(this, "isDataLoaded", true); + } + getByte() { + (0, _util.unreachable)("Abstract method `getByte` called"); + } + getBytes(length) { + (0, _util.unreachable)("Abstract method `getBytes` called"); + } + peekByte() { + const peekedByte = this.getByte(); + if (peekedByte !== -1) { + this.pos--; + } + return peekedByte; + } + peekBytes(length) { + const bytes = this.getBytes(length); + this.pos -= bytes.length; + return bytes; + } + getUint16() { + const b0 = this.getByte(); + const b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + } + getInt32() { + const b0 = this.getByte(); + const b1 = this.getByte(); + const b2 = this.getByte(); + const b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + } + getByteRange(begin, end) { + (0, _util.unreachable)("Abstract method `getByteRange` called"); + } + getString(length) { + return (0, _util.bytesToString)(this.getBytes(length)); + } + skip(n) { + this.pos += n || 1; + } + reset() { + (0, _util.unreachable)("Abstract method `reset` called"); + } + moveStart() { + (0, _util.unreachable)("Abstract method `moveStart` called"); + } + makeSubStream(start, length) { + let dict = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + (0, _util.unreachable)("Abstract method `makeSubStream` called"); + } + getBaseStreams() { + return null; + } +} +exports.BaseStream = BaseStream; + +/***/ }), +/* 137 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.NetworkPdfManager = exports.LocalPdfManager = void 0; +var _util = __w_pdfjs_require__(2); +var _chunked_stream = __w_pdfjs_require__(138); +var _core_utils = __w_pdfjs_require__(135); +var _document = __w_pdfjs_require__(140); +var _stream = __w_pdfjs_require__(139); +function parseDocBaseUrl(url) { + if (url) { + const absoluteUrl = (0, _util.createValidAbsoluteUrl)(url); + if (absoluteUrl) { + return absoluteUrl.href; + } + (0, _util.warn)(`Invalid absolute docBaseUrl: "${url}".`); + } + return null; +} +class BasePdfManager { + constructor() { + if (this.constructor === BasePdfManager) { + (0, _util.unreachable)("Cannot initialize BasePdfManager."); + } + } + get docId() { + return this._docId; + } + get password() { + return this._password; + } + get docBaseUrl() { + const catalog = this.pdfDocument.catalog; + return (0, _util.shadow)(this, "docBaseUrl", catalog.baseUrl || this._docBaseUrl); + } + ensureDoc(prop, args) { + return this.ensure(this.pdfDocument, prop, args); + } + ensureXRef(prop, args) { + return this.ensure(this.pdfDocument.xref, prop, args); + } + ensureCatalog(prop, args) { + return this.ensure(this.pdfDocument.catalog, prop, args); + } + getPage(pageIndex) { + return this.pdfDocument.getPage(pageIndex); + } + fontFallback(id, handler) { + return this.pdfDocument.fontFallback(id, handler); + } + loadXfaFonts(handler, task) { + return this.pdfDocument.loadXfaFonts(handler, task); + } + loadXfaImages() { + return this.pdfDocument.loadXfaImages(); + } + serializeXfaData(annotationStorage) { + return this.pdfDocument.serializeXfaData(annotationStorage); + } + cleanup() { + let manuallyTriggered = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return this.pdfDocument.cleanup(manuallyTriggered); + } + async ensure(obj, prop, args) { + (0, _util.unreachable)("Abstract method `ensure` called"); + } + requestRange(begin, end) { + (0, _util.unreachable)("Abstract method `requestRange` called"); + } + requestLoadedStream() { + let noFetch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + (0, _util.unreachable)("Abstract method `requestLoadedStream` called"); + } + sendProgressiveData(chunk) { + (0, _util.unreachable)("Abstract method `sendProgressiveData` called"); + } + updatePassword(password) { + this._password = password; + } + terminate(reason) { + (0, _util.unreachable)("Abstract method `terminate` called"); + } +} +class LocalPdfManager extends BasePdfManager { + constructor(docId, data, password, msgHandler, evaluatorOptions, enableXfa, docBaseUrl) { + super(); + this._docId = docId; + this._password = password; + this._docBaseUrl = parseDocBaseUrl(docBaseUrl); + this.msgHandler = msgHandler; + this.evaluatorOptions = evaluatorOptions; + this.enableXfa = enableXfa; + const stream = new _stream.Stream(data); + this.pdfDocument = new _document.PDFDocument(this, stream); + this._loadedStreamPromise = Promise.resolve(stream); + } + async ensure(obj, prop, args) { + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; + } + requestRange(begin, end) { + return Promise.resolve(); + } + requestLoadedStream() { + let noFetch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return this._loadedStreamPromise; + } + terminate(reason) {} +} +exports.LocalPdfManager = LocalPdfManager; +class NetworkPdfManager extends BasePdfManager { + constructor(docId, pdfNetworkStream, args, evaluatorOptions, enableXfa, docBaseUrl) { + super(); + this._docId = docId; + this._password = args.password; + this._docBaseUrl = parseDocBaseUrl(docBaseUrl); + this.msgHandler = args.msgHandler; + this.evaluatorOptions = evaluatorOptions; + this.enableXfa = enableXfa; + this.streamManager = new _chunked_stream.ChunkedStreamManager(pdfNetworkStream, { + msgHandler: args.msgHandler, + length: args.length, + disableAutoFetch: args.disableAutoFetch, + rangeChunkSize: args.rangeChunkSize + }); + this.pdfDocument = new _document.PDFDocument(this, this.streamManager.getStream()); + } + async ensure(obj, prop, args) { + try { + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; + } catch (ex) { + if (!(ex instanceof _core_utils.MissingDataException)) { + throw ex; + } + await this.requestRange(ex.begin, ex.end); + return this.ensure(obj, prop, args); + } + } + requestRange(begin, end) { + return this.streamManager.requestRange(begin, end); + } + requestLoadedStream() { + let noFetch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return this.streamManager.requestAllChunks(noFetch); + } + sendProgressiveData(chunk) { + this.streamManager.onReceiveData({ + chunk + }); + } + terminate(reason) { + this.streamManager.abort(reason); + } +} +exports.NetworkPdfManager = NetworkPdfManager; + +/***/ }), +/* 138 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ChunkedStreamManager = exports.ChunkedStream = void 0; +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +var _stream = __w_pdfjs_require__(139); +class ChunkedStream extends _stream.Stream { + constructor(length, chunkSize, manager) { + super(new Uint8Array(length), 0, length, null); + this.chunkSize = chunkSize; + this._loadedChunks = new Set(); + this.numChunks = Math.ceil(length / chunkSize); + this.manager = manager; + this.progressiveDataLength = 0; + this.lastSuccessfulEnsureByteChunk = -1; + } + getMissingChunks() { + const chunks = []; + for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + chunks.push(chunk); + } + } + return chunks; + } + get numChunksLoaded() { + return this._loadedChunks.size; + } + get isDataLoaded() { + return this.numChunksLoaded === this.numChunks; + } + onReceiveData(begin, chunk) { + const chunkSize = this.chunkSize; + if (begin % chunkSize !== 0) { + throw new Error(`Bad begin offset: ${begin}`); + } + const end = begin + chunk.byteLength; + if (end % chunkSize !== 0 && end !== this.bytes.length) { + throw new Error(`Bad end offset: ${end}`); + } + this.bytes.set(new Uint8Array(chunk), begin); + const beginChunk = Math.floor(begin / chunkSize); + const endChunk = Math.floor((end - 1) / chunkSize) + 1; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + onReceiveProgressiveData(data) { + let position = this.progressiveDataLength; + const beginChunk = Math.floor(position / this.chunkSize); + this.bytes.set(new Uint8Array(data), position); + position += data.byteLength; + this.progressiveDataLength = position; + const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + ensureByte(pos) { + if (pos < this.progressiveDataLength) { + return; + } + const chunk = Math.floor(pos / this.chunkSize); + if (chunk > this.numChunks) { + return; + } + if (chunk === this.lastSuccessfulEnsureByteChunk) { + return; + } + if (!this._loadedChunks.has(chunk)) { + throw new _core_utils.MissingDataException(pos, pos + 1); + } + this.lastSuccessfulEnsureByteChunk = chunk; + } + ensureRange(begin, end) { + if (begin >= end) { + return; + } + if (end <= this.progressiveDataLength) { + return; + } + const beginChunk = Math.floor(begin / this.chunkSize); + if (beginChunk > this.numChunks) { + return; + } + const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + throw new _core_utils.MissingDataException(begin, end); + } + } + } + nextEmptyChunk(beginChunk) { + const numChunks = this.numChunks; + for (let i = 0; i < numChunks; ++i) { + const chunk = (beginChunk + i) % numChunks; + if (!this._loadedChunks.has(chunk)) { + return chunk; + } + } + return null; + } + hasChunk(chunk) { + return this._loadedChunks.has(chunk); + } + getByte() { + const pos = this.pos; + if (pos >= this.end) { + return -1; + } + if (pos >= this.progressiveDataLength) { + this.ensureByte(pos); + } + return this.bytes[this.pos++]; + } + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + if (strEnd > this.progressiveDataLength) { + this.ensureRange(pos, strEnd); + } + return bytes.subarray(pos, strEnd); + } + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + if (end > this.progressiveDataLength) { + this.ensureRange(pos, end); + } + this.pos = end; + return bytes.subarray(pos, end); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + if (end > this.progressiveDataLength) { + this.ensureRange(begin, end); + } + return this.bytes.subarray(begin, end); + } + makeSubStream(start, length) { + let dict = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + if (length) { + if (start + length > this.progressiveDataLength) { + this.ensureRange(start, start + length); + } + } else { + if (start >= this.progressiveDataLength) { + this.ensureByte(start); + } + } + function ChunkedStreamSubstream() {} + ChunkedStreamSubstream.prototype = Object.create(this); + ChunkedStreamSubstream.prototype.getMissingChunks = function () { + const chunkSize = this.chunkSize; + const beginChunk = Math.floor(this.start / chunkSize); + const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; + const missingChunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + missingChunks.push(chunk); + } + } + return missingChunks; + }; + Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { + get() { + if (this.numChunksLoaded === this.numChunks) { + return true; + } + return this.getMissingChunks().length === 0; + }, + configurable: true + }); + const subStream = new ChunkedStreamSubstream(); + subStream.pos = subStream.start = start; + subStream.end = start + length || this.end; + subStream.dict = dict; + return subStream; + } + getBaseStreams() { + return [this]; + } +} +exports.ChunkedStream = ChunkedStream; +class ChunkedStreamManager { + constructor(pdfNetworkStream, args) { + this.length = args.length; + this.chunkSize = args.rangeChunkSize; + this.stream = new ChunkedStream(this.length, this.chunkSize, this); + this.pdfNetworkStream = pdfNetworkStream; + this.disableAutoFetch = args.disableAutoFetch; + this.msgHandler = args.msgHandler; + this.currRequestId = 0; + this._chunksNeededByRequest = new Map(); + this._requestsByChunk = new Map(); + this._promisesByRequest = new Map(); + this.progressiveDataLength = 0; + this.aborted = false; + this._loadedStreamCapability = (0, _util.createPromiseCapability)(); + } + sendRequest(begin, end) { + const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); + if (!rangeReader.isStreamingSupported) { + rangeReader.onProgress = this.onProgress.bind(this); + } + let chunks = [], + loaded = 0; + return new Promise((resolve, reject) => { + const readChunk = chunk => { + try { + if (!chunk.done) { + const data = chunk.value; + chunks.push(data); + loaded += (0, _util.arrayByteLength)(data); + if (rangeReader.isStreamingSupported) { + this.onProgress({ + loaded + }); + } + rangeReader.read().then(readChunk, reject); + return; + } + const chunkData = (0, _util.arraysToBytes)(chunks); + chunks = null; + resolve(chunkData); + } catch (e) { + reject(e); + } + }; + rangeReader.read().then(readChunk, reject); + }).then(data => { + if (this.aborted) { + return; + } + this.onReceiveData({ + chunk: data, + begin + }); + }); + } + requestAllChunks() { + let noFetch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (!noFetch) { + const missingChunks = this.stream.getMissingChunks(); + this._requestChunks(missingChunks); + } + return this._loadedStreamCapability.promise; + } + _requestChunks(chunks) { + const requestId = this.currRequestId++; + const chunksNeeded = new Set(); + this._chunksNeededByRequest.set(requestId, chunksNeeded); + for (const chunk of chunks) { + if (!this.stream.hasChunk(chunk)) { + chunksNeeded.add(chunk); + } + } + if (chunksNeeded.size === 0) { + return Promise.resolve(); + } + const capability = (0, _util.createPromiseCapability)(); + this._promisesByRequest.set(requestId, capability); + const chunksToRequest = []; + for (const chunk of chunksNeeded) { + let requestIds = this._requestsByChunk.get(chunk); + if (!requestIds) { + requestIds = []; + this._requestsByChunk.set(chunk, requestIds); + chunksToRequest.push(chunk); + } + requestIds.push(requestId); + } + if (chunksToRequest.length > 0) { + const groupedChunksToRequest = this.groupChunks(chunksToRequest); + for (const groupedChunk of groupedChunksToRequest) { + const begin = groupedChunk.beginChunk * this.chunkSize; + const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); + this.sendRequest(begin, end).catch(capability.reject); + } + } + return capability.promise.catch(reason => { + if (this.aborted) { + return; + } + throw reason; + }); + } + getStream() { + return this.stream; + } + requestRange(begin, end) { + end = Math.min(end, this.length); + const beginChunk = this.getBeginChunk(begin); + const endChunk = this.getEndChunk(end); + const chunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + chunks.push(chunk); + } + return this._requestChunks(chunks); + } + requestRanges() { + let ranges = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + const chunksToRequest = []; + for (const range of ranges) { + const beginChunk = this.getBeginChunk(range.begin); + const endChunk = this.getEndChunk(range.end); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!chunksToRequest.includes(chunk)) { + chunksToRequest.push(chunk); + } + } + } + chunksToRequest.sort(function (a, b) { + return a - b; + }); + return this._requestChunks(chunksToRequest); + } + groupChunks(chunks) { + const groupedChunks = []; + let beginChunk = -1; + let prevChunk = -1; + for (let i = 0, ii = chunks.length; i < ii; ++i) { + const chunk = chunks[i]; + if (beginChunk < 0) { + beginChunk = chunk; + } + if (prevChunk >= 0 && prevChunk + 1 !== chunk) { + groupedChunks.push({ + beginChunk, + endChunk: prevChunk + 1 + }); + beginChunk = chunk; + } + if (i + 1 === chunks.length) { + groupedChunks.push({ + beginChunk, + endChunk: chunk + 1 + }); + } + prevChunk = chunk; + } + return groupedChunks; + } + onProgress(args) { + this.msgHandler.send("DocProgress", { + loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, + total: this.length + }); + } + onReceiveData(args) { + const chunk = args.chunk; + const isProgressive = args.begin === undefined; + const begin = isProgressive ? this.progressiveDataLength : args.begin; + const end = begin + chunk.byteLength; + const beginChunk = Math.floor(begin / this.chunkSize); + const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); + if (isProgressive) { + this.stream.onReceiveProgressiveData(chunk); + this.progressiveDataLength = end; + } else { + this.stream.onReceiveData(begin, chunk); + } + if (this.stream.isDataLoaded) { + this._loadedStreamCapability.resolve(this.stream); + } + const loadedRequests = []; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + const requestIds = this._requestsByChunk.get(curChunk); + if (!requestIds) { + continue; + } + this._requestsByChunk.delete(curChunk); + for (const requestId of requestIds) { + const chunksNeeded = this._chunksNeededByRequest.get(requestId); + if (chunksNeeded.has(curChunk)) { + chunksNeeded.delete(curChunk); + } + if (chunksNeeded.size > 0) { + continue; + } + loadedRequests.push(requestId); + } + } + if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { + let nextEmptyChunk; + if (this.stream.numChunksLoaded === 1) { + const lastChunk = this.stream.numChunks - 1; + if (!this.stream.hasChunk(lastChunk)) { + nextEmptyChunk = lastChunk; + } + } else { + nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); + } + if (Number.isInteger(nextEmptyChunk)) { + this._requestChunks([nextEmptyChunk]); + } + } + for (const requestId of loadedRequests) { + const capability = this._promisesByRequest.get(requestId); + this._promisesByRequest.delete(requestId); + capability.resolve(); + } + this.msgHandler.send("DocProgress", { + loaded: this.stream.numChunksLoaded * this.chunkSize, + total: this.length + }); + } + onError(err) { + this._loadedStreamCapability.reject(err); + } + getBeginChunk(begin) { + return Math.floor(begin / this.chunkSize); + } + getEndChunk(end) { + return Math.floor((end - 1) / this.chunkSize) + 1; + } + abort(reason) { + this.aborted = true; + if (this.pdfNetworkStream) { + this.pdfNetworkStream.cancelAllRequests(reason); + } + for (const capability of this._promisesByRequest.values()) { + capability.reject(reason); + } + } +} +exports.ChunkedStreamManager = ChunkedStreamManager; + +/***/ }), +/* 139 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.StringStream = exports.Stream = exports.NullStream = void 0; +var _base_stream = __w_pdfjs_require__(136); +var _util = __w_pdfjs_require__(2); +class Stream extends _base_stream.BaseStream { + constructor(arrayBuffer, start, length, dict) { + super(); + this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); + this.start = start || 0; + this.pos = this.start; + this.end = start + length || this.bytes.length; + this.dict = dict; + } + get length() { + return this.end - this.start; + } + get isEmpty() { + return this.length === 0; + } + getByte() { + if (this.pos >= this.end) { + return -1; + } + return this.bytes[this.pos++]; + } + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + return bytes.subarray(pos, strEnd); + } + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + this.pos = end; + return bytes.subarray(pos, end); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + return this.bytes.subarray(begin, end); + } + reset() { + this.pos = this.start; + } + moveStart() { + this.start = this.pos; + } + makeSubStream(start, length) { + let dict = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + return new Stream(this.bytes.buffer, start, length, dict); + } +} +exports.Stream = Stream; +class StringStream extends Stream { + constructor(str) { + super((0, _util.stringToBytes)(str)); + } +} +exports.StringStream = StringStream; +class NullStream extends Stream { + constructor() { + super(new Uint8Array(0)); + } +} +exports.NullStream = NullStream; + +/***/ }), +/* 140 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Page = exports.PDFDocument = void 0; +var _annotation = __w_pdfjs_require__(141); +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +var _primitives = __w_pdfjs_require__(134); +var _xfa_fonts = __w_pdfjs_require__(180); +var _base_stream = __w_pdfjs_require__(136); +var _crypto = __w_pdfjs_require__(196); +var _catalog = __w_pdfjs_require__(198); +var _cleanup_helper = __w_pdfjs_require__(200); +var _dataset_reader = __w_pdfjs_require__(229); +var _parser = __w_pdfjs_require__(146); +var _stream = __w_pdfjs_require__(139); +var _object_loader = __w_pdfjs_require__(204); +var _operator_list = __w_pdfjs_require__(191); +var _evaluator = __w_pdfjs_require__(144); +var _decode_stream = __w_pdfjs_require__(148); +var _struct_tree = __w_pdfjs_require__(203); +var _writer = __w_pdfjs_require__(194); +var _factory = __w_pdfjs_require__(205); +var _xref = __w_pdfjs_require__(230); +const DEFAULT_USER_UNIT = 1.0; +const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; +class Page { + constructor(_ref) { + let { + pdfManager, + xref, + pageIndex, + pageDict, + ref, + globalIdFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + nonBlendModesSet, + xfaFactory + } = _ref; + this.pdfManager = pdfManager; + this.pageIndex = pageIndex; + this.pageDict = pageDict; + this.xref = xref; + this.ref = ref; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalImageCache = globalImageCache; + this.nonBlendModesSet = nonBlendModesSet; + this.evaluatorOptions = pdfManager.evaluatorOptions; + this.resourcesPromise = null; + this.xfaFactory = xfaFactory; + const idCounters = { + obj: 0 + }; + this._localIdFactory = class extends globalIdFactory { + static createObjId() { + return `p${pageIndex}_${++idCounters.obj}`; + } + static getPageObjId() { + return `page${ref.toString()}`; + } + }; + } + _getInheritableProperty(key) { + let getArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + const value = (0, _core_utils.getInheritableProperty)({ + dict: this.pageDict, + key, + getArray, + stopWhenFound: false + }); + if (!Array.isArray(value)) { + return value; + } + if (value.length === 1 || !(value[0] instanceof _primitives.Dict)) { + return value[0]; + } + return _primitives.Dict.merge({ + xref: this.xref, + dictArray: value + }); + } + get content() { + return this.pageDict.getArray("Contents"); + } + get resources() { + const resources = this._getInheritableProperty("Resources"); + return (0, _util.shadow)(this, "resources", resources instanceof _primitives.Dict ? resources : _primitives.Dict.empty); + } + _getBoundingBox(name) { + if (this.xfaData) { + return this.xfaData.bbox; + } + let box = this._getInheritableProperty(name, true); + if (Array.isArray(box) && box.length === 4) { + box = _util.Util.normalizeRect(box); + if (box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return box; + } + (0, _util.warn)(`Empty, or invalid, /${name} entry.`); + } + return null; + } + get mediaBox() { + return (0, _util.shadow)(this, "mediaBox", this._getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); + } + get cropBox() { + return (0, _util.shadow)(this, "cropBox", this._getBoundingBox("CropBox") || this.mediaBox); + } + get userUnit() { + let obj = this.pageDict.get("UserUnit"); + if (typeof obj !== "number" || obj <= 0) { + obj = DEFAULT_USER_UNIT; + } + return (0, _util.shadow)(this, "userUnit", obj); + } + get view() { + const { + cropBox, + mediaBox + } = this; + if (cropBox !== mediaBox && !(0, _util.isArrayEqual)(cropBox, mediaBox)) { + const box = _util.Util.intersect(cropBox, mediaBox); + if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return (0, _util.shadow)(this, "view", box); + } + (0, _util.warn)("Empty /CropBox and /MediaBox intersection."); + } + return (0, _util.shadow)(this, "view", mediaBox); + } + get rotate() { + let rotate = this._getInheritableProperty("Rotate") || 0; + if (rotate % 90 !== 0) { + rotate = 0; + } else if (rotate >= 360) { + rotate %= 360; + } else if (rotate < 0) { + rotate = (rotate % 360 + 360) % 360; + } + return (0, _util.shadow)(this, "rotate", rotate); + } + _onSubStreamError(handler, reason, objId) { + if (this.evaluatorOptions.ignoreErrors) { + handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorContentSubStream + }); + (0, _util.warn)(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); + return; + } + throw reason; + } + getContentStream(handler) { + return this.pdfManager.ensure(this, "content").then(content => { + if (content instanceof _base_stream.BaseStream) { + return content; + } + if (Array.isArray(content)) { + return new _decode_stream.StreamsSequenceStream(content, this._onSubStreamError.bind(this, handler)); + } + return new _stream.NullStream(); + }); + } + get xfaData() { + return (0, _util.shadow)(this, "xfaData", this.xfaFactory ? { + bbox: this.xfaFactory.getBoundingBox(this.pageIndex) + } : null); + } + async saveNewAnnotations(handler, task, annotations) { + if (this.xfaFactory) { + throw new Error("XFA: Cannot save new annotations."); + } + const partialEvaluator = new _evaluator.PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + options: this.evaluatorOptions + }); + const pageDict = this.pageDict; + const annotationsArray = this.annotations.slice(); + const newData = await _annotation.AnnotationFactory.saveNewAnnotations(partialEvaluator, task, annotations); + for (const { + ref + } of newData.annotations) { + annotationsArray.push(ref); + } + const savedDict = pageDict.get("Annots"); + pageDict.set("Annots", annotationsArray); + const buffer = []; + let transform = null; + if (this.xref.encrypt) { + transform = this.xref.encrypt.createCipherTransform(this.ref.num, this.ref.gen); + } + (0, _writer.writeObject)(this.ref, pageDict, buffer, transform); + if (savedDict) { + pageDict.set("Annots", savedDict); + } + const objects = newData.dependencies; + objects.push({ + ref: this.ref, + data: buffer.join("") + }, ...newData.annotations); + return objects; + } + save(handler, task, annotationStorage) { + const partialEvaluator = new _evaluator.PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + options: this.evaluatorOptions + }); + return this._parsedAnnotations.then(function (annotations) { + const newRefsPromises = []; + for (const annotation of annotations) { + if (!annotation.mustBePrinted(annotationStorage)) { + continue; + } + newRefsPromises.push(annotation.save(partialEvaluator, task, annotationStorage).catch(function (reason) { + (0, _util.warn)("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return null; + })); + } + return Promise.all(newRefsPromises).then(function (newRefs) { + return newRefs.filter(newRef => !!newRef); + }); + }); + } + loadResources(keys) { + if (!this.resourcesPromise) { + this.resourcesPromise = this.pdfManager.ensure(this, "resources"); + } + return this.resourcesPromise.then(() => { + const objectLoader = new _object_loader.ObjectLoader(this.resources, keys, this.xref); + return objectLoader.load(); + }); + } + getOperatorList(_ref2) { + let { + handler, + sink, + task, + intent, + cacheKey, + annotationStorage = null + } = _ref2; + const contentStreamPromise = this.getContentStream(handler); + const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]); + const partialEvaluator = new _evaluator.PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + options: this.evaluatorOptions + }); + const newAnnotationsByPage = !this.xfaFactory ? (0, _core_utils.getNewAnnotationsMap)(annotationStorage) : null; + let newAnnotationsPromise = Promise.resolve(null); + if (newAnnotationsByPage) { + const newAnnotations = newAnnotationsByPage.get(this.pageIndex); + if (newAnnotations) { + newAnnotationsPromise = _annotation.AnnotationFactory.printNewAnnotations(partialEvaluator, task, newAnnotations); + } + } + const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); + const pageListPromise = dataPromises.then(_ref3 => { + let [contentStream] = _ref3; + const opList = new _operator_list.OperatorList(intent, sink); + handler.send("StartRenderPage", { + transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet), + pageIndex: this.pageIndex, + cacheKey + }); + return partialEvaluator.getOperatorList({ + stream: contentStream, + task, + resources: this.resources, + operatorList: opList + }).then(function () { + return opList; + }); + }); + return Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]).then(function (_ref4) { + let [pageOpList, annotations, newAnnotations] = _ref4; + if (newAnnotations) { + annotations = annotations.concat(newAnnotations); + } + if (annotations.length === 0 || intent & _util.RenderingIntentFlag.ANNOTATIONS_DISABLE) { + pageOpList.flush(true); + return { + length: pageOpList.totalLength + }; + } + const renderForms = !!(intent & _util.RenderingIntentFlag.ANNOTATIONS_FORMS), + intentAny = !!(intent & _util.RenderingIntentFlag.ANY), + intentDisplay = !!(intent & _util.RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & _util.RenderingIntentFlag.PRINT); + const opListPromises = []; + for (const annotation of annotations) { + if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage) || intentPrint && annotation.mustBePrinted(annotationStorage)) { + opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, renderForms, annotationStorage).catch(function (reason) { + (0, _util.warn)("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return { + opList: null, + separateForm: false, + separateCanvas: false + }; + })); + } + } + return Promise.all(opListPromises).then(function (opLists) { + let form = false, + canvas = false; + for (const { + opList, + separateForm, + separateCanvas + } of opLists) { + pageOpList.addOpList(opList); + if (separateForm) { + form = separateForm; + } + if (separateCanvas) { + canvas = separateCanvas; + } + } + pageOpList.flush(true, { + form, + canvas + }); + return { + length: pageOpList.totalLength + }; + }); + }); + } + extractTextContent(_ref5) { + let { + handler, + task, + includeMarkedContent, + sink, + combineTextItems + } = _ref5; + const contentStreamPromise = this.getContentStream(handler); + const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]); + const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); + return dataPromises.then(_ref6 => { + let [contentStream] = _ref6; + const partialEvaluator = new _evaluator.PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + options: this.evaluatorOptions + }); + return partialEvaluator.getTextContent({ + stream: contentStream, + task, + resources: this.resources, + includeMarkedContent, + combineTextItems, + sink, + viewBox: this.view + }); + }); + } + async getStructTree() { + const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot"); + if (!structTreeRoot) { + return null; + } + const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); + return structTree.serializable; + } + _parseStructTree(structTreeRoot) { + const tree = new _struct_tree.StructTreePage(structTreeRoot, this.pageDict); + tree.parse(); + return tree; + } + async getAnnotationsData(handler, task, intent) { + const annotations = await this._parsedAnnotations; + if (annotations.length === 0) { + return []; + } + const textContentPromises = []; + const annotationsData = []; + let partialEvaluator; + const intentAny = !!(intent & _util.RenderingIntentFlag.ANY), + intentDisplay = !!(intent & _util.RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & _util.RenderingIntentFlag.PRINT); + for (const annotation of annotations) { + const isVisible = intentAny || intentDisplay && annotation.viewable; + if (isVisible || intentPrint && annotation.printable) { + annotationsData.push(annotation.data); + } + if (annotation.hasTextContent && isVisible) { + if (!partialEvaluator) { + partialEvaluator = new _evaluator.PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + options: this.evaluatorOptions + }); + } + textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, this.view).catch(function (reason) { + (0, _util.warn)(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`); + })); + } + } + await Promise.all(textContentPromises); + return annotationsData; + } + get annotations() { + const annots = this._getInheritableProperty("Annots"); + return (0, _util.shadow)(this, "annotations", Array.isArray(annots) ? annots : []); + } + get _parsedAnnotations() { + const parsedAnnotations = this.pdfManager.ensure(this, "annotations").then(() => { + const annotationPromises = []; + for (const annotationRef of this.annotations) { + annotationPromises.push(_annotation.AnnotationFactory.create(this.xref, annotationRef, this.pdfManager, this._localIdFactory, false).catch(function (reason) { + (0, _util.warn)(`_parsedAnnotations: "${reason}".`); + return null; + })); + } + return Promise.all(annotationPromises).then(function (annotations) { + if (annotations.length === 0) { + return annotations; + } + const sortedAnnotations = []; + let popupAnnotations; + for (const annotation of annotations) { + if (!annotation) { + continue; + } + if (annotation instanceof _annotation.PopupAnnotation) { + if (!popupAnnotations) { + popupAnnotations = []; + } + popupAnnotations.push(annotation); + continue; + } + sortedAnnotations.push(annotation); + } + if (popupAnnotations) { + sortedAnnotations.push(...popupAnnotations); + } + return sortedAnnotations; + }); + }); + return (0, _util.shadow)(this, "_parsedAnnotations", parsedAnnotations); + } + get jsActions() { + const actions = (0, _core_utils.collectActions)(this.xref, this.pageDict, _util.PageActionEventType); + return (0, _util.shadow)(this, "jsActions", actions); + } +} +exports.Page = Page; +const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]); +const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]); +const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]); +const FINGERPRINT_FIRST_BYTES = 1024; +const EMPTY_FINGERPRINT = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; +function find(stream, signature) { + let limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1024; + let backwards = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + const signatureLength = signature.length; + const scanBytes = stream.peekBytes(limit); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + return false; + } + if (backwards) { + const signatureEnd = signatureLength - 1; + let pos = scanBytes.length - 1; + while (pos >= signatureEnd) { + let j = 0; + while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos - signatureEnd; + return true; + } + pos--; + } + } else { + let pos = 0; + while (pos <= scanLength) { + let j = 0; + while (j < signatureLength && scanBytes[pos + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos; + return true; + } + pos++; + } + } + return false; +} +class PDFDocument { + constructor(pdfManager, stream) { + if (stream.length <= 0) { + throw new _util.InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes."); + } + this.pdfManager = pdfManager; + this.stream = stream; + this.xref = new _xref.XRef(stream, pdfManager); + this._pagePromises = new Map(); + this._version = null; + const idCounters = { + font: 0 + }; + this._globalIdFactory = class { + static getDocId() { + return `g_${pdfManager.docId}`; + } + static createFontId() { + return `f${++idCounters.font}`; + } + static createObjId() { + (0, _util.unreachable)("Abstract method `createObjId` called."); + } + static getPageObjId() { + (0, _util.unreachable)("Abstract method `getPageObjId` called."); + } + }; + } + parse(recoveryMode) { + this.xref.parse(recoveryMode); + this.catalog = new _catalog.Catalog(this.pdfManager, this.xref); + } + get linearization() { + let linearization = null; + try { + linearization = _parser.Linearization.create(this.stream); + } catch (err) { + if (err instanceof _core_utils.MissingDataException) { + throw err; + } + (0, _util.info)(err); + } + return (0, _util.shadow)(this, "linearization", linearization); + } + get startXRef() { + const stream = this.stream; + let startXRef = 0; + if (this.linearization) { + stream.reset(); + if (find(stream, ENDOBJ_SIGNATURE)) { + startXRef = stream.pos + 6 - stream.start; + } + } else { + const step = 1024; + const startXRefLength = STARTXREF_SIGNATURE.length; + let found = false, + pos = stream.end; + while (!found && pos > 0) { + pos -= step - startXRefLength; + if (pos < 0) { + pos = 0; + } + stream.pos = pos; + found = find(stream, STARTXREF_SIGNATURE, step, true); + } + if (found) { + stream.skip(9); + let ch; + do { + ch = stream.getByte(); + } while ((0, _core_utils.isWhiteSpace)(ch)); + let str = ""; + while (ch >= 0x20 && ch <= 0x39) { + str += String.fromCharCode(ch); + ch = stream.getByte(); + } + startXRef = parseInt(str, 10); + if (isNaN(startXRef)) { + startXRef = 0; + } + } + } + return (0, _util.shadow)(this, "startXRef", startXRef); + } + checkHeader() { + const stream = this.stream; + stream.reset(); + if (!find(stream, PDF_HEADER_SIGNATURE)) { + return; + } + stream.moveStart(); + stream.skip(PDF_HEADER_SIGNATURE.length); + let version = "", + ch; + while ((ch = stream.getByte()) > 0x20 && version.length < 7) { + version += String.fromCharCode(ch); + } + if (_core_utils.PDF_VERSION_REGEXP.test(version)) { + this._version = version; + } else { + (0, _util.warn)(`Invalid PDF header version: ${version}`); + } + } + parseStartXRef() { + this.xref.setStartXRef(this.startXRef); + } + get numPages() { + let num = 0; + if (this.catalog.hasActualNumPages) { + num = this.catalog.numPages; + } else if (this.xfaFactory) { + num = this.xfaFactory.getNumPages(); + } else if (this.linearization) { + num = this.linearization.numPages; + } else { + num = this.catalog.numPages; + } + return (0, _util.shadow)(this, "numPages", num); + } + _hasOnlyDocumentSignatures(fields) { + let recursionDepth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + const RECURSION_LIMIT = 10; + if (!Array.isArray(fields)) { + return false; + } + return fields.every(field => { + field = this.xref.fetchIfRef(field); + if (!(field instanceof _primitives.Dict)) { + return false; + } + if (field.has("Kids")) { + if (++recursionDepth > RECURSION_LIMIT) { + (0, _util.warn)("_hasOnlyDocumentSignatures: maximum recursion depth reached"); + return false; + } + return this._hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); + } + const isSignature = (0, _primitives.isName)(field.get("FT"), "Sig"); + const rectangle = field.get("Rect"); + const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0); + return isSignature && isInvisible; + }); + } + get _xfaStreams() { + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return null; + } + const xfa = acroForm.get("XFA"); + const entries = { + "xdp:xdp": "", + template: "", + datasets: "", + config: "", + connectionSet: "", + localeSet: "", + stylesheet: "", + "/xdp:xdp": "" + }; + if (xfa instanceof _base_stream.BaseStream && !xfa.isEmpty) { + entries["xdp:xdp"] = xfa; + return entries; + } + if (!Array.isArray(xfa) || xfa.length === 0) { + return null; + } + for (let i = 0, ii = xfa.length; i < ii; i += 2) { + let name; + if (i === 0) { + name = "xdp:xdp"; + } else if (i === ii - 2) { + name = "/xdp:xdp"; + } else { + name = xfa[i]; + } + if (!entries.hasOwnProperty(name)) { + continue; + } + const data = this.xref.fetchIfRef(xfa[i + 1]); + if (!(data instanceof _base_stream.BaseStream) || data.isEmpty) { + continue; + } + entries[name] = data; + } + return entries; + } + get xfaDatasets() { + const streams = this._xfaStreams; + if (!streams) { + return (0, _util.shadow)(this, "xfaDatasets", null); + } + for (const key of ["datasets", "xdp:xdp"]) { + const stream = streams[key]; + if (!stream) { + continue; + } + try { + const str = (0, _util.stringToUTF8String)(stream.getString()); + const data = { + [key]: str + }; + return (0, _util.shadow)(this, "xfaDatasets", new _dataset_reader.DatasetReader(data)); + } catch (_) { + (0, _util.warn)("XFA - Invalid utf-8 string."); + break; + } + } + return (0, _util.shadow)(this, "xfaDatasets", null); + } + get xfaData() { + const streams = this._xfaStreams; + if (!streams) { + return null; + } + const data = Object.create(null); + for (const [key, stream] of Object.entries(streams)) { + if (!stream) { + continue; + } + try { + data[key] = (0, _util.stringToUTF8String)(stream.getString()); + } catch (_) { + (0, _util.warn)("XFA - Invalid utf-8 string."); + return null; + } + } + return data; + } + get xfaFactory() { + let data; + if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) { + data = this.xfaData; + } + return (0, _util.shadow)(this, "xfaFactory", data ? new _factory.XFAFactory(data) : null); + } + get isPureXfa() { + return this.xfaFactory ? this.xfaFactory.isValid() : false; + } + get htmlForXfa() { + return this.xfaFactory ? this.xfaFactory.getPages() : null; + } + async loadXfaImages() { + const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages"); + if (!xfaImagesDict) { + return; + } + const keys = xfaImagesDict.getKeys(); + const objectLoader = new _object_loader.ObjectLoader(xfaImagesDict, keys, this.xref); + await objectLoader.load(); + const xfaImages = new Map(); + for (const key of keys) { + const stream = xfaImagesDict.get(key); + if (stream instanceof _base_stream.BaseStream) { + xfaImages.set(key, stream.getBytes()); + } + } + this.xfaFactory.setImages(xfaImages); + } + async loadXfaFonts(handler, task) { + const acroForm = await this.pdfManager.ensureCatalog("acroForm"); + if (!acroForm) { + return; + } + const resources = await acroForm.getAsync("DR"); + if (!(resources instanceof _primitives.Dict)) { + return; + } + const objectLoader = new _object_loader.ObjectLoader(resources, ["Font"], this.xref); + await objectLoader.load(); + const fontRes = resources.get("Font"); + if (!(fontRes instanceof _primitives.Dict)) { + return; + } + const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions); + options.useSystemFonts = false; + const partialEvaluator = new _evaluator.PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: -1, + idFactory: this._globalIdFactory, + fontCache: this.catalog.fontCache, + builtInCMapCache: this.catalog.builtInCMapCache, + standardFontDataCache: this.catalog.standardFontDataCache, + options + }); + const operatorList = new _operator_list.OperatorList(); + const pdfFonts = []; + const initialState = { + get font() { + return pdfFonts.at(-1); + }, + set font(font) { + pdfFonts.push(font); + }, + clone() { + return this; + } + }; + const fonts = new Map(); + fontRes.forEach((fontName, font) => { + fonts.set(fontName, font); + }); + const promises = []; + for (const [fontName, font] of fonts) { + const descriptor = font.get("FontDescriptor"); + if (!(descriptor instanceof _primitives.Dict)) { + continue; + } + let fontFamily = descriptor.get("FontFamily"); + fontFamily = fontFamily.replace(/[ ]+(\d)/g, "$1"); + const fontWeight = descriptor.get("FontWeight"); + const italicAngle = -descriptor.get("ItalicAngle"); + const cssFontInfo = { + fontFamily, + fontWeight, + italicAngle + }; + if (!(0, _core_utils.validateCSSFont)(cssFontInfo)) { + continue; + } + promises.push(partialEvaluator.handleSetFont(resources, [_primitives.Name.get(fontName), 1], null, operatorList, task, initialState, null, cssFontInfo).catch(function (reason) { + (0, _util.warn)(`loadXfaFonts: "${reason}".`); + return null; + })); + } + await Promise.all(promises); + const missingFonts = this.xfaFactory.setFonts(pdfFonts); + if (!missingFonts) { + return; + } + options.ignoreErrors = true; + promises.length = 0; + pdfFonts.length = 0; + const reallyMissingFonts = new Set(); + for (const missing of missingFonts) { + if (!(0, _xfa_fonts.getXfaFontName)(`${missing}-Regular`)) { + reallyMissingFonts.add(missing); + } + } + if (reallyMissingFonts.size) { + missingFonts.push("PdfJS-Fallback"); + } + for (const missing of missingFonts) { + if (reallyMissingFonts.has(missing)) { + continue; + } + for (const fontInfo of [{ + name: "Regular", + fontWeight: 400, + italicAngle: 0 + }, { + name: "Bold", + fontWeight: 700, + italicAngle: 0 + }, { + name: "Italic", + fontWeight: 400, + italicAngle: 12 + }, { + name: "BoldItalic", + fontWeight: 700, + italicAngle: 12 + }]) { + const name = `${missing}-${fontInfo.name}`; + const dict = (0, _xfa_fonts.getXfaFontDict)(name); + promises.push(partialEvaluator.handleSetFont(resources, [_primitives.Name.get(name), 1], null, operatorList, task, initialState, dict, { + fontFamily: missing, + fontWeight: fontInfo.fontWeight, + italicAngle: fontInfo.italicAngle + }).catch(function (reason) { + (0, _util.warn)(`loadXfaFonts: "${reason}".`); + return null; + })); + } + } + await Promise.all(promises); + this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); + } + async serializeXfaData(annotationStorage) { + return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null; + } + get version() { + return this.catalog.version || this._version; + } + get formInfo() { + const formInfo = { + hasFields: false, + hasAcroForm: false, + hasXfa: false, + hasSignatures: false + }; + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return (0, _util.shadow)(this, "formInfo", formInfo); + } + try { + const fields = acroForm.get("Fields"); + const hasFields = Array.isArray(fields) && fields.length > 0; + formInfo.hasFields = hasFields; + const xfa = acroForm.get("XFA"); + formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof _base_stream.BaseStream && !xfa.isEmpty; + const sigFlags = acroForm.get("SigFlags"); + const hasSignatures = !!(sigFlags & 0x1); + const hasOnlyDocumentSignatures = hasSignatures && this._hasOnlyDocumentSignatures(fields); + formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; + formInfo.hasSignatures = hasSignatures; + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)(`Cannot fetch form information: "${ex}".`); + } + return (0, _util.shadow)(this, "formInfo", formInfo); + } + get documentInfo() { + const docInfo = { + PDFFormatVersion: this.version, + Language: this.catalog.lang, + EncryptFilterName: this.xref.encrypt ? this.xref.encrypt.filterName : null, + IsLinearized: !!this.linearization, + IsAcroFormPresent: this.formInfo.hasAcroForm, + IsXFAPresent: this.formInfo.hasXfa, + IsCollectionPresent: !!this.catalog.collection, + IsSignaturesPresent: this.formInfo.hasSignatures + }; + let infoDict; + try { + infoDict = this.xref.trailer.get("Info"); + } catch (err) { + if (err instanceof _core_utils.MissingDataException) { + throw err; + } + (0, _util.info)("The document information dictionary is invalid."); + } + if (!(infoDict instanceof _primitives.Dict)) { + return (0, _util.shadow)(this, "documentInfo", docInfo); + } + for (const key of infoDict.getKeys()) { + const value = infoDict.get(key); + switch (key) { + case "Title": + case "Author": + case "Subject": + case "Keywords": + case "Creator": + case "Producer": + case "CreationDate": + case "ModDate": + if (typeof value === "string") { + docInfo[key] = (0, _util.stringToPDFString)(value); + continue; + } + break; + case "Trapped": + if (value instanceof _primitives.Name) { + docInfo[key] = value; + continue; + } + break; + default: + let customValue; + switch (typeof value) { + case "string": + customValue = (0, _util.stringToPDFString)(value); + break; + case "number": + case "boolean": + customValue = value; + break; + default: + if (value instanceof _primitives.Name) { + customValue = value; + } + break; + } + if (customValue === undefined) { + (0, _util.warn)(`Bad value, for custom key "${key}", in Info: ${value}.`); + continue; + } + if (!docInfo.Custom) { + docInfo.Custom = Object.create(null); + } + docInfo.Custom[key] = customValue; + continue; + } + (0, _util.warn)(`Bad value, for key "${key}", in Info: ${value}.`); + } + return (0, _util.shadow)(this, "documentInfo", docInfo); + } + get fingerprints() { + function validate(data) { + return typeof data === "string" && data.length > 0 && data !== EMPTY_FINGERPRINT; + } + function hexString(hash) { + const buf = []; + for (const num of hash) { + const hex = num.toString(16); + buf.push(hex.padStart(2, "0")); + } + return buf.join(""); + } + const idArray = this.xref.trailer.get("ID"); + let hashOriginal, hashModified; + if (Array.isArray(idArray) && validate(idArray[0])) { + hashOriginal = (0, _util.stringToBytes)(idArray[0]); + if (idArray[1] !== idArray[0] && validate(idArray[1])) { + hashModified = (0, _util.stringToBytes)(idArray[1]); + } + } else { + hashOriginal = (0, _crypto.calculateMD5)(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); + } + return (0, _util.shadow)(this, "fingerprints", [hexString(hashOriginal), hashModified ? hexString(hashModified) : null]); + } + async _getLinearizationPage(pageIndex) { + const { + catalog, + linearization, + xref + } = this; + const ref = _primitives.Ref.get(linearization.objectNumberFirst, 0); + try { + const obj = await xref.fetchAsync(ref); + if (obj instanceof _primitives.Dict) { + let type = obj.getRaw("Type"); + if (type instanceof _primitives.Ref) { + type = await xref.fetchAsync(type); + } + if ((0, _primitives.isName)(type, "Page") || !obj.has("Type") && !obj.has("Kids")) { + if (!catalog.pageKidsCountCache.has(ref)) { + catalog.pageKidsCountCache.put(ref, 1); + } + if (!catalog.pageIndexCache.has(ref)) { + catalog.pageIndexCache.put(ref, 0); + } + return [obj, ref]; + } + } + throw new _util.FormatError("The Linearization dictionary doesn't point to a valid Page dictionary."); + } catch (reason) { + (0, _util.warn)(`_getLinearizationPage: "${reason.message}".`); + return catalog.getPageDict(pageIndex); + } + } + getPage(pageIndex) { + const cachedPromise = this._pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const { + catalog, + linearization, + xfaFactory + } = this; + let promise; + if (xfaFactory) { + promise = Promise.resolve([_primitives.Dict.empty, null]); + } else if (linearization && linearization.pageFirst === pageIndex) { + promise = this._getLinearizationPage(pageIndex); + } else { + promise = catalog.getPageDict(pageIndex); + } + promise = promise.then(_ref7 => { + let [pageDict, ref] = _ref7; + return new Page({ + pdfManager: this.pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory + }); + }); + this._pagePromises.set(pageIndex, promise); + return promise; + } + async checkFirstPage() { + let recoveryMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (recoveryMode) { + return; + } + try { + await this.getPage(0); + } catch (reason) { + if (reason instanceof _core_utils.XRefEntryException) { + this._pagePromises.delete(0); + await this.cleanup(); + throw new _core_utils.XRefParseException(); + } + } + } + async checkLastPage() { + let recoveryMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const { + catalog, + pdfManager + } = this; + catalog.setActualNumPages(); + let numPages; + try { + await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]); + if (this.xfaFactory) { + return; + } else if (this.linearization) { + numPages = this.linearization.numPages; + } else { + numPages = catalog.numPages; + } + if (!Number.isInteger(numPages)) { + throw new _util.FormatError("Page count is not an integer."); + } else if (numPages <= 1) { + return; + } + await this.getPage(numPages - 1); + } catch (reason) { + this._pagePromises.delete(numPages - 1); + await this.cleanup(); + if (reason instanceof _core_utils.XRefEntryException && !recoveryMode) { + throw new _core_utils.XRefParseException(); + } + (0, _util.warn)(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`); + let pagesTree; + try { + pagesTree = await catalog.getAllPageDicts(recoveryMode); + } catch (reasonAll) { + if (reasonAll instanceof _core_utils.XRefEntryException && !recoveryMode) { + throw new _core_utils.XRefParseException(); + } + catalog.setActualNumPages(1); + return; + } + for (const [pageIndex, [pageDict, ref]] of pagesTree) { + let promise; + if (pageDict instanceof Error) { + promise = Promise.reject(pageDict); + promise.catch(() => {}); + } else { + promise = Promise.resolve(new Page({ + pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory: null + })); + } + this._pagePromises.set(pageIndex, promise); + } + catalog.setActualNumPages(pagesTree.size); + } + } + fontFallback(id, handler) { + return this.catalog.fontFallback(id, handler); + } + async cleanup() { + let manuallyTriggered = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return this.catalog ? this.catalog.cleanup(manuallyTriggered) : (0, _cleanup_helper.clearGlobalCaches)(); + } + _collectFieldObjects(name, fieldRef, promises) { + const field = this.xref.fetchIfRef(fieldRef); + if (field.has("T")) { + const partName = (0, _util.stringToPDFString)(field.get("T")); + if (name === "") { + name = partName; + } else { + name = `${name}.${partName}`; + } + } + if (!promises.has(name)) { + promises.set(name, []); + } + promises.get(name).push(_annotation.AnnotationFactory.create(this.xref, fieldRef, this.pdfManager, this._localIdFactory, true).then(annotation => annotation && annotation.getFieldObject()).catch(function (reason) { + (0, _util.warn)(`_collectFieldObjects: "${reason}".`); + return null; + })); + if (field.has("Kids")) { + const kids = field.get("Kids"); + for (const kid of kids) { + this._collectFieldObjects(name, kid, promises); + } + } + } + get fieldObjects() { + if (!this.formInfo.hasFields) { + return (0, _util.shadow)(this, "fieldObjects", Promise.resolve(null)); + } + const allFields = Object.create(null); + const fieldPromises = new Map(); + for (const fieldRef of this.catalog.acroForm.get("Fields")) { + this._collectFieldObjects("", fieldRef, fieldPromises); + } + const allPromises = []; + for (const [name, promises] of fieldPromises) { + allPromises.push(Promise.all(promises).then(fields => { + fields = fields.filter(field => !!field); + if (fields.length > 0) { + allFields[name] = fields; + } + })); + } + return (0, _util.shadow)(this, "fieldObjects", Promise.all(allPromises).then(() => allFields)); + } + get hasJSActions() { + const promise = this.pdfManager.ensureDoc("_parseHasJSActions"); + return (0, _util.shadow)(this, "hasJSActions", promise); + } + async _parseHasJSActions() { + const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]); + if (catalogJsActions) { + return true; + } + if (fieldObjects) { + return Object.values(fieldObjects).some(fieldObject => fieldObject.some(object => object.actions !== null)); + } + return false; + } + get calculationOrderIds() { + const acroForm = this.catalog.acroForm; + if (!acroForm || !acroForm.has("CO")) { + return (0, _util.shadow)(this, "calculationOrderIds", null); + } + const calculationOrder = acroForm.get("CO"); + if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { + return (0, _util.shadow)(this, "calculationOrderIds", null); + } + const ids = []; + for (const id of calculationOrder) { + if (id instanceof _primitives.Ref) { + ids.push(id.toString()); + } + } + if (ids.length === 0) { + return (0, _util.shadow)(this, "calculationOrderIds", null); + } + return (0, _util.shadow)(this, "calculationOrderIds", ids); + } +} +exports.PDFDocument = PDFDocument; + +/***/ }), +/* 141 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PopupAnnotation = exports.MarkupAnnotation = exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = void 0; +exports.getQuadPoints = getQuadPoints; +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +var _default_appearance = __w_pdfjs_require__(142); +var _primitives = __w_pdfjs_require__(134); +var _writer = __w_pdfjs_require__(194); +var _base_stream = __w_pdfjs_require__(136); +var _bidi = __w_pdfjs_require__(189); +var _catalog = __w_pdfjs_require__(198); +var _colorspace = __w_pdfjs_require__(143); +var _file_spec = __w_pdfjs_require__(201); +var _object_loader = __w_pdfjs_require__(204); +var _operator_list = __w_pdfjs_require__(191); +var _stream = __w_pdfjs_require__(139); +var _factory = __w_pdfjs_require__(205); +class AnnotationFactory { + static create(xref, ref, pdfManager, idFactory, collectFields) { + return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments"), pdfManager.ensureDoc("xfaDatasets"), collectFields ? this._getPageIndex(xref, ref, pdfManager) : -1]).then(_ref => { + let [acroForm, baseUrl, attachments, xfaDatasets, pageIndex] = _ref; + return pdfManager.ensure(this, "_create", [xref, ref, pdfManager, idFactory, acroForm, attachments, xfaDatasets, collectFields, pageIndex]); + }); + } + static _create(xref, ref, pdfManager, idFactory, acroForm) { + let attachments = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null; + let xfaDatasets = arguments.length > 6 ? arguments[6] : undefined; + let collectFields = arguments.length > 7 ? arguments[7] : undefined; + let pageIndex = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : -1; + const dict = xref.fetchIfRef(ref); + if (!(dict instanceof _primitives.Dict)) { + return undefined; + } + const id = ref instanceof _primitives.Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; + let subtype = dict.get("Subtype"); + subtype = subtype instanceof _primitives.Name ? subtype.name : null; + const acroFormDict = acroForm instanceof _primitives.Dict ? acroForm : _primitives.Dict.empty; + const parameters = { + xref, + ref, + dict, + subtype, + id, + pdfManager, + acroForm: acroFormDict, + attachments, + xfaDatasets, + collectFields, + needAppearances: !collectFields && acroFormDict.get("NeedAppearances") === true, + pageIndex, + isOffscreenCanvasSupported: _util.FeatureTest.isOffscreenCanvasSupported && pdfManager.evaluatorOptions.isOffscreenCanvasSupported + }; + switch (subtype) { + case "Link": + return new LinkAnnotation(parameters); + case "Text": + return new TextAnnotation(parameters); + case "Widget": + let fieldType = (0, _core_utils.getInheritableProperty)({ + dict, + key: "FT" + }); + fieldType = fieldType instanceof _primitives.Name ? fieldType.name : null; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotation(parameters); + case "Btn": + return new ButtonWidgetAnnotation(parameters); + case "Ch": + return new ChoiceWidgetAnnotation(parameters); + case "Sig": + return new SignatureWidgetAnnotation(parameters); + } + (0, _util.warn)(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type."); + return new WidgetAnnotation(parameters); + case "Popup": + return new PopupAnnotation(parameters); + case "FreeText": + return new FreeTextAnnotation(parameters); + case "Line": + return new LineAnnotation(parameters); + case "Square": + return new SquareAnnotation(parameters); + case "Circle": + return new CircleAnnotation(parameters); + case "PolyLine": + return new PolylineAnnotation(parameters); + case "Polygon": + return new PolygonAnnotation(parameters); + case "Caret": + return new CaretAnnotation(parameters); + case "Ink": + return new InkAnnotation(parameters); + case "Highlight": + return new HighlightAnnotation(parameters); + case "Underline": + return new UnderlineAnnotation(parameters); + case "Squiggly": + return new SquigglyAnnotation(parameters); + case "StrikeOut": + return new StrikeOutAnnotation(parameters); + case "Stamp": + return new StampAnnotation(parameters); + case "FileAttachment": + return new FileAttachmentAnnotation(parameters); + default: + if (!collectFields) { + if (!subtype) { + (0, _util.warn)("Annotation is missing the required /Subtype."); + } else { + (0, _util.warn)(`Unimplemented annotation type "${subtype}", ` + "falling back to base annotation."); + } + } + return new Annotation(parameters); + } + } + static async _getPageIndex(xref, ref, pdfManager) { + try { + const annotDict = await xref.fetchIfRefAsync(ref); + if (!(annotDict instanceof _primitives.Dict)) { + return -1; + } + const pageRef = annotDict.getRaw("P"); + if (!(pageRef instanceof _primitives.Ref)) { + return -1; + } + const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]); + return pageIndex; + } catch (ex) { + (0, _util.warn)(`_getPageIndex: "${ex}".`); + return -1; + } + } + static async saveNewAnnotations(evaluator, task, annotations) { + const xref = evaluator.xref; + let baseFontRef; + const dependencies = []; + const promises = []; + for (const annotation of annotations) { + switch (annotation.annotationType) { + case _util.AnnotationEditorType.FREETEXT: + if (!baseFontRef) { + const baseFont = new _primitives.Dict(xref); + baseFont.set("BaseFont", _primitives.Name.get("Helvetica")); + baseFont.set("Type", _primitives.Name.get("Font")); + baseFont.set("Subtype", _primitives.Name.get("Type1")); + baseFont.set("Encoding", _primitives.Name.get("WinAnsiEncoding")); + const buffer = []; + baseFontRef = xref.getNewTemporaryRef(); + (0, _writer.writeObject)(baseFontRef, baseFont, buffer, null); + dependencies.push({ + ref: baseFontRef, + data: buffer.join("") + }); + } + promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, dependencies, { + evaluator, + task, + baseFontRef + })); + break; + case _util.AnnotationEditorType.INK: + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, dependencies)); + } + } + return { + annotations: await Promise.all(promises), + dependencies + }; + } + static async printNewAnnotations(evaluator, task, annotations) { + if (!annotations) { + return null; + } + const xref = evaluator.xref; + const promises = []; + const isOffscreenCanvasSupported = _util.FeatureTest.isOffscreenCanvasSupported && evaluator.options.isOffscreenCanvasSupported; + for (const annotation of annotations) { + switch (annotation.annotationType) { + case _util.AnnotationEditorType.FREETEXT: + promises.push(FreeTextAnnotation.createNewPrintAnnotation(xref, annotation, { + evaluator, + task, + isOffscreenCanvasSupported + })); + break; + case _util.AnnotationEditorType.INK: + promises.push(InkAnnotation.createNewPrintAnnotation(xref, annotation, { + isOffscreenCanvasSupported + })); + break; + } + } + return Promise.all(promises); + } +} +exports.AnnotationFactory = AnnotationFactory; +function getRgbColor(color) { + let defaultColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Uint8ClampedArray(3); + if (!Array.isArray(color)) { + return defaultColor; + } + const rgbColor = defaultColor || new Uint8ClampedArray(3); + switch (color.length) { + case 0: + return null; + case 1: + _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 3: + _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + case 4: + _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; + default: + return defaultColor; + } +} +function getPdfColorArray(color) { + return Array.from(color, c => c / 255); +} +function getQuadPoints(dict, rect) { + const quadPoints = dict.getArray("QuadPoints"); + if (!Array.isArray(quadPoints) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { + return null; + } + const quadPointsLists = []; + for (let i = 0, ii = quadPoints.length / 8; i < ii; i++) { + let minX = Infinity, + maxX = -Infinity, + minY = Infinity, + maxY = -Infinity; + for (let j = i * 8, jj = i * 8 + 8; j < jj; j += 2) { + const x = quadPoints[j]; + const y = quadPoints[j + 1]; + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) { + return null; + } + quadPointsLists.push([{ + x: minX, + y: maxY + }, { + x: maxX, + y: maxY + }, { + x: minX, + y: minY + }, { + x: maxX, + y: minY + }]); + } + return quadPointsLists; +} +function getTransformMatrix(rect, bbox, matrix) { + const [minX, minY, maxX, maxY] = _util.Util.getAxialAlignedBoundingBox(bbox, matrix); + if (minX === maxX || minY === maxY) { + return [1, 0, 0, 1, rect[0], rect[1]]; + } + const xRatio = (rect[2] - rect[0]) / (maxX - minX); + const yRatio = (rect[3] - rect[1]) / (maxY - minY); + return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio]; +} +class Annotation { + constructor(params) { + const { + dict, + xref + } = params; + this.setTitle(dict.get("T")); + this.setContents(dict.get("Contents")); + this.setModificationDate(dict.get("M")); + this.setFlags(dict.get("F")); + this.setRectangle(dict.getArray("Rect")); + this.setColor(dict.getArray("C")); + this.setBorderStyle(dict); + this.setAppearance(dict); + this.setOptionalContent(dict); + const MK = dict.get("MK"); + this.setBorderAndBackgroundColors(MK); + this.setRotation(MK); + this._streams = []; + if (this.appearance) { + this._streams.push(this.appearance); + } + this.data = { + annotationFlags: this.flags, + borderStyle: this.borderStyle, + color: this.color, + backgroundColor: this.backgroundColor, + borderColor: this.borderColor, + rotation: this.rotation, + contentsObj: this._contents, + hasAppearance: !!this.appearance, + id: params.id, + modificationDate: this.modificationDate, + rect: this.rectangle, + subtype: params.subtype, + hasOwnCanvas: false + }; + if (params.collectFields) { + const kids = dict.get("Kids"); + if (Array.isArray(kids)) { + const kidIds = []; + for (const kid of kids) { + if (kid instanceof _primitives.Ref) { + kidIds.push(kid.toString()); + } + } + if (kidIds.length !== 0) { + this.data.kidIds = kidIds; + } + } + this.data.actions = (0, _core_utils.collectActions)(xref, dict, _util.AnnotationActionEventType); + this.data.fieldName = this._constructFieldName(dict); + this.data.pageIndex = params.pageIndex; + } + this._isOffscreenCanvasSupported = params.isOffscreenCanvasSupported; + this._fallbackFontDict = null; + this._needAppearances = false; + } + _hasFlag(flags, flag) { + return !!(flags & flag); + } + _isViewable(flags) { + return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.NOVIEW); + } + _isPrintable(flags) { + return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE); + } + mustBeViewed(annotationStorage) { + const storageEntry = annotationStorage && annotationStorage.get(this.data.id); + if (storageEntry && storageEntry.hidden !== undefined) { + return !storageEntry.hidden; + } + return this.viewable && !this._hasFlag(this.flags, _util.AnnotationFlag.HIDDEN); + } + mustBePrinted(annotationStorage) { + const storageEntry = annotationStorage && annotationStorage.get(this.data.id); + if (storageEntry && storageEntry.print !== undefined) { + return storageEntry.print; + } + return this.printable; + } + get viewable() { + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return true; + } + return this._isViewable(this.flags); + } + get printable() { + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return false; + } + return this._isPrintable(this.flags); + } + _parseStringHelper(data) { + const str = typeof data === "string" ? (0, _util.stringToPDFString)(data) : ""; + const dir = str && (0, _bidi.bidi)(str).dir === "rtl" ? "rtl" : "ltr"; + return { + str, + dir + }; + } + setDefaultAppearance(params) { + const defaultAppearance = (0, _core_utils.getInheritableProperty)({ + dict: params.dict, + key: "DA" + }) || params.acroForm.get("DA"); + this._defaultAppearance = typeof defaultAppearance === "string" ? defaultAppearance : ""; + this.data.defaultAppearanceData = (0, _default_appearance.parseDefaultAppearance)(this._defaultAppearance); + } + setTitle(title) { + this._title = this._parseStringHelper(title); + } + setContents(contents) { + this._contents = this._parseStringHelper(contents); + } + setModificationDate(modificationDate) { + this.modificationDate = typeof modificationDate === "string" ? modificationDate : null; + } + setFlags(flags) { + this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0; + } + hasFlag(flag) { + return this._hasFlag(this.flags, flag); + } + setRectangle(rectangle) { + if (Array.isArray(rectangle) && rectangle.length === 4) { + this.rectangle = _util.Util.normalizeRect(rectangle); + } else { + this.rectangle = [0, 0, 0, 0]; + } + } + setColor(color) { + this.color = getRgbColor(color); + } + setLineEndings(lineEndings) { + this.lineEndings = ["None", "None"]; + if (Array.isArray(lineEndings) && lineEndings.length === 2) { + for (let i = 0; i < 2; i++) { + const obj = lineEndings[i]; + if (obj instanceof _primitives.Name) { + switch (obj.name) { + case "None": + continue; + case "Square": + case "Circle": + case "Diamond": + case "OpenArrow": + case "ClosedArrow": + case "Butt": + case "ROpenArrow": + case "RClosedArrow": + case "Slash": + this.lineEndings[i] = obj.name; + continue; + } + } + (0, _util.warn)(`Ignoring invalid lineEnding: ${obj}`); + } + } + } + setRotation(mk) { + this.rotation = 0; + if (mk instanceof _primitives.Dict) { + let angle = mk.get("R") || 0; + if (Number.isInteger(angle) && angle !== 0) { + angle %= 360; + if (angle < 0) { + angle += 360; + } + if (angle % 90 === 0) { + this.rotation = angle; + } + } + } + } + setBorderAndBackgroundColors(mk) { + if (mk instanceof _primitives.Dict) { + this.borderColor = getRgbColor(mk.getArray("BC"), null); + this.backgroundColor = getRgbColor(mk.getArray("BG"), null); + } else { + this.borderColor = this.backgroundColor = null; + } + } + setBorderStyle(borderStyle) { + this.borderStyle = new AnnotationBorderStyle(); + if (!(borderStyle instanceof _primitives.Dict)) { + return; + } + if (borderStyle.has("BS")) { + const dict = borderStyle.get("BS"); + const dictType = dict.get("Type"); + if (!dictType || (0, _primitives.isName)(dictType, "Border")) { + this.borderStyle.setWidth(dict.get("W"), this.rectangle); + this.borderStyle.setStyle(dict.get("S")); + this.borderStyle.setDashArray(dict.getArray("D")); + } + } else if (borderStyle.has("Border")) { + const array = borderStyle.getArray("Border"); + if (Array.isArray(array) && array.length >= 3) { + this.borderStyle.setHorizontalCornerRadius(array[0]); + this.borderStyle.setVerticalCornerRadius(array[1]); + this.borderStyle.setWidth(array[2], this.rectangle); + if (array.length === 4) { + this.borderStyle.setDashArray(array[3], true); + } + } + } else { + this.borderStyle.setWidth(0); + } + } + setAppearance(dict) { + this.appearance = null; + const appearanceStates = dict.get("AP"); + if (!(appearanceStates instanceof _primitives.Dict)) { + return; + } + const normalAppearanceState = appearanceStates.get("N"); + if (normalAppearanceState instanceof _base_stream.BaseStream) { + this.appearance = normalAppearanceState; + return; + } + if (!(normalAppearanceState instanceof _primitives.Dict)) { + return; + } + const as = dict.get("AS"); + if (!(as instanceof _primitives.Name) || !normalAppearanceState.has(as.name)) { + return; + } + this.appearance = normalAppearanceState.get(as.name); + } + setOptionalContent(dict) { + this.oc = null; + const oc = dict.get("OC"); + if (oc instanceof _primitives.Name) { + (0, _util.warn)("setOptionalContent: Support for /Name-entry is not implemented."); + } else if (oc instanceof _primitives.Dict) { + this.oc = oc; + } + } + loadResources(keys, appearance) { + return appearance.dict.getAsync("Resources").then(resources => { + if (!resources) { + return undefined; + } + const objectLoader = new _object_loader.ObjectLoader(resources, keys, resources.xref); + return objectLoader.load().then(function () { + return resources; + }); + }); + } + async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { + const data = this.data; + let appearance = this.appearance; + const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & _util.RenderingIntentFlag.DISPLAY); + if (!appearance) { + if (!isUsingOwnCanvas) { + return { + opList: new _operator_list.OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + appearance = new _stream.StringStream(""); + appearance.dict = new _primitives.Dict(); + } + const appearanceDict = appearance.dict; + const resources = await this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], appearance); + const bbox = appearanceDict.getArray("BBox") || [0, 0, 1, 1]; + const matrix = appearanceDict.getArray("Matrix") || [1, 0, 0, 1, 0, 0]; + const transform = getTransformMatrix(data.rect, bbox, matrix); + const opList = new _operator_list.OperatorList(); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(_util.OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(_util.OPS.beginAnnotation, [data.id, data.rect, transform, matrix, isUsingOwnCanvas]); + await evaluator.getOperatorList({ + stream: appearance, + task, + resources, + operatorList: opList, + fallbackFontDict: this._fallbackFontDict + }); + opList.addOp(_util.OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(_util.OPS.endMarkedContent, []); + } + this.reset(); + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas + }; + } + async save(evaluator, task, annotationStorage) { + return null; + } + get hasTextContent() { + return false; + } + async extractTextContent(evaluator, task, viewBox) { + if (!this.appearance) { + return; + } + const resources = await this.loadResources(["ExtGState", "Font", "Properties", "XObject"], this.appearance); + const text = []; + const buffer = []; + const sink = { + desiredSize: Math.Infinity, + ready: true, + enqueue(chunk, size) { + for (const item of chunk.items) { + buffer.push(item.str); + if (item.hasEOL) { + text.push(buffer.join("")); + buffer.length = 0; + } + } + } + }; + await evaluator.getTextContent({ + stream: this.appearance, + task, + resources, + includeMarkedContent: true, + combineTextItems: true, + sink, + viewBox + }); + this.reset(); + if (buffer.length) { + text.push(buffer.join("")); + } + if (text.length > 0) { + this.data.textContent = text; + } + } + getFieldObject() { + if (this.data.kidIds) { + return { + id: this.data.id, + actions: this.data.actions, + name: this.data.fieldName, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + type: "", + kidIds: this.data.kidIds, + page: this.data.pageIndex, + rotation: this.rotation + }; + } + return null; + } + reset() { + for (const stream of this._streams) { + stream.reset(); + } + } + _constructFieldName(dict) { + if (!dict.has("T") && !dict.has("Parent")) { + (0, _util.warn)("Unknown field name, falling back to empty field name."); + return ""; + } + if (!dict.has("Parent")) { + return (0, _util.stringToPDFString)(dict.get("T")); + } + const fieldName = []; + if (dict.has("T")) { + fieldName.unshift((0, _util.stringToPDFString)(dict.get("T"))); + } + let loopDict = dict; + const visited = new _primitives.RefSet(); + if (dict.objId) { + visited.put(dict.objId); + } + while (loopDict.has("Parent")) { + loopDict = loopDict.get("Parent"); + if (!(loopDict instanceof _primitives.Dict) || loopDict.objId && visited.has(loopDict.objId)) { + break; + } + if (loopDict.objId) { + visited.put(loopDict.objId); + } + if (loopDict.has("T")) { + fieldName.unshift((0, _util.stringToPDFString)(loopDict.get("T"))); + } + } + return fieldName.join("."); + } +} +exports.Annotation = Annotation; +class AnnotationBorderStyle { + constructor() { + this.width = 1; + this.style = _util.AnnotationBorderStyleType.SOLID; + this.dashArray = [3]; + this.horizontalCornerRadius = 0; + this.verticalCornerRadius = 0; + } + setWidth(width) { + let rect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0, 0, 0]; + if (width instanceof _primitives.Name) { + this.width = 0; + return; + } + if (typeof width === "number") { + if (width > 0) { + const maxWidth = (rect[2] - rect[0]) / 2; + const maxHeight = (rect[3] - rect[1]) / 2; + if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) { + (0, _util.warn)(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`); + width = 1; + } + } + this.width = width; + } + } + setStyle(style) { + if (!(style instanceof _primitives.Name)) { + return; + } + switch (style.name) { + case "S": + this.style = _util.AnnotationBorderStyleType.SOLID; + break; + case "D": + this.style = _util.AnnotationBorderStyleType.DASHED; + break; + case "B": + this.style = _util.AnnotationBorderStyleType.BEVELED; + break; + case "I": + this.style = _util.AnnotationBorderStyleType.INSET; + break; + case "U": + this.style = _util.AnnotationBorderStyleType.UNDERLINE; + break; + default: + break; + } + } + setDashArray(dashArray) { + let forceStyle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (Array.isArray(dashArray) && dashArray.length > 0) { + let isValid = true; + let allZeros = true; + for (const element of dashArray) { + const validNumber = +element >= 0; + if (!validNumber) { + isValid = false; + break; + } else if (element > 0) { + allZeros = false; + } + } + if (isValid && !allZeros) { + this.dashArray = dashArray; + if (forceStyle) { + this.setStyle(_primitives.Name.get("D")); + } + } else { + this.width = 0; + } + } else if (dashArray) { + this.width = 0; + } + } + setHorizontalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.horizontalCornerRadius = radius; + } + } + setVerticalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.verticalCornerRadius = radius; + } + } +} +exports.AnnotationBorderStyle = AnnotationBorderStyle; +class MarkupAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict + } = params; + if (dict.has("IRT")) { + const rawIRT = dict.getRaw("IRT"); + this.data.inReplyTo = rawIRT instanceof _primitives.Ref ? rawIRT.toString() : null; + const rt = dict.get("RT"); + this.data.replyType = rt instanceof _primitives.Name ? rt.name : _util.AnnotationReplyType.REPLY; + } + if (this.data.replyType === _util.AnnotationReplyType.GROUP) { + const parent = dict.get("IRT"); + this.setTitle(parent.get("T")); + this.data.titleObj = this._title; + this.setContents(parent.get("Contents")); + this.data.contentsObj = this._contents; + if (!parent.has("CreationDate")) { + this.data.creationDate = null; + } else { + this.setCreationDate(parent.get("CreationDate")); + this.data.creationDate = this.creationDate; + } + if (!parent.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parent.get("M")); + this.data.modificationDate = this.modificationDate; + } + this.data.hasPopup = parent.has("Popup"); + if (!parent.has("C")) { + this.data.color = null; + } else { + this.setColor(parent.getArray("C")); + this.data.color = this.color; + } + } else { + this.data.titleObj = this._title; + this.setCreationDate(dict.get("CreationDate")); + this.data.creationDate = this.creationDate; + this.data.hasPopup = dict.has("Popup"); + if (!dict.has("C")) { + this.data.color = null; + } + } + if (dict.has("RC")) { + this.data.richText = _factory.XFAFactory.getRichTextAsHtml(dict.get("RC")); + } + } + setCreationDate(creationDate) { + this.creationDate = typeof creationDate === "string" ? creationDate : null; + } + _setDefaultAppearance(_ref2) { + let { + xref, + extra, + strokeColor, + fillColor, + blendMode, + strokeAlpha, + fillAlpha, + pointsCallback + } = _ref2; + let minX = Number.MAX_VALUE; + let minY = Number.MAX_VALUE; + let maxX = Number.MIN_VALUE; + let maxY = Number.MIN_VALUE; + const buffer = ["q"]; + if (extra) { + buffer.push(extra); + } + if (strokeColor) { + buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`); + } + if (fillColor) { + buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); + } + let pointsArray = this.data.quadPoints; + if (!pointsArray) { + pointsArray = [[{ + x: this.rectangle[0], + y: this.rectangle[3] + }, { + x: this.rectangle[2], + y: this.rectangle[3] + }, { + x: this.rectangle[0], + y: this.rectangle[1] + }, { + x: this.rectangle[2], + y: this.rectangle[1] + }]]; + } + for (const points of pointsArray) { + const [mX, MX, mY, MY] = pointsCallback(buffer, points); + minX = Math.min(minX, mX); + maxX = Math.max(maxX, MX); + minY = Math.min(minY, mY); + maxY = Math.max(maxY, MY); + } + buffer.push("Q"); + const formDict = new _primitives.Dict(xref); + const appearanceStreamDict = new _primitives.Dict(xref); + appearanceStreamDict.set("Subtype", _primitives.Name.get("Form")); + const appearanceStream = new _stream.StringStream(buffer.join(" ")); + appearanceStream.dict = appearanceStreamDict; + formDict.set("Fm0", appearanceStream); + const gsDict = new _primitives.Dict(xref); + if (blendMode) { + gsDict.set("BM", _primitives.Name.get(blendMode)); + } + if (typeof strokeAlpha === "number") { + gsDict.set("CA", strokeAlpha); + } + if (typeof fillAlpha === "number") { + gsDict.set("ca", fillAlpha); + } + const stateDict = new _primitives.Dict(xref); + stateDict.set("GS0", gsDict); + const resources = new _primitives.Dict(xref); + resources.set("ExtGState", stateDict); + resources.set("XObject", formDict); + const appearanceDict = new _primitives.Dict(xref); + appearanceDict.set("Resources", resources); + const bbox = this.data.rect = [minX, minY, maxX, maxY]; + appearanceDict.set("BBox", bbox); + this.appearance = new _stream.StringStream("/GS0 gs /Fm0 Do"); + this.appearance.dict = appearanceDict; + this._streams.push(this.appearance, appearanceStream); + } + static async createNewAnnotation(xref, annotation, dependencies, params) { + const annotationRef = xref.getNewTemporaryRef(); + const ap = await this.createNewAppearanceStream(annotation, xref, params); + const buffer = []; + let annotationDict; + if (ap) { + const apRef = xref.getNewTemporaryRef(); + annotationDict = this.createNewDict(annotation, xref, { + apRef + }); + const transform = xref.encrypt ? xref.encrypt.createCipherTransform(apRef.num, apRef.gen) : null; + (0, _writer.writeObject)(apRef, ap, buffer, transform); + dependencies.push({ + ref: apRef, + data: buffer.join("") + }); + } else { + annotationDict = this.createNewDict(annotation, xref, {}); + } + buffer.length = 0; + const transform = xref.encrypt ? xref.encrypt.createCipherTransform(annotationRef.num, annotationRef.gen) : null; + (0, _writer.writeObject)(annotationRef, annotationDict, buffer, transform); + return { + ref: annotationRef, + data: buffer.join("") + }; + } + static async createNewPrintAnnotation(xref, annotation, params) { + const ap = await this.createNewAppearanceStream(annotation, xref, params); + const annotationDict = this.createNewDict(annotation, xref, { + ap + }); + return new this.prototype.constructor({ + dict: annotationDict, + xref, + isOffscreenCanvasSupported: params.isOffscreenCanvasSupported + }); + } +} +exports.MarkupAnnotation = MarkupAnnotation; +class WidgetAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + const data = this.data; + this.ref = params.ref; + this._needAppearances = params.needAppearances; + data.annotationType = _util.AnnotationType.WIDGET; + if (data.fieldName === undefined) { + data.fieldName = this._constructFieldName(dict); + } + if (data.actions === undefined) { + data.actions = (0, _core_utils.collectActions)(xref, dict, _util.AnnotationActionEventType); + } + let fieldValue = (0, _core_utils.getInheritableProperty)({ + dict, + key: "V", + getArray: true + }); + data.fieldValue = this._decodeFormValue(fieldValue); + const defaultFieldValue = (0, _core_utils.getInheritableProperty)({ + dict, + key: "DV", + getArray: true + }); + data.defaultFieldValue = this._decodeFormValue(defaultFieldValue); + if (fieldValue === undefined && params.xfaDatasets) { + const path = this._title.str; + if (path) { + this._hasValueFromXFA = true; + data.fieldValue = fieldValue = params.xfaDatasets.getValue(path); + } + } + if (fieldValue === undefined && data.defaultFieldValue !== null) { + data.fieldValue = data.defaultFieldValue; + } + data.alternativeText = (0, _util.stringToPDFString)(dict.get("TU") || ""); + this.setDefaultAppearance(params); + data.hasAppearance = this._needAppearances && data.fieldValue !== undefined && data.fieldValue !== null || data.hasAppearance; + const fieldType = (0, _core_utils.getInheritableProperty)({ + dict, + key: "FT" + }); + data.fieldType = fieldType instanceof _primitives.Name ? fieldType.name : null; + const localResources = (0, _core_utils.getInheritableProperty)({ + dict, + key: "DR" + }); + const acroFormResources = params.acroForm.get("DR"); + const appearanceResources = this.appearance && this.appearance.dict.get("Resources"); + this._fieldResources = { + localResources, + acroFormResources, + appearanceResources, + mergedResources: _primitives.Dict.merge({ + xref, + dictArray: [localResources, appearanceResources, acroFormResources], + mergeSubDicts: true + }) + }; + data.fieldFlags = (0, _core_utils.getInheritableProperty)({ + dict, + key: "Ff" + }); + if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { + data.fieldFlags = 0; + } + data.readOnly = this.hasFieldFlag(_util.AnnotationFieldFlag.READONLY); + data.required = this.hasFieldFlag(_util.AnnotationFieldFlag.REQUIRED); + data.hidden = this._hasFlag(data.annotationFlags, _util.AnnotationFlag.HIDDEN); + } + _decodeFormValue(formValue) { + if (Array.isArray(formValue)) { + return formValue.filter(item => typeof item === "string").map(item => (0, _util.stringToPDFString)(item)); + } else if (formValue instanceof _primitives.Name) { + return (0, _util.stringToPDFString)(formValue.name); + } else if (typeof formValue === "string") { + return (0, _util.stringToPDFString)(formValue); + } + return null; + } + hasFieldFlag(flag) { + return !!(this.data.fieldFlags & flag); + } + getRotationMatrix(annotationStorage) { + const storageEntry = annotationStorage ? annotationStorage.get(this.data.id) : undefined; + let rotation = storageEntry && storageEntry.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (rotation === 0) { + return _util.IDENTITY_MATRIX; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + return (0, _core_utils.getRotationMatrix)(rotation, width, height); + } + getBorderAndBackgroundAppearances(annotationStorage) { + const storageEntry = annotationStorage ? annotationStorage.get(this.data.id) : undefined; + let rotation = storageEntry && storageEntry.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (!this.backgroundColor && !this.borderColor) { + return ""; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const rect = rotation === 0 || rotation === 180 ? `0 0 ${width} ${height} re` : `0 0 ${height} ${width} re`; + let str = ""; + if (this.backgroundColor) { + str = `${(0, _default_appearance.getPdfColor)(this.backgroundColor, true)} ${rect} f `; + } + if (this.borderColor) { + const borderWidth = this.borderStyle.width || 1; + str += `${borderWidth} w ${(0, _default_appearance.getPdfColor)(this.borderColor, false)} ${rect} S `; + } + return str; + } + async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { + if (renderForms && !(this instanceof SignatureWidgetAnnotation)) { + return { + opList: new _operator_list.OperatorList(), + separateForm: true, + separateCanvas: false + }; + } + if (!this._hasText) { + return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + } + const content = await this._getAppearance(evaluator, task, intent, annotationStorage); + if (this.appearance && content === null) { + return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + } + const opList = new _operator_list.OperatorList(); + if (!this._defaultAppearance || content === null) { + return { + opList, + separateForm: false, + separateCanvas: false + }; + } + const matrix = [1, 0, 0, 1, 0, 0]; + const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]; + const transform = getTransformMatrix(this.data.rect, bbox, matrix); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(_util.OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(_util.OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), false]); + const stream = new _stream.StringStream(content); + await evaluator.getOperatorList({ + stream, + task, + resources: this._fieldResources.mergedResources, + operatorList: opList + }); + opList.addOp(_util.OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(_util.OPS.endMarkedContent, []); + } + return { + opList, + separateForm: false, + separateCanvas: false + }; + } + _getMKDict(rotation) { + const mk = new _primitives.Dict(null); + if (rotation) { + mk.set("R", rotation); + } + if (this.borderColor) { + mk.set("BC", getPdfColorArray(this.borderColor)); + } + if (this.backgroundColor) { + mk.set("BG", getPdfColorArray(this.backgroundColor)); + } + return mk.size > 0 ? mk : null; + } + async save(evaluator, task, annotationStorage) { + const storageEntry = annotationStorage ? annotationStorage.get(this.data.id) : undefined; + let value = storageEntry && storageEntry.value; + let rotation = storageEntry && storageEntry.rotation; + if (value === this.data.fieldValue || value === undefined) { + if (!this._hasValueFromXFA && rotation === undefined) { + return null; + } + value = value || this.data.fieldValue; + } + if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && value.length === this.data.fieldValue.length && value.every((x, i) => x === this.data.fieldValue[i])) { + return null; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let appearance = null; + if (!this._needAppearances) { + appearance = await this._getAppearance(evaluator, task, _util.RenderingIntentFlag.SAVE, annotationStorage); + if (appearance === null) { + return null; + } + } else {} + let needAppearances = false; + if (appearance && appearance.needAppearances) { + needAppearances = true; + appearance = null; + } + const { + xref + } = evaluator; + const originalDict = xref.fetchIfRef(this.ref); + if (!(originalDict instanceof _primitives.Dict)) { + return null; + } + const dict = new _primitives.Dict(xref); + for (const key of originalDict.getKeys()) { + if (key !== "AP") { + dict.set(key, originalDict.getRaw(key)); + } + } + const xfa = { + path: (0, _util.stringToPDFString)(dict.get("T") || ""), + value + }; + const encoder = val => { + return (0, _core_utils.isAscii)(val) ? val : (0, _core_utils.stringToUTF16String)(val, true); + }; + dict.set("V", Array.isArray(value) ? value.map(encoder) : encoder(value)); + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + const encrypt = xref.encrypt; + const originalTransform = encrypt ? encrypt.createCipherTransform(this.ref.num, this.ref.gen) : null; + const buffer = []; + const changes = [{ + ref: this.ref, + data: "", + xfa, + needAppearances + }]; + if (appearance !== null) { + const newRef = xref.getNewTemporaryRef(); + const AP = new _primitives.Dict(xref); + dict.set("AP", AP); + AP.set("N", newRef); + let newTransform = null; + if (encrypt) { + newTransform = encrypt.createCipherTransform(newRef.num, newRef.gen); + appearance = newTransform.encryptString(appearance); + } + const resources = this._getSaveFieldResources(xref); + const appearanceStream = new _stream.StringStream(appearance); + const appearanceDict = appearanceStream.dict = new _primitives.Dict(xref); + appearanceDict.set("Length", appearance.length); + appearanceDict.set("Subtype", _primitives.Name.get("Form")); + appearanceDict.set("Resources", resources); + appearanceDict.set("BBox", [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]); + const rotationMatrix = this.getRotationMatrix(annotationStorage); + if (rotationMatrix !== _util.IDENTITY_MATRIX) { + appearanceDict.set("Matrix", rotationMatrix); + } + (0, _writer.writeObject)(newRef, appearanceStream, buffer, newTransform); + changes.push({ + ref: newRef, + data: buffer.join(""), + xfa: null, + needAppearances: false + }); + buffer.length = 0; + } + dict.set("M", `D:${(0, _util.getModificationDate)()}`); + (0, _writer.writeObject)(this.ref, dict, buffer, originalTransform); + changes[0].data = buffer.join(""); + return changes; + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + const isPassword = this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD); + if (isPassword) { + return null; + } + const storageEntry = annotationStorage ? annotationStorage.get(this.data.id) : undefined; + let value, rotation; + if (storageEntry) { + value = storageEntry.formattedValue || storageEntry.value; + rotation = storageEntry.rotation; + } + if (rotation === undefined && value === undefined && !this._needAppearances) { + if (!this._hasValueFromXFA || this.appearance) { + return null; + } + } + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + if (value === undefined) { + value = this.data.fieldValue; + if (!value) { + return `/Tx BMC q ${colors}Q EMC`; + } + } + if (Array.isArray(value) && value.length === 1) { + value = value[0]; + } + (0, _util.assert)(typeof value === "string", "Expected `value` to be a string."); + if (!this.data.combo) { + value = value.trim(); + } else { + const option = this.data.options.find(_ref3 => { + let { + exportValue + } = _ref3; + return value === exportValue; + }) || this.data.options[0]; + value = option && option.displayValue || ""; + } + if (value === "") { + return `/Tx BMC q ${colors}Q EMC`; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let lineCount = -1; + let lines; + if (this.data.multiLine) { + lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC")); + lineCount = lines.length; + } else { + lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = (0, _default_appearance.parseDefaultAppearance)(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); + } + let font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); + let defaultAppearance, fontSize, lineHeight; + const encodedLines = []; + let encodingError = false; + for (const line of lines) { + const encodedString = font.encodeString(line); + if (encodedString.length > 1) { + encodingError = true; + } + encodedLines.push(encodedString.join("")); + } + if (encodingError && intent & _util.RenderingIntentFlag.SAVE) { + return { + needAppearances: true + }; + } + if (encodingError && this._isOffscreenCanvasSupported) { + const fontFamily = this.data.comb ? "monospace" : "sans-serif"; + const fakeUnicodeFont = new _default_appearance.FakeUnicodeFont(evaluator.xref, fontFamily); + const resources = fakeUnicodeFont.createFontResources(lines.join("")); + const newFont = resources.getRaw("Font"); + if (this._fieldResources.mergedResources.has("Font")) { + const oldFont = this._fieldResources.mergedResources.get("Font"); + for (const key of newFont.getKeys()) { + oldFont.set(key, newFont.getRaw(key)); + } + } else { + this._fieldResources.mergedResources.set("Font", newFont); + } + const fontName = fakeUnicodeFont.fontName.name; + font = await WidgetAnnotation._getFontData(evaluator, task, { + fontName, + fontSize: 0 + }, resources); + for (let i = 0, ii = encodedLines.length; i < ii; i++) { + encodedLines[i] = (0, _core_utils.stringToUTF16String)(lines[i]); + } + const savedDefaultAppearance = Object.assign(Object.create(null), this.data.defaultAppearanceData); + this.data.defaultAppearanceData.fontSize = 0; + this.data.defaultAppearanceData.fontName = fontName; + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); + this.data.defaultAppearanceData = savedDefaultAppearance; + } else { + if (!this._isOffscreenCanvasSupported) { + (0, _util.warn)("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly."); + } + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); + } + let descent = font.descent; + if (isNaN(descent)) { + descent = _util.BASELINE_FACTOR * lineHeight; + } else { + descent = Math.max(_util.BASELINE_FACTOR * lineHeight, Math.abs(descent) * fontSize); + } + const defaultVPadding = Math.min(Math.floor((totalHeight - fontSize) / 2), defaultPadding); + const alignment = this.data.textAlignment; + if (this.data.multiLine) { + return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); + } + if (this.data.comb) { + return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); + } + const bottomPadding = defaultVPadding + descent; + if (alignment === 0 || alignment > 2) { + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${(0, _core_utils.numberToString)(defaultHPadding)} ${(0, _core_utils.numberToString)(bottomPadding)} Tm (${(0, _core_utils.escapeString)(encodedLines[0])}) Tj` + " ET Q EMC"; + } + const prevInfo = { + shift: 0 + }; + const renderedText = this._renderText(encodedLines[0], font, fontSize, totalWidth, alignment, prevInfo, defaultHPadding, bottomPadding); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC"; + } + static async _getFontData(evaluator, task, appearanceData, resources) { + const operatorList = new _operator_list.OperatorList(); + const initialState = { + font: null, + clone() { + return this; + } + }; + const { + fontName, + fontSize + } = appearanceData; + await evaluator.handleSetFont(resources, [fontName && _primitives.Name.get(fontName), fontSize], null, operatorList, task, initialState, null); + return initialState.font; + } + _getTextWidth(text, font) { + return font.charsToGlyphs(text).reduce((width, glyph) => width + glyph.width, 0) / 1000; + } + _computeFontSize(height, width, text, font, lineCount) { + let { + fontSize + } = this.data.defaultAppearanceData; + let lineHeight = (fontSize || 12) * _util.LINE_FACTOR, + numberOfLines = Math.round(height / lineHeight); + if (!fontSize) { + const roundWithTwoDigits = x => Math.floor(x * 100) / 100; + if (lineCount === -1) { + const textWidth = this._getTextWidth(text, font); + fontSize = roundWithTwoDigits(Math.min(height / _util.LINE_FACTOR, textWidth > width ? width / textWidth : Infinity)); + numberOfLines = 1; + } else { + const lines = text.split(/\r\n?|\n/); + const cachedLines = []; + for (const line of lines) { + const encoded = font.encodeString(line).join(""); + const glyphs = font.charsToGlyphs(encoded); + const positions = font.getCharPositions(encoded); + cachedLines.push({ + line: encoded, + glyphs, + positions + }); + } + const isTooBig = fsize => { + let totalHeight = 0; + for (const cache of cachedLines) { + const chunks = this._splitLine(null, font, fsize, width, cache); + totalHeight += chunks.length * fsize; + if (totalHeight > height) { + return true; + } + } + return false; + }; + numberOfLines = Math.max(numberOfLines, lineCount); + while (true) { + lineHeight = height / numberOfLines; + fontSize = roundWithTwoDigits(lineHeight / _util.LINE_FACTOR); + if (isTooBig(fontSize)) { + numberOfLines++; + continue; + } + break; + } + } + const { + fontName, + fontColor + } = this.data.defaultAppearanceData; + this._defaultAppearance = (0, _default_appearance.createDefaultAppearance)({ + fontSize, + fontName, + fontColor + }); + } + return [this._defaultAppearance, fontSize, height / numberOfLines]; + } + _renderText(text, font, fontSize, totalWidth, alignment, prevInfo, hPadding, vPadding) { + let shift; + if (alignment === 1) { + const width = this._getTextWidth(text, font) * fontSize; + shift = (totalWidth - width) / 2; + } else if (alignment === 2) { + const width = this._getTextWidth(text, font) * fontSize; + shift = totalWidth - width - hPadding; + } else { + shift = hPadding; + } + const shiftStr = (0, _core_utils.numberToString)(shift - prevInfo.shift); + prevInfo.shift = shift; + vPadding = (0, _core_utils.numberToString)(vPadding); + return `${shiftStr} ${vPadding} Td (${(0, _core_utils.escapeString)(text)}) Tj`; + } + _getSaveFieldResources(xref) { + const { + localResources, + appearanceResources, + acroFormResources + } = this._fieldResources; + const fontName = this.data.defaultAppearanceData && this.data.defaultAppearanceData.fontName; + if (!fontName) { + return localResources || _primitives.Dict.empty; + } + for (const resources of [localResources, appearanceResources]) { + if (resources instanceof _primitives.Dict) { + const localFont = resources.get("Font"); + if (localFont instanceof _primitives.Dict && localFont.has(fontName)) { + return resources; + } + } + } + if (acroFormResources instanceof _primitives.Dict) { + const acroFormFont = acroFormResources.get("Font"); + if (acroFormFont instanceof _primitives.Dict && acroFormFont.has(fontName)) { + const subFontDict = new _primitives.Dict(xref); + subFontDict.set(fontName, acroFormFont.getRaw(fontName)); + const subResourcesDict = new _primitives.Dict(xref); + subResourcesDict.set("Font", subFontDict); + return _primitives.Dict.merge({ + xref, + dictArray: [subResourcesDict, localResources], + mergeSubDicts: true + }); + } + } + return localResources || _primitives.Dict.empty; + } + getFieldObject() { + return null; + } +} +class TextWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this._hasText = true; + const dict = params.dict; + if (typeof this.data.fieldValue !== "string") { + this.data.fieldValue = ""; + } + let alignment = (0, _core_utils.getInheritableProperty)({ + dict, + key: "Q" + }); + if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) { + alignment = null; + } + this.data.textAlignment = alignment; + let maximumLength = (0, _core_utils.getInheritableProperty)({ + dict, + key: "MaxLen" + }); + if (!Number.isInteger(maximumLength) || maximumLength < 0) { + maximumLength = 0; + } + this.data.maxLen = maximumLength; + this.data.multiLine = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE); + this.data.comb = this.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; + this.data.doNotScroll = this.hasFieldFlag(_util.AnnotationFieldFlag.DONOTSCROLL); + } + _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, hPadding, vPadding, descent, lineHeight, annotationStorage) { + const combWidth = width / this.data.maxLen; + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const buf = []; + const positions = font.getCharPositions(text); + for (const [start, end] of positions) { + buf.push(`(${(0, _core_utils.escapeString)(text.substring(start, end))}) Tj`); + } + const renderedComb = buf.join(` ${(0, _core_utils.numberToString)(combWidth)} 0 Td `); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${(0, _core_utils.numberToString)(hPadding)} ${(0, _core_utils.numberToString)(vPadding + descent)} Tm ${renderedComb}` + " ET Q EMC"; + } + _getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) { + const buf = []; + const totalWidth = width - 2 * hPadding; + const prevInfo = { + shift: 0 + }; + for (let i = 0, ii = lines.length; i < ii; i++) { + const line = lines[i]; + const chunks = this._splitLine(line, font, fontSize, totalWidth); + for (let j = 0, jj = chunks.length; j < jj; j++) { + const chunk = chunks[j]; + const vShift = i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight; + buf.push(this._renderText(chunk, font, fontSize, width, alignment, prevInfo, hPadding, vShift)); + } + } + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const renderedText = buf.join("\n"); + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${(0, _core_utils.numberToString)(height)} Tm ${renderedText}` + " ET Q EMC"; + } + _splitLine(line, font, fontSize, width) { + let cache = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + line = cache.line || line; + const glyphs = cache.glyphs || font.charsToGlyphs(line); + if (glyphs.length <= 1) { + return [line]; + } + const positions = cache.positions || font.getCharPositions(line); + const scale = fontSize / 1000; + const chunks = []; + let lastSpacePosInStringStart = -1, + lastSpacePosInStringEnd = -1, + lastSpacePos = -1, + startChunk = 0, + currentWidth = 0; + for (let i = 0, ii = glyphs.length; i < ii; i++) { + const [start, end] = positions[i]; + const glyph = glyphs[i]; + const glyphWidth = glyph.width * scale; + if (glyph.unicode === " ") { + if (currentWidth + glyphWidth > width) { + chunks.push(line.substring(startChunk, start)); + startChunk = start; + currentWidth = glyphWidth; + lastSpacePosInStringStart = -1; + lastSpacePos = -1; + } else { + currentWidth += glyphWidth; + lastSpacePosInStringStart = start; + lastSpacePosInStringEnd = end; + lastSpacePos = i; + } + } else { + if (currentWidth + glyphWidth > width) { + if (lastSpacePosInStringStart !== -1) { + chunks.push(line.substring(startChunk, lastSpacePosInStringEnd)); + startChunk = lastSpacePosInStringEnd; + i = lastSpacePos + 1; + lastSpacePosInStringStart = -1; + currentWidth = 0; + } else { + chunks.push(line.substring(startChunk, start)); + startChunk = start; + currentWidth = glyphWidth; + } + } else { + currentWidth += glyphWidth; + } + } + } + if (startChunk < line.length) { + chunks.push(line.substring(startChunk, line.length)); + } + return chunks; + } + getFieldObject() { + return { + id: this.data.id, + value: this.data.fieldValue, + defaultValue: this.data.defaultFieldValue || "", + multiline: this.data.multiLine, + password: this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD), + charLimit: this.data.maxLen, + comb: this.data.comb, + editable: !this.data.readOnly, + hidden: this.data.hidden, + name: this.data.fieldName, + rect: this.data.rect, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type: "text" + }; + } +} +class ButtonWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this.checkedAppearance = null; + this.uncheckedAppearance = null; + this.data.checkBox = !this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); + this.data.radioButton = this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); + this.data.pushButton = this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON); + this.data.isTooltipOnly = false; + if (this.data.checkBox) { + this._processCheckBox(params); + } else if (this.data.radioButton) { + this._processRadioButton(params); + } else if (this.data.pushButton) { + this.data.hasOwnCanvas = true; + this._processPushButton(params); + } else { + (0, _util.warn)("Invalid field flags for button widget annotation"); + } + } + async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { + if (this.data.pushButton) { + return super.getOperatorList(evaluator, task, intent, false, annotationStorage); + } + let value = null; + let rotation = null; + if (annotationStorage) { + const storageEntry = annotationStorage.get(this.data.id); + value = storageEntry ? storageEntry.value : null; + rotation = storageEntry ? storageEntry.rotation : null; + } + if (value === null && this.appearance) { + return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + } + if (value === null || value === undefined) { + if (this.data.checkBox) { + value = this.data.fieldValue === this.data.exportValue; + } else { + value = this.data.fieldValue === this.data.buttonValue; + } + } + const appearance = value ? this.checkedAppearance : this.uncheckedAppearance; + if (appearance) { + const savedAppearance = this.appearance; + const savedMatrix = appearance.dict.getArray("Matrix") || _util.IDENTITY_MATRIX; + if (rotation) { + appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); + } + this.appearance = appearance; + const operatorList = super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + this.appearance = savedAppearance; + appearance.dict.set("Matrix", savedMatrix); + return operatorList; + } + return { + opList: new _operator_list.OperatorList(), + separateForm: false, + separateCanvas: false + }; + } + async save(evaluator, task, annotationStorage) { + if (this.data.checkBox) { + return this._saveCheckbox(evaluator, task, annotationStorage); + } + if (this.data.radioButton) { + return this._saveRadioButton(evaluator, task, annotationStorage); + } + return null; + } + async _saveCheckbox(evaluator, task, annotationStorage) { + if (!annotationStorage) { + return null; + } + const storageEntry = annotationStorage.get(this.data.id); + let rotation = storageEntry && storageEntry.rotation; + let value = storageEntry && storageEntry.value; + if (rotation === undefined) { + if (value === undefined) { + return null; + } + const defaultValue = this.data.fieldValue === this.data.exportValue; + if (defaultValue === value) { + return null; + } + } + const dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof _primitives.Dict)) { + return null; + } + if (rotation === undefined) { + rotation = this.rotation; + } + if (value === undefined) { + value = this.data.fieldValue === this.data.exportValue; + } + const xfa = { + path: (0, _util.stringToPDFString)(dict.get("T") || ""), + value: value ? this.data.exportValue : "" + }; + const name = _primitives.Name.get(value ? this.data.exportValue : "Off"); + dict.set("V", name); + dict.set("AS", name); + dict.set("M", `D:${(0, _util.getModificationDate)()}`); + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + const encrypt = evaluator.xref.encrypt; + let originalTransform = null; + if (encrypt) { + originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen); + } + const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`]; + (0, _writer.writeDict)(dict, buffer, originalTransform); + buffer.push("\nendobj\n"); + return [{ + ref: this.ref, + data: buffer.join(""), + xfa + }]; + } + async _saveRadioButton(evaluator, task, annotationStorage) { + if (!annotationStorage) { + return null; + } + const storageEntry = annotationStorage.get(this.data.id); + let rotation = storageEntry && storageEntry.rotation; + let value = storageEntry && storageEntry.value; + if (rotation === undefined) { + if (value === undefined) { + return null; + } + const defaultValue = this.data.fieldValue === this.data.buttonValue; + if (defaultValue === value) { + return null; + } + } + const dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof _primitives.Dict)) { + return null; + } + if (value === undefined) { + value = this.data.fieldValue === this.data.buttonValue; + } + if (rotation === undefined) { + rotation = this.rotation; + } + const xfa = { + path: (0, _util.stringToPDFString)(dict.get("T") || ""), + value: value ? this.data.buttonValue : "" + }; + const name = _primitives.Name.get(value ? this.data.buttonValue : "Off"); + let parentBuffer = null; + const encrypt = evaluator.xref.encrypt; + if (value) { + if (this.parent instanceof _primitives.Ref) { + const parent = evaluator.xref.fetch(this.parent); + let parentTransform = null; + if (encrypt) { + parentTransform = encrypt.createCipherTransform(this.parent.num, this.parent.gen); + } + parent.set("V", name); + parentBuffer = [`${this.parent.num} ${this.parent.gen} obj\n`]; + (0, _writer.writeDict)(parent, parentBuffer, parentTransform); + parentBuffer.push("\nendobj\n"); + } else if (this.parent instanceof _primitives.Dict) { + this.parent.set("V", name); + } + } + dict.set("AS", name); + dict.set("M", `D:${(0, _util.getModificationDate)()}`); + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + let originalTransform = null; + if (encrypt) { + originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen); + } + const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`]; + (0, _writer.writeDict)(dict, buffer, originalTransform); + buffer.push("\nendobj\n"); + const newRefs = [{ + ref: this.ref, + data: buffer.join(""), + xfa + }]; + if (parentBuffer !== null) { + newRefs.push({ + ref: this.parent, + data: parentBuffer.join(""), + xfa: null + }); + } + return newRefs; + } + _getDefaultCheckedAppearance(params, type) { + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const bbox = [0, 0, width, height]; + const FONT_RATIO = 0.8; + const fontSize = Math.min(width, height) * FONT_RATIO; + let metrics, char; + if (type === "check") { + metrics = { + width: 0.755 * fontSize, + height: 0.705 * fontSize + }; + char = "\x33"; + } else if (type === "disc") { + metrics = { + width: 0.791 * fontSize, + height: 0.705 * fontSize + }; + char = "\x6C"; + } else { + (0, _util.unreachable)(`_getDefaultCheckedAppearance - unsupported type: ${type}`); + } + const xShift = (0, _core_utils.numberToString)((width - metrics.width) / 2); + const yShift = (0, _core_utils.numberToString)((height - metrics.height) / 2); + const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; + const appearanceStreamDict = new _primitives.Dict(params.xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", _primitives.Name.get("Form")); + appearanceStreamDict.set("Type", _primitives.Name.get("XObject")); + appearanceStreamDict.set("BBox", bbox); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]); + appearanceStreamDict.set("Length", appearance.length); + const resources = new _primitives.Dict(params.xref); + const font = new _primitives.Dict(params.xref); + font.set("PdfJsZaDb", this.fallbackFontDict); + resources.set("Font", font); + appearanceStreamDict.set("Resources", resources); + this.checkedAppearance = new _stream.StringStream(appearance); + this.checkedAppearance.dict = appearanceStreamDict; + this._streams.push(this.checkedAppearance); + } + _processCheckBox(params) { + const customAppearance = params.dict.get("AP"); + if (!(customAppearance instanceof _primitives.Dict)) { + return; + } + const normalAppearance = customAppearance.get("N"); + if (!(normalAppearance instanceof _primitives.Dict)) { + return; + } + const asValue = this._decodeFormValue(params.dict.get("AS")); + if (typeof asValue === "string") { + this.data.fieldValue = asValue; + } + const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes"; + const exportValues = normalAppearance.getKeys(); + if (exportValues.length === 0) { + exportValues.push("Off", yes); + } else if (exportValues.length === 1) { + if (exportValues[0] === "Off") { + exportValues.push(yes); + } else { + exportValues.unshift("Off"); + } + } else if (exportValues.includes(yes)) { + exportValues.length = 0; + exportValues.push("Off", yes); + } else { + const otherYes = exportValues.find(v => v !== "Off"); + exportValues.length = 0; + exportValues.push("Off", otherYes); + } + if (!exportValues.includes(this.data.fieldValue)) { + this.data.fieldValue = "Off"; + } + this.data.exportValue = exportValues[1]; + this.checkedAppearance = normalAppearance.get(this.data.exportValue) || null; + this.uncheckedAppearance = normalAppearance.get("Off") || null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "check"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); + } + this._fallbackFontDict = this.fallbackFontDict; + } + _processRadioButton(params) { + this.data.fieldValue = this.data.buttonValue = null; + const fieldParent = params.dict.get("Parent"); + if (fieldParent instanceof _primitives.Dict) { + this.parent = params.dict.getRaw("Parent"); + const fieldParentValue = fieldParent.get("V"); + if (fieldParentValue instanceof _primitives.Name) { + this.data.fieldValue = this._decodeFormValue(fieldParentValue); + } + } + const appearanceStates = params.dict.get("AP"); + if (!(appearanceStates instanceof _primitives.Dict)) { + return; + } + const normalAppearance = appearanceStates.get("N"); + if (!(normalAppearance instanceof _primitives.Dict)) { + return; + } + for (const key of normalAppearance.getKeys()) { + if (key !== "Off") { + this.data.buttonValue = this._decodeFormValue(key); + break; + } + } + this.checkedAppearance = normalAppearance.get(this.data.buttonValue) || null; + this.uncheckedAppearance = normalAppearance.get("Off") || null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "disc"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); + } + this._fallbackFontDict = this.fallbackFontDict; + } + _processPushButton(params) { + if (!params.dict.has("A") && !params.dict.has("AA") && !this.data.alternativeText) { + (0, _util.warn)("Push buttons without action dictionaries are not supported"); + return; + } + this.data.isTooltipOnly = !params.dict.has("A") && !params.dict.has("AA"); + _catalog.Catalog.parseDestDictionary({ + destDict: params.dict, + resultObj: this.data, + docBaseUrl: params.pdfManager.docBaseUrl, + docAttachments: params.attachments + }); + } + getFieldObject() { + let type = "button"; + let exportValues; + if (this.data.checkBox) { + type = "checkbox"; + exportValues = this.data.exportValue; + } else if (this.data.radioButton) { + type = "radiobutton"; + exportValues = this.data.buttonValue; + } + return { + id: this.data.id, + value: this.data.fieldValue || "Off", + defaultValue: this.data.defaultFieldValue, + exportValues, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + hidden: this.data.hidden, + actions: this.data.actions, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + get fallbackFontDict() { + const dict = new _primitives.Dict(); + dict.set("BaseFont", _primitives.Name.get("ZapfDingbats")); + dict.set("Type", _primitives.Name.get("FallbackType")); + dict.set("Subtype", _primitives.Name.get("FallbackType")); + dict.set("Encoding", _primitives.Name.get("ZapfDingbatsEncoding")); + return (0, _util.shadow)(this, "fallbackFontDict", dict); + } +} +class ChoiceWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.options = []; + const options = (0, _core_utils.getInheritableProperty)({ + dict, + key: "Opt" + }); + if (Array.isArray(options)) { + for (let i = 0, ii = options.length; i < ii; i++) { + const option = xref.fetchIfRef(options[i]); + const isOptionArray = Array.isArray(option); + this.data.options[i] = { + exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option), + displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option) + }; + } + } + if (typeof this.data.fieldValue === "string") { + this.data.fieldValue = [this.data.fieldValue]; + } else if (!this.data.fieldValue) { + this.data.fieldValue = []; + } + this.data.combo = this.hasFieldFlag(_util.AnnotationFieldFlag.COMBO); + this.data.multiSelect = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT); + this._hasText = true; + } + getFieldObject() { + const type = this.data.combo ? "combobox" : "listbox"; + const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null; + return { + id: this.data.id, + value, + defaultValue: this.data.defaultFieldValue, + editable: !this.data.readOnly, + name: this.data.fieldName, + rect: this.data.rect, + numItems: this.data.fieldValue.length, + multipleSelection: this.data.multiSelect, + hidden: this.data.hidden, + actions: this.data.actions, + items: this.data.options, + page: this.data.pageIndex, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + rotation: this.rotation, + type + }; + } + async _getAppearance(evaluator, task, intent, annotationStorage) { + if (this.data.combo) { + return super._getAppearance(evaluator, task, intent, annotationStorage); + } + let exportedValue, rotation; + const storageEntry = annotationStorage ? annotationStorage.get(this.data.id) : undefined; + if (storageEntry) { + rotation = storageEntry.rotation; + exportedValue = storageEntry.value; + } + if (rotation === undefined && exportedValue === undefined && !this._needAppearances) { + return null; + } + if (exportedValue === undefined) { + exportedValue = this.data.fieldValue; + } else if (!Array.isArray(exportedValue)) { + exportedValue = [exportedValue]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + const lineCount = this.data.options.length; + const valueIndices = []; + for (let i = 0; i < lineCount; i++) { + const { + exportValue + } = this.data.options[i]; + if (exportedValue.includes(exportValue)) { + valueIndices.push(i); + } + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = (0, _default_appearance.parseDefaultAppearance)(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); + } + const font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); + let defaultAppearance; + let { + fontSize + } = this.data.defaultAppearanceData; + if (!fontSize) { + const lineHeight = (totalHeight - defaultPadding) / lineCount; + let lineWidth = -1; + let value; + for (const { + displayValue + } of this.data.options) { + const width = this._getTextWidth(displayValue, font); + if (width > lineWidth) { + lineWidth = width; + value = displayValue; + } + } + [defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1); + } else { + defaultAppearance = this._defaultAppearance; + } + const lineHeight = fontSize * _util.LINE_FACTOR; + const vPadding = (lineHeight - fontSize) / 2; + const numberOfVisibleLines = Math.floor(totalHeight / lineHeight); + let firstIndex; + if (valueIndices.length === 1) { + const valuePosition = valueIndices[0]; + const indexInPage = valuePosition % numberOfVisibleLines; + firstIndex = valuePosition - indexInPage; + } else { + firstIndex = valueIndices.length ? valueIndices[0] : 0; + } + const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount); + const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`]; + if (valueIndices.length) { + buf.push("0.600006 0.756866 0.854904 rg"); + for (const index of valueIndices) { + if (firstIndex <= index && index < end) { + buf.push(`1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`); + } + } + } + buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`); + const prevInfo = { + shift: 0 + }; + for (let i = firstIndex; i < end; i++) { + const { + displayValue + } = this.data.options[i]; + const vpadding = i === firstIndex ? vPadding : 0; + buf.push(this._renderText(displayValue, font, fontSize, totalWidth, 0, prevInfo, defaultHPadding, -lineHeight + vpadding)); + } + buf.push("ET Q EMC"); + return buf.join("\n"); + } +} +class SignatureWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + this.data.fieldValue = null; + } + getFieldObject() { + return { + id: this.data.id, + value: null, + page: this.data.pageIndex, + type: "signature" + }; + } +} +class TextAnnotation extends MarkupAnnotation { + constructor(params) { + const DEFAULT_ICON_SIZE = 22; + super(params); + const { + dict + } = params; + this.data.annotationType = _util.AnnotationType.TEXT; + if (this.data.hasAppearance) { + this.data.name = "NoIcon"; + } else { + this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; + this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; + this.data.name = dict.has("Name") ? dict.get("Name").name : "Note"; + } + if (dict.has("State")) { + this.data.state = dict.get("State") || null; + this.data.stateModel = dict.get("StateModel") || null; + } else { + this.data.state = null; + this.data.stateModel = null; + } + } +} +class LinkAnnotation extends Annotation { + constructor(params) { + super(params); + this.data.annotationType = _util.AnnotationType.LINK; + const quadPoints = getQuadPoints(params.dict, this.rectangle); + if (quadPoints) { + this.data.quadPoints = quadPoints; + } + this.data.borderColor = this.data.borderColor || this.data.color; + _catalog.Catalog.parseDestDictionary({ + destDict: params.dict, + resultObj: this.data, + docBaseUrl: params.pdfManager.docBaseUrl, + docAttachments: params.attachments + }); + } +} +class PopupAnnotation extends Annotation { + constructor(params) { + super(params); + const { + dict + } = params; + this.data.annotationType = _util.AnnotationType.POPUP; + let parentItem = dict.get("Parent"); + if (!parentItem) { + (0, _util.warn)("Popup annotation has a missing or invalid parent annotation."); + return; + } + const parentSubtype = parentItem.get("Subtype"); + this.data.parentType = parentSubtype instanceof _primitives.Name ? parentSubtype.name : null; + const rawParent = dict.getRaw("Parent"); + this.data.parentId = rawParent instanceof _primitives.Ref ? rawParent.toString() : null; + const parentRect = parentItem.getArray("Rect"); + if (Array.isArray(parentRect) && parentRect.length === 4) { + this.data.parentRect = _util.Util.normalizeRect(parentRect); + } else { + this.data.parentRect = [0, 0, 0, 0]; + } + const rt = parentItem.get("RT"); + if ((0, _primitives.isName)(rt, _util.AnnotationReplyType.GROUP)) { + parentItem = parentItem.get("IRT"); + } + if (!parentItem.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parentItem.get("M")); + this.data.modificationDate = this.modificationDate; + } + if (!parentItem.has("C")) { + this.data.color = null; + } else { + this.setColor(parentItem.getArray("C")); + this.data.color = this.color; + } + if (!this.viewable) { + const parentFlags = parentItem.get("F"); + if (this._isViewable(parentFlags)) { + this.setFlags(parentFlags); + } + } + this.setTitle(parentItem.get("T")); + this.data.titleObj = this._title; + this.setContents(parentItem.get("Contents")); + this.data.contentsObj = this._contents; + if (parentItem.has("RC")) { + this.data.richText = _factory.XFAFactory.getRichTextAsHtml(parentItem.get("RC")); + } + } +} +exports.PopupAnnotation = PopupAnnotation; +class FreeTextAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + xref + } = params; + this.data.annotationType = _util.AnnotationType.FREETEXT; + this.setDefaultAppearance(params); + if (!this.appearance && this._isOffscreenCanvasSupported) { + const fakeUnicodeFont = new _default_appearance.FakeUnicodeFont(xref, "sans-serif"); + const fontData = this.data.defaultAppearanceData; + this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontData.fontSize || 10, fontData.fontColor); + this._streams.push(this.appearance, _default_appearance.FakeUnicodeFont.toUnicodeStream); + } else if (!this._isOffscreenCanvasSupported) { + (0, _util.warn)("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly."); + } + } + get hasTextContent() { + return !!this.appearance; + } + static createNewDict(annotation, xref, _ref4) { + let { + apRef, + ap + } = _ref4; + const { + color, + fontSize, + rect, + rotation, + user, + value + } = annotation; + const freetext = new _primitives.Dict(xref); + freetext.set("Type", _primitives.Name.get("Annot")); + freetext.set("Subtype", _primitives.Name.get("FreeText")); + freetext.set("CreationDate", `D:${(0, _util.getModificationDate)()}`); + freetext.set("Rect", rect); + const da = `/Helv ${fontSize} Tf ${(0, _default_appearance.getPdfColor)(color, true)}`; + freetext.set("DA", da); + freetext.set("Contents", (0, _core_utils.isAscii)(value) ? value : (0, _core_utils.stringToUTF16String)(value, true)); + freetext.set("F", 4); + freetext.set("Border", [0, 0, 0]); + freetext.set("Rotate", rotation); + if (user) { + freetext.set("T", (0, _core_utils.isAscii)(user) ? user : (0, _core_utils.stringToUTF16String)(user, true)); + } + if (apRef || ap) { + const n = new _primitives.Dict(xref); + freetext.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + } + return freetext; + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + baseFontRef, + evaluator, + task + } = params; + const { + color, + fontSize, + rect, + rotation, + value + } = annotation; + const resources = new _primitives.Dict(xref); + const font = new _primitives.Dict(xref); + if (baseFontRef) { + font.set("Helv", baseFontRef); + } else { + const baseFont = new _primitives.Dict(xref); + baseFont.set("BaseFont", _primitives.Name.get("Helvetica")); + baseFont.set("Type", _primitives.Name.get("Font")); + baseFont.set("Subtype", _primitives.Name.get("Type1")); + baseFont.set("Encoding", _primitives.Name.get("WinAnsiEncoding")); + font.set("Helv", baseFont); + } + resources.set("Font", font); + const helv = await WidgetAnnotation._getFontData(evaluator, task, { + fontName: "Helvetica", + fontSize + }, resources); + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + const lines = value.split("\n"); + const scale = fontSize / 1000; + let totalWidth = -Infinity; + const encodedLines = []; + for (let line of lines) { + const encoded = helv.encodeString(line); + if (encoded.length > 1) { + return null; + } + line = encoded.join(""); + encodedLines.push(line); + let lineWidth = 0; + const glyphs = helv.charsToGlyphs(line); + for (const glyph of glyphs) { + lineWidth += glyph.width * scale; + } + totalWidth = Math.max(totalWidth, lineWidth); + } + let hscale = 1; + if (totalWidth > w) { + hscale = w / totalWidth; + } + let vscale = 1; + const lineHeight = _util.LINE_FACTOR * fontSize; + const lineDescent = _util.LINE_DESCENT_FACTOR * fontSize; + const totalHeight = lineHeight * lines.length; + if (totalHeight > h) { + vscale = h / totalHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + const buffer = ["q", `0 0 ${(0, _core_utils.numberToString)(w)} ${(0, _core_utils.numberToString)(h)} re W n`, `BT`, `1 0 0 1 0 ${(0, _core_utils.numberToString)(h + lineDescent)} Tm 0 Tc ${(0, _default_appearance.getPdfColor)(color, true)}`, `/Helv ${(0, _core_utils.numberToString)(newFontSize)} Tf`]; + const vShift = (0, _core_utils.numberToString)(lineHeight); + for (const line of encodedLines) { + buffer.push(`0 -${vShift} Td (${(0, _core_utils.escapeString)(line)}) Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new _primitives.Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", _primitives.Name.get("Form")); + appearanceStreamDict.set("Type", _primitives.Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, w, h]); + appearanceStreamDict.set("Length", appearance.length); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = (0, _core_utils.getRotationMatrix)(rotation, w, h); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new _stream.StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class LineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.LINE; + const lineCoordinates = dict.getArray("L"); + this.data.lineCoordinates = _util.Util.normalizeRect(lineCoordinates); + this.setLineEndings(dict.getArray("LE")); + this.data.lineEndings = this.lineEndings; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust]; + if (!_util.Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S"); + return [points[0].x - borderWidth, points[1].x + borderWidth, points[3].y - borderWidth, points[1].y + borderWidth]; + } + }); + } + } +} +class SquareAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.SQUARE; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + this._setDefaultAppearance({ + xref, + extra: `${this.borderStyle.width} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x = points[2].x + this.borderStyle.width / 2; + const y = points[2].y + this.borderStyle.width / 2; + const width = points[3].x - points[2].x - this.borderStyle.width; + const height = points[1].y - points[3].y - this.borderStyle.width; + buffer.push(`${x} ${y} ${width} ${height} re`); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0].x, points[1].x, points[3].y, points[1].y]; + } + }); + } + } +} +class CircleAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.CIRCLE; + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4)); + this._setDefaultAppearance({ + xref, + extra: `${this.borderStyle.width} w`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x0 = points[0].x + this.borderStyle.width / 2; + const y0 = points[0].y - this.borderStyle.width / 2; + const x1 = points[3].x - this.borderStyle.width / 2; + const y1 = points[3].y + this.borderStyle.width / 2; + const xMid = x0 + (x1 - x0) / 2; + const yMid = y0 + (y1 - y0) / 2; + const xOffset = (x1 - x0) / 2 * controlPointsDistance; + const yOffset = (y1 - y0) / 2 * controlPointsDistance; + buffer.push(`${xMid} ${y1} m`, `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`, `${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`, `${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`, `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`, "h"); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0].x, points[1].x, points[3].y, points[1].y]; + } + }); + } + } +} +class PolylineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.POLYLINE; + this.data.vertices = []; + if (!(this instanceof PolygonAnnotation)) { + this.setLineEndings(dict.getArray("LE")); + this.data.lineEndings = this.lineEndings; + } + const rawVertices = dict.getArray("Vertices"); + if (!Array.isArray(rawVertices)) { + return; + } + for (let i = 0, ii = rawVertices.length; i < ii; i += 2) { + this.data.vertices.push({ + x: rawVertices[i], + y: rawVertices[i + 1] + }); + } + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (const vertex of this.data.vertices) { + bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust); + bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust); + bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust); + bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust); + } + if (!_util.Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + const vertices = this.data.vertices; + for (let i = 0, ii = vertices.length; i < ii; i++) { + buffer.push(`${vertices[i].x} ${vertices[i].y} ${i === 0 ? "m" : "l"}`); + } + buffer.push("S"); + return [points[0].x, points[1].x, points[3].y, points[1].y]; + } + }); + } + } +} +class PolygonAnnotation extends PolylineAnnotation { + constructor(params) { + super(params); + this.data.annotationType = _util.AnnotationType.POLYGON; + } +} +class CaretAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.annotationType = _util.AnnotationType.CARET; + } +} +class InkAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.INK; + this.data.inkLists = []; + const rawInkLists = dict.getArray("InkList"); + if (!Array.isArray(rawInkLists)) { + return; + } + for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { + this.data.inkLists.push([]); + for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { + this.data.inkLists[i].push({ + x: xref.fetchIfRef(rawInkLists[i][j]), + y: xref.fetchIfRef(rawInkLists[i][j + 1]) + }); + } + } + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (const inkLists of this.data.inkLists) { + for (const vertex of inkLists) { + bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust); + bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust); + bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust); + bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust); + } + } + if (!_util.Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i++) { + buffer.push(`${inkList[i].x} ${inkList[i].y} ${i === 0 ? "m" : "l"}`); + } + buffer.push("S"); + } + return [points[0].x, points[1].x, points[3].y, points[1].y]; + } + }); + } + } + static createNewDict(annotation, xref, _ref5) { + let { + apRef, + ap + } = _ref5; + const { + paths, + rect, + rotation + } = annotation; + const ink = new _primitives.Dict(xref); + ink.set("Type", _primitives.Name.get("Annot")); + ink.set("Subtype", _primitives.Name.get("Ink")); + ink.set("CreationDate", `D:${(0, _util.getModificationDate)()}`); + ink.set("Rect", rect); + ink.set("InkList", paths.map(p => p.points)); + ink.set("F", 4); + ink.set("Border", [0, 0, 0]); + ink.set("Rotate", rotation); + const n = new _primitives.Dict(xref); + ink.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + return ink; + } + static async createNewAppearanceStream(annotation, xref, params) { + const { + color, + rect, + rotation, + paths, + thickness, + opacity + } = annotation; + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${(0, _default_appearance.getPdfColor)(color, false)}`]; + if (opacity !== 1) { + appearanceBuffer.push("/R0 gs"); + } + const buffer = []; + for (const { + bezier + } of paths) { + buffer.length = 0; + buffer.push(`${(0, _core_utils.numberToString)(bezier[0])} ${(0, _core_utils.numberToString)(bezier[1])} m`); + for (let i = 2, ii = bezier.length; i < ii; i += 6) { + const curve = bezier.slice(i, i + 6).map(_core_utils.numberToString).join(" "); + buffer.push(`${curve} c`); + } + buffer.push("S"); + appearanceBuffer.push(buffer.join("\n")); + } + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new _primitives.Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", _primitives.Name.get("Form")); + appearanceStreamDict.set("Type", _primitives.Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, w, h]); + appearanceStreamDict.set("Length", appearance.length); + if (rotation) { + const matrix = (0, _core_utils.getRotationMatrix)(rotation, w, h); + appearanceStreamDict.set("Matrix", matrix); + } + if (opacity !== 1) { + const resources = new _primitives.Dict(xref); + const extGState = new _primitives.Dict(xref); + const r0 = new _primitives.Dict(xref); + r0.set("CA", opacity); + r0.set("Type", _primitives.Name.get("ExtGState")); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + } + const ap = new _stream.StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +class HighlightAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.HIGHLIGHT; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + const resources = this.appearance && this.appearance.dict.get("Resources"); + if (!this.appearance || !(resources && resources.has("ExtGState"))) { + if (this.appearance) { + (0, _util.warn)("HighlightAnnotation - ignoring built-in appearance stream."); + } + const fillColor = this.color ? getPdfColorArray(this.color) : [1, 1, 0]; + const fillAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + fillColor, + blendMode: "Multiply", + fillAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${points[0].x} ${points[0].y} m`, `${points[1].x} ${points[1].y} l`, `${points[3].x} ${points[3].y} l`, `${points[2].x} ${points[2].y} l`, "f"); + return [points[0].x, points[1].x, points[3].y, points[1].y]; + } + }); + } + } else { + this.data.hasPopup = false; + } + } +} +class UnderlineAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.UNDERLINE; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${points[2].x} ${points[2].y} m`, `${points[3].x} ${points[3].y} l`, "S"); + return [points[0].x, points[1].x, points[3].y, points[1].y]; + } + }); + } + } else { + this.data.hasPopup = false; + } + } +} +class SquigglyAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.SQUIGGLY; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + const dy = (points[0].y - points[2].y) / 6; + let shift = dy; + let x = points[2].x; + const y = points[2].y; + const xEnd = points[3].x; + buffer.push(`${x} ${y + shift} m`); + do { + x += 2; + shift = shift === 0 ? dy : 0; + buffer.push(`${x} ${y + shift} l`); + } while (x < xEnd); + buffer.push("S"); + return [points[2].x, xEnd, y - 2 * dy, y + 2 * dy]; + } + }); + } + } else { + this.data.hasPopup = false; + } + } +} +class StrikeOutAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + this.data.annotationType = _util.AnnotationType.STRIKEOUT; + const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); + if (quadPoints) { + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + this._setDefaultAppearance({ + xref, + extra: "[] 0 d 1 w", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push(`${(points[0].x + points[2].x) / 2} ` + `${(points[0].y + points[2].y) / 2} m`, `${(points[1].x + points[3].x) / 2} ` + `${(points[1].y + points[3].y) / 2} l`, "S"); + return [points[0].x, points[1].x, points[3].y, points[1].y]; + } + }); + } + } else { + this.data.hasPopup = false; + } + } +} +class StampAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + this.data.annotationType = _util.AnnotationType.STAMP; + } +} +class FileAttachmentAnnotation extends MarkupAnnotation { + constructor(params) { + super(params); + const { + dict, + xref + } = params; + const file = new _file_spec.FileSpec(dict.get("FS"), xref); + this.data.annotationType = _util.AnnotationType.FILEATTACHMENT; + this.data.file = file.serializable; + const name = dict.get("Name"); + this.data.name = name instanceof _primitives.Name ? (0, _util.stringToPDFString)(name.name) : "PushPin"; + } +} + +/***/ }), +/* 142 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.FakeUnicodeFont = void 0; +exports.createDefaultAppearance = createDefaultAppearance; +exports.getPdfColor = getPdfColor; +exports.parseDefaultAppearance = parseDefaultAppearance; +var _primitives = __w_pdfjs_require__(134); +var _core_utils = __w_pdfjs_require__(135); +var _util = __w_pdfjs_require__(2); +var _colorspace = __w_pdfjs_require__(143); +var _evaluator = __w_pdfjs_require__(144); +var _stream = __w_pdfjs_require__(139); +class DefaultAppearanceEvaluator extends _evaluator.EvaluatorPreprocessor { + constructor(str) { + super(new _stream.StringStream(str)); + } + parse() { + const operation = { + fn: 0, + args: [] + }; + const result = { + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3) + }; + try { + while (true) { + operation.args.length = 0; + if (!this.read(operation)) { + break; + } + if (this.savedStatesDepth !== 0) { + continue; + } + const { + fn, + args + } = operation; + switch (fn | 0) { + case _util.OPS.setFont: + const [fontName, fontSize] = args; + if (fontName instanceof _primitives.Name) { + result.fontName = fontName.name; + } + if (typeof fontSize === "number" && fontSize > 0) { + result.fontSize = fontSize; + } + break; + case _util.OPS.setFillRGBColor: + _colorspace.ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); + break; + case _util.OPS.setFillGray: + _colorspace.ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case _util.OPS.setFillColorSpace: + _colorspace.ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + } + } + } catch (reason) { + (0, _util.warn)(`parseDefaultAppearance - ignoring errors: "${reason}".`); + } + return result; + } +} +function parseDefaultAppearance(str) { + return new DefaultAppearanceEvaluator(str).parse(); +} +function getPdfColor(color, isFill) { + if (color[0] === color[1] && color[1] === color[2]) { + const gray = color[0] / 255; + return `${(0, _core_utils.numberToString)(gray)} ${isFill ? "g" : "G"}`; + } + return Array.from(color, c => (0, _core_utils.numberToString)(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`; +} +function createDefaultAppearance(_ref) { + let { + fontSize, + fontName, + fontColor + } = _ref; + return `/${(0, _core_utils.escapePDFName)(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; +} +class FakeUnicodeFont { + constructor(xref, fontFamily) { + this.xref = xref; + this.widths = null; + this.firstChar = Infinity; + this.lastChar = -Infinity; + this.fontFamily = fontFamily; + const canvas = new OffscreenCanvas(1, 1); + this.ctxMeasure = canvas.getContext("2d"); + if (!FakeUnicodeFont._fontNameId) { + FakeUnicodeFont._fontNameId = 1; + } + this.fontName = _primitives.Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`); + } + get toUnicodeRef() { + if (!FakeUnicodeFont._toUnicodeRef) { + const toUnicode = `/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (Adobe) +/Ordering (UCS) /Supplement 0 >> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +1 beginbfrange +<0000> <0000> +endbfrange +endcmap CMapName currentdict /CMap defineresource pop end end`; + const toUnicodeStream = FakeUnicodeFont.toUnicodeStream = new _stream.StringStream(toUnicode); + const toUnicodeDict = new _primitives.Dict(this.xref); + toUnicodeStream.dict = toUnicodeDict; + toUnicodeDict.set("Length", toUnicode.length); + FakeUnicodeFont._toUnicodeRef = this.xref.getNewPersistentRef(toUnicodeStream); + } + return FakeUnicodeFont._toUnicodeRef; + } + get fontDescriptorRef() { + if (!FakeUnicodeFont._fontDescriptorRef) { + const fontDescriptor = new _primitives.Dict(this.xref); + fontDescriptor.set("Type", _primitives.Name.get("FontDescriptor")); + fontDescriptor.set("FontName", this.fontName); + fontDescriptor.set("FontFamily", "MyriadPro Regular"); + fontDescriptor.set("FontBBox", [0, 0, 0, 0]); + fontDescriptor.set("FontStretch", _primitives.Name.get("Normal")); + fontDescriptor.set("FontWeight", 400); + fontDescriptor.set("ItalicAngle", 0); + FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor); + } + return FakeUnicodeFont._fontDescriptorRef; + } + get descendantFontRef() { + const descendantFont = new _primitives.Dict(this.xref); + descendantFont.set("BaseFont", this.fontName); + descendantFont.set("Type", _primitives.Name.get("Font")); + descendantFont.set("Subtype", _primitives.Name.get("CIDFontType0")); + descendantFont.set("CIDToGIDMap", _primitives.Name.get("Identity")); + descendantFont.set("FirstChar", this.firstChar); + descendantFont.set("LastChar", this.lastChar); + descendantFont.set("FontDescriptor", this.fontDescriptorRef); + descendantFont.set("DW", 1000); + const widths = []; + const chars = [...this.widths.entries()].sort(); + let currentChar = null; + let currentWidths = null; + for (const [char, width] of chars) { + if (!currentChar) { + currentChar = char; + currentWidths = [width]; + continue; + } + if (char === currentChar + currentWidths.length) { + currentWidths.push(width); + } else { + widths.push(currentChar, currentWidths); + currentChar = char; + currentWidths = [width]; + } + } + if (currentChar) { + widths.push(currentChar, currentWidths); + } + descendantFont.set("W", widths); + const cidSystemInfo = new _primitives.Dict(this.xref); + cidSystemInfo.set("Ordering", "Identity"); + cidSystemInfo.set("Registry", "Adobe"); + cidSystemInfo.set("Supplement", 0); + descendantFont.set("CIDSystemInfo", cidSystemInfo); + return this.xref.getNewPersistentRef(descendantFont); + } + get baseFontRef() { + const baseFont = new _primitives.Dict(this.xref); + baseFont.set("BaseFont", this.fontName); + baseFont.set("Type", _primitives.Name.get("Font")); + baseFont.set("Subtype", _primitives.Name.get("Type0")); + baseFont.set("Encoding", _primitives.Name.get("Identity-H")); + baseFont.set("DescendantFonts", [this.descendantFontRef]); + baseFont.set("ToUnicode", this.toUnicodeRef); + return this.xref.getNewPersistentRef(baseFont); + } + get resources() { + const resources = new _primitives.Dict(this.xref); + const font = new _primitives.Dict(this.xref); + font.set(this.fontName.name, this.baseFontRef); + resources.set("Font", font); + return resources; + } + _createContext() { + this.widths = new Map(); + this.ctxMeasure.font = `1000px ${this.fontFamily}`; + return this.ctxMeasure; + } + createFontResources(text) { + const ctx = this._createContext(); + for (const line of text.split(/\r\n?|\n/)) { + for (const char of line.split("")) { + const code = char.charCodeAt(0); + if (this.widths.has(code)) { + continue; + } + const metrics = ctx.measureText(char); + const width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); + } + } + return this.resources; + } + createAppearance(text, rect, rotation, fontSize, bgColor) { + const ctx = this._createContext(); + const lines = []; + let maxWidth = -Infinity; + for (const line of text.split(/\r\n?|\n/)) { + lines.push(line); + const lineWidth = ctx.measureText(line).width; + maxWidth = Math.max(maxWidth, lineWidth); + for (const char of line.split("")) { + const code = char.charCodeAt(0); + let width = this.widths.get(code); + if (width === undefined) { + const metrics = ctx.measureText(char); + width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); + } + } + } + maxWidth *= fontSize / 1000; + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + let hscale = 1; + if (maxWidth > w) { + hscale = w / maxWidth; + } + let vscale = 1; + const lineHeight = _util.LINE_FACTOR * fontSize; + const lineDescent = _util.LINE_DESCENT_FACTOR * fontSize; + const maxHeight = lineHeight * lines.length; + if (maxHeight > h) { + vscale = h / maxHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + const buffer = ["q", `0 0 ${(0, _core_utils.numberToString)(w)} ${(0, _core_utils.numberToString)(h)} re W n`, `BT`, `1 0 0 1 0 ${(0, _core_utils.numberToString)(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, `/${this.fontName.name} ${(0, _core_utils.numberToString)(newFontSize)} Tf`]; + const vShift = (0, _core_utils.numberToString)(lineHeight); + for (const line of lines) { + buffer.push(`0 -${vShift} Td <${(0, _core_utils.stringToUTF16HexString)(line)}> Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new _primitives.Dict(this.xref); + appearanceStreamDict.set("Subtype", _primitives.Name.get("Form")); + appearanceStreamDict.set("Type", _primitives.Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, w, h]); + appearanceStreamDict.set("Length", appearance.length); + appearanceStreamDict.set("Resources", this.resources); + if (rotation) { + const matrix = (0, _core_utils.getRotationMatrix)(rotation, w, h); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new _stream.StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; + } +} +exports.FakeUnicodeFont = FakeUnicodeFont; + +/***/ }), +/* 143 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ColorSpace = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _base_stream = __w_pdfjs_require__(136); +var _core_utils = __w_pdfjs_require__(135); +function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) { + const COMPONENTS = 3; + alpha01 = alpha01 !== 1 ? 0 : alpha01; + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let newIndex = 0, + oldIndex; + const xScaled = new Uint16Array(w2); + const w1Scanline = w1 * COMPONENTS; + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; + } + for (let i = 0; i < h2; i++) { + const py = Math.floor(i * yRatio) * w1Scanline; + for (let j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + newIndex += alpha01; + } + } +} +class ColorSpace { + constructor(name, numComps) { + if (this.constructor === ColorSpace) { + (0, _util.unreachable)("Cannot initialize ColorSpace."); + } + this.name = name; + this.numComps = numComps; + } + getRgb(src, srcOffset) { + const rgb = new Uint8ClampedArray(3); + this.getRgbItem(src, srcOffset, rgb, 0); + return rgb; + } + getRgbItem(src, srcOffset, dest, destOffset) { + (0, _util.unreachable)("Should not call ColorSpace.getRgbItem"); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + (0, _util.unreachable)("Should not call ColorSpace.getRgbBuffer"); + } + getOutputLength(inputLength, alpha01) { + (0, _util.unreachable)("Should not call ColorSpace.getOutputLength"); + } + isPassthrough(bits) { + return false; + } + isDefaultDecode(decodeMap, bpc) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + } + fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + const count = originalWidth * originalHeight; + let rgbBuf = null; + const numComponentColors = 1 << bpc; + const needsResizing = originalHeight !== height || originalWidth !== width; + if (this.isPassthrough(bpc)) { + rgbBuf = comps; + } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") { + const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); + for (let i = 0; i < numComponentColors; i++) { + allColors[i] = i; + } + const colorMap = new Uint8ClampedArray(numComponentColors * 3); + this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0); + if (!needsResizing) { + let destPos = 0; + for (let i = 0; i < count; ++i) { + const key = comps[i] * 3; + dest[destPos++] = colorMap[key]; + dest[destPos++] = colorMap[key + 1]; + dest[destPos++] = colorMap[key + 2]; + destPos += alpha01; + } + } else { + rgbBuf = new Uint8Array(count * 3); + let rgbPos = 0; + for (let i = 0; i < count; ++i) { + const key = comps[i] * 3; + rgbBuf[rgbPos++] = colorMap[key]; + rgbBuf[rgbPos++] = colorMap[key + 1]; + rgbBuf[rgbPos++] = colorMap[key + 2]; + } + } + } else { + if (!needsResizing) { + this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01); + } else { + rgbBuf = new Uint8ClampedArray(count * 3); + this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0); + } + } + if (rgbBuf) { + if (needsResizing) { + resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01); + } else { + let destPos = 0, + rgbPos = 0; + for (let i = 0, ii = width * actualHeight; i < ii; i++) { + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + destPos += alpha01; + } + } + } + } + get usesZeroToOneRange() { + return (0, _util.shadow)(this, "usesZeroToOneRange", true); + } + static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) { + if (!localColorSpaceCache) { + throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.'); + } + if (!parsedColorSpace) { + throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.'); + } + let csName, csRef; + if (cacheKey instanceof _primitives.Ref) { + csRef = cacheKey; + cacheKey = xref.fetch(cacheKey); + } + if (cacheKey instanceof _primitives.Name) { + csName = cacheKey.name; + } + if (csName || csRef) { + localColorSpaceCache.set(csName, csRef, parsedColorSpace); + } + } + static getCached(cacheKey, xref, localColorSpaceCache) { + if (!localColorSpaceCache) { + throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.'); + } + if (cacheKey instanceof _primitives.Ref) { + const localColorSpace = localColorSpaceCache.getByRef(cacheKey); + if (localColorSpace) { + return localColorSpace; + } + try { + cacheKey = xref.fetch(cacheKey); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + } + } + if (cacheKey instanceof _primitives.Name) { + const localColorSpace = localColorSpaceCache.getByName(cacheKey.name); + if (localColorSpace) { + return localColorSpace; + } + } + return null; + } + static async parseAsync(_ref) { + let { + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache + } = _ref; + const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; + } + static parse(_ref2) { + let { + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache + } = _ref2; + const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache); + if (cachedColorSpace) { + return cachedColorSpace; + } + const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; + } + static _parse(cs, xref) { + let resources = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + let pdfFunctionFactory = arguments.length > 3 ? arguments[3] : undefined; + cs = xref.fetchIfRef(cs); + if (cs instanceof _primitives.Name) { + switch (cs.name) { + case "G": + case "DeviceGray": + return this.singletons.gray; + case "RGB": + case "DeviceRGB": + return this.singletons.rgb; + case "CMYK": + case "DeviceCMYK": + return this.singletons.cmyk; + case "Pattern": + return new PatternCS(null); + default: + if (resources instanceof _primitives.Dict) { + const colorSpaces = resources.get("ColorSpace"); + if (colorSpaces instanceof _primitives.Dict) { + const resourcesCS = colorSpaces.get(cs.name); + if (resourcesCS) { + if (resourcesCS instanceof _primitives.Name) { + return this._parse(resourcesCS, xref, resources, pdfFunctionFactory); + } + cs = resourcesCS; + break; + } + } + } + throw new _util.FormatError(`Unrecognized ColorSpace: ${cs.name}`); + } + } + if (Array.isArray(cs)) { + const mode = xref.fetchIfRef(cs[0]).name; + let params, numComps, baseCS, whitePoint, blackPoint, gamma; + switch (mode) { + case "G": + case "DeviceGray": + return this.singletons.gray; + case "RGB": + case "DeviceRGB": + return this.singletons.rgb; + case "CMYK": + case "DeviceCMYK": + return this.singletons.cmyk; + case "CalGray": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.get("Gamma"); + return new CalGrayCS(whitePoint, blackPoint, gamma); + case "CalRGB": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.getArray("Gamma"); + const matrix = params.getArray("Matrix"); + return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); + case "ICCBased": + const stream = xref.fetchIfRef(cs[1]); + const dict = stream.dict; + numComps = dict.get("N"); + const alt = dict.get("Alternate"); + if (alt) { + const altCS = this._parse(alt, xref, resources, pdfFunctionFactory); + if (altCS.numComps === numComps) { + return altCS; + } + (0, _util.warn)("ICCBased color space: Ignoring incorrect /Alternate entry."); + } + if (numComps === 1) { + return this.singletons.gray; + } else if (numComps === 3) { + return this.singletons.rgb; + } else if (numComps === 4) { + return this.singletons.cmyk; + } + break; + case "Pattern": + baseCS = cs[1] || null; + if (baseCS) { + baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory); + } + return new PatternCS(baseCS); + case "I": + case "Indexed": + baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory); + const hiVal = xref.fetchIfRef(cs[2]) + 1; + const lookup = xref.fetchIfRef(cs[3]); + return new IndexedCS(baseCS, hiVal, lookup); + case "Separation": + case "DeviceN": + const name = xref.fetchIfRef(cs[1]); + numComps = Array.isArray(name) ? name.length : 1; + baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory); + const tintFn = pdfFunctionFactory.create(cs[3]); + return new AlternateCS(numComps, baseCS, tintFn); + case "Lab": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + const range = params.getArray("Range"); + return new LabCS(whitePoint, blackPoint, range); + default: + throw new _util.FormatError(`Unimplemented ColorSpace object: ${mode}`); + } + } + throw new _util.FormatError(`Unrecognized ColorSpace object: ${cs}`); + } + static isDefaultDecode(decode, numComps) { + if (!Array.isArray(decode)) { + return true; + } + if (numComps * 2 !== decode.length) { + (0, _util.warn)("The decode map is not the correct length"); + return true; + } + for (let i = 0, ii = decode.length; i < ii; i += 2) { + if (decode[i] !== 0 || decode[i + 1] !== 1) { + return false; + } + } + return true; + } + static get singletons() { + return (0, _util.shadow)(this, "singletons", { + get gray() { + return (0, _util.shadow)(this, "gray", new DeviceGrayCS()); + }, + get rgb() { + return (0, _util.shadow)(this, "rgb", new DeviceRgbCS()); + }, + get cmyk() { + return (0, _util.shadow)(this, "cmyk", new DeviceCmykCS()); + } + }); + } +} +exports.ColorSpace = ColorSpace; +class AlternateCS extends ColorSpace { + constructor(numComps, base, tintFn) { + super("Alternate", numComps); + this.base = base; + this.tintFn = tintFn; + this.tmpBuf = new Float32Array(base.numComps); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const tmpBuf = this.tmpBuf; + this.tintFn(src, srcOffset, tmpBuf, 0); + this.base.getRgbItem(tmpBuf, 0, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const tintFn = this.tintFn; + const base = this.base; + const scale = 1 / ((1 << bits) - 1); + const baseNumComps = base.numComps; + const usesZeroToOneRange = base.usesZeroToOneRange; + const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0; + let pos = isPassthrough ? destOffset : 0; + const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count); + const numComps = this.numComps; + const scaled = new Float32Array(numComps); + const tinted = new Float32Array(baseNumComps); + let i, j; + for (i = 0; i < count; i++) { + for (j = 0; j < numComps; j++) { + scaled[j] = src[srcOffset++] * scale; + } + tintFn(scaled, 0, tinted, 0); + if (usesZeroToOneRange) { + for (j = 0; j < baseNumComps; j++) { + baseBuf[pos++] = tinted[j] * 255; + } + } else { + base.getRgbItem(tinted, 0, baseBuf, pos); + pos += baseNumComps; + } + } + if (!isPassthrough) { + base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); + } + } + getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01); + } +} +class PatternCS extends ColorSpace { + constructor(baseCS) { + super("Pattern", null); + this.base = baseCS; + } + isDefaultDecode(decodeMap, bpc) { + (0, _util.unreachable)("Should not call PatternCS.isDefaultDecode"); + } +} +class IndexedCS extends ColorSpace { + constructor(base, highVal, lookup) { + super("Indexed", 1); + this.base = base; + this.highVal = highVal; + const length = base.numComps * highVal; + this.lookup = new Uint8Array(length); + if (lookup instanceof _base_stream.BaseStream) { + const bytes = lookup.getBytes(length); + this.lookup.set(bytes); + } else if (typeof lookup === "string") { + for (let i = 0; i < length; ++i) { + this.lookup[i] = lookup.charCodeAt(i) & 0xff; + } + } else { + throw new _util.FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`); + } + } + getRgbItem(src, srcOffset, dest, destOffset) { + const numComps = this.base.numComps; + const start = src[srcOffset] * numComps; + this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const base = this.base; + const numComps = base.numComps; + const outputDelta = base.getOutputLength(numComps, alpha01); + const lookup = this.lookup; + for (let i = 0; i < count; ++i) { + const lookupPos = src[srcOffset++] * numComps; + base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); + destOffset += outputDelta; + } + } + getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); + } + isDefaultDecode(decodeMap, bpc) { + if (!Array.isArray(decodeMap)) { + return true; + } + if (decodeMap.length !== 2) { + (0, _util.warn)("Decode map length is not correct"); + return true; + } + if (!Number.isInteger(bpc) || bpc < 1) { + (0, _util.warn)("Bits per component is not correct"); + return true; + } + return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1; + } +} +class DeviceGrayCS extends ColorSpace { + constructor() { + super("DeviceGray", 1); + } + getRgbItem(src, srcOffset, dest, destOffset) { + const c = src[srcOffset] * 255; + dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 255 / ((1 << bits) - 1); + let j = srcOffset, + q = destOffset; + for (let i = 0; i < count; ++i) { + const c = scale * src[j++]; + dest[q++] = c; + dest[q++] = c; + dest[q++] = c; + q += alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + } +} +class DeviceRgbCS extends ColorSpace { + constructor() { + super("DeviceRGB", 3); + } + getRgbItem(src, srcOffset, dest, destOffset) { + dest[destOffset] = src[srcOffset] * 255; + dest[destOffset + 1] = src[srcOffset + 1] * 255; + dest[destOffset + 2] = src[srcOffset + 2] * 255; + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + if (bits === 8 && alpha01 === 0) { + dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); + return; + } + const scale = 255 / ((1 << bits) - 1); + let j = srcOffset, + q = destOffset; + for (let i = 0; i < count; ++i) { + dest[q++] = scale * src[j++]; + dest[q++] = scale * src[j++]; + dest[q++] = scale * src[j++]; + q += alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } + isPassthrough(bits) { + return bits === 8; + } +} +const DeviceCmykCS = function DeviceCmykCSClosure() { + function convertToRgb(src, srcOffset, srcScale, dest, destOffset) { + const c = src[srcOffset] * srcScale; + const m = src[srcOffset + 1] * srcScale; + const y = src[srcOffset + 2] * srcScale; + const k = src[srcOffset + 3] * srcScale; + dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747); + dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578); + dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367); + } + class DeviceCmykCS extends ColorSpace { + constructor() { + super("DeviceCMYK", 4); + } + getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(src, srcOffset, 1, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; i++) { + convertToRgb(src, srcOffset, scale, dest, destOffset); + srcOffset += 4; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength / 4 * (3 + alpha01) | 0; + } + } + return DeviceCmykCS; +}(); +const CalGrayCS = function CalGrayCSClosure() { + function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { + const A = src[srcOffset] * scale; + const AG = A ** cs.G; + const L = cs.YW * AG; + const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0); + dest[destOffset] = val; + dest[destOffset + 1] = val; + dest[destOffset + 2] = val; + } + class CalGrayCS extends ColorSpace { + constructor(whitePoint, blackPoint, gamma) { + super("CalGray", 1); + if (!whitePoint) { + throw new _util.FormatError("WhitePoint missing - required for color space CalGray"); + } + blackPoint = blackPoint || [0, 0, 0]; + gamma = gamma || 1; + this.XW = whitePoint[0]; + this.YW = whitePoint[1]; + this.ZW = whitePoint[2]; + this.XB = blackPoint[0]; + this.YB = blackPoint[1]; + this.ZB = blackPoint[2]; + this.G = gamma; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + ", no fallback available"); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + (0, _util.info)(`Invalid BlackPoint for ${this.name}, falling back to default.`); + this.XB = this.YB = this.ZB = 0; + } + if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { + (0, _util.warn)(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`); + } + if (this.G < 1) { + (0, _util.info)(`Invalid Gamma: ${this.G} for ${this.name}, ` + "falling back to default."); + this.G = 1; + } + } + getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(this, src, srcOffset, dest, destOffset, 1); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + convertToRgb(this, src, srcOffset, dest, destOffset, scale); + srcOffset += 1; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + } + } + return CalGrayCS; +}(); +const CalRGBCS = function CalRGBCSClosure() { + const BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]); + const BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]); + const SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]); + const FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); + const tempNormalizeMatrix = new Float32Array(3); + const tempConvertMatrix1 = new Float32Array(3); + const tempConvertMatrix2 = new Float32Array(3); + const DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0; + function matrixProduct(a, b, result) { + result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; + result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; + } + function convertToFlat(sourceWhitePoint, LMS, result) { + result[0] = LMS[0] * 1 / sourceWhitePoint[0]; + result[1] = LMS[1] * 1 / sourceWhitePoint[1]; + result[2] = LMS[2] * 1 / sourceWhitePoint[2]; + } + function convertToD65(sourceWhitePoint, LMS, result) { + const D65X = 0.95047; + const D65Y = 1; + const D65Z = 1.08883; + result[0] = LMS[0] * D65X / sourceWhitePoint[0]; + result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; + result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; + } + function sRGBTransferFunction(color) { + if (color <= 0.0031308) { + return adjustToRange(0, 1, 12.92 * color); + } + if (color >= 0.99554525) { + return 1; + } + return adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055); + } + function adjustToRange(min, max, value) { + return Math.max(min, Math.min(max, value)); + } + function decodeL(L) { + if (L < 0) { + return -decodeL(-L); + } + if (L > 8.0) { + return ((L + 16) / 116) ** 3; + } + return L * DECODE_L_CONSTANT; + } + function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { + if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) { + result[0] = XYZ_Flat[0]; + result[1] = XYZ_Flat[1]; + result[2] = XYZ_Flat[2]; + return; + } + const zeroDecodeL = decodeL(0); + const X_DST = zeroDecodeL; + const X_SRC = decodeL(sourceBlackPoint[0]); + const Y_DST = zeroDecodeL; + const Y_SRC = decodeL(sourceBlackPoint[1]); + const Z_DST = zeroDecodeL; + const Z_SRC = decodeL(sourceBlackPoint[2]); + const X_Scale = (1 - X_DST) / (1 - X_SRC); + const X_Offset = 1 - X_Scale; + const Y_Scale = (1 - Y_DST) / (1 - Y_SRC); + const Y_Offset = 1 - Y_Scale; + const Z_Scale = (1 - Z_DST) / (1 - Z_SRC); + const Z_Offset = 1 - Z_Scale; + result[0] = XYZ_Flat[0] * X_Scale + X_Offset; + result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; + result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; + } + function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { + if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { + result[0] = XYZ_In[0]; + result[1] = XYZ_In[1]; + result[2] = XYZ_In[2]; + return; + } + const LMS = result; + matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_Flat = tempNormalizeMatrix; + convertToFlat(sourceWhitePoint, LMS, LMS_Flat); + matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); + } + function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { + const LMS = result; + matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_D65 = tempNormalizeMatrix; + convertToD65(sourceWhitePoint, LMS, LMS_D65); + matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); + } + function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { + const A = adjustToRange(0, 1, src[srcOffset] * scale); + const B = adjustToRange(0, 1, src[srcOffset + 1] * scale); + const C = adjustToRange(0, 1, src[srcOffset + 2] * scale); + const AGR = A === 1 ? 1 : A ** cs.GR; + const BGG = B === 1 ? 1 : B ** cs.GG; + const CGB = C === 1 ? 1 : C ** cs.GB; + const X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; + const Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; + const Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; + const XYZ = tempConvertMatrix1; + XYZ[0] = X; + XYZ[1] = Y; + XYZ[2] = Z; + const XYZ_Flat = tempConvertMatrix2; + normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); + const XYZ_Black = tempConvertMatrix1; + compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); + const XYZ_D65 = tempConvertMatrix2; + normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); + const SRGB = tempConvertMatrix1; + matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); + dest[destOffset] = sRGBTransferFunction(SRGB[0]) * 255; + dest[destOffset + 1] = sRGBTransferFunction(SRGB[1]) * 255; + dest[destOffset + 2] = sRGBTransferFunction(SRGB[2]) * 255; + } + class CalRGBCS extends ColorSpace { + constructor(whitePoint, blackPoint, gamma, matrix) { + super("CalRGB", 3); + if (!whitePoint) { + throw new _util.FormatError("WhitePoint missing - required for color space CalRGB"); + } + blackPoint = blackPoint || new Float32Array(3); + gamma = gamma || new Float32Array([1, 1, 1]); + matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); + const XW = whitePoint[0]; + const YW = whitePoint[1]; + const ZW = whitePoint[2]; + this.whitePoint = whitePoint; + const XB = blackPoint[0]; + const YB = blackPoint[1]; + const ZB = blackPoint[2]; + this.blackPoint = blackPoint; + this.GR = gamma[0]; + this.GG = gamma[1]; + this.GB = gamma[2]; + this.MXA = matrix[0]; + this.MYA = matrix[1]; + this.MZA = matrix[2]; + this.MXB = matrix[3]; + this.MYB = matrix[4]; + this.MZB = matrix[5]; + this.MXC = matrix[6]; + this.MYC = matrix[7]; + this.MZC = matrix[8]; + if (XW < 0 || ZW < 0 || YW !== 1) { + throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + ", no fallback available"); + } + if (XB < 0 || YB < 0 || ZB < 0) { + (0, _util.info)(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default."); + this.blackPoint = new Float32Array(3); + } + if (this.GR < 0 || this.GG < 0 || this.GB < 0) { + (0, _util.info)(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`); + this.GR = this.GG = this.GB = 1; + } + } + getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(this, src, srcOffset, dest, destOffset, 1); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + convertToRgb(this, src, srcOffset, dest, destOffset, scale); + srcOffset += 3; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } + } + return CalRGBCS; +}(); +const LabCS = function LabCSClosure() { + function fn_g(x) { + let result; + if (x >= 6 / 29) { + result = x ** 3; + } else { + result = 108 / 841 * (x - 4 / 29); + } + return result; + } + function decode(value, high1, low2, high2) { + return low2 + value * (high2 - low2) / high1; + } + function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { + let Ls = src[srcOffset]; + let as = src[srcOffset + 1]; + let bs = src[srcOffset + 2]; + if (maxVal !== false) { + Ls = decode(Ls, maxVal, 0, 100); + as = decode(as, maxVal, cs.amin, cs.amax); + bs = decode(bs, maxVal, cs.bmin, cs.bmax); + } + if (as > cs.amax) { + as = cs.amax; + } else if (as < cs.amin) { + as = cs.amin; + } + if (bs > cs.bmax) { + bs = cs.bmax; + } else if (bs < cs.bmin) { + bs = cs.bmin; + } + const M = (Ls + 16) / 116; + const L = M + as / 500; + const N = M - bs / 200; + const X = cs.XW * fn_g(L); + const Y = cs.YW * fn_g(M); + const Z = cs.ZW * fn_g(N); + let r, g, b; + if (cs.ZW < 1) { + r = X * 3.1339 + Y * -1.617 + Z * -0.4906; + g = X * -0.9785 + Y * 1.916 + Z * 0.0333; + b = X * 0.072 + Y * -0.229 + Z * 1.4057; + } else { + r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; + g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; + b = X * 0.0557 + Y * -0.204 + Z * 1.057; + } + dest[destOffset] = Math.sqrt(r) * 255; + dest[destOffset + 1] = Math.sqrt(g) * 255; + dest[destOffset + 2] = Math.sqrt(b) * 255; + } + class LabCS extends ColorSpace { + constructor(whitePoint, blackPoint, range) { + super("Lab", 3); + if (!whitePoint) { + throw new _util.FormatError("WhitePoint missing - required for color space Lab"); + } + blackPoint = blackPoint || [0, 0, 0]; + range = range || [-100, 100, -100, 100]; + this.XW = whitePoint[0]; + this.YW = whitePoint[1]; + this.ZW = whitePoint[2]; + this.amin = range[0]; + this.amax = range[1]; + this.bmin = range[2]; + this.bmax = range[3]; + this.XB = blackPoint[0]; + this.YB = blackPoint[1]; + this.ZB = blackPoint[2]; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + throw new _util.FormatError("Invalid WhitePoint components, no fallback available"); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + (0, _util.info)("Invalid BlackPoint, falling back to default"); + this.XB = this.YB = this.ZB = 0; + } + if (this.amin > this.amax || this.bmin > this.bmax) { + (0, _util.info)("Invalid Range, falling back to defaults"); + this.amin = -100; + this.amax = 100; + this.bmin = -100; + this.bmax = 100; + } + } + getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(this, src, srcOffset, false, dest, destOffset); + } + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const maxVal = (1 << bits) - 1; + for (let i = 0; i < count; i++) { + convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); + srcOffset += 3; + destOffset += 3 + alpha01; + } + } + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + } + isDefaultDecode(decodeMap, bpc) { + return true; + } + get usesZeroToOneRange() { + return (0, _util.shadow)(this, "usesZeroToOneRange", false); + } + } + return LabCS; +}(); + +/***/ }), +/* 144 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PartialEvaluator = exports.EvaluatorPreprocessor = void 0; +var _util = __w_pdfjs_require__(2); +var _cmap = __w_pdfjs_require__(145); +var _primitives = __w_pdfjs_require__(134); +var _fonts = __w_pdfjs_require__(163); +var _fonts_utils = __w_pdfjs_require__(167); +var _encodings = __w_pdfjs_require__(166); +var _standard_fonts = __w_pdfjs_require__(170); +var _pattern = __w_pdfjs_require__(179); +var _xfa_fonts = __w_pdfjs_require__(180); +var _to_unicode_map = __w_pdfjs_require__(171); +var _function = __w_pdfjs_require__(186); +var _parser = __w_pdfjs_require__(146); +var _image_utils = __w_pdfjs_require__(188); +var _stream = __w_pdfjs_require__(139); +var _base_stream = __w_pdfjs_require__(136); +var _bidi = __w_pdfjs_require__(189); +var _colorspace = __w_pdfjs_require__(143); +var _decode_stream = __w_pdfjs_require__(148); +var _glyphlist = __w_pdfjs_require__(168); +var _core_utils = __w_pdfjs_require__(135); +var _metrics = __w_pdfjs_require__(174); +var _unicode = __w_pdfjs_require__(169); +var _murmurhash = __w_pdfjs_require__(190); +var _operator_list = __w_pdfjs_require__(191); +var _image = __w_pdfjs_require__(192); +const DefaultPartialEvaluatorOptions = Object.freeze({ + maxImageSize: -1, + disableFontFace: false, + ignoreErrors: false, + isEvalSupported: true, + isOffscreenCanvasSupported: true, + fontExtraProperties: false, + useSystemFonts: true, + cMapUrl: null, + standardFontDataUrl: null +}); +const PatternType = { + TILING: 1, + SHADING: 2 +}; +const TEXT_CHUNK_BATCH_SIZE = 10; +const deferred = Promise.resolve(); +function normalizeBlendMode(value) { + let parsingArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (Array.isArray(value)) { + for (const val of value) { + const maybeBM = normalizeBlendMode(val, true); + if (maybeBM) { + return maybeBM; + } + } + (0, _util.warn)(`Unsupported blend mode Array: ${value}`); + return "source-over"; + } + if (!(value instanceof _primitives.Name)) { + if (parsingArray) { + return null; + } + return "source-over"; + } + switch (value.name) { + case "Normal": + case "Compatible": + return "source-over"; + case "Multiply": + return "multiply"; + case "Screen": + return "screen"; + case "Overlay": + return "overlay"; + case "Darken": + return "darken"; + case "Lighten": + return "lighten"; + case "ColorDodge": + return "color-dodge"; + case "ColorBurn": + return "color-burn"; + case "HardLight": + return "hard-light"; + case "SoftLight": + return "soft-light"; + case "Difference": + return "difference"; + case "Exclusion": + return "exclusion"; + case "Hue": + return "hue"; + case "Saturation": + return "saturation"; + case "Color": + return "color"; + case "Luminosity": + return "luminosity"; + } + if (parsingArray) { + return null; + } + (0, _util.warn)(`Unsupported blend mode: ${value.name}`); + return "source-over"; +} +function incrementCachedImageMaskCount(data) { + if (data.fn === _util.OPS.paintImageMaskXObject && data.args[0] && data.args[0].count > 0) { + data.args[0].count++; + } +} +class TimeSlotManager { + static get TIME_SLOT_DURATION_MS() { + return (0, _util.shadow)(this, "TIME_SLOT_DURATION_MS", 20); + } + static get CHECK_TIME_EVERY() { + return (0, _util.shadow)(this, "CHECK_TIME_EVERY", 100); + } + constructor() { + this.reset(); + } + check() { + if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) { + return false; + } + this.checked = 0; + return this.endTime <= Date.now(); + } + reset() { + this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS; + this.checked = 0; + } +} +class PartialEvaluator { + constructor(_ref) { + let { + xref, + handler, + pageIndex, + idFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + options = null + } = _ref; + this.xref = xref; + this.handler = handler; + this.pageIndex = pageIndex; + this.idFactory = idFactory; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalImageCache = globalImageCache; + this.options = options || DefaultPartialEvaluatorOptions; + this.parsingType3Font = false; + this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); + } + get _pdfFunctionFactory() { + const pdfFunctionFactory = new _function.PDFFunctionFactory({ + xref: this.xref, + isEvalSupported: this.options.isEvalSupported + }); + return (0, _util.shadow)(this, "_pdfFunctionFactory", pdfFunctionFactory); + } + clone() { + let newOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + const newEvaluator = Object.create(this); + newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions); + return newEvaluator; + } + hasBlendModes(resources, nonBlendModesSet) { + if (!(resources instanceof _primitives.Dict)) { + return false; + } + if (resources.objId && nonBlendModesSet.has(resources.objId)) { + return false; + } + const processed = new _primitives.RefSet(nonBlendModesSet); + if (resources.objId) { + processed.put(resources.objId); + } + const nodes = [resources], + xref = this.xref; + while (nodes.length) { + const node = nodes.shift(); + const graphicStates = node.get("ExtGState"); + if (graphicStates instanceof _primitives.Dict) { + for (let graphicState of graphicStates.getRawValues()) { + if (graphicState instanceof _primitives.Ref) { + if (processed.has(graphicState)) { + continue; + } + try { + graphicState = xref.fetch(graphicState); + } catch (ex) { + processed.put(graphicState); + (0, _util.info)(`hasBlendModes - ignoring ExtGState: "${ex}".`); + continue; + } + } + if (!(graphicState instanceof _primitives.Dict)) { + continue; + } + if (graphicState.objId) { + processed.put(graphicState.objId); + } + const bm = graphicState.get("BM"); + if (bm instanceof _primitives.Name) { + if (bm.name !== "Normal") { + return true; + } + continue; + } + if (bm !== undefined && Array.isArray(bm)) { + for (const element of bm) { + if (element instanceof _primitives.Name && element.name !== "Normal") { + return true; + } + } + } + } + } + const xObjects = node.get("XObject"); + if (!(xObjects instanceof _primitives.Dict)) { + continue; + } + for (let xObject of xObjects.getRawValues()) { + if (xObject instanceof _primitives.Ref) { + if (processed.has(xObject)) { + continue; + } + try { + xObject = xref.fetch(xObject); + } catch (ex) { + processed.put(xObject); + (0, _util.info)(`hasBlendModes - ignoring XObject: "${ex}".`); + continue; + } + } + if (!(xObject instanceof _base_stream.BaseStream)) { + continue; + } + if (xObject.dict.objId) { + processed.put(xObject.dict.objId); + } + const xResources = xObject.dict.get("Resources"); + if (!(xResources instanceof _primitives.Dict)) { + continue; + } + if (xResources.objId && processed.has(xResources.objId)) { + continue; + } + nodes.push(xResources); + if (xResources.objId) { + processed.put(xResources.objId); + } + } + } + for (const ref of processed) { + nonBlendModesSet.put(ref); + } + return false; + } + async fetchBuiltInCMap(name) { + const cachedData = this.builtInCMapCache.get(name); + if (cachedData) { + return cachedData; + } + let data; + if (this.options.cMapUrl !== null) { + const url = `${this.options.cMapUrl}${name}.bcmap`; + const response = await fetch(url); + if (!response.ok) { + throw new Error(`fetchBuiltInCMap: failed to fetch file "${url}" with "${response.statusText}".`); + } + data = { + cMapData: new Uint8Array(await response.arrayBuffer()), + compressionType: _util.CMapCompressionType.BINARY + }; + } else { + data = await this.handler.sendWithPromise("FetchBuiltInCMap", { + name + }); + } + if (data.compressionType !== _util.CMapCompressionType.NONE) { + this.builtInCMapCache.set(name, data); + } + return data; + } + async fetchStandardFontData(name) { + const cachedData = this.standardFontDataCache.get(name); + if (cachedData) { + return new _stream.Stream(cachedData); + } + if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") { + return null; + } + const standardFontNameToFileName = (0, _standard_fonts.getFontNameToFileMap)(), + filename = standardFontNameToFileName[name]; + let data; + if (this.options.standardFontDataUrl !== null) { + const url = `${this.options.standardFontDataUrl}${filename}`; + const response = await fetch(url); + if (!response.ok) { + (0, _util.warn)(`fetchStandardFontData: failed to fetch file "${url}" with "${response.statusText}".`); + } else { + data = await response.arrayBuffer(); + } + } else { + try { + data = await this.handler.sendWithPromise("FetchStandardFontData", { + filename + }); + } catch (e) { + (0, _util.warn)(`fetchStandardFontData: failed to fetch file "${filename}" with "${e}".`); + } + } + if (!data) { + return null; + } + this.standardFontDataCache.set(name, data); + return new _stream.Stream(data); + } + async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) { + const dict = xobj.dict; + const matrix = dict.getArray("Matrix"); + let bbox = dict.getArray("BBox"); + if (Array.isArray(bbox) && bbox.length === 4) { + bbox = _util.Util.normalizeRect(bbox); + } else { + bbox = null; + } + let optionalContent, groupOptions; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); + } + if (optionalContent !== undefined) { + operatorList.addOp(_util.OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + const group = dict.get("Group"); + if (group) { + groupOptions = { + matrix, + bbox, + smask, + isolated: false, + knockout: false + }; + const groupSubtype = group.get("S"); + let colorSpace = null; + if ((0, _primitives.isName)(groupSubtype, "Transparency")) { + groupOptions.isolated = group.get("I") || false; + groupOptions.knockout = group.get("K") || false; + if (group.has("CS")) { + const cs = group.getRaw("CS"); + const cachedColorSpace = _colorspace.ColorSpace.getCached(cs, this.xref, localColorSpaceCache); + if (cachedColorSpace) { + colorSpace = cachedColorSpace; + } else { + colorSpace = await this.parseColorSpace({ + cs, + resources, + localColorSpaceCache + }); + } + } + } + if (smask && smask.backdrop) { + colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb; + smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); + } + operatorList.addOp(_util.OPS.beginGroup, [groupOptions]); + } + const args = group ? [matrix, null] : [matrix, bbox]; + operatorList.addOp(_util.OPS.paintFormXObjectBegin, args); + return this.getOperatorList({ + stream: xobj, + task, + resources: dict.get("Resources") || resources, + operatorList, + initialState + }).then(function () { + operatorList.addOp(_util.OPS.paintFormXObjectEnd, []); + if (group) { + operatorList.addOp(_util.OPS.endGroup, [groupOptions]); + } + if (optionalContent !== undefined) { + operatorList.addOp(_util.OPS.endMarkedContent, []); + } + }); + } + _sendImgData(objId, imgData) { + let cacheGlobally = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null; + if (this.parsingType3Font || cacheGlobally) { + return this.handler.send("commonobj", [objId, "Image", imgData], transfers); + } + return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers); + } + async buildPaintImageXObject(_ref2) { + let { + resources, + image, + isInline = false, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + } = _ref2; + const dict = image.dict; + const imageRef = dict.objId; + const w = dict.get("W", "Width"); + const h = dict.get("H", "Height"); + if (!(w && typeof w === "number") || !(h && typeof h === "number")) { + (0, _util.warn)("Image dimensions are missing, or not numbers."); + return; + } + const maxImageSize = this.options.maxImageSize; + if (maxImageSize !== -1 && w * h > maxImageSize) { + const msg = "Image exceeded maximum allowed size and was removed."; + if (this.options.ignoreErrors) { + (0, _util.warn)(msg); + return; + } + throw new Error(msg); + } + let optionalContent; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); + } + const imageMask = dict.get("IM", "ImageMask") || false; + let imgData, args; + if (imageMask) { + const interpolate = dict.get("I", "Interpolate"); + const bitStrideLength = w + 7 >> 3; + const imgArray = image.getBytes(bitStrideLength * h); + const decode = dict.getArray("D", "Decode"); + if (this.parsingType3Font) { + imgData = _image.PDFImage.createRawMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof _decode_stream.DecodeStream, + inverseDecode: !!decode && decode[0] > 0, + interpolate + }); + imgData.cached = !!cacheKey; + args = [imgData]; + operatorList.addImageOps(_util.OPS.paintImageMaskXObject, args, optionalContent); + if (cacheKey) { + localImageCache.set(cacheKey, imageRef, { + fn: _util.OPS.paintImageMaskXObject, + args, + optionalContent + }); + } + return; + } + imgData = _image.PDFImage.createMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof _decode_stream.DecodeStream, + inverseDecode: !!decode && decode[0] > 0, + interpolate, + isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported + }); + if (imgData.isSingleOpaquePixel) { + operatorList.addImageOps(_util.OPS.paintSolidColorImageMask, [], optionalContent); + if (cacheKey) { + localImageCache.set(cacheKey, imageRef, { + fn: _util.OPS.paintSolidColorImageMask, + args: [], + optionalContent + }); + } + return; + } + const objId = `mask_${this.idFactory.createObjId()}`; + operatorList.addDependency(objId); + this._sendImgData(objId, imgData); + args = [{ + data: objId, + width: imgData.width, + height: imgData.height, + interpolate: imgData.interpolate, + count: 1 + }]; + operatorList.addImageOps(_util.OPS.paintImageMaskXObject, args, optionalContent); + if (cacheKey) { + localImageCache.set(cacheKey, imageRef, { + fn: _util.OPS.paintImageMaskXObject, + args, + optionalContent + }); + } + return; + } + const softMask = dict.get("SM", "SMask") || false; + const mask = dict.get("Mask") || false; + const SMALL_IMAGE_DIMENSIONS = 200; + if (isInline && !softMask && !mask && w + h < SMALL_IMAGE_DIMENSIONS) { + const imageObj = new _image.PDFImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }); + imgData = imageObj.createImageData(true); + operatorList.addImageOps(_util.OPS.paintInlineImageXObject, [imgData], optionalContent); + return; + } + let objId = `img_${this.idFactory.createObjId()}`, + cacheGlobally = false; + if (this.parsingType3Font) { + objId = `${this.idFactory.getDocId()}_type3_${objId}`; + } else if (imageRef) { + cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex); + if (cacheGlobally) { + objId = `${this.idFactory.getDocId()}_${objId}`; + } + } + operatorList.addDependency(objId); + args = [objId, w, h]; + _image.PDFImage.buildImage({ + xref: this.xref, + res: resources, + image, + isInline, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }).then(imageObj => { + imgData = imageObj.createImageData(false); + // console.log('图片对象',imgData); + if (cacheKey && imageRef && cacheGlobally) { + this.globalImageCache.addByteSize(imageRef, imgData.data.length); + } + return this._sendImgData(objId, imgData, cacheGlobally); + }).catch(reason => { + // console.log('图片加载失败'); + (0, _util.warn)(`Unable to decode image "${objId}": "${reason}".`); + return this._sendImgData(objId, null, cacheGlobally); + }); + operatorList.addImageOps(_util.OPS.paintImageXObject, args, optionalContent); + if (cacheKey) { + localImageCache.set(cacheKey, imageRef, { + fn: _util.OPS.paintImageXObject, + args, + optionalContent + }); + if (imageRef) { + (0, _util.assert)(!isInline, "Cannot cache an inline image globally."); + this.globalImageCache.addPageIndex(imageRef, this.pageIndex); + if (cacheGlobally) { + this.globalImageCache.setData(imageRef, { + objId, + fn: _util.OPS.paintImageXObject, + args, + optionalContent, + byteSize: 0 + }); + } + } + } + } + handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) { + const smaskContent = smask.get("G"); + const smaskOptions = { + subtype: smask.get("S").name, + backdrop: smask.get("BC") + }; + const transferObj = smask.get("TR"); + if ((0, _function.isPDFFunction)(transferObj)) { + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256); + const tmp = new Float32Array(1); + for (let i = 0; i < 256; i++) { + tmp[0] = i / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[i] = tmp[0] * 255 | 0; + } + smaskOptions.transferMap = transferMap; + } + return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone(), localColorSpaceCache); + } + handleTransferFunction(tr) { + let transferArray; + if (Array.isArray(tr)) { + transferArray = tr; + } else if ((0, _function.isPDFFunction)(tr)) { + transferArray = [tr]; + } else { + return null; + } + const transferMaps = []; + let numFns = 0, + numEffectfulFns = 0; + for (const entry of transferArray) { + const transferObj = this.xref.fetchIfRef(entry); + numFns++; + if ((0, _primitives.isName)(transferObj, "Identity")) { + transferMaps.push(null); + continue; + } else if (!(0, _function.isPDFFunction)(transferObj)) { + return null; + } + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256), + tmp = new Float32Array(1); + for (let j = 0; j < 256; j++) { + tmp[0] = j / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[j] = tmp[0] * 255 | 0; + } + transferMaps.push(transferMap); + numEffectfulFns++; + } + if (!(numFns === 1 || numFns === 4)) { + return null; + } + if (numEffectfulFns === 0) { + return null; + } + return transferMaps; + } + handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache) { + const tilingOpList = new _operator_list.OperatorList(); + const patternResources = _primitives.Dict.merge({ + xref: this.xref, + dictArray: [patternDict.get("Resources"), resources] + }); + return this.getOperatorList({ + stream: pattern, + task, + resources: patternResources, + operatorList: tilingOpList + }).then(function () { + const operatorListIR = tilingOpList.getIR(); + const tilingPatternIR = (0, _pattern.getTilingPatternIR)(operatorListIR, patternDict, color); + operatorList.addDependencies(tilingOpList.dependencies); + operatorList.addOp(fn, tilingPatternIR); + if (patternDict.objId) { + localTilingPatternCache.set(null, patternDict.objId, { + operatorListIR, + dict: patternDict + }); + } + }).catch(reason => { + if (reason instanceof _util.AbortException) { + return; + } + if (this.options.ignoreErrors) { + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorTilingPattern + }); + (0, _util.warn)(`handleTilingType - ignoring pattern: "${reason}".`); + return; + } + throw reason; + }); + } + handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) { + let fallbackFontDict = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null; + let cssFontInfo = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null; + const fontName = fontArgs && fontArgs[0] instanceof _primitives.Name ? fontArgs[0].name : null; + return this.loadFont(fontName, fontRef, resources, fallbackFontDict, cssFontInfo).then(translated => { + if (!translated.font.isType3Font) { + return translated; + } + return translated.loadType3Data(this, resources, task).then(function () { + operatorList.addDependencies(translated.type3Dependencies); + return translated; + }).catch(reason => { + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadType3 + }); + return new TranslatedFont({ + loadedName: "g_font_error", + font: new _fonts.ErrorFont(`Type3 font load error: ${reason}`), + dict: translated.font, + evaluatorOptions: this.options + }); + }); + }).then(translated => { + state.font = translated.font; + translated.send(this.handler); + return translated.loadedName; + }); + } + handleText(chars, state) { + const font = state.font; + const glyphs = font.charsToGlyphs(chars); + if (font.data) { + const isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG); + if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || this.options.disableFontFace) { + PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options); + } + } + return glyphs; + } + ensureStateFont(state) { + if (state.font) { + return; + } + const reason = new _util.FormatError("Missing setFont (Tf) operator before text rendering operator."); + if (this.options.ignoreErrors) { + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorFontState + }); + (0, _util.warn)(`ensureStateFont: "${reason}".`); + return; + } + throw reason; + } + async setGState(_ref3) { + let { + resources, + gState, + operatorList, + cacheKey, + task, + stateManager, + localGStateCache, + localColorSpaceCache + } = _ref3; + const gStateRef = gState.objId; + let isSimpleGState = true; + const gStateObj = []; + let promise = Promise.resolve(); + for (const key of gState.getKeys()) { + const value = gState.get(key); + switch (key) { + case "Type": + break; + case "LW": + case "LC": + case "LJ": + case "ML": + case "D": + case "RI": + case "FL": + case "CA": + case "ca": + gStateObj.push([key, value]); + break; + case "Font": + isSimpleGState = false; + promise = promise.then(() => { + return this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) { + operatorList.addDependency(loadedName); + gStateObj.push([key, [loadedName, value[1]]]); + }); + }); + break; + case "BM": + gStateObj.push([key, normalizeBlendMode(value)]); + break; + case "SMask": + if ((0, _primitives.isName)(value, "None")) { + gStateObj.push([key, false]); + break; + } + if (value instanceof _primitives.Dict) { + isSimpleGState = false; + promise = promise.then(() => { + return this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache); + }); + gStateObj.push([key, true]); + } else { + (0, _util.warn)("Unsupported SMask type"); + } + break; + case "TR": + const transferMaps = this.handleTransferFunction(value); + gStateObj.push([key, transferMaps]); + break; + case "OP": + case "op": + case "OPM": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + case "TR2": + case "HT": + case "SM": + case "SA": + case "AIS": + case "TK": + (0, _util.info)("graphic state operator " + key); + break; + default: + (0, _util.info)("Unknown graphic state operator " + key); + break; + } + } + return promise.then(function () { + if (gStateObj.length > 0) { + operatorList.addOp(_util.OPS.setGState, [gStateObj]); + } + if (isSimpleGState) { + localGStateCache.set(cacheKey, gStateRef, gStateObj); + } + }); + } + loadFont(fontName, font, resources) { + let fallbackFontDict = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + let cssFontInfo = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; + const errorFont = async () => { + return new TranslatedFont({ + loadedName: "g_font_error", + font: new _fonts.ErrorFont(`Font "${fontName}" is not available.`), + dict: font, + evaluatorOptions: this.options + }); + }; + const xref = this.xref; + let fontRef; + if (font) { + if (font instanceof _primitives.Ref) { + fontRef = font; + } + } else { + const fontRes = resources.get("Font"); + if (fontRes) { + fontRef = fontRes.getRaw(fontName); + } + } + if (!fontRef) { + const partialMsg = `Font "${fontName || font && font.toString()}" is not available`; + if (!this.options.ignoreErrors && !this.parsingType3Font) { + (0, _util.warn)(`${partialMsg}.`); + return errorFont(); + } + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorFontMissing + }); + (0, _util.warn)(`${partialMsg} -- attempting to fallback to a default font.`); + if (fallbackFontDict) { + fontRef = fallbackFontDict; + } else { + fontRef = PartialEvaluator.fallbackFontDict; + } + } + if (this.parsingType3Font && this.type3FontRefs.has(fontRef)) { + return errorFont(); + } + if (this.fontCache.has(fontRef)) { + return this.fontCache.get(fontRef); + } + font = xref.fetchIfRef(fontRef); + if (!(font instanceof _primitives.Dict)) { + return errorFont(); + } + if (font.cacheKey && this.fontCache.has(font.cacheKey)) { + return this.fontCache.get(font.cacheKey); + } + const fontCapability = (0, _util.createPromiseCapability)(); + let preEvaluatedFont; + try { + preEvaluatedFont = this.preEvaluateFont(font); + preEvaluatedFont.cssFontInfo = cssFontInfo; + } catch (reason) { + (0, _util.warn)(`loadFont - preEvaluateFont failed: "${reason}".`); + return errorFont(); + } + const { + descriptor, + hash + } = preEvaluatedFont; + const fontRefIsRef = fontRef instanceof _primitives.Ref; + let fontID; + if (fontRefIsRef) { + fontID = `f${fontRef.toString()}`; + } + if (hash && descriptor instanceof _primitives.Dict) { + if (!descriptor.fontAliases) { + descriptor.fontAliases = Object.create(null); + } + const fontAliases = descriptor.fontAliases; + if (fontAliases[hash]) { + const aliasFontRef = fontAliases[hash].aliasRef; + if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) { + this.fontCache.putAlias(fontRef, aliasFontRef); + return this.fontCache.get(fontRef); + } + } else { + fontAliases[hash] = { + fontID: this.idFactory.createFontId() + }; + } + if (fontRefIsRef) { + fontAliases[hash].aliasRef = fontRef; + } + fontID = fontAliases[hash].fontID; + } + if (fontRefIsRef) { + this.fontCache.put(fontRef, fontCapability.promise); + } else { + if (!fontID) { + fontID = this.idFactory.createFontId(); + } + font.cacheKey = `cacheKey_${fontID}`; + this.fontCache.put(font.cacheKey, fontCapability.promise); + } + (0, _util.assert)(fontID && fontID.startsWith("f"), 'The "fontID" must be (correctly) defined.'); + font.loadedName = `${this.idFactory.getDocId()}_${fontID}`; + this.translateFont(preEvaluatedFont).then(translatedFont => { + if (translatedFont.fontType !== undefined) { + xref.stats.addFontType(translatedFont.fontType); + } + fontCapability.resolve(new TranslatedFont({ + loadedName: font.loadedName, + font: translatedFont, + dict: font, + evaluatorOptions: this.options + })); + }).catch(reason => { + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorFontTranslate + }); + (0, _util.warn)(`loadFont - translateFont failed: "${reason}".`); + try { + const fontFile3 = descriptor && descriptor.get("FontFile3"); + const subtype = fontFile3 && fontFile3.get("Subtype"); + const fontType = (0, _fonts_utils.getFontType)(preEvaluatedFont.type, subtype && subtype.name); + if (fontType !== undefined) { + xref.stats.addFontType(fontType); + } + } catch (ex) {} + fontCapability.resolve(new TranslatedFont({ + loadedName: font.loadedName, + font: new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason), + dict: font, + evaluatorOptions: this.options + })); + }); + return fontCapability.promise; + } + buildPath(operatorList, fn, args) { + let parsingText = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + const lastIndex = operatorList.length - 1; + if (!args) { + args = []; + } + if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) { + if (parsingText) { + (0, _util.warn)(`Encountered path operator "${fn}" inside of a text object.`); + operatorList.addOp(_util.OPS.save, null); + } + let minMax; + switch (fn) { + case _util.OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax = [Math.min(args[0], x), Math.max(args[0], x), Math.min(args[1], y), Math.max(args[1], y)]; + break; + case _util.OPS.moveTo: + case _util.OPS.lineTo: + minMax = [args[0], args[0], args[1], args[1]]; + break; + default: + minMax = [Infinity, -Infinity, Infinity, -Infinity]; + break; + } + operatorList.addOp(_util.OPS.constructPath, [[fn], args, minMax]); + if (parsingText) { + operatorList.addOp(_util.OPS.restore, null); + } + } else { + const opArgs = operatorList.argsArray[lastIndex]; + opArgs[0].push(fn); + opArgs[1].push(...args); + const minMax = opArgs[2]; + switch (fn) { + case _util.OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax[0] = Math.min(minMax[0], args[0], x); + minMax[1] = Math.max(minMax[1], args[0], x); + minMax[2] = Math.min(minMax[2], args[1], y); + minMax[3] = Math.max(minMax[3], args[1], y); + break; + case _util.OPS.moveTo: + case _util.OPS.lineTo: + minMax[0] = Math.min(minMax[0], args[0]); + minMax[1] = Math.max(minMax[1], args[0]); + minMax[2] = Math.min(minMax[2], args[1]); + minMax[3] = Math.max(minMax[3], args[1]); + break; + } + } + } + parseColorSpace(_ref4) { + let { + cs, + resources, + localColorSpaceCache + } = _ref4; + return _colorspace.ColorSpace.parseAsync({ + cs, + xref: this.xref, + resources, + pdfFunctionFactory: this._pdfFunctionFactory, + localColorSpaceCache + }).catch(reason => { + if (reason instanceof _util.AbortException) { + return null; + } + if (this.options.ignoreErrors) { + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorColorSpace + }); + (0, _util.warn)(`parseColorSpace - ignoring ColorSpace: "${reason}".`); + return null; + } + throw reason; + }); + } + parseShading(_ref5) { + let { + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + } = _ref5; + let id = localShadingPatternCache.get(shading); + if (!id) { + var shadingFill = _pattern.Pattern.parseShading(shading, this.xref, resources, this.handler, this._pdfFunctionFactory, localColorSpaceCache); + const patternIR = shadingFill.getIR(); + id = `pattern_${this.idFactory.createObjId()}`; + localShadingPatternCache.set(shading, id); + this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); + } + return id; + } + handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache) { + const patternName = args.pop(); + if (patternName instanceof _primitives.Name) { + const rawPattern = patterns.getRaw(patternName.name); + const localTilingPattern = rawPattern instanceof _primitives.Ref && localTilingPatternCache.getByRef(rawPattern); + if (localTilingPattern) { + try { + const color = cs.base ? cs.base.getRgb(args, 0) : null; + const tilingPatternIR = (0, _pattern.getTilingPatternIR)(localTilingPattern.operatorListIR, localTilingPattern.dict, color); + operatorList.addOp(fn, tilingPatternIR); + return undefined; + } catch (ex) {} + } + const pattern = this.xref.fetchIfRef(rawPattern); + if (pattern) { + const dict = pattern instanceof _base_stream.BaseStream ? pattern.dict : pattern; + const typeNum = dict.get("PatternType"); + if (typeNum === PatternType.TILING) { + const color = cs.base ? cs.base.getRgb(args, 0) : null; + return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache); + } else if (typeNum === PatternType.SHADING) { + const shading = dict.get("Shading"); + const matrix = dict.getArray("Matrix"); + const objId = this.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }); + operatorList.addOp(fn, ["Shading", objId, matrix]); + return undefined; + } + throw new _util.FormatError(`Unknown PatternType: ${typeNum}`); + } + } + throw new _util.FormatError(`Unknown PatternName: ${patternName}`); + } + _parseVisibilityExpression(array, nestingCounter, currentResult) { + const MAX_NESTING = 10; + if (++nestingCounter > MAX_NESTING) { + (0, _util.warn)("Visibility expression is too deeply nested"); + return; + } + const length = array.length; + const operator = this.xref.fetchIfRef(array[0]); + if (length < 2 || !(operator instanceof _primitives.Name)) { + (0, _util.warn)("Invalid visibility expression"); + return; + } + switch (operator.name) { + case "And": + case "Or": + case "Not": + currentResult.push(operator.name); + break; + default: + (0, _util.warn)(`Invalid operator ${operator.name} in visibility expression`); + return; + } + for (let i = 1; i < length; i++) { + const raw = array[i]; + const object = this.xref.fetchIfRef(raw); + if (Array.isArray(object)) { + const nestedResult = []; + currentResult.push(nestedResult); + this._parseVisibilityExpression(object, nestingCounter, nestedResult); + } else if (raw instanceof _primitives.Ref) { + currentResult.push(raw.toString()); + } + } + } + async parseMarkedContentProps(contentProperties, resources) { + let optionalContent; + if (contentProperties instanceof _primitives.Name) { + const properties = resources.get("Properties"); + optionalContent = properties.get(contentProperties.name); + } else if (contentProperties instanceof _primitives.Dict) { + optionalContent = contentProperties; + } else { + throw new _util.FormatError("Optional content properties malformed."); + } + const optionalContentType = optionalContent.get("Type").name; + if (optionalContentType === "OCG") { + return { + type: optionalContentType, + id: optionalContent.objId + }; + } else if (optionalContentType === "OCMD") { + const expression = optionalContent.get("VE"); + if (Array.isArray(expression)) { + const result = []; + this._parseVisibilityExpression(expression, 0, result); + if (result.length > 0) { + return { + type: "OCMD", + expression: result + }; + } + } + const optionalContentGroups = optionalContent.get("OCGs"); + if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof _primitives.Dict) { + const groupIds = []; + if (Array.isArray(optionalContentGroups)) { + for (const ocg of optionalContentGroups) { + groupIds.push(ocg.toString()); + } + } else { + groupIds.push(optionalContentGroups.objId); + } + return { + type: optionalContentType, + ids: groupIds, + policy: optionalContent.get("P") instanceof _primitives.Name ? optionalContent.get("P").name : null, + expression: null + }; + } else if (optionalContentGroups instanceof _primitives.Ref) { + return { + type: optionalContentType, + id: optionalContentGroups.toString() + }; + } + } + return null; + } + getOperatorList(_ref6) { + let { + stream, + task, + resources, + operatorList, + initialState = null, + fallbackFontDict = null + } = _ref6; + resources = resources || _primitives.Dict.empty; + initialState = initialState || new EvalState(); + if (!operatorList) { + throw new Error('getOperatorList: missing "operatorList" parameter'); + } + const self = this; + const xref = this.xref; + let parsingText = false; + const localImageCache = new _image_utils.LocalImageCache(); + const localColorSpaceCache = new _image_utils.LocalColorSpaceCache(); + const localGStateCache = new _image_utils.LocalGStateCache(); + const localTilingPatternCache = new _image_utils.LocalTilingPatternCache(); + const localShadingPatternCache = new Map(); + const xobjs = resources.get("XObject") || _primitives.Dict.empty; + const patterns = resources.get("Pattern") || _primitives.Dict.empty; + const stateManager = new StateManager(initialState); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + const timeSlotManager = new TimeSlotManager(); + function closePendingRestoreOPS(argument) { + for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { + operatorList.addOp(_util.OPS.restore, []); + } + } + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + Promise.all([promise, operatorList.ready]).then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, i, ii, cs, name, isValidName; + while (!(stop = timeSlotManager.check())) { + operation.args = null; + if (!preprocessor.read(operation)) { + break; + } + let args = operation.args; + let fn = operation.fn; + switch (fn | 0) { + case _util.OPS.paintXObject: + isValidName = args[0] instanceof _primitives.Name; + name = args[0].name; + if (isValidName) { + const localImage = localImageCache.getByName(name); + if (localImage) { + operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); + incrementCachedImageMaskCount(localImage); + args = null; + continue; + } + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new _util.FormatError("XObject must be referred to by name."); + } + let xobj = xobjs.getRaw(name); + if (xobj instanceof _primitives.Ref) { + const localImage = localImageCache.getByRef(xobj); + if (localImage) { + operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); + incrementCachedImageMaskCount(localImage); + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); + if (globalImage) { + operatorList.addDependency(globalImage.objId); + operatorList.addImageOps(globalImage.fn, globalImage.args, globalImage.optionalContent); + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof _base_stream.BaseStream)) { + throw new _util.FormatError("XObject should be a stream"); + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof _primitives.Name)) { + throw new _util.FormatError("XObject should have a Name subtype"); + } + if (type.name === "Form") { + stateManager.save(); + self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () { + stateManager.restore(); + resolveXObject(); + }, rejectXObject); + return; + } else if (type.name === "Image") { + self.buildPaintImageXObject({ + resources, + image: xobj, + operatorList, + cacheKey: name, + localImageCache, + localColorSpaceCache + }).then(resolveXObject, rejectXObject); + return; + } else if (type.name === "PS") { + (0, _util.info)("Ignored XObject subtype PS"); + } else { + throw new _util.FormatError(`Unhandled XObject subtype ${type.name}`); + } + resolveXObject(); + }).catch(function (reason) { + if (reason instanceof _util.AbortException) { + return; + } + if (self.options.ignoreErrors) { + self.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorXObject + }); + (0, _util.warn)(`getOperatorList - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case _util.OPS.setFont: + var fontSize = args[1]; + next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) { + operatorList.addDependency(loadedName); + operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]); + })); + return; + case _util.OPS.beginText: + parsingText = true; + break; + case _util.OPS.endText: + parsingText = false; + break; + case _util.OPS.endInlineImage: + var cacheKey = args[0].cacheKey; + if (cacheKey) { + const localImage = localImageCache.getByName(cacheKey); + if (localImage) { + operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); + incrementCachedImageMaskCount(localImage); + args = null; + continue; + } + } + next(self.buildPaintImageXObject({ + resources, + image: args[0], + isInline: true, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache + })); + return; + case _util.OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + args[0] = self.handleText(args[0], stateManager.state); + break; + case _util.OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + var combinedGlyphs = []; + var state = stateManager.state; + for (const arrItem of args[0]) { + if (typeof arrItem === "string") { + combinedGlyphs.push(...self.handleText(arrItem, state)); + } else if (typeof arrItem === "number") { + combinedGlyphs.push(arrItem); + } + } + args[0] = combinedGlyphs; + fn = _util.OPS.showText; + break; + case _util.OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + operatorList.addOp(_util.OPS.nextLine); + args[0] = self.handleText(args[0], stateManager.state); + fn = _util.OPS.showText; + break; + case _util.OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + operatorList.addOp(_util.OPS.nextLine); + operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]); + operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]); + args[0] = self.handleText(args[0], stateManager.state); + fn = _util.OPS.showText; + break; + case _util.OPS.setTextRenderingMode: + stateManager.state.textRenderingMode = args[0]; + break; + case _util.OPS.setFillColorSpace: + { + const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache); + if (cachedColorSpace) { + stateManager.state.fillColorSpace = cachedColorSpace; + continue; + } + next(self.parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache + }).then(function (colorSpace) { + if (colorSpace) { + stateManager.state.fillColorSpace = colorSpace; + } + })); + return; + } + case _util.OPS.setStrokeColorSpace: + { + const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache); + if (cachedColorSpace) { + stateManager.state.strokeColorSpace = cachedColorSpace; + continue; + } + next(self.parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache + }).then(function (colorSpace) { + if (colorSpace) { + stateManager.state.strokeColorSpace = colorSpace; + } + })); + return; + } + case _util.OPS.setFillColor: + cs = stateManager.state.fillColorSpace; + args = cs.getRgb(args, 0); + fn = _util.OPS.setFillRGBColor; + break; + case _util.OPS.setStrokeColor: + cs = stateManager.state.strokeColorSpace; + args = cs.getRgb(args, 0); + fn = _util.OPS.setStrokeRGBColor; + break; + case _util.OPS.setFillGray: + stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray; + args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0); + fn = _util.OPS.setFillRGBColor; + break; + case _util.OPS.setStrokeGray: + stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray; + args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0); + fn = _util.OPS.setStrokeRGBColor; + break; + case _util.OPS.setFillCMYKColor: + stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk; + args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = _util.OPS.setFillRGBColor; + break; + case _util.OPS.setStrokeCMYKColor: + stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk; + args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = _util.OPS.setStrokeRGBColor; + break; + case _util.OPS.setFillRGBColor: + stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb; + args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case _util.OPS.setStrokeRGBColor: + stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb; + args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case _util.OPS.setFillColorN: + cs = stateManager.state.fillColorSpace; + if (cs.name === "Pattern") { + next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + return; + } + args = cs.getRgb(args, 0); + fn = _util.OPS.setFillRGBColor; + break; + case _util.OPS.setStrokeColorN: + cs = stateManager.state.strokeColorSpace; + if (cs.name === "Pattern") { + next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + return; + } + args = cs.getRgb(args, 0); + fn = _util.OPS.setStrokeRGBColor; + break; + case _util.OPS.shadingFill: + var shadingRes = resources.get("Shading"); + if (!shadingRes) { + throw new _util.FormatError("No shading resource found"); + } + var shading = shadingRes.get(args[0].name); + if (!shading) { + throw new _util.FormatError("No shading object found"); + } + const patternId = self.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache + }); + args = [patternId]; + fn = _util.OPS.shadingFill; + break; + case _util.OPS.setGState: + isValidName = args[0] instanceof _primitives.Name; + name = args[0].name; + if (isValidName) { + const localGStateObj = localGStateCache.getByName(name); + if (localGStateObj) { + if (localGStateObj.length > 0) { + operatorList.addOp(_util.OPS.setGState, [localGStateObj]); + } + args = null; + continue; + } + } + next(new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { + throw new _util.FormatError("GState must be referred to by name."); + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof _primitives.Dict)) { + throw new _util.FormatError("ExtGState should be a dictionary."); + } + const gState = extGState.get(name); + if (!(gState instanceof _primitives.Dict)) { + throw new _util.FormatError("GState should be a dictionary."); + } + self.setGState({ + resources, + gState, + operatorList, + cacheKey: name, + task, + stateManager, + localGStateCache, + localColorSpaceCache + }).then(resolveGState, rejectGState); + }).catch(function (reason) { + if (reason instanceof _util.AbortException) { + return; + } + if (self.options.ignoreErrors) { + self.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorExtGState + }); + (0, _util.warn)(`getOperatorList - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case _util.OPS.moveTo: + case _util.OPS.lineTo: + case _util.OPS.curveTo: + case _util.OPS.curveTo2: + case _util.OPS.curveTo3: + case _util.OPS.closePath: + case _util.OPS.rectangle: + self.buildPath(operatorList, fn, args, parsingText); + continue; + case _util.OPS.markPoint: + case _util.OPS.markPointProps: + case _util.OPS.beginCompat: + case _util.OPS.endCompat: + continue; + case _util.OPS.beginMarkedContentProps: + if (!(args[0] instanceof _primitives.Name)) { + (0, _util.warn)(`Expected name for beginMarkedContentProps arg0=${args[0]}`); + continue; + } + if (args[0].name === "OC") { + next(self.parseMarkedContentProps(args[1], resources).then(data => { + operatorList.addOp(_util.OPS.beginMarkedContentProps, ["OC", data]); + }).catch(reason => { + if (reason instanceof _util.AbortException) { + return; + } + if (self.options.ignoreErrors) { + self.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorMarkedContent + }); + (0, _util.warn)(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`); + return; + } + throw reason; + })); + return; + } + args = [args[0].name, args[1] instanceof _primitives.Dict ? args[1].get("MCID") : null]; + break; + case _util.OPS.beginMarkedContent: + case _util.OPS.endMarkedContent: + default: + if (args !== null) { + for (i = 0, ii = args.length; i < ii; i++) { + if (args[i] instanceof _primitives.Dict) { + break; + } + } + if (i < ii) { + (0, _util.warn)("getOperatorList - ignoring operator: " + fn); + continue; + } + } + } + operatorList.addOp(fn, args); + } + if (stop) { + next(deferred); + return; + } + closePendingRestoreOPS(); + resolve(); + }).catch(reason => { + if (reason instanceof _util.AbortException) { + return; + } + if (this.options.ignoreErrors) { + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorOperatorList + }); + (0, _util.warn)(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + closePendingRestoreOPS(); + return; + } + throw reason; + }); + } + getTextContent(_ref7) { + let { + stream, + task, + resources, + stateManager = null, + combineTextItems = false, + includeMarkedContent = false, + sink, + seenStyles = new Set(), + viewBox, + markedContentData = null + } = _ref7; + resources = resources || _primitives.Dict.empty; + stateManager = stateManager || new StateManager(new TextState()); + if (includeMarkedContent) { + markedContentData = markedContentData || { + level: 0 + }; + } + const textContent = { + items: [], + styles: Object.create(null) + }; + const textContentItem = { + initialized: false, + str: [], + totalWidth: 0, + totalHeight: 0, + width: 0, + height: 0, + vertical: false, + prevTransform: null, + textAdvanceScale: 0, + spaceInFlowMin: 0, + spaceInFlowMax: 0, + trackingSpaceMin: Infinity, + negativeSpaceMax: -Infinity, + notASpace: -Infinity, + transform: null, + fontName: null, + hasEOL: false + }; + const twoLastChars = [" ", " "]; + let twoLastCharsPos = 0; + function saveLastChar(char) { + const nextPos = (twoLastCharsPos + 1) % 2; + const ret = twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " "; + twoLastChars[twoLastCharsPos] = char; + twoLastCharsPos = nextPos; + return ret; + } + function resetLastChars() { + twoLastChars[0] = twoLastChars[1] = " "; + twoLastCharsPos = 0; + } + const TRACKING_SPACE_FACTOR = 0.1; + const NOT_A_SPACE_FACTOR = 0.03; + const NEGATIVE_SPACE_FACTOR = -0.2; + const SPACE_IN_FLOW_MIN_FACTOR = 0.1; + const SPACE_IN_FLOW_MAX_FACTOR = 0.6; + const self = this; + const xref = this.xref; + const showSpacedTextBuffer = []; + let xobjs = null; + const emptyXObjectCache = new _image_utils.LocalImageCache(); + const emptyGStateCache = new _image_utils.LocalGStateCache(); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + let textState; + function getCurrentTextTransform() { + const font = textState.font; + const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; + if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !(0, _util.isArrayEqual)(textState.fontMatrix, _util.FONT_IDENTITY_MATRIX)) { + const glyphHeight = font.bbox[3] - font.bbox[1]; + if (glyphHeight > 0) { + tsm[3] *= glyphHeight * textState.fontMatrix[3]; + } + } + return _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm)); + } + function ensureTextContentItem() { + if (textContentItem.initialized) { + return textContentItem; + } + const { + font, + loadedName + } = textState; + if (!seenStyles.has(loadedName)) { + seenStyles.add(loadedName); + textContent.styles[loadedName] = { + fontFamily: font.fallbackName, + ascent: font.ascent, + descent: font.descent, + vertical: font.vertical + }; + } + textContentItem.fontName = loadedName; + const trm = textContentItem.transform = getCurrentTextTransform(); + if (!font.vertical) { + textContentItem.width = textContentItem.totalWidth = 0; + textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]); + textContentItem.vertical = false; + } else { + textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]); + textContentItem.height = textContentItem.totalHeight = 0; + textContentItem.vertical = true; + } + const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; + textContentItem.trackingSpaceMin = textState.fontSize * TRACKING_SPACE_FACTOR; + textContentItem.notASpace = textState.fontSize * NOT_A_SPACE_FACTOR; + textContentItem.negativeSpaceMax = textState.fontSize * NEGATIVE_SPACE_FACTOR; + textContentItem.spaceInFlowMin = textState.fontSize * SPACE_IN_FLOW_MIN_FACTOR; + textContentItem.spaceInFlowMax = textState.fontSize * SPACE_IN_FLOW_MAX_FACTOR; + textContentItem.hasEOL = false; + textContentItem.initialized = true; + return textContentItem; + } + function updateAdvanceScale() { + if (!textContentItem.initialized) { + return; + } + const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + const scaleFactor = scaleCtmX * scaleLineX; + if (scaleFactor === textContentItem.textAdvanceScale) { + return; + } + if (!textContentItem.vertical) { + textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; + textContentItem.width = 0; + } else { + textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; + textContentItem.height = 0; + } + textContentItem.textAdvanceScale = scaleFactor; + } + function runBidiTransform(textChunk) { + const text = textChunk.str.join(""); + const bidiResult = (0, _bidi.bidi)(text, -1, textChunk.vertical); + return { + str: bidiResult.str, + dir: bidiResult.dir, + width: Math.abs(textChunk.totalWidth), + height: Math.abs(textChunk.totalHeight), + transform: textChunk.transform, + fontName: textChunk.fontName, + hasEOL: textChunk.hasEOL + }; + } + function handleSetFont(fontName, fontRef) { + return self.loadFont(fontName, fontRef, resources).then(function (translated) { + if (!translated.font.isType3Font) { + return translated; + } + return translated.loadType3Data(self, resources, task).catch(function () {}).then(function () { + return translated; + }); + }).then(function (translated) { + textState.loadedName = translated.loadedName; + textState.font = translated.font; + textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX; + }); + } + function applyInverseRotation(x, y, matrix) { + const scale = Math.hypot(matrix[0], matrix[1]); + return [(matrix[0] * x + matrix[1] * y) / scale, (matrix[2] * x + matrix[3] * y) / scale]; + } + function compareWithLastPosition() { + const currentTransform = getCurrentTextTransform(); + let posX = currentTransform[4]; + let posY = currentTransform[5]; + const shiftedX = posX - viewBox[0]; + const shiftedY = posY - viewBox[1]; + if (shiftedX < 0 || shiftedX > viewBox[2] || shiftedY < 0 || shiftedY > viewBox[3]) { + return false; + } + if (!combineTextItems || !textState.font || !textContentItem.prevTransform) { + return true; + } + let lastPosX = textContentItem.prevTransform[4]; + let lastPosY = textContentItem.prevTransform[5]; + if (lastPosX === posX && lastPosY === posY) { + return true; + } + let rotate = -1; + if (currentTransform[0] && currentTransform[1] === 0 && currentTransform[2] === 0) { + rotate = currentTransform[0] > 0 ? 0 : 180; + } else if (currentTransform[1] && currentTransform[0] === 0 && currentTransform[3] === 0) { + rotate = currentTransform[1] > 0 ? 90 : 270; + } + switch (rotate) { + case 0: + break; + case 90: + [posX, posY] = [posY, posX]; + [lastPosX, lastPosY] = [lastPosY, lastPosX]; + break; + case 180: + [posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY]; + break; + case 270: + [posX, posY] = [-posY, -posX]; + [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; + break; + default: + [posX, posY] = applyInverseRotation(posX, posY, currentTransform); + [lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform); + } + if (textState.font.vertical) { + const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; + const advanceX = posX - lastPosX; + const textOrientation = Math.sign(textContentItem.height); + if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceX) > 0.5 * textContentItem.width) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + if (Math.abs(advanceX) > textContentItem.width) { + appendEOL(); + return true; + } + if (advanceY <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { + textContentItem.height += advanceY; + } else if (!addFakeSpaces(advanceY, textContentItem.prevTransform, textOrientation)) { + if (textContentItem.str.length === 0) { + resetLastChars(); + textContent.items.push({ + str: " ", + dir: "ltr", + width: 0, + height: Math.abs(advanceY), + transform: textContentItem.prevTransform, + fontName: textContentItem.fontName, + hasEOL: false + }); + } else { + textContentItem.height += advanceY; + } + } + return true; + } + const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; + const advanceY = posY - lastPosY; + const textOrientation = Math.sign(textContentItem.width); + if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceY) > 0.5 * textContentItem.height) { + appendEOL(); + return true; + } + resetLastChars(); + flushTextContentItem(); + return true; + } + if (Math.abs(advanceY) > textContentItem.height) { + appendEOL(); + return true; + } + if (advanceX <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { + textContentItem.width += advanceX; + } else if (!addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)) { + if (textContentItem.str.length === 0) { + resetLastChars(); + textContent.items.push({ + str: " ", + dir: "ltr", + width: Math.abs(advanceX), + height: 0, + transform: textContentItem.prevTransform, + fontName: textContentItem.fontName, + hasEOL: false + }); + } else { + textContentItem.width += advanceX; + } + } + return true; + } + function buildTextContentItem(_ref8) { + let { + chars, + extraSpacing + } = _ref8; + const font = textState.font; + if (!chars) { + const charSpacing = textState.charSpacing + extraSpacing; + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + return; + } + const glyphs = font.charsToGlyphs(chars); + const scale = textState.fontMatrix[0] * textState.fontSize; + for (let i = 0, ii = glyphs.length; i < ii; i++) { + const glyph = glyphs[i]; + const { + category + } = glyph; + if (category.isInvisibleFormatMark) { + continue; + } + let charSpacing = textState.charSpacing + (i + 1 === ii ? extraSpacing : 0); + let glyphWidth = glyph.width; + if (font.vertical) { + glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth; + } + let scaledDim = glyphWidth * scale; + if (category.isWhitespace) { + if (!font.vertical) { + charSpacing += scaledDim + textState.wordSpacing; + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + charSpacing += -scaledDim + textState.wordSpacing; + textState.translateTextMatrix(0, -charSpacing); + } + saveLastChar(" "); + continue; + } + if (!compareWithLastPosition()) { + continue; + } + const textChunk = ensureTextContentItem(); + if (category.isZeroWidthDiacritic) { + scaledDim = 0; + } + if (!font.vertical) { + scaledDim *= textState.textHScale; + textState.translateTextMatrix(scaledDim, 0); + textChunk.width += scaledDim; + } else { + textState.translateTextMatrix(0, scaledDim); + scaledDim = Math.abs(scaledDim); + textChunk.height += scaledDim; + } + if (scaledDim) { + textChunk.prevTransform = getCurrentTextTransform(); + } + const glyphUnicode = glyph.normalizedUnicode; + if (saveLastChar(glyphUnicode)) { + textChunk.str.push(" "); + } + textChunk.str.push(glyphUnicode); + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix(charSpacing * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + } + } + function appendEOL() { + resetLastChars(); + if (textContentItem.initialized) { + textContentItem.hasEOL = true; + flushTextContentItem(); + } else { + textContent.items.push({ + str: "", + dir: "ltr", + width: 0, + height: 0, + transform: getCurrentTextTransform(), + fontName: textState.loadedName, + hasEOL: true + }); + } + } + function addFakeSpaces(width, transf, textOrientation) { + if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) { + if (textContentItem.initialized) { + resetLastChars(); + textContentItem.str.push(" "); + } + return false; + } + const fontName = textContentItem.fontName; + let height = 0; + if (textContentItem.vertical) { + height = width; + width = 0; + } + flushTextContentItem(); + resetLastChars(); + textContent.items.push({ + str: " ", + dir: "ltr", + width: Math.abs(width), + height: Math.abs(height), + transform: transf || getCurrentTextTransform(), + fontName, + hasEOL: false + }); + return true; + } + function flushTextContentItem() { + if (!textContentItem.initialized || !textContentItem.str) { + return; + } + if (!textContentItem.vertical) { + textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; + } else { + textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; + } + textContent.items.push(runBidiTransform(textContentItem)); + textContentItem.initialized = false; + textContentItem.str.length = 0; + } + function enqueueChunk() { + let batch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const length = textContent.items.length; + if (length === 0) { + return; + } + if (batch && length < TEXT_CHUNK_BATCH_SIZE) { + return; + } + sink.enqueue(textContent, length); + textContent.items = []; + textContent.styles = Object.create(null); + } + const timeSlotManager = new TimeSlotManager(); + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + enqueueChunk(true); + Promise.all([promise, sink.ready]).then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, + args = []; + while (!(stop = timeSlotManager.check())) { + args.length = 0; + operation.args = args; + if (!preprocessor.read(operation)) { + break; + } + textState = stateManager.state; + const fn = operation.fn; + args = operation.args; + switch (fn | 0) { + case _util.OPS.setFont: + var fontNameArg = args[0].name, + fontSizeArg = args[1]; + if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { + break; + } + flushTextContentItem(); + textState.fontName = fontNameArg; + textState.fontSize = fontSizeArg; + next(handleSetFont(fontNameArg, null)); + return; + case _util.OPS.setTextRise: + textState.textRise = args[0]; + break; + case _util.OPS.setHScale: + textState.textHScale = args[0] / 100; + break; + case _util.OPS.setLeading: + textState.leading = args[0]; + break; + case _util.OPS.moveText: + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case _util.OPS.setLeadingMoveText: + textState.leading = -args[1]; + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case _util.OPS.nextLine: + textState.carriageReturn(); + break; + case _util.OPS.setTextMatrix: + textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + updateAdvanceScale(); + break; + case _util.OPS.setCharSpacing: + textState.charSpacing = args[0]; + break; + case _util.OPS.setWordSpacing: + textState.wordSpacing = args[0]; + break; + case _util.OPS.beginText: + textState.textMatrix = _util.IDENTITY_MATRIX.slice(); + textState.textLineMatrix = _util.IDENTITY_MATRIX.slice(); + break; + case _util.OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000; + const elements = args[0]; + for (let i = 0, ii = elements.length; i < ii - 1; i++) { + const item = elements[i]; + if (typeof item === "string") { + showSpacedTextBuffer.push(item); + } else if (typeof item === "number" && item !== 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: item * spaceFactor + }); + } + } + const item = elements.at(-1); + if (typeof item === "string") { + showSpacedTextBuffer.push(item); + } + if (showSpacedTextBuffer.length > 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: 0 + }); + } + break; + case _util.OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case _util.OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.carriageReturn(); + buildTextContentItem({ + chars: args[0], + extraSpacing: 0 + }); + break; + case _util.OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + textState.wordSpacing = args[0]; + textState.charSpacing = args[1]; + textState.carriageReturn(); + buildTextContentItem({ + chars: args[2], + extraSpacing: 0 + }); + break; + case _util.OPS.paintXObject: + flushTextContentItem(); + if (!xobjs) { + xobjs = resources.get("XObject") || _primitives.Dict.empty; + } + var isValidName = args[0] instanceof _primitives.Name; + var name = args[0].name; + if (isValidName && emptyXObjectCache.getByName(name)) { + break; + } + next(new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { + throw new _util.FormatError("XObject must be referred to by name."); + } + let xobj = xobjs.getRaw(name); + if (xobj instanceof _primitives.Ref) { + if (emptyXObjectCache.getByRef(xobj)) { + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); + if (globalImage) { + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof _base_stream.BaseStream)) { + throw new _util.FormatError("XObject should be a stream"); + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof _primitives.Name)) { + throw new _util.FormatError("XObject should have a Name subtype"); + } + if (type.name !== "Form") { + emptyXObjectCache.set(name, xobj.dict.objId, true); + resolveXObject(); + return; + } + const currentState = stateManager.state.clone(); + const xObjStateManager = new StateManager(currentState); + const matrix = xobj.dict.getArray("Matrix"); + if (Array.isArray(matrix) && matrix.length === 6) { + xObjStateManager.transform(matrix); + } + enqueueChunk(); + const sinkWrapper = { + enqueueInvoked: false, + enqueue(chunk, size) { + this.enqueueInvoked = true; + sink.enqueue(chunk, size); + }, + get desiredSize() { + return sink.desiredSize; + }, + get ready() { + return sink.ready; + } + }; + self.getTextContent({ + stream: xobj, + task, + resources: xobj.dict.get("Resources") || resources, + stateManager: xObjStateManager, + combineTextItems, + includeMarkedContent, + sink: sinkWrapper, + seenStyles, + viewBox, + markedContentData + }).then(function () { + if (!sinkWrapper.enqueueInvoked) { + emptyXObjectCache.set(name, xobj.dict.objId, true); + } + resolveXObject(); + }, rejectXObject); + }).catch(function (reason) { + if (reason instanceof _util.AbortException) { + return; + } + if (self.options.ignoreErrors) { + (0, _util.warn)(`getTextContent - ignoring XObject: "${reason}".`); + return; + } + throw reason; + })); + return; + case _util.OPS.setGState: + isValidName = args[0] instanceof _primitives.Name; + name = args[0].name; + if (isValidName && emptyGStateCache.getByName(name)) { + break; + } + next(new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { + throw new _util.FormatError("GState must be referred to by name."); + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof _primitives.Dict)) { + throw new _util.FormatError("ExtGState should be a dictionary."); + } + const gState = extGState.get(name); + if (!(gState instanceof _primitives.Dict)) { + throw new _util.FormatError("GState should be a dictionary."); + } + const gStateFont = gState.get("Font"); + if (!gStateFont) { + emptyGStateCache.set(name, gState.objId, true); + resolveGState(); + return; + } + flushTextContentItem(); + textState.fontName = null; + textState.fontSize = gStateFont[1]; + handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState); + }).catch(function (reason) { + if (reason instanceof _util.AbortException) { + return; + } + if (self.options.ignoreErrors) { + (0, _util.warn)(`getTextContent - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + })); + return; + case _util.OPS.beginMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentData.level++; + textContent.items.push({ + type: "beginMarkedContent", + tag: args[0] instanceof _primitives.Name ? args[0].name : null + }); + } + break; + case _util.OPS.beginMarkedContentProps: + flushTextContentItem(); + if (includeMarkedContent) { + markedContentData.level++; + let mcid = null; + if (args[1] instanceof _primitives.Dict) { + mcid = args[1].get("MCID"); + } + textContent.items.push({ + type: "beginMarkedContentProps", + id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mcid${mcid}` : null, + tag: args[0] instanceof _primitives.Name ? args[0].name : null + }); + } + break; + case _util.OPS.endMarkedContent: + flushTextContentItem(); + if (includeMarkedContent) { + if (markedContentData.level === 0) { + break; + } + markedContentData.level--; + textContent.items.push({ + type: "endMarkedContent" + }); + } + break; + } + if (textContent.items.length >= sink.desiredSize) { + stop = true; + break; + } + } + if (stop) { + next(deferred); + return; + } + flushTextContentItem(); + enqueueChunk(); + resolve(); + }).catch(reason => { + if (reason instanceof _util.AbortException) { + return; + } + if (this.options.ignoreErrors) { + (0, _util.warn)(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`); + flushTextContentItem(); + enqueueChunk(); + return; + } + throw reason; + }); + } + extractDataStructures(dict, baseDict, properties) { + const xref = this.xref; + let cidToGidBytes; + const toUnicodePromise = this.readToUnicode(properties.toUnicode || dict.get("ToUnicode") || baseDict.get("ToUnicode")); + if (properties.composite) { + const cidSystemInfo = dict.get("CIDSystemInfo"); + if (cidSystemInfo instanceof _primitives.Dict) { + properties.cidSystemInfo = { + registry: (0, _util.stringToPDFString)(cidSystemInfo.get("Registry")), + ordering: (0, _util.stringToPDFString)(cidSystemInfo.get("Ordering")), + supplement: cidSystemInfo.get("Supplement") + }; + } + try { + const cidToGidMap = dict.get("CIDToGIDMap"); + if (cidToGidMap instanceof _base_stream.BaseStream) { + cidToGidBytes = cidToGidMap.getBytes(); + } + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + (0, _util.warn)(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`); + } + } + const differences = []; + let baseEncodingName = null; + let encoding; + if (dict.has("Encoding")) { + encoding = dict.get("Encoding"); + if (encoding instanceof _primitives.Dict) { + baseEncodingName = encoding.get("BaseEncoding"); + baseEncodingName = baseEncodingName instanceof _primitives.Name ? baseEncodingName.name : null; + if (encoding.has("Differences")) { + const diffEncoding = encoding.get("Differences"); + let index = 0; + for (const entry of diffEncoding) { + const data = xref.fetchIfRef(entry); + if (typeof data === "number") { + index = data; + } else if (data instanceof _primitives.Name) { + differences[index++] = data.name; + } else { + throw new _util.FormatError(`Invalid entry in 'Differences' array: ${data}`); + } + } + } + } else if (encoding instanceof _primitives.Name) { + baseEncodingName = encoding.name; + } else { + const msg = "Encoding is not a Name nor a Dict"; + if (!this.options.ignoreErrors) { + throw new _util.FormatError(msg); + } + (0, _util.warn)(msg); + } + if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") { + baseEncodingName = null; + } + } + if (baseEncodingName) { + properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName); + } else { + const isSymbolicFont = !!(properties.flags & _fonts_utils.FontFlags.Symbolic); + const isNonsymbolicFont = !!(properties.flags & _fonts_utils.FontFlags.Nonsymbolic); + encoding = _encodings.StandardEncoding; + if (properties.type === "TrueType" && !isNonsymbolicFont) { + encoding = _encodings.WinAnsiEncoding; + } + if (isSymbolicFont) { + encoding = _encodings.MacRomanEncoding; + if (!properties.file || properties.isInternalFont) { + if (/Symbol/i.test(properties.name)) { + encoding = _encodings.SymbolSetEncoding; + } else if (/Dingbats|Wingdings/i.test(properties.name)) { + encoding = _encodings.ZapfDingbatsEncoding; + } + } + } + properties.defaultEncoding = encoding; + } + properties.differences = differences; + properties.baseEncodingName = baseEncodingName; + properties.hasEncoding = !!baseEncodingName || differences.length > 0; + properties.dict = dict; + return toUnicodePromise.then(readToUnicode => { + properties.toUnicode = readToUnicode; + return this.buildToUnicode(properties); + }).then(builtToUnicode => { + properties.toUnicode = builtToUnicode; + if (cidToGidBytes) { + properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode); + } + return properties; + }); + } + _simpleFontToUnicode(properties) { + let forceGlyphs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + (0, _util.assert)(!properties.composite, "Must be a simple font."); + const toUnicode = []; + const encoding = properties.defaultEncoding.slice(); + const baseEncodingName = properties.baseEncodingName; + const differences = properties.differences; + for (const charcode in differences) { + const glyphName = differences[charcode]; + if (glyphName === ".notdef") { + continue; + } + encoding[charcode] = glyphName; + } + const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)(); + for (const charcode in encoding) { + let glyphName = encoding[charcode]; + if (glyphName === "") { + continue; + } + let unicode = glyphsUnicodeMap[glyphName]; + if (unicode !== undefined) { + toUnicode[charcode] = String.fromCharCode(unicode); + continue; + } + let code = 0; + switch (glyphName[0]) { + case "G": + if (glyphName.length === 3) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "g": + if (glyphName.length === 5) { + code = parseInt(glyphName.substring(1), 16); + } + break; + case "C": + case "c": + if (glyphName.length >= 3 && glyphName.length <= 4) { + const codeStr = glyphName.substring(1); + if (forceGlyphs) { + code = parseInt(codeStr, 16); + break; + } + code = +codeStr; + if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) { + return this._simpleFontToUnicode(properties, true); + } + } + break; + case "u": + unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + code = unicode; + } + break; + } + if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { + if (baseEncodingName && code === +charcode) { + const baseEncoding = (0, _encodings.getEncoding)(baseEncodingName); + if (baseEncoding && (glyphName = baseEncoding[charcode])) { + toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); + continue; + } + } + toUnicode[charcode] = String.fromCodePoint(code); + } + } + return toUnicode; + } + async buildToUnicode(properties) { + properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0; + if (properties.hasIncludedToUnicodeMap) { + if (!properties.composite && properties.hasEncoding) { + properties.fallbackToUnicode = this._simpleFontToUnicode(properties); + } + return properties.toUnicode; + } + if (!properties.composite) { + return new _to_unicode_map.ToUnicodeMap(this._simpleFontToUnicode(properties)); + } + if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof _cmap.IdentityCMap) || properties.cidSystemInfo.registry === "Adobe" && (properties.cidSystemInfo.ordering === "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" || properties.cidSystemInfo.ordering === "Korea1"))) { + const { + registry, + ordering + } = properties.cidSystemInfo; + const ucs2CMapName = _primitives.Name.get(`${registry}-${ordering}-UCS2`); + const ucs2CMap = await _cmap.CMapFactory.create({ + encoding: ucs2CMapName, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + const toUnicode = []; + properties.cMap.forEach(function (charcode, cid) { + if (cid > 0xffff) { + throw new _util.FormatError("Max size of CID is 65,535"); + } + const ucs2 = ucs2CMap.lookup(cid); + if (ucs2) { + toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1)); + } + }); + return new _to_unicode_map.ToUnicodeMap(toUnicode); + } + return new _to_unicode_map.IdentityToUnicodeMap(properties.firstChar, properties.lastChar); + } + readToUnicode(cmapObj) { + if (!cmapObj) { + return Promise.resolve(null); + } + if (cmapObj instanceof _primitives.Name) { + return _cmap.CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }).then(function (cmap) { + if (cmap instanceof _cmap.IdentityCMap) { + return new _to_unicode_map.IdentityToUnicodeMap(0, 0xffff); + } + return new _to_unicode_map.ToUnicodeMap(cmap.getMap()); + }); + } else if (cmapObj instanceof _base_stream.BaseStream) { + return _cmap.CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }).then(function (cmap) { + if (cmap instanceof _cmap.IdentityCMap) { + return new _to_unicode_map.IdentityToUnicodeMap(0, 0xffff); + } + const map = new Array(cmap.length); + cmap.forEach(function (charCode, token) { + if (typeof token === "number") { + map[charCode] = String.fromCodePoint(token); + return; + } + const str = []; + for (let k = 0; k < token.length; k += 2) { + const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + if ((w1 & 0xf800) !== 0xd800) { + str.push(w1); + continue; + } + k += 2; + const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); + } + map[charCode] = String.fromCodePoint(...str); + }); + return new _to_unicode_map.ToUnicodeMap(map); + }, reason => { + if (reason instanceof _util.AbortException) { + return null; + } + if (this.options.ignoreErrors) { + this.handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorFontToUnicode + }); + (0, _util.warn)(`readToUnicode - ignoring ToUnicode data: "${reason}".`); + return null; + } + throw reason; + }); + } + return Promise.resolve(null); + } + readCidToGidMap(glyphsData, toUnicode) { + const result = []; + for (let j = 0, jj = glyphsData.length; j < jj; j++) { + const glyphID = glyphsData[j++] << 8 | glyphsData[j]; + const code = j >> 1; + if (glyphID === 0 && !toUnicode.has(code)) { + continue; + } + result[code] = glyphID; + } + return result; + } + extractWidths(dict, descriptor, properties) { + const xref = this.xref; + let glyphsWidths = []; + let defaultWidth = 0; + const glyphsVMetrics = []; + let defaultVMetrics; + let i, ii, j, jj, start, code, widths; + if (properties.composite) { + defaultWidth = dict.has("DW") ? dict.get("DW") : 1000; + widths = dict.get("W"); + if (widths) { + for (i = 0, ii = widths.length; i < ii; i++) { + start = xref.fetchIfRef(widths[i++]); + code = xref.fetchIfRef(widths[i]); + if (Array.isArray(code)) { + for (j = 0, jj = code.length; j < jj; j++) { + glyphsWidths[start++] = xref.fetchIfRef(code[j]); + } + } else { + const width = xref.fetchIfRef(widths[++i]); + for (j = start; j <= code; j++) { + glyphsWidths[j] = width; + } + } + } + } + if (properties.vertical) { + let vmetrics = dict.getArray("DW2") || [880, -1000]; + defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; + vmetrics = dict.get("W2"); + if (vmetrics) { + for (i = 0, ii = vmetrics.length; i < ii; i++) { + start = xref.fetchIfRef(vmetrics[i++]); + code = xref.fetchIfRef(vmetrics[i]); + if (Array.isArray(code)) { + for (j = 0, jj = code.length; j < jj; j++) { + glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])]; + } + } else { + const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])]; + for (j = start; j <= code; j++) { + glyphsVMetrics[j] = vmetric; + } + } + } + } + } + } else { + const firstChar = properties.firstChar; + widths = dict.get("Widths"); + if (widths) { + j = firstChar; + for (i = 0, ii = widths.length; i < ii; i++) { + glyphsWidths[j++] = xref.fetchIfRef(widths[i]); + } + defaultWidth = parseFloat(descriptor.get("MissingWidth")) || 0; + } else { + const baseFontName = dict.get("BaseFont"); + if (baseFontName instanceof _primitives.Name) { + const metrics = this.getBaseFontMetrics(baseFontName.name); + glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); + defaultWidth = metrics.defaultWidth; + } + } + } + let isMonospace = true; + let firstWidth = defaultWidth; + for (const glyph in glyphsWidths) { + const glyphWidth = glyphsWidths[glyph]; + if (!glyphWidth) { + continue; + } + if (!firstWidth) { + firstWidth = glyphWidth; + continue; + } + if (firstWidth !== glyphWidth) { + isMonospace = false; + break; + } + } + if (isMonospace) { + properties.flags |= _fonts_utils.FontFlags.FixedPitch; + } + properties.defaultWidth = defaultWidth; + properties.widths = glyphsWidths; + properties.defaultVMetrics = defaultVMetrics; + properties.vmetrics = glyphsVMetrics; + } + isSerifFont(baseFontName) { + const fontNameWoStyle = baseFontName.split("-")[0]; + return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || /serif/gi.test(fontNameWoStyle); + } + getBaseFontMetrics(name) { + let defaultWidth = 0; + let widths = Object.create(null); + let monospace = false; + const stdFontMap = (0, _standard_fonts.getStdFontMap)(); + let lookupName = stdFontMap[name] || name; + const Metrics = (0, _metrics.getMetrics)(); + if (!(lookupName in Metrics)) { + if (this.isSerifFont(name)) { + lookupName = "Times-Roman"; + } else { + lookupName = "Helvetica"; + } + } + const glyphWidths = Metrics[lookupName]; + if (typeof glyphWidths === "number") { + defaultWidth = glyphWidths; + monospace = true; + } else { + widths = glyphWidths(); + } + return { + defaultWidth, + monospace, + widths + }; + } + buildCharCodeToWidth(widthsByGlyphName, properties) { + const widths = Object.create(null); + const differences = properties.differences; + const encoding = properties.defaultEncoding; + for (let charCode = 0; charCode < 256; charCode++) { + if (charCode in differences && widthsByGlyphName[differences[charCode]]) { + widths[charCode] = widthsByGlyphName[differences[charCode]]; + continue; + } + if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { + widths[charCode] = widthsByGlyphName[encoding[charCode]]; + continue; + } + } + return widths; + } + preEvaluateFont(dict) { + const baseDict = dict; + let type = dict.get("Subtype"); + if (!(type instanceof _primitives.Name)) { + throw new _util.FormatError("invalid font Subtype"); + } + let composite = false; + let hash, toUnicode; + if (type.name === "Type0") { + const df = dict.get("DescendantFonts"); + if (!df) { + throw new _util.FormatError("Descendant fonts are not specified"); + } + dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df; + if (!(dict instanceof _primitives.Dict)) { + throw new _util.FormatError("Descendant font is not a dictionary."); + } + type = dict.get("Subtype"); + if (!(type instanceof _primitives.Name)) { + throw new _util.FormatError("invalid font Subtype"); + } + composite = true; + } + const firstChar = dict.get("FirstChar") || 0, + lastChar = dict.get("LastChar") || (composite ? 0xffff : 0xff); + const descriptor = dict.get("FontDescriptor"); + if (descriptor) { + hash = new _murmurhash.MurmurHash3_64(); + const encoding = baseDict.getRaw("Encoding"); + if (encoding instanceof _primitives.Name) { + hash.update(encoding.name); + } else if (encoding instanceof _primitives.Ref) { + hash.update(encoding.toString()); + } else if (encoding instanceof _primitives.Dict) { + for (const entry of encoding.getRawValues()) { + if (entry instanceof _primitives.Name) { + hash.update(entry.name); + } else if (entry instanceof _primitives.Ref) { + hash.update(entry.toString()); + } else if (Array.isArray(entry)) { + const diffLength = entry.length, + diffBuf = new Array(diffLength); + for (let j = 0; j < diffLength; j++) { + const diffEntry = entry[j]; + if (diffEntry instanceof _primitives.Name) { + diffBuf[j] = diffEntry.name; + } else if (typeof diffEntry === "number" || diffEntry instanceof _primitives.Ref) { + diffBuf[j] = diffEntry.toString(); + } + } + hash.update(diffBuf.join()); + } + } + } + hash.update(`${firstChar}-${lastChar}`); + toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode"); + if (toUnicode instanceof _base_stream.BaseStream) { + const stream = toUnicode.str || toUnicode; + const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); + hash.update(uint8array); + } else if (toUnicode instanceof _primitives.Name) { + hash.update(toUnicode.name); + } + const widths = dict.get("Widths") || baseDict.get("Widths"); + if (Array.isArray(widths)) { + const widthsBuf = []; + for (const entry of widths) { + if (typeof entry === "number" || entry instanceof _primitives.Ref) { + widthsBuf.push(entry.toString()); + } + } + hash.update(widthsBuf.join()); + } + if (composite) { + hash.update("compositeFont"); + const compositeWidths = dict.get("W") || baseDict.get("W"); + if (Array.isArray(compositeWidths)) { + const widthsBuf = []; + for (const entry of compositeWidths) { + if (typeof entry === "number" || entry instanceof _primitives.Ref) { + widthsBuf.push(entry.toString()); + } else if (Array.isArray(entry)) { + const subWidthsBuf = []; + for (const element of entry) { + if (typeof element === "number" || element instanceof _primitives.Ref) { + subWidthsBuf.push(element.toString()); + } + } + widthsBuf.push(`[${subWidthsBuf.join()}]`); + } + } + hash.update(widthsBuf.join()); + } + const cidToGidMap = dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap"); + if (cidToGidMap instanceof _primitives.Name) { + hash.update(cidToGidMap.name); + } else if (cidToGidMap instanceof _primitives.Ref) { + hash.update(cidToGidMap.toString()); + } else if (cidToGidMap instanceof _base_stream.BaseStream) { + hash.update(cidToGidMap.peekBytes()); + } + } + } + return { + descriptor, + dict, + baseDict, + composite, + type: type.name, + firstChar, + lastChar, + toUnicode, + hash: hash ? hash.hexdigest() : "" + }; + } + async translateFont(_ref9) { + let { + descriptor, + dict, + baseDict, + composite, + type, + firstChar, + lastChar, + toUnicode, + cssFontInfo + } = _ref9; + const isType3Font = type === "Type3"; + let properties; + if (!descriptor) { + if (isType3Font) { + descriptor = new _primitives.Dict(null); + descriptor.set("FontName", _primitives.Name.get(type)); + descriptor.set("FontBBox", dict.getArray("FontBBox") || [0, 0, 0, 0]); + } else { + let baseFontName = dict.get("BaseFont"); + if (!(baseFontName instanceof _primitives.Name)) { + throw new _util.FormatError("Base font is not specified"); + } + baseFontName = baseFontName.name.replace(/[,_]/g, "-"); + const metrics = this.getBaseFontMetrics(baseFontName); + const fontNameWoStyle = baseFontName.split("-")[0]; + const flags = (this.isSerifFont(fontNameWoStyle) ? _fonts_utils.FontFlags.Serif : 0) | (metrics.monospace ? _fonts_utils.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts_utils.FontFlags.Symbolic : _fonts_utils.FontFlags.Nonsymbolic); + properties = { + type, + name: baseFontName, + loadedName: baseDict.loadedName, + widths: metrics.widths, + defaultWidth: metrics.defaultWidth, + isSimulatedFlags: true, + flags, + firstChar, + lastChar, + toUnicode, + xHeight: 0, + capHeight: 0, + italicAngle: 0, + isType3Font + }; + const widths = dict.get("Widths"); + const standardFontName = (0, _standard_fonts.getStandardFontName)(baseFontName); + let file = null; + if (standardFontName) { + properties.isStandardFont = true; + file = await this.fetchStandardFontData(standardFontName); + properties.isInternalFont = !!file; + } + return this.extractDataStructures(dict, dict, properties).then(newProperties => { + if (widths) { + const glyphWidths = []; + let j = firstChar; + for (const width of widths) { + glyphWidths[j++] = this.xref.fetchIfRef(width); + } + newProperties.widths = glyphWidths; + } else { + newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties); + } + return new _fonts.Font(baseFontName, file, newProperties); + }); + } + } + let fontName = descriptor.get("FontName"); + let baseFont = dict.get("BaseFont"); + if (typeof fontName === "string") { + fontName = _primitives.Name.get(fontName); + } + if (typeof baseFont === "string") { + baseFont = _primitives.Name.get(baseFont); + } + if (!isType3Font) { + const fontNameStr = fontName && fontName.name; + const baseFontStr = baseFont && baseFont.name; + if (fontNameStr !== baseFontStr) { + (0, _util.info)(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`); + if (fontNameStr && baseFontStr && baseFontStr.startsWith(fontNameStr)) { + fontName = baseFont; + } + } + } + fontName = fontName || baseFont; + if (!(fontName instanceof _primitives.Name)) { + throw new _util.FormatError("invalid font name"); + } + let fontFile, subtype, length1, length2, length3; + try { + fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3"); + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + (0, _util.warn)(`translateFont - fetching "${fontName.name}" font file: "${ex}".`); + fontFile = new _stream.NullStream(); + } + let isStandardFont = false; + let isInternalFont = false; + let glyphScaleFactors = null; + if (fontFile) { + if (fontFile.dict) { + const subtypeEntry = fontFile.dict.get("Subtype"); + if (subtypeEntry instanceof _primitives.Name) { + subtype = subtypeEntry.name; + } + length1 = fontFile.dict.get("Length1"); + length2 = fontFile.dict.get("Length2"); + length3 = fontFile.dict.get("Length3"); + } + } else if (cssFontInfo) { + const standardFontName = (0, _xfa_fonts.getXfaFontName)(fontName.name); + if (standardFontName) { + cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`; + cssFontInfo.metrics = standardFontName.metrics || null; + glyphScaleFactors = standardFontName.factors || null; + fontFile = await this.fetchStandardFontData(standardFontName.name); + isInternalFont = !!fontFile; + baseDict = dict = (0, _xfa_fonts.getXfaFontDict)(fontName.name); + composite = true; + } + } else if (!isType3Font) { + const standardFontName = (0, _standard_fonts.getStandardFontName)(fontName.name); + if (standardFontName) { + isStandardFont = true; + fontFile = await this.fetchStandardFontData(standardFontName); + isInternalFont = !!fontFile; + } + } + properties = { + type, + name: fontName.name, + subtype, + file: fontFile, + length1, + length2, + length3, + isStandardFont, + isInternalFont, + loadedName: baseDict.loadedName, + composite, + fixedPitch: false, + fontMatrix: dict.getArray("FontMatrix") || _util.FONT_IDENTITY_MATRIX, + firstChar, + lastChar, + toUnicode, + bbox: descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), + ascent: descriptor.get("Ascent"), + descent: descriptor.get("Descent"), + xHeight: descriptor.get("XHeight") || 0, + capHeight: descriptor.get("CapHeight") || 0, + flags: descriptor.get("Flags"), + italicAngle: descriptor.get("ItalicAngle") || 0, + isType3Font, + cssFontInfo, + scaleFactors: glyphScaleFactors + }; + if (composite) { + const cidEncoding = baseDict.get("Encoding"); + if (cidEncoding instanceof _primitives.Name) { + properties.cidEncoding = cidEncoding.name; + } + const cMap = await _cmap.CMapFactory.create({ + encoding: cidEncoding, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + } + return this.extractDataStructures(dict, baseDict, properties).then(newProperties => { + this.extractWidths(dict, descriptor, newProperties); + return new _fonts.Font(fontName.name, fontFile, newProperties); + }); + } + static buildFontPaths(font, glyphs, handler, evaluatorOptions) { + function buildPath(fontChar) { + const glyphName = `${font.loadedName}_path_${fontChar}`; + try { + if (font.renderer.hasBuiltPath(fontChar)) { + return; + } + handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); + } catch (reason) { + if (evaluatorOptions.ignoreErrors) { + handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.errorFontBuildPath + }); + (0, _util.warn)(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); + return; + } + throw reason; + } + } + for (const glyph of glyphs) { + buildPath(glyph.fontChar); + const accent = glyph.accent; + if (accent && accent.fontChar) { + buildPath(accent.fontChar); + } + } + } + static get fallbackFontDict() { + const dict = new _primitives.Dict(); + dict.set("BaseFont", _primitives.Name.get("PDFJS-FallbackFont")); + dict.set("Type", _primitives.Name.get("FallbackType")); + dict.set("Subtype", _primitives.Name.get("FallbackType")); + dict.set("Encoding", _primitives.Name.get("WinAnsiEncoding")); + return (0, _util.shadow)(this, "fallbackFontDict", dict); + } +} +exports.PartialEvaluator = PartialEvaluator; +class TranslatedFont { + constructor(_ref10) { + let { + loadedName, + font, + dict, + evaluatorOptions + } = _ref10; + this.loadedName = loadedName; + this.font = font; + this.dict = dict; + this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions; + this.type3Loaded = null; + this.type3Dependencies = font.isType3Font ? new Set() : null; + this.sent = false; + } + send(handler) { + if (this.sent) { + return; + } + this.sent = true; + handler.send("commonobj", [this.loadedName, "Font", this.font.exportData(this._evaluatorOptions.fontExtraProperties)]); + } + fallback(handler) { + if (!this.font.data) { + return; + } + this.font.disableFontFace = true; + PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, this._evaluatorOptions); + } + loadType3Data(evaluator, resources, task) { + if (this.type3Loaded) { + return this.type3Loaded; + } + if (!this.font.isType3Font) { + throw new Error("Must be a Type3 font."); + } + const type3Evaluator = evaluator.clone({ + ignoreErrors: false + }); + type3Evaluator.parsingType3Font = true; + const type3FontRefs = new _primitives.RefSet(evaluator.type3FontRefs); + if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) { + type3FontRefs.put(this.dict.objId); + } + type3Evaluator.type3FontRefs = type3FontRefs; + const translatedFont = this.font, + type3Dependencies = this.type3Dependencies; + let loadCharProcsPromise = Promise.resolve(); + const charProcs = this.dict.get("CharProcs"); + const fontResources = this.dict.get("Resources") || resources; + const charProcOperatorList = Object.create(null); + const fontBBox = _util.Util.normalizeRect(translatedFont.bbox || [0, 0, 0, 0]), + width = fontBBox[2] - fontBBox[0], + height = fontBBox[3] - fontBBox[1]; + const fontBBoxSize = Math.hypot(width, height); + for (const key of charProcs.getKeys()) { + loadCharProcsPromise = loadCharProcsPromise.then(() => { + const glyphStream = charProcs.get(key); + const operatorList = new _operator_list.OperatorList(); + return type3Evaluator.getOperatorList({ + stream: glyphStream, + task, + resources: fontResources, + operatorList + }).then(() => { + if (operatorList.fnArray[0] === _util.OPS.setCharWidthAndBounds) { + this._removeType3ColorOperators(operatorList, fontBBoxSize); + } + charProcOperatorList[key] = operatorList.getIR(); + for (const dependency of operatorList.dependencies) { + type3Dependencies.add(dependency); + } + }).catch(function (reason) { + (0, _util.warn)(`Type3 font resource "${key}" is not available.`); + const dummyOperatorList = new _operator_list.OperatorList(); + charProcOperatorList[key] = dummyOperatorList.getIR(); + }); + }); + } + this.type3Loaded = loadCharProcsPromise.then(() => { + translatedFont.charProcOperatorList = charProcOperatorList; + if (this._bbox) { + translatedFont.isCharBBox = true; + translatedFont.bbox = this._bbox; + } + }); + return this.type3Loaded; + } + _removeType3ColorOperators(operatorList) { + let fontBBoxSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : NaN; + const charBBox = _util.Util.normalizeRect(operatorList.argsArray[0].slice(2)), + width = charBBox[2] - charBBox[0], + height = charBBox[3] - charBBox[1]; + const charBBoxSize = Math.hypot(width, height); + if (width === 0 || height === 0) { + operatorList.fnArray.splice(0, 1); + operatorList.argsArray.splice(0, 1); + } else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) { + if (!this._bbox) { + this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; + } + this._bbox[0] = Math.min(this._bbox[0], charBBox[0]); + this._bbox[1] = Math.min(this._bbox[1], charBBox[1]); + this._bbox[2] = Math.max(this._bbox[2], charBBox[2]); + this._bbox[3] = Math.max(this._bbox[3], charBBox[3]); + } + let i = 0, + ii = operatorList.length; + while (i < ii) { + switch (operatorList.fnArray[i]) { + case _util.OPS.setCharWidthAndBounds: + break; + case _util.OPS.setStrokeColorSpace: + case _util.OPS.setFillColorSpace: + case _util.OPS.setStrokeColor: + case _util.OPS.setStrokeColorN: + case _util.OPS.setFillColor: + case _util.OPS.setFillColorN: + case _util.OPS.setStrokeGray: + case _util.OPS.setFillGray: + case _util.OPS.setStrokeRGBColor: + case _util.OPS.setFillRGBColor: + case _util.OPS.setStrokeCMYKColor: + case _util.OPS.setFillCMYKColor: + case _util.OPS.shadingFill: + case _util.OPS.setRenderingIntent: + operatorList.fnArray.splice(i, 1); + operatorList.argsArray.splice(i, 1); + ii--; + continue; + case _util.OPS.setGState: + const [gStateObj] = operatorList.argsArray[i]; + let j = 0, + jj = gStateObj.length; + while (j < jj) { + const [gStateKey] = gStateObj[j]; + switch (gStateKey) { + case "TR": + case "TR2": + case "HT": + case "BG": + case "BG2": + case "UCR": + case "UCR2": + gStateObj.splice(j, 1); + jj--; + continue; + } + j++; + } + break; + } + i++; + } + } +} +class StateManager { + constructor() { + let initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new EvalState(); + this.state = initialState; + this.stateStack = []; + } + save() { + const old = this.state; + this.stateStack.push(this.state); + this.state = old.clone(); + } + restore() { + const prev = this.stateStack.pop(); + if (prev) { + this.state = prev; + } + } + transform(args) { + this.state.ctm = _util.Util.transform(this.state.ctm, args); + } +} +class TextState { + constructor() { + this.ctm = new Float32Array(_util.IDENTITY_MATRIX); + this.fontName = null; + this.fontSize = 0; + this.loadedName = null; + this.font = null; + this.fontMatrix = _util.FONT_IDENTITY_MATRIX; + this.textMatrix = _util.IDENTITY_MATRIX.slice(); + this.textLineMatrix = _util.IDENTITY_MATRIX.slice(); + this.charSpacing = 0; + this.wordSpacing = 0; + this.leading = 0; + this.textHScale = 1; + this.textRise = 0; + } + setTextMatrix(a, b, c, d, e, f) { + const m = this.textMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + } + setTextLineMatrix(a, b, c, d, e, f) { + const m = this.textLineMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + } + translateTextMatrix(x, y) { + const m = this.textMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + } + translateTextLineMatrix(x, y) { + const m = this.textLineMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + } + carriageReturn() { + this.translateTextLineMatrix(0, -this.leading); + this.textMatrix = this.textLineMatrix.slice(); + } + clone() { + const clone = Object.create(this); + clone.textMatrix = this.textMatrix.slice(); + clone.textLineMatrix = this.textLineMatrix.slice(); + clone.fontMatrix = this.fontMatrix.slice(); + return clone; + } +} +class EvalState { + constructor() { + this.ctm = new Float32Array(_util.IDENTITY_MATRIX); + this.font = null; + this.textRenderingMode = _util.TextRenderingMode.FILL; + this.fillColorSpace = _colorspace.ColorSpace.singletons.gray; + this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray; + } + clone() { + return Object.create(this); + } +} +class EvaluatorPreprocessor { + static get opMap() { + const getOPMap = (0, _core_utils.getLookupTableFactory)(function (t) { + t.w = { + id: _util.OPS.setLineWidth, + numArgs: 1, + variableArgs: false + }; + t.J = { + id: _util.OPS.setLineCap, + numArgs: 1, + variableArgs: false + }; + t.j = { + id: _util.OPS.setLineJoin, + numArgs: 1, + variableArgs: false + }; + t.M = { + id: _util.OPS.setMiterLimit, + numArgs: 1, + variableArgs: false + }; + t.d = { + id: _util.OPS.setDash, + numArgs: 2, + variableArgs: false + }; + t.ri = { + id: _util.OPS.setRenderingIntent, + numArgs: 1, + variableArgs: false + }; + t.i = { + id: _util.OPS.setFlatness, + numArgs: 1, + variableArgs: false + }; + t.gs = { + id: _util.OPS.setGState, + numArgs: 1, + variableArgs: false + }; + t.q = { + id: _util.OPS.save, + numArgs: 0, + variableArgs: false + }; + t.Q = { + id: _util.OPS.restore, + numArgs: 0, + variableArgs: false + }; + t.cm = { + id: _util.OPS.transform, + numArgs: 6, + variableArgs: false + }; + t.m = { + id: _util.OPS.moveTo, + numArgs: 2, + variableArgs: false + }; + t.l = { + id: _util.OPS.lineTo, + numArgs: 2, + variableArgs: false + }; + t.c = { + id: _util.OPS.curveTo, + numArgs: 6, + variableArgs: false + }; + t.v = { + id: _util.OPS.curveTo2, + numArgs: 4, + variableArgs: false + }; + t.y = { + id: _util.OPS.curveTo3, + numArgs: 4, + variableArgs: false + }; + t.h = { + id: _util.OPS.closePath, + numArgs: 0, + variableArgs: false + }; + t.re = { + id: _util.OPS.rectangle, + numArgs: 4, + variableArgs: false + }; + t.S = { + id: _util.OPS.stroke, + numArgs: 0, + variableArgs: false + }; + t.s = { + id: _util.OPS.closeStroke, + numArgs: 0, + variableArgs: false + }; + t.f = { + id: _util.OPS.fill, + numArgs: 0, + variableArgs: false + }; + t.F = { + id: _util.OPS.fill, + numArgs: 0, + variableArgs: false + }; + t["f*"] = { + id: _util.OPS.eoFill, + numArgs: 0, + variableArgs: false + }; + t.B = { + id: _util.OPS.fillStroke, + numArgs: 0, + variableArgs: false + }; + t["B*"] = { + id: _util.OPS.eoFillStroke, + numArgs: 0, + variableArgs: false + }; + t.b = { + id: _util.OPS.closeFillStroke, + numArgs: 0, + variableArgs: false + }; + t["b*"] = { + id: _util.OPS.closeEOFillStroke, + numArgs: 0, + variableArgs: false + }; + t.n = { + id: _util.OPS.endPath, + numArgs: 0, + variableArgs: false + }; + t.W = { + id: _util.OPS.clip, + numArgs: 0, + variableArgs: false + }; + t["W*"] = { + id: _util.OPS.eoClip, + numArgs: 0, + variableArgs: false + }; + t.BT = { + id: _util.OPS.beginText, + numArgs: 0, + variableArgs: false + }; + t.ET = { + id: _util.OPS.endText, + numArgs: 0, + variableArgs: false + }; + t.Tc = { + id: _util.OPS.setCharSpacing, + numArgs: 1, + variableArgs: false + }; + t.Tw = { + id: _util.OPS.setWordSpacing, + numArgs: 1, + variableArgs: false + }; + t.Tz = { + id: _util.OPS.setHScale, + numArgs: 1, + variableArgs: false + }; + t.TL = { + id: _util.OPS.setLeading, + numArgs: 1, + variableArgs: false + }; + t.Tf = { + id: _util.OPS.setFont, + numArgs: 2, + variableArgs: false + }; + t.Tr = { + id: _util.OPS.setTextRenderingMode, + numArgs: 1, + variableArgs: false + }; + t.Ts = { + id: _util.OPS.setTextRise, + numArgs: 1, + variableArgs: false + }; + t.Td = { + id: _util.OPS.moveText, + numArgs: 2, + variableArgs: false + }; + t.TD = { + id: _util.OPS.setLeadingMoveText, + numArgs: 2, + variableArgs: false + }; + t.Tm = { + id: _util.OPS.setTextMatrix, + numArgs: 6, + variableArgs: false + }; + t["T*"] = { + id: _util.OPS.nextLine, + numArgs: 0, + variableArgs: false + }; + t.Tj = { + id: _util.OPS.showText, + numArgs: 1, + variableArgs: false + }; + t.TJ = { + id: _util.OPS.showSpacedText, + numArgs: 1, + variableArgs: false + }; + t["'"] = { + id: _util.OPS.nextLineShowText, + numArgs: 1, + variableArgs: false + }; + t['"'] = { + id: _util.OPS.nextLineSetSpacingShowText, + numArgs: 3, + variableArgs: false + }; + t.d0 = { + id: _util.OPS.setCharWidth, + numArgs: 2, + variableArgs: false + }; + t.d1 = { + id: _util.OPS.setCharWidthAndBounds, + numArgs: 6, + variableArgs: false + }; + t.CS = { + id: _util.OPS.setStrokeColorSpace, + numArgs: 1, + variableArgs: false + }; + t.cs = { + id: _util.OPS.setFillColorSpace, + numArgs: 1, + variableArgs: false + }; + t.SC = { + id: _util.OPS.setStrokeColor, + numArgs: 4, + variableArgs: true + }; + t.SCN = { + id: _util.OPS.setStrokeColorN, + numArgs: 33, + variableArgs: true + }; + t.sc = { + id: _util.OPS.setFillColor, + numArgs: 4, + variableArgs: true + }; + t.scn = { + id: _util.OPS.setFillColorN, + numArgs: 33, + variableArgs: true + }; + t.G = { + id: _util.OPS.setStrokeGray, + numArgs: 1, + variableArgs: false + }; + t.g = { + id: _util.OPS.setFillGray, + numArgs: 1, + variableArgs: false + }; + t.RG = { + id: _util.OPS.setStrokeRGBColor, + numArgs: 3, + variableArgs: false + }; + t.rg = { + id: _util.OPS.setFillRGBColor, + numArgs: 3, + variableArgs: false + }; + t.K = { + id: _util.OPS.setStrokeCMYKColor, + numArgs: 4, + variableArgs: false + }; + t.k = { + id: _util.OPS.setFillCMYKColor, + numArgs: 4, + variableArgs: false + }; + t.sh = { + id: _util.OPS.shadingFill, + numArgs: 1, + variableArgs: false + }; + t.BI = { + id: _util.OPS.beginInlineImage, + numArgs: 0, + variableArgs: false + }; + t.ID = { + id: _util.OPS.beginImageData, + numArgs: 0, + variableArgs: false + }; + t.EI = { + id: _util.OPS.endInlineImage, + numArgs: 1, + variableArgs: false + }; + t.Do = { + id: _util.OPS.paintXObject, + numArgs: 1, + variableArgs: false + }; + t.MP = { + id: _util.OPS.markPoint, + numArgs: 1, + variableArgs: false + }; + t.DP = { + id: _util.OPS.markPointProps, + numArgs: 2, + variableArgs: false + }; + t.BMC = { + id: _util.OPS.beginMarkedContent, + numArgs: 1, + variableArgs: false + }; + t.BDC = { + id: _util.OPS.beginMarkedContentProps, + numArgs: 2, + variableArgs: false + }; + t.EMC = { + id: _util.OPS.endMarkedContent, + numArgs: 0, + variableArgs: false + }; + t.BX = { + id: _util.OPS.beginCompat, + numArgs: 0, + variableArgs: false + }; + t.EX = { + id: _util.OPS.endCompat, + numArgs: 0, + variableArgs: false + }; + t.BM = null; + t.BD = null; + t.true = null; + t.fa = null; + t.fal = null; + t.fals = null; + t.false = null; + t.nu = null; + t.nul = null; + t.null = null; + }); + return (0, _util.shadow)(this, "opMap", getOPMap()); + } + static get MAX_INVALID_PATH_OPS() { + return (0, _util.shadow)(this, "MAX_INVALID_PATH_OPS", 10); + } + constructor(stream, xref) { + let stateManager = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new StateManager(); + this.parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream, EvaluatorPreprocessor.opMap), + xref + }); + this.stateManager = stateManager; + this.nonProcessedArgs = []; + this._isPathOp = false; + this._numInvalidPathOPS = 0; + } + get savedStatesDepth() { + return this.stateManager.stateStack.length; + } + read(operation) { + let args = operation.args; + while (true) { + const obj = this.parser.getObj(); + if (obj instanceof _primitives.Cmd) { + const cmd = obj.cmd; + const opSpec = EvaluatorPreprocessor.opMap[cmd]; + if (!opSpec) { + (0, _util.warn)(`Unknown command "${cmd}".`); + continue; + } + const fn = opSpec.id; + const numArgs = opSpec.numArgs; + let argsLength = args !== null ? args.length : 0; + if (!this._isPathOp) { + this._numInvalidPathOPS = 0; + } + this._isPathOp = fn >= _util.OPS.moveTo && fn <= _util.OPS.endPath; + if (!opSpec.variableArgs) { + if (argsLength !== numArgs) { + const nonProcessedArgs = this.nonProcessedArgs; + while (argsLength > numArgs) { + nonProcessedArgs.push(args.shift()); + argsLength--; + } + while (argsLength < numArgs && nonProcessedArgs.length !== 0) { + if (args === null) { + args = []; + } + args.unshift(nonProcessedArgs.pop()); + argsLength++; + } + } + if (argsLength < numArgs) { + const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`; + if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) { + throw new _util.FormatError(`Invalid ${partialMsg}`); + } + (0, _util.warn)(`Skipping ${partialMsg}`); + if (args !== null) { + args.length = 0; + } + continue; + } + } else if (argsLength > numArgs) { + (0, _util.info)(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`); + } + this.preprocessCommand(fn, args); + operation.fn = fn; + operation.args = args; + return true; + } + if (obj === _primitives.EOF) { + return false; + } + if (obj !== null) { + if (args === null) { + args = []; + } + args.push(obj); + if (args.length > 33) { + throw new _util.FormatError("Too many arguments"); + } + } + } + } + preprocessCommand(fn, args) { + switch (fn | 0) { + case _util.OPS.save: + this.stateManager.save(); + break; + case _util.OPS.restore: + this.stateManager.restore(); + break; + case _util.OPS.transform: + this.stateManager.transform(args); + break; + } + } +} +exports.EvaluatorPreprocessor = EvaluatorPreprocessor; + +/***/ }), +/* 145 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.IdentityCMap = exports.CMapFactory = exports.CMap = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _base_stream = __w_pdfjs_require__(136); +var _parser = __w_pdfjs_require__(146); +var _core_utils = __w_pdfjs_require__(135); +var _stream = __w_pdfjs_require__(139); +const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"]; +const MAX_MAP_RANGE = 2 ** 24 - 1; +class CMap { + constructor() { + let builtInCMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + this.codespaceRanges = [[], [], [], []]; + this.numCodespaceRanges = 0; + this._map = []; + this.name = ""; + this.vertical = false; + this.useCMap = null; + this.builtInCMap = builtInCMap; + } + addCodespaceRange(n, low, high) { + this.codespaceRanges[n - 1].push(low, high); + this.numCodespaceRanges++; + } + mapCidRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); + } + while (low <= high) { + this._map[low++] = dstLow++; + } + } + mapBfRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); + } + const lastByte = dstLow.length - 1; + while (low <= high) { + this._map[low++] = dstLow; + const nextCharCode = dstLow.charCodeAt(lastByte) + 1; + if (nextCharCode > 0xff) { + dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00"; + continue; + } + dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); + } + } + mapBfRangeToArray(low, high, array) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); + } + const ii = array.length; + let i = 0; + while (low <= high && i < ii) { + this._map[low] = array[i++]; + ++low; + } + } + mapOne(src, dst) { + this._map[src] = dst; + } + lookup(code) { + return this._map[code]; + } + contains(code) { + return this._map[code] !== undefined; + } + forEach(callback) { + const map = this._map; + const length = map.length; + if (length <= 0x10000) { + for (let i = 0; i < length; i++) { + if (map[i] !== undefined) { + callback(i, map[i]); + } + } + } else { + for (const i in map) { + callback(i, map[i]); + } + } + } + charCodeOf(value) { + const map = this._map; + if (map.length <= 0x10000) { + return map.indexOf(value); + } + for (const charCode in map) { + if (map[charCode] === value) { + return charCode | 0; + } + } + return -1; + } + getMap() { + return this._map; + } + readCharCode(str, offset, out) { + let c = 0; + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (c >= low && c <= high) { + out.charcode = c; + out.length = n + 1; + return; + } + } + } + out.charcode = 0; + out.length = 1; + } + getCharCodeLength(charCode) { + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (charCode >= low && charCode <= high) { + return n + 1; + } + } + } + return 1; + } + get length() { + return this._map.length; + } + get isIdentityCMap() { + if (!(this.name === "Identity-H" || this.name === "Identity-V")) { + return false; + } + if (this._map.length !== 0x10000) { + return false; + } + for (let i = 0; i < 0x10000; i++) { + if (this._map[i] !== i) { + return false; + } + } + return true; + } +} +exports.CMap = CMap; +class IdentityCMap extends CMap { + constructor(vertical, n) { + super(); + this.vertical = vertical; + this.addCodespaceRange(n, 0, 0xffff); + } + mapCidRange(low, high, dstLow) { + (0, _util.unreachable)("should not call mapCidRange"); + } + mapBfRange(low, high, dstLow) { + (0, _util.unreachable)("should not call mapBfRange"); + } + mapBfRangeToArray(low, high, array) { + (0, _util.unreachable)("should not call mapBfRangeToArray"); + } + mapOne(src, dst) { + (0, _util.unreachable)("should not call mapCidOne"); + } + lookup(code) { + return Number.isInteger(code) && code <= 0xffff ? code : undefined; + } + contains(code) { + return Number.isInteger(code) && code <= 0xffff; + } + forEach(callback) { + for (let i = 0; i <= 0xffff; i++) { + callback(i, i); + } + } + charCodeOf(value) { + return Number.isInteger(value) && value <= 0xffff ? value : -1; + } + getMap() { + const map = new Array(0x10000); + for (let i = 0; i <= 0xffff; i++) { + map[i] = i; + } + return map; + } + get length() { + return 0x10000; + } + get isIdentityCMap() { + (0, _util.unreachable)("should not access .isIdentityCMap"); + } +} +exports.IdentityCMap = IdentityCMap; +const BinaryCMapReader = function BinaryCMapReaderClosure() { + function hexToInt(a, size) { + let n = 0; + for (let i = 0; i <= size; i++) { + n = n << 8 | a[i]; + } + return n >>> 0; + } + function hexToStr(a, size) { + if (size === 1) { + return String.fromCharCode(a[0], a[1]); + } + if (size === 3) { + return String.fromCharCode(a[0], a[1], a[2], a[3]); + } + return String.fromCharCode.apply(null, a.subarray(0, size + 1)); + } + function addHex(a, b, size) { + let c = 0; + for (let i = size; i >= 0; i--) { + c += a[i] + b[i]; + a[i] = c & 255; + c >>= 8; + } + } + function incHex(a, size) { + let c = 1; + for (let i = size; i >= 0 && c > 0; i--) { + c += a[i]; + a[i] = c & 255; + c >>= 8; + } + } + const MAX_NUM_SIZE = 16; + const MAX_ENCODED_NUM_SIZE = 19; + class BinaryCMapStream { + constructor(data) { + this.buffer = data; + this.pos = 0; + this.end = data.length; + this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); + } + readByte() { + if (this.pos >= this.end) { + return -1; + } + return this.buffer[this.pos++]; + } + readNumber() { + let n = 0; + let last; + do { + const b = this.readByte(); + if (b < 0) { + throw new _util.FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + n = n << 7 | b & 0x7f; + } while (!last); + return n; + } + readSigned() { + const n = this.readNumber(); + return n & 1 ? ~(n >>> 1) : n >>> 1; + } + readHex(num, size) { + num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); + this.pos += size + 1; + } + readHexNumber(num, size) { + let last; + const stack = this.tmpBuf; + let sp = 0; + do { + const b = this.readByte(); + if (b < 0) { + throw new _util.FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + stack[sp++] = b & 0x7f; + } while (!last); + let i = size, + buffer = 0, + bufferSize = 0; + while (i >= 0) { + while (bufferSize < 8 && stack.length > 0) { + buffer |= stack[--sp] << bufferSize; + bufferSize += 7; + } + num[i] = buffer & 255; + i--; + buffer >>= 8; + bufferSize -= 8; + } + } + readHexSigned(num, size) { + this.readHexNumber(num, size); + const sign = num[size] & 1 ? 255 : 0; + let c = 0; + for (let i = 0; i <= size; i++) { + c = (c & 1) << 8 | num[i]; + num[i] = c >> 1 ^ sign; + } + } + readString() { + const len = this.readNumber(); + let s = ""; + for (let i = 0; i < len; i++) { + s += String.fromCharCode(this.readNumber()); + } + return s; + } + } + class BinaryCMapReader { + async process(data, cMap, extend) { + const stream = new BinaryCMapStream(data); + const header = stream.readByte(); + cMap.vertical = !!(header & 1); + let useCMap = null; + const start = new Uint8Array(MAX_NUM_SIZE); + const end = new Uint8Array(MAX_NUM_SIZE); + const char = new Uint8Array(MAX_NUM_SIZE); + const charCode = new Uint8Array(MAX_NUM_SIZE); + const tmp = new Uint8Array(MAX_NUM_SIZE); + let code; + let b; + while ((b = stream.readByte()) >= 0) { + const type = b >> 5; + if (type === 7) { + switch (b & 0x1f) { + case 0: + stream.readString(); + break; + case 1: + useCMap = stream.readString(); + break; + } + continue; + } + const sequence = !!(b & 0x10); + const dataSize = b & 15; + if (dataSize + 1 > MAX_NUM_SIZE) { + throw new Error("BinaryCMapReader.process: Invalid dataSize."); + } + const ucs2DataSize = 1; + const subitemsCount = stream.readNumber(); + switch (type) { + case 0: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + } + break; + case 1: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + } + break; + case 2: + stream.readHex(char, dataSize); + code = stream.readNumber(); + cMap.mapOne(hexToInt(char, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, dataSize); + if (!sequence) { + stream.readHexNumber(tmp, dataSize); + addHex(char, tmp, dataSize); + } + code = stream.readSigned() + (code + 1); + cMap.mapOne(hexToInt(char, dataSize), code); + } + break; + case 3: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + if (!sequence) { + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + } + break; + case 4: + stream.readHex(char, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(tmp, ucs2DataSize); + addHex(char, tmp, ucs2DataSize); + } + incHex(charCode, dataSize); + stream.readHexSigned(tmp, dataSize); + addHex(charCode, tmp, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + case 5: + stream.readHex(start, ucs2DataSize); + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(start, ucs2DataSize); + addHex(start, end, ucs2DataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + default: + throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); + } + } + if (useCMap) { + return extend(useCMap); + } + return cMap; + } + } + return BinaryCMapReader; +}(); +const CMapFactory = function CMapFactoryClosure() { + function strToInt(str) { + let a = 0; + for (let i = 0; i < str.length; i++) { + a = a << 8 | str.charCodeAt(i); + } + return a >>> 0; + } + function expectString(obj) { + if (typeof obj !== "string") { + throw new _util.FormatError("Malformed CMap: expected string."); + } + } + function expectInt(obj) { + if (!Number.isInteger(obj)) { + throw new _util.FormatError("Malformed CMap: expected int."); + } + } + function parseBfChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === _primitives.EOF) { + break; + } + if ((0, _primitives.isCmd)(obj, "endbfchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const dst = obj; + cMap.mapOne(src, dst); + } + } + function parseBfRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === _primitives.EOF) { + break; + } + if ((0, _primitives.isCmd)(obj, "endbfrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + if (Number.isInteger(obj) || typeof obj === "string") { + const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; + cMap.mapBfRange(low, high, dstLow); + } else if ((0, _primitives.isCmd)(obj, "[")) { + obj = lexer.getObj(); + const array = []; + while (!(0, _primitives.isCmd)(obj, "]") && obj !== _primitives.EOF) { + array.push(obj); + obj = lexer.getObj(); + } + cMap.mapBfRangeToArray(low, high, array); + } else { + break; + } + } + throw new _util.FormatError("Invalid bf range."); + } + function parseCidChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === _primitives.EOF) { + break; + } + if ((0, _primitives.isCmd)(obj, "endcidchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dst = obj; + cMap.mapOne(src, dst); + } + } + function parseCidRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === _primitives.EOF) { + break; + } + if ((0, _primitives.isCmd)(obj, "endcidrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dstLow = obj; + cMap.mapCidRange(low, high, dstLow); + } + } + function parseCodespaceRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === _primitives.EOF) { + break; + } + if ((0, _primitives.isCmd)(obj, "endcodespacerange")) { + return; + } + if (typeof obj !== "string") { + break; + } + const low = strToInt(obj); + obj = lexer.getObj(); + if (typeof obj !== "string") { + break; + } + const high = strToInt(obj); + cMap.addCodespaceRange(obj.length, low, high); + } + throw new _util.FormatError("Invalid codespace range."); + } + function parseWMode(cMap, lexer) { + const obj = lexer.getObj(); + if (Number.isInteger(obj)) { + cMap.vertical = !!obj; + } + } + function parseCMapName(cMap, lexer) { + const obj = lexer.getObj(); + if (obj instanceof _primitives.Name) { + cMap.name = obj.name; + } + } + async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { + let previous, embeddedUseCMap; + objLoop: while (true) { + try { + const obj = lexer.getObj(); + if (obj === _primitives.EOF) { + break; + } else if (obj instanceof _primitives.Name) { + if (obj.name === "WMode") { + parseWMode(cMap, lexer); + } else if (obj.name === "CMapName") { + parseCMapName(cMap, lexer); + } + previous = obj; + } else if (obj instanceof _primitives.Cmd) { + switch (obj.cmd) { + case "endcmap": + break objLoop; + case "usecmap": + if (previous instanceof _primitives.Name) { + embeddedUseCMap = previous.name; + } + break; + case "begincodespacerange": + parseCodespaceRange(cMap, lexer); + break; + case "beginbfchar": + parseBfChar(cMap, lexer); + break; + case "begincidchar": + parseCidChar(cMap, lexer); + break; + case "beginbfrange": + parseBfRange(cMap, lexer); + break; + case "begincidrange": + parseCidRange(cMap, lexer); + break; + } + } + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)("Invalid cMap data: " + ex); + continue; + } + } + if (!useCMap && embeddedUseCMap) { + useCMap = embeddedUseCMap; + } + if (useCMap) { + return extendCMap(cMap, fetchBuiltInCMap, useCMap); + } + return cMap; + } + async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { + cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); + if (cMap.numCodespaceRanges === 0) { + const useCodespaceRanges = cMap.useCMap.codespaceRanges; + for (let i = 0; i < useCodespaceRanges.length; i++) { + cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); + } + cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; + } + cMap.useCMap.forEach(function (key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, cMap.useCMap.lookup(key)); + } + }); + return cMap; + } + async function createBuiltInCMap(name, fetchBuiltInCMap) { + if (name === "Identity-H") { + return new IdentityCMap(false, 2); + } else if (name === "Identity-V") { + return new IdentityCMap(true, 2); + } + if (!BUILT_IN_CMAPS.includes(name)) { + throw new Error("Unknown CMap name: " + name); + } + if (!fetchBuiltInCMap) { + throw new Error("Built-in CMap parameters are not provided."); + } + const { + cMapData, + compressionType + } = await fetchBuiltInCMap(name); + const cMap = new CMap(true); + if (compressionType === _util.CMapCompressionType.BINARY) { + return new BinaryCMapReader().process(cMapData, cMap, useCMap => { + return extendCMap(cMap, fetchBuiltInCMap, useCMap); + }); + } + if (compressionType === _util.CMapCompressionType.NONE) { + const lexer = new _parser.Lexer(new _stream.Stream(cMapData)); + return parseCMap(cMap, lexer, fetchBuiltInCMap, null); + } + throw new Error(`Invalid CMap "compressionType" value: ${compressionType}`); + } + return { + async create(params) { + const encoding = params.encoding; + const fetchBuiltInCMap = params.fetchBuiltInCMap; + const useCMap = params.useCMap; + if (encoding instanceof _primitives.Name) { + return createBuiltInCMap(encoding.name, fetchBuiltInCMap); + } else if (encoding instanceof _base_stream.BaseStream) { + const parsedCMap = await parseCMap(new CMap(), new _parser.Lexer(encoding), fetchBuiltInCMap, useCMap); + if (parsedCMap.isIdentityCMap) { + return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); + } + return parsedCMap; + } + throw new Error("Encoding required."); + } + }; +}(); +exports.CMapFactory = CMapFactory; + +/***/ }), +/* 146 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Parser = exports.Linearization = exports.Lexer = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _core_utils = __w_pdfjs_require__(135); +var _ascii_85_stream = __w_pdfjs_require__(147); +var _ascii_hex_stream = __w_pdfjs_require__(149); +var _ccitt_stream = __w_pdfjs_require__(150); +var _flate_stream = __w_pdfjs_require__(152); +var _jbig2_stream = __w_pdfjs_require__(153); +var _jpeg_stream = __w_pdfjs_require__(156); +var _jpx_stream = __w_pdfjs_require__(158); +var _lzw_stream = __w_pdfjs_require__(160); +var _stream = __w_pdfjs_require__(139); +var _predictor_stream = __w_pdfjs_require__(161); +var _run_length_stream = __w_pdfjs_require__(162); +const MAX_LENGTH_TO_CACHE = 1000; +function getInlineImageCacheKey(bytes) { + const strBuf = [], + ii = bytes.length; + let i = 0; + while (i < ii - 1) { + strBuf.push(bytes[i++] << 8 | bytes[i++]); + } + if (i < ii) { + strBuf.push(bytes[i]); + } + return ii + "_" + String.fromCharCode.apply(null, strBuf); +} +class Parser { + constructor(_ref) { + let { + lexer, + xref, + allowStreams = false, + recoveryMode = false + } = _ref; + this.lexer = lexer; + this.xref = xref; + this.allowStreams = allowStreams; + this.recoveryMode = recoveryMode; + this.imageCache = Object.create(null); + this._imageId = 0; + this.refill(); + } + refill() { + this.buf1 = this.lexer.getObj(); + this.buf2 = this.lexer.getObj(); + } + shift() { + if (this.buf2 instanceof _primitives.Cmd && this.buf2.cmd === "ID") { + this.buf1 = this.buf2; + this.buf2 = null; + } else { + this.buf1 = this.buf2; + this.buf2 = this.lexer.getObj(); + } + } + tryShift() { + try { + this.shift(); + return true; + } catch (e) { + if (e instanceof _core_utils.MissingDataException) { + throw e; + } + return false; + } + } + getObj() { + let cipherTransform = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + const buf1 = this.buf1; + this.shift(); + if (buf1 instanceof _primitives.Cmd) { + switch (buf1.cmd) { + case "BI": + return this.makeInlineImage(cipherTransform); + case "[": + const array = []; + while (!(0, _primitives.isCmd)(this.buf1, "]") && this.buf1 !== _primitives.EOF) { + array.push(this.getObj(cipherTransform)); + } + if (this.buf1 === _primitives.EOF) { + if (this.recoveryMode) { + return array; + } + throw new _core_utils.ParserEOFException("End of file inside array."); + } + this.shift(); + return array; + case "<<": + const dict = new _primitives.Dict(this.xref); + while (!(0, _primitives.isCmd)(this.buf1, ">>") && this.buf1 !== _primitives.EOF) { + if (!(this.buf1 instanceof _primitives.Name)) { + (0, _util.info)("Malformed dictionary: key must be a name object"); + this.shift(); + continue; + } + const key = this.buf1.name; + this.shift(); + if (this.buf1 === _primitives.EOF) { + break; + } + dict.set(key, this.getObj(cipherTransform)); + } + if (this.buf1 === _primitives.EOF) { + if (this.recoveryMode) { + return dict; + } + throw new _core_utils.ParserEOFException("End of file inside dictionary."); + } + if ((0, _primitives.isCmd)(this.buf2, "stream")) { + return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict; + } + this.shift(); + return dict; + default: + return buf1; + } + } + if (Number.isInteger(buf1)) { + if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, "R")) { + const ref = _primitives.Ref.get(buf1, this.buf1); + this.shift(); + this.shift(); + return ref; + } + return buf1; + } + if (typeof buf1 === "string") { + if (cipherTransform) { + return cipherTransform.decryptString(buf1); + } + return buf1; + } + return buf1; + } + findDefaultInlineStreamEnd(stream) { + const E = 0x45, + I = 0x49, + SPACE = 0x20, + LF = 0xa, + CR = 0xd, + NUL = 0x0; + const lexer = this.lexer, + startPos = stream.pos, + n = 10; + let state = 0, + ch, + maybeEIPos; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else { + if (ch === SPACE || ch === LF || ch === CR) { + maybeEIPos = stream.pos; + const followingBytes = stream.peekBytes(n); + for (let i = 0, ii = followingBytes.length; i < ii; i++) { + ch = followingBytes[i]; + if (ch === NUL && followingBytes[i + 1] !== NUL) { + continue; + } + if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) { + state = 0; + break; + } + } + if (state !== 2) { + continue; + } + if (lexer.knownCommands) { + const nextObj = lexer.peekObj(); + if (nextObj instanceof _primitives.Cmd && !lexer.knownCommands[nextObj.cmd]) { + state = 0; + } + } else { + (0, _util.warn)("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined."); + } + if (state === 2) { + break; + } + } else { + state = 0; + } + } + } + if (ch === -1) { + (0, _util.warn)("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker"); + if (maybeEIPos) { + (0, _util.warn)('... trying to recover by using the last "EI" occurrence.'); + stream.skip(-(stream.pos - maybeEIPos)); + } + } + let endOffset = 4; + stream.skip(-endOffset); + ch = stream.peekByte(); + stream.skip(endOffset); + if (!(0, _core_utils.isWhiteSpace)(ch)) { + endOffset--; + } + return stream.pos - endOffset - startPos; + } + findDCTDecodeInlineStreamEnd(stream) { + const startPos = stream.pos; + let foundEOI = false, + b, + markerLength; + while ((b = stream.getByte()) !== -1) { + if (b !== 0xff) { + continue; + } + switch (stream.getByte()) { + case 0x00: + break; + case 0xff: + stream.skip(-1); + break; + case 0xd9: + foundEOI = true; + break; + case 0xc0: + case 0xc1: + case 0xc2: + case 0xc3: + case 0xc5: + case 0xc6: + case 0xc7: + case 0xc9: + case 0xca: + case 0xcb: + case 0xcd: + case 0xce: + case 0xcf: + case 0xc4: + case 0xcc: + case 0xda: + case 0xdb: + case 0xdc: + case 0xdd: + case 0xde: + case 0xdf: + case 0xe0: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xe4: + case 0xe5: + case 0xe6: + case 0xe7: + case 0xe8: + case 0xe9: + case 0xea: + case 0xeb: + case 0xec: + case 0xed: + case 0xee: + case 0xef: + case 0xfe: + markerLength = stream.getUint16(); + if (markerLength > 2) { + stream.skip(markerLength - 2); + } else { + stream.skip(-2); + } + break; + } + if (foundEOI) { + break; + } + } + const length = stream.pos - startPos; + if (b === -1) { + (0, _util.warn)("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + findASCII85DecodeInlineStreamEnd(stream) { + const TILDE = 0x7e, + GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === TILDE) { + const tildePos = stream.pos; + ch = stream.peekByte(); + while ((0, _core_utils.isWhiteSpace)(ch)) { + stream.skip(); + ch = stream.peekByte(); + } + if (ch === GT) { + stream.skip(); + break; + } + if (stream.pos > tildePos) { + const maybeEI = stream.peekBytes(2); + if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) { + break; + } + } + } + } + const length = stream.pos - startPos; + if (ch === -1) { + (0, _util.warn)("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + findASCIIHexDecodeInlineStreamEnd(stream) { + const GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === GT) { + break; + } + } + const length = stream.pos - startPos; + if (ch === -1) { + (0, _util.warn)("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ instead."); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + } + inlineStreamSkipEI(stream) { + const E = 0x45, + I = 0x49; + let state = 0, + ch; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else if (state === 2) { + break; + } + } + } + makeInlineImage(cipherTransform) { + const lexer = this.lexer; + const stream = lexer.stream; + const dictMap = Object.create(null); + let dictLength; + while (!(0, _primitives.isCmd)(this.buf1, "ID") && this.buf1 !== _primitives.EOF) { + if (!(this.buf1 instanceof _primitives.Name)) { + throw new _util.FormatError("Dictionary key must be a name object"); + } + const key = this.buf1.name; + this.shift(); + if (this.buf1 === _primitives.EOF) { + break; + } + dictMap[key] = this.getObj(cipherTransform); + } + if (lexer.beginInlineImagePos !== -1) { + dictLength = stream.pos - lexer.beginInlineImagePos; + } + const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter); + let filterName; + if (filter instanceof _primitives.Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = this.xref.fetchIfRef(filter[0]); + if (filterZero instanceof _primitives.Name) { + filterName = filterZero.name; + } + } + const startPos = stream.pos; + let length; + switch (filterName) { + case "DCT": + case "DCTDecode": + length = this.findDCTDecodeInlineStreamEnd(stream); + break; + case "A85": + case "ASCII85Decode": + length = this.findASCII85DecodeInlineStreamEnd(stream); + break; + case "AHx": + case "ASCIIHexDecode": + length = this.findASCIIHexDecodeInlineStreamEnd(stream); + break; + default: + length = this.findDefaultInlineStreamEnd(stream); + } + let cacheKey; + if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) { + const initialStreamPos = stream.pos; + stream.pos = lexer.beginInlineImagePos; + cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length)); + stream.pos = initialStreamPos; + const cacheEntry = this.imageCache[cacheKey]; + if (cacheEntry !== undefined) { + this.buf2 = _primitives.Cmd.get("EI"); + this.shift(); + cacheEntry.reset(); + return cacheEntry; + } + } + const dict = new _primitives.Dict(this.xref); + for (const key in dictMap) { + dict.set(key, dictMap[key]); + } + let imageStream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + imageStream = cipherTransform.createStream(imageStream, length); + } + imageStream = this.filter(imageStream, dict, length); + imageStream.dict = dict; + if (cacheKey !== undefined) { + imageStream.cacheKey = `inline_img_${++this._imageId}`; + this.imageCache[cacheKey] = imageStream; + } + this.buf2 = _primitives.Cmd.get("EI"); + this.shift(); + return imageStream; + } + _findStreamLength(startPos, signature) { + const { + stream + } = this.lexer; + stream.pos = startPos; + const SCAN_BLOCK_LENGTH = 2048; + const signatureLength = signature.length; + while (stream.pos < stream.end) { + const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + break; + } + let pos = 0; + while (pos < scanLength) { + let j = 0; + while (j < signatureLength && scanBytes[pos + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + stream.pos += pos; + return stream.pos - startPos; + } + pos++; + } + stream.pos += scanLength; + } + return -1; + } + makeStream(dict, cipherTransform) { + const lexer = this.lexer; + let stream = lexer.stream; + lexer.skipToNextLine(); + const startPos = stream.pos - 1; + let length = dict.get("Length"); + if (!Number.isInteger(length)) { + (0, _util.info)(`Bad length "${length && length.toString()}" in stream.`); + length = 0; + } + stream.pos = startPos + length; + lexer.nextChar(); + if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, "endstream")) { + this.shift(); + } else { + const ENDSTREAM_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]); + let actualLength = this._findStreamLength(startPos, ENDSTREAM_SIGNATURE); + if (actualLength < 0) { + const MAX_TRUNCATION = 1; + for (let i = 1; i <= MAX_TRUNCATION; i++) { + const end = ENDSTREAM_SIGNATURE.length - i; + const TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end); + const maybeLength = this._findStreamLength(startPos, TRUNCATED_SIGNATURE); + if (maybeLength >= 0) { + const lastByte = stream.peekBytes(end + 1)[end]; + if (!(0, _core_utils.isWhiteSpace)(lastByte)) { + break; + } + (0, _util.info)(`Found "${(0, _util.bytesToString)(TRUNCATED_SIGNATURE)}" when ` + "searching for endstream command."); + actualLength = maybeLength; + break; + } + } + if (actualLength < 0) { + throw new _util.FormatError("Missing endstream command."); + } + } + length = actualLength; + lexer.nextChar(); + this.shift(); + this.shift(); + } + this.shift(); + stream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + stream = cipherTransform.createStream(stream, length); + } + stream = this.filter(stream, dict, length); + stream.dict = dict; + return stream; + } + filter(stream, dict, length) { + let filter = dict.get("F", "Filter"); + let params = dict.get("DP", "DecodeParms"); + if (filter instanceof _primitives.Name) { + if (Array.isArray(params)) { + (0, _util.warn)("/DecodeParms should not be an Array, when /Filter is a Name."); + } + return this.makeFilter(stream, filter.name, length, params); + } + let maybeLength = length; + if (Array.isArray(filter)) { + const filterArray = filter; + const paramsArray = params; + for (let i = 0, ii = filterArray.length; i < ii; ++i) { + filter = this.xref.fetchIfRef(filterArray[i]); + if (!(filter instanceof _primitives.Name)) { + throw new _util.FormatError(`Bad filter name "${filter}"`); + } + params = null; + if (Array.isArray(paramsArray) && i in paramsArray) { + params = this.xref.fetchIfRef(paramsArray[i]); + } + stream = this.makeFilter(stream, filter.name, maybeLength, params); + maybeLength = null; + } + } + return stream; + } + makeFilter(stream, name, maybeLength, params) { + if (maybeLength === 0) { + (0, _util.warn)(`Empty "${name}" stream.`); + return new _stream.NullStream(); + } + const xrefStats = this.xref.stats; + try { + switch (name) { + case "Fl": + case "FlateDecode": + xrefStats.addStreamType(_util.StreamType.FLATE); + if (params) { + return new _predictor_stream.PredictorStream(new _flate_stream.FlateStream(stream, maybeLength), maybeLength, params); + } + return new _flate_stream.FlateStream(stream, maybeLength); + case "LZW": + case "LZWDecode": + xrefStats.addStreamType(_util.StreamType.LZW); + let earlyChange = 1; + if (params) { + if (params.has("EarlyChange")) { + earlyChange = params.get("EarlyChange"); + } + return new _predictor_stream.PredictorStream(new _lzw_stream.LZWStream(stream, maybeLength, earlyChange), maybeLength, params); + } + return new _lzw_stream.LZWStream(stream, maybeLength, earlyChange); + case "DCT": + case "DCTDecode": + xrefStats.addStreamType(_util.StreamType.DCT); + return new _jpeg_stream.JpegStream(stream, maybeLength, params); + case "JPX": + case "JPXDecode": + xrefStats.addStreamType(_util.StreamType.JPX); + return new _jpx_stream.JpxStream(stream, maybeLength, params); + case "A85": + case "ASCII85Decode": + xrefStats.addStreamType(_util.StreamType.A85); + return new _ascii_85_stream.Ascii85Stream(stream, maybeLength); + case "AHx": + case "ASCIIHexDecode": + xrefStats.addStreamType(_util.StreamType.AHX); + return new _ascii_hex_stream.AsciiHexStream(stream, maybeLength); + case "CCF": + case "CCITTFaxDecode": + xrefStats.addStreamType(_util.StreamType.CCF); + return new _ccitt_stream.CCITTFaxStream(stream, maybeLength, params); + case "RL": + case "RunLengthDecode": + xrefStats.addStreamType(_util.StreamType.RLX); + return new _run_length_stream.RunLengthStream(stream, maybeLength); + case "JBIG2Decode": + xrefStats.addStreamType(_util.StreamType.JBIG); + return new _jbig2_stream.Jbig2Stream(stream, maybeLength, params); + } + (0, _util.warn)(`Filter "${name}" is not supported.`); + return stream; + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)(`Invalid stream: "${ex}"`); + return new _stream.NullStream(); + } + } +} +exports.Parser = Parser; +const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; +function toHexDigit(ch) { + if (ch >= 0x30 && ch <= 0x39) { + return ch & 0x0f; + } + if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + return (ch & 0x0f) + 9; + } + return -1; +} +class Lexer { + constructor(stream) { + let knownCommands = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + this.stream = stream; + this.nextChar(); + this.strBuf = []; + this.knownCommands = knownCommands; + this._hexStringNumWarn = 0; + this.beginInlineImagePos = -1; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + peekChar() { + return this.stream.peekByte(); + } + getNumber() { + let ch = this.currentChar; + let eNotation = false; + let divideBy = 0; + let sign = 0; + if (ch === 0x2d) { + sign = -1; + ch = this.nextChar(); + if (ch === 0x2d) { + ch = this.nextChar(); + } + } else if (ch === 0x2b) { + sign = 1; + ch = this.nextChar(); + } + if (ch === 0x0a || ch === 0x0d) { + do { + ch = this.nextChar(); + } while (ch === 0x0a || ch === 0x0d); + } + if (ch === 0x2e) { + divideBy = 10; + ch = this.nextChar(); + } + if (ch < 0x30 || ch > 0x39) { + const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`; + if ((0, _core_utils.isWhiteSpace)(ch) || ch === -1) { + (0, _util.info)(`Lexer.getNumber - "${msg}".`); + return 0; + } + throw new _util.FormatError(msg); + } + sign = sign || 1; + let baseValue = ch - 0x30; + let powerValue = 0; + let powerValueSign = 1; + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39) { + const currentDigit = ch - 0x30; + if (eNotation) { + powerValue = powerValue * 10 + currentDigit; + } else { + if (divideBy !== 0) { + divideBy *= 10; + } + baseValue = baseValue * 10 + currentDigit; + } + } else if (ch === 0x2e) { + if (divideBy === 0) { + divideBy = 1; + } else { + break; + } + } else if (ch === 0x2d) { + (0, _util.warn)("Badly formatted number: minus sign in the middle"); + } else if (ch === 0x45 || ch === 0x65) { + ch = this.peekChar(); + if (ch === 0x2b || ch === 0x2d) { + powerValueSign = ch === 0x2d ? -1 : 1; + this.nextChar(); + } else if (ch < 0x30 || ch > 0x39) { + break; + } + eNotation = true; + } else { + break; + } + } + if (divideBy !== 0) { + baseValue /= divideBy; + } + if (eNotation) { + baseValue *= 10 ** (powerValueSign * powerValue); + } + return sign * baseValue; + } + getString() { + let numParen = 1; + let done = false; + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.nextChar(); + while (true) { + let charBuffered = false; + switch (ch | 0) { + case -1: + (0, _util.warn)("Unterminated string"); + done = true; + break; + case 0x28: + ++numParen; + strBuf.push("("); + break; + case 0x29: + if (--numParen === 0) { + this.nextChar(); + done = true; + } else { + strBuf.push(")"); + } + break; + case 0x5c: + ch = this.nextChar(); + switch (ch) { + case -1: + (0, _util.warn)("Unterminated string"); + done = true; + break; + case 0x6e: + strBuf.push("\n"); + break; + case 0x72: + strBuf.push("\r"); + break; + case 0x74: + strBuf.push("\t"); + break; + case 0x62: + strBuf.push("\b"); + break; + case 0x66: + strBuf.push("\f"); + break; + case 0x5c: + case 0x28: + case 0x29: + strBuf.push(String.fromCharCode(ch)); + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + let x = ch & 0x0f; + ch = this.nextChar(); + charBuffered = true; + if (ch >= 0x30 && ch <= 0x37) { + x = (x << 3) + (ch & 0x0f); + ch = this.nextChar(); + if (ch >= 0x30 && ch <= 0x37) { + charBuffered = false; + x = (x << 3) + (ch & 0x0f); + } + } + strBuf.push(String.fromCharCode(x)); + break; + case 0x0d: + if (this.peekChar() === 0x0a) { + this.nextChar(); + } + break; + case 0x0a: + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + if (done) { + break; + } + if (!charBuffered) { + ch = this.nextChar(); + } + } + return strBuf.join(""); + } + getName() { + let ch, previousCh; + const strBuf = this.strBuf; + strBuf.length = 0; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + if (ch === 0x23) { + ch = this.nextChar(); + if (specialChars[ch]) { + (0, _util.warn)("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number."); + strBuf.push("#"); + break; + } + const x = toHexDigit(ch); + if (x !== -1) { + previousCh = ch; + ch = this.nextChar(); + const x2 = toHexDigit(ch); + if (x2 === -1) { + (0, _util.warn)(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number."); + strBuf.push("#", String.fromCharCode(previousCh)); + if (specialChars[ch]) { + break; + } + strBuf.push(String.fromCharCode(ch)); + continue; + } + strBuf.push(String.fromCharCode(x << 4 | x2)); + } else { + strBuf.push("#", String.fromCharCode(ch)); + } + } else { + strBuf.push(String.fromCharCode(ch)); + } + } + if (strBuf.length > 127) { + (0, _util.warn)(`Name token is longer than allowed by the spec: ${strBuf.length}`); + } + return _primitives.Name.get(strBuf.join("")); + } + _hexStringWarn(ch) { + const MAX_HEX_STRING_NUM_WARN = 5; + if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { + (0, _util.warn)("getHexString - ignoring additional invalid characters."); + return; + } + if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { + return; + } + (0, _util.warn)(`getHexString - ignoring invalid character: ${ch}`); + } + getHexString() { + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.currentChar; + let isFirstHex = true; + let firstDigit, secondDigit; + this._hexStringNumWarn = 0; + while (true) { + if (ch < 0) { + (0, _util.warn)("Unterminated hex string"); + break; + } else if (ch === 0x3e) { + this.nextChar(); + break; + } else if (specialChars[ch] === 1) { + ch = this.nextChar(); + continue; + } else { + if (isFirstHex) { + firstDigit = toHexDigit(ch); + if (firstDigit === -1) { + this._hexStringWarn(ch); + ch = this.nextChar(); + continue; + } + } else { + secondDigit = toHexDigit(ch); + if (secondDigit === -1) { + this._hexStringWarn(ch); + ch = this.nextChar(); + continue; + } + strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit)); + } + isFirstHex = !isFirstHex; + ch = this.nextChar(); + } + } + return strBuf.join(""); + } + getObj() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return _primitives.EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (specialChars[ch] !== 1) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2b: + case 0x2d: + case 0x2e: + return this.getNumber(); + case 0x28: + return this.getString(); + case 0x2f: + return this.getName(); + case 0x5b: + this.nextChar(); + return _primitives.Cmd.get("["); + case 0x5d: + this.nextChar(); + return _primitives.Cmd.get("]"); + case 0x3c: + ch = this.nextChar(); + if (ch === 0x3c) { + this.nextChar(); + return _primitives.Cmd.get("<<"); + } + return this.getHexString(); + case 0x3e: + ch = this.nextChar(); + if (ch === 0x3e) { + this.nextChar(); + return _primitives.Cmd.get(">>"); + } + return _primitives.Cmd.get(">"); + case 0x7b: + this.nextChar(); + return _primitives.Cmd.get("{"); + case 0x7d: + this.nextChar(); + return _primitives.Cmd.get("}"); + case 0x29: + this.nextChar(); + throw new _util.FormatError(`Illegal character: ${ch}`); + } + let str = String.fromCharCode(ch); + if (ch < 0x20 || ch > 0x7f) { + const nextCh = this.peekChar(); + if (nextCh >= 0x20 && nextCh <= 0x7f) { + this.nextChar(); + return _primitives.Cmd.get(str); + } + } + const knownCommands = this.knownCommands; + let knownCommandFound = knownCommands && knownCommands[str] !== undefined; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + const possibleCommand = str + String.fromCharCode(ch); + if (knownCommandFound && knownCommands[possibleCommand] === undefined) { + break; + } + if (str.length === 128) { + throw new _util.FormatError(`Command token too long: ${str.length}`); + } + str = possibleCommand; + knownCommandFound = knownCommands && knownCommands[str] !== undefined; + } + if (str === "true") { + return true; + } + if (str === "false") { + return false; + } + if (str === "null") { + return null; + } + if (str === "BI") { + this.beginInlineImagePos = this.stream.pos; + } + return _primitives.Cmd.get(str); + } + peekObj() { + const streamPos = this.stream.pos, + currentChar = this.currentChar, + beginInlineImagePos = this.beginInlineImagePos; + let nextObj; + try { + nextObj = this.getObj(); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)(`peekObj: ${ex}`); + } + this.stream.pos = streamPos; + this.currentChar = currentChar; + this.beginInlineImagePos = beginInlineImagePos; + return nextObj; + } + skipToNextLine() { + let ch = this.currentChar; + while (ch >= 0) { + if (ch === 0x0d) { + ch = this.nextChar(); + if (ch === 0x0a) { + this.nextChar(); + } + break; + } else if (ch === 0x0a) { + this.nextChar(); + break; + } + ch = this.nextChar(); + } + } +} +exports.Lexer = Lexer; +class Linearization { + static create(stream) { + function getInt(linDict, name) { + let allowZeroValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + const obj = linDict.get(name); + if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { + return obj; + } + throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid."); + } + function getHints(linDict) { + const hints = linDict.get("H"); + let hintsLength; + if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { + for (let index = 0; index < hintsLength; index++) { + const hint = hints[index]; + if (!(Number.isInteger(hint) && hint > 0)) { + throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`); + } + } + return hints; + } + throw new Error("Hint array in the linearization dictionary is invalid."); + } + const parser = new Parser({ + lexer: new Lexer(stream), + xref: null + }); + const obj1 = parser.getObj(); + const obj2 = parser.getObj(); + const obj3 = parser.getObj(); + const linDict = parser.getObj(); + let obj, length; + if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, "obj") && linDict instanceof _primitives.Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { + return null; + } else if ((length = getInt(linDict, "L")) !== stream.length) { + throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); + } + return { + length, + hints: getHints(linDict), + objectNumberFirst: getInt(linDict, "O"), + endFirst: getInt(linDict, "E"), + numPages: getInt(linDict, "N"), + mainXRefEntriesOffset: getInt(linDict, "T"), + pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 + }; + } +} +exports.Linearization = Linearization; + +/***/ }), +/* 147 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Ascii85Stream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +var _core_utils = __w_pdfjs_require__(135); +class Ascii85Stream extends _decode_stream.DecodeStream { + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.8; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.input = new Uint8Array(5); + } + readBlock() { + const TILDA_CHAR = 0x7e; + const Z_LOWER_CHAR = 0x7a; + const EOF = -1; + const str = this.str; + let c = str.getByte(); + while ((0, _core_utils.isWhiteSpace)(c)) { + c = str.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; + return; + } + const bufferLength = this.bufferLength; + let buffer, i; + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + for (i = 0; i < 4; ++i) { + buffer[bufferLength + i] = 0; + } + this.bufferLength += 4; + } else { + const input = this.input; + input[0] = c; + for (i = 1; i < 5; ++i) { + c = str.getByte(); + while ((0, _core_utils.isWhiteSpace)(c)) { + c = str.getByte(); + } + input[i] = c; + if (c === EOF || c === TILDA_CHAR) { + break; + } + } + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + if (i < 5) { + for (; i < 5; ++i) { + input[i] = 0x21 + 84; + } + this.eof = true; + } + let t = 0; + for (i = 0; i < 5; ++i) { + t = t * 85 + (input[i] - 0x21); + } + for (i = 3; i >= 0; --i) { + buffer[bufferLength + i] = t & 0xff; + t >>= 8; + } + } + } +} +exports.Ascii85Stream = Ascii85Stream; + +/***/ }), +/* 148 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.StreamsSequenceStream = exports.DecodeStream = void 0; +var _base_stream = __w_pdfjs_require__(136); +var _stream = __w_pdfjs_require__(139); +const emptyBuffer = new Uint8Array(0); +class DecodeStream extends _base_stream.BaseStream { + constructor(maybeMinBufferLength) { + super(); + this._rawMinBufferLength = maybeMinBufferLength || 0; + this.pos = 0; + this.bufferLength = 0; + this.eof = false; + this.buffer = emptyBuffer; + this.minBufferLength = 512; + if (maybeMinBufferLength) { + while (this.minBufferLength < maybeMinBufferLength) { + this.minBufferLength *= 2; + } + } + } + get isEmpty() { + while (!this.eof && this.bufferLength === 0) { + this.readBlock(); + } + return this.bufferLength === 0; + } + ensureBuffer(requested) { + const buffer = this.buffer; + if (requested <= buffer.byteLength) { + return buffer; + } + let size = this.minBufferLength; + while (size < requested) { + size *= 2; + } + const buffer2 = new Uint8Array(size); + buffer2.set(buffer); + return this.buffer = buffer2; + } + getByte() { + const pos = this.pos; + while (this.bufferLength <= pos) { + if (this.eof) { + return -1; + } + this.readBlock(); + } + return this.buffer[this.pos++]; + } + getBytes(length) { + const pos = this.pos; + let end; + if (length) { + this.ensureBuffer(pos + length); + end = pos + length; + while (!this.eof && this.bufferLength < end) { + this.readBlock(); + } + const bufEnd = this.bufferLength; + if (end > bufEnd) { + end = bufEnd; + } + } else { + while (!this.eof) { + this.readBlock(); + } + end = this.bufferLength; + } + this.pos = end; + return this.buffer.subarray(pos, end); + } + reset() { + this.pos = 0; + } + makeSubStream(start, length) { + let dict = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + if (length === undefined) { + while (!this.eof) { + this.readBlock(); + } + } else { + const end = start + length; + while (this.bufferLength <= end && !this.eof) { + this.readBlock(); + } + } + return new _stream.Stream(this.buffer, start, length, dict); + } + getBaseStreams() { + return this.str ? this.str.getBaseStreams() : null; + } +} +exports.DecodeStream = DecodeStream; +class StreamsSequenceStream extends DecodeStream { + constructor(streams) { + let onError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let maybeLength = 0; + for (const stream of streams) { + maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length; + } + super(maybeLength); + this.streams = streams; + this._onError = onError; + } + readBlock() { + const streams = this.streams; + if (streams.length === 0) { + this.eof = true; + return; + } + const stream = streams.shift(); + let chunk; + try { + chunk = stream.getBytes(); + } catch (reason) { + if (this._onError) { + this._onError(reason, stream.dict && stream.dict.objId); + return; + } + throw reason; + } + const bufferLength = this.bufferLength; + const newLength = bufferLength + chunk.length; + const buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } + getBaseStreams() { + const baseStreamsBuf = []; + for (const stream of this.streams) { + const baseStreams = stream.getBaseStreams(); + if (baseStreams) { + baseStreamsBuf.push(...baseStreams); + } + } + return baseStreamsBuf.length > 0 ? baseStreamsBuf : null; + } +} +exports.StreamsSequenceStream = StreamsSequenceStream; + +/***/ }), +/* 149 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.AsciiHexStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +class AsciiHexStream extends _decode_stream.DecodeStream { + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.5; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.firstDigit = -1; + } + readBlock() { + const UPSTREAM_BLOCK_SIZE = 8000; + const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + const maxDecodeLength = bytes.length + 1 >> 1; + const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + let bufferLength = this.bufferLength; + let firstDigit = this.firstDigit; + for (const ch of bytes) { + let digit; + if (ch >= 0x30 && ch <= 0x39) { + digit = ch & 0x0f; + } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + digit = (ch & 0x0f) + 9; + } else if (ch === 0x3e) { + this.eof = true; + break; + } else { + continue; + } + if (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = firstDigit << 4 | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; + } +} +exports.AsciiHexStream = AsciiHexStream; + +/***/ }), +/* 150 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.CCITTFaxStream = void 0; +var _ccitt = __w_pdfjs_require__(151); +var _decode_stream = __w_pdfjs_require__(148); +var _primitives = __w_pdfjs_require__(134); +class CCITTFaxStream extends _decode_stream.DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + if (!(params instanceof _primitives.Dict)) { + params = _primitives.Dict.empty; + } + const source = { + next() { + return str.getByte(); + } + }; + this.ccittFaxDecoder = new _ccitt.CCITTFaxDecoder(source, { + K: params.get("K"), + EndOfLine: params.get("EndOfLine"), + EncodedByteAlign: params.get("EncodedByteAlign"), + Columns: params.get("Columns"), + Rows: params.get("Rows"), + EndOfBlock: params.get("EndOfBlock"), + BlackIs1: params.get("BlackIs1") + }); + } + readBlock() { + while (!this.eof) { + const c = this.ccittFaxDecoder.readNextChar(); + if (c === -1) { + this.eof = true; + return; + } + this.ensureBuffer(this.bufferLength + 1); + this.buffer[this.bufferLength++] = c; + } + } +} +exports.CCITTFaxStream = CCITTFaxStream; + +/***/ }), +/* 151 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.CCITTFaxDecoder = void 0; +var _util = __w_pdfjs_require__(2); +const ccittEOL = -2; +const ccittEOF = -1; +const twoDimPass = 0; +const twoDimHoriz = 1; +const twoDimVert0 = 2; +const twoDimVertR1 = 3; +const twoDimVertL1 = 4; +const twoDimVertR2 = 5; +const twoDimVertL2 = 6; +const twoDimVertR3 = 7; +const twoDimVertL3 = 8; +const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]]; +const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]]; +const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]]; +const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]]; +const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]]; +const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]; +class CCITTFaxDecoder { + constructor(source) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (!source || typeof source.next !== "function") { + throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); + } + this.source = source; + this.eof = false; + this.encoding = options.K || 0; + this.eoline = options.EndOfLine || false; + this.byteAlign = options.EncodedByteAlign || false; + this.columns = options.Columns || 1728; + this.rows = options.Rows || 0; + let eoblock = options.EndOfBlock; + if (eoblock === null || eoblock === undefined) { + eoblock = true; + } + this.eoblock = eoblock; + this.black = options.BlackIs1 || false; + this.codingLine = new Uint32Array(this.columns + 1); + this.refLine = new Uint32Array(this.columns + 2); + this.codingLine[0] = this.columns; + this.codingPos = 0; + this.row = 0; + this.nextLine2D = this.encoding < 0; + this.inputBits = 0; + this.inputBuf = 0; + this.outputBits = 0; + this.rowsDone = false; + let code1; + while ((code1 = this._lookBits(12)) === 0) { + this._eatBits(1); + } + if (code1 === 1) { + this._eatBits(12); + } + if (this.encoding > 0) { + this.nextLine2D = !this._lookBits(1); + this._eatBits(1); + } + } + readNextChar() { + if (this.eof) { + return -1; + } + const refLine = this.refLine; + const codingLine = this.codingLine; + const columns = this.columns; + let refPos, blackPixels, bits, i; + if (this.outputBits === 0) { + if (this.rowsDone) { + this.eof = true; + } + if (this.eof) { + return -1; + } + this.err = false; + let code1, code2, code3; + if (this.nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = columns; + refLine[i] = columns; + codingLine[0] = 0; + this.codingPos = 0; + refPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = this._getTwoDimCode(); + switch (code1) { + case twoDimPass: + this._addPixels(refLine[refPos + 1], blackPixels); + if (refLine[refPos + 1] < columns) { + refPos += 2; + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = this._getBlackCode(); + } while (code3 >= 64); + } + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + if (codingLine[this.codingPos] < columns) { + this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + break; + case twoDimVertR3: + this._addPixels(refLine[refPos] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR2: + this._addPixels(refLine[refPos] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR1: + this._addPixels(refLine[refPos] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVert0: + this._addPixels(refLine[refPos], blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL3: + this._addPixelsNeg(refLine[refPos] - 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL2: + this._addPixelsNeg(refLine[refPos] - 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL1: + this._addPixelsNeg(refLine[refPos] - 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case ccittEOF: + this._addPixels(columns, 0); + this.eof = true; + break; + default: + (0, _util.info)("bad 2d code"); + this._addPixels(columns, 0); + this.err = true; + } + } + } else { + codingLine[0] = 0; + this.codingPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = 0; + if (blackPixels) { + do { + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + } + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + blackPixels ^= 1; + } + } + let gotEOL = false; + if (this.byteAlign) { + this.inputBits &= ~7; + } + if (!this.eoblock && this.row === this.rows - 1) { + this.rowsDone = true; + } else { + code1 = this._lookBits(12); + if (this.eoline) { + while (code1 !== ccittEOF && code1 !== 1) { + this._eatBits(1); + code1 = this._lookBits(12); + } + } else { + while (code1 === 0) { + this._eatBits(1); + code1 = this._lookBits(12); + } + } + if (code1 === 1) { + this._eatBits(12); + gotEOL = true; + } else if (code1 === ccittEOF) { + this.eof = true; + } + } + if (!this.eof && this.encoding > 0 && !this.rowsDone) { + this.nextLine2D = !this._lookBits(1); + this._eatBits(1); + } + if (this.eoblock && gotEOL && this.byteAlign) { + code1 = this._lookBits(12); + if (code1 === 1) { + this._eatBits(12); + if (this.encoding > 0) { + this._lookBits(1); + this._eatBits(1); + } + if (this.encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = this._lookBits(12); + if (code1 !== 1) { + (0, _util.info)("bad rtc code: " + code1); + } + this._eatBits(12); + if (this.encoding > 0) { + this._lookBits(1); + this._eatBits(1); + } + } + } + this.eof = true; + } + } else if (this.err && this.eoline) { + while (true) { + code1 = this._lookBits(13); + if (code1 === ccittEOF) { + this.eof = true; + return -1; + } + if (code1 >> 1 === 1) { + break; + } + this._eatBits(1); + } + this._eatBits(12); + if (this.encoding > 0) { + this._eatBits(1); + this.nextLine2D = !(code1 & 1); + } + } + if (codingLine[0] > 0) { + this.outputBits = codingLine[this.codingPos = 0]; + } else { + this.outputBits = codingLine[this.codingPos = 1]; + } + this.row++; + } + let c; + if (this.outputBits >= 8) { + c = this.codingPos & 1 ? 0 : 0xff; + this.outputBits -= 8; + if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } + } else { + bits = 8; + c = 0; + do { + if (typeof this.outputBits !== "number") { + throw new _util.FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.'); + } + if (this.outputBits > bits) { + c <<= bits; + if (!(this.codingPos & 1)) { + c |= 0xff >> 8 - bits; + } + this.outputBits -= bits; + bits = 0; + } else { + c <<= this.outputBits; + if (!(this.codingPos & 1)) { + c |= 0xff >> 8 - this.outputBits; + } + bits -= this.outputBits; + this.outputBits = 0; + if (codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } else if (bits > 0) { + c <<= bits; + bits = 0; + } + } + } while (bits); + } + if (this.black) { + c ^= 0xff; + } + return c; + } + _addPixels(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + (0, _util.info)("row is wrong length"); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + } + _addPixelsNeg(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + (0, _util.info)("row is wrong length"); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } else if (a1 < codingLine[codingPos]) { + if (a1 < 0) { + (0, _util.info)("invalid code"); + this.err = true; + a1 = 0; + } + while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { + --codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + } + _findTableCode(start, end, table, limit) { + const limitValue = limit || 0; + for (let i = start; i <= end; ++i) { + let code = this._lookBits(i); + if (code === ccittEOF) { + return [true, 1, false]; + } + if (i < end) { + code <<= end - i; + } + if (!limitValue || code >= limitValue) { + const p = table[code - limitValue]; + if (p[0] === i) { + this._eatBits(i); + return [true, p[1], true]; + } + } + } + return [false, 0, false]; + } + _getTwoDimCode() { + let code = 0; + let p; + if (this.eoblock) { + code = this._lookBits(7); + p = twoDimTable[code]; + if (p && p[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + const result = this._findTableCode(1, 7, twoDimTable); + if (result[0] && result[2]) { + return result[1]; + } + } + (0, _util.info)("Bad two dim code"); + return ccittEOF; + } + _getWhiteCode() { + let code = 0; + let p; + if (this.eoblock) { + code = this._lookBits(12); + if (code === ccittEOF) { + return 1; + } + if (code >> 5 === 0) { + p = whiteTable1[code]; + } else { + p = whiteTable2[code >> 3]; + } + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + let result = this._findTableCode(1, 9, whiteTable2); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(11, 12, whiteTable1); + if (result[0]) { + return result[1]; + } + } + (0, _util.info)("bad white code"); + this._eatBits(1); + return 1; + } + _getBlackCode() { + let code, p; + if (this.eoblock) { + code = this._lookBits(13); + if (code === ccittEOF) { + return 1; + } + if (code >> 7 === 0) { + p = blackTable1[code]; + } else if (code >> 9 === 0 && code >> 7 !== 0) { + p = blackTable2[(code >> 1) - 64]; + } else { + p = blackTable3[code >> 7]; + } + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; + } + } else { + let result = this._findTableCode(2, 6, blackTable3); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(7, 12, blackTable2, 64); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(10, 13, blackTable1); + if (result[0]) { + return result[1]; + } + } + (0, _util.info)("bad black code"); + this._eatBits(1); + return 1; + } + _lookBits(n) { + let c; + while (this.inputBits < n) { + if ((c = this.source.next()) === -1) { + if (this.inputBits === 0) { + return ccittEOF; + } + return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n; + } + this.inputBuf = this.inputBuf << 8 | c; + this.inputBits += 8; + } + return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n; + } + _eatBits(n) { + if ((this.inputBits -= n) < 0) { + this.inputBits = 0; + } + } +} +exports.CCITTFaxDecoder = CCITTFaxDecoder; + +/***/ }), +/* 152 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.FlateStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +var _util = __w_pdfjs_require__(2); +const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]); +const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]); +const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9]; +const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5]; +class FlateStream extends _decode_stream.DecodeStream { + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + const cmf = str.getByte(); + const flg = str.getByte(); + if (cmf === -1 || flg === -1) { + throw new _util.FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); + } + if ((cmf & 0x0f) !== 0x08) { + throw new _util.FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`); + } + if (((cmf << 8) + flg) % 31 !== 0) { + throw new _util.FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); + } + if (flg & 0x20) { + throw new _util.FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); + } + this.codeSize = 0; + this.codeBuf = 0; + } + getBits(bits) { + const str = this.str; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < bits) { + if ((b = str.getByte()) === -1) { + throw new _util.FormatError("Bad encoding in flate stream"); + } + codeBuf |= b << codeSize; + codeSize += 8; + } + b = codeBuf & (1 << bits) - 1; + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; + } + getCode(table) { + const str = this.str; + const codes = table[0]; + const maxLen = table[1]; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < maxLen) { + if ((b = str.getByte()) === -1) { + break; + } + codeBuf |= b << codeSize; + codeSize += 8; + } + const code = codes[codeBuf & (1 << maxLen) - 1]; + const codeLen = code >> 16; + const codeVal = code & 0xffff; + if (codeLen < 1 || codeSize < codeLen) { + throw new _util.FormatError("Bad encoding in flate stream"); + } + this.codeBuf = codeBuf >> codeLen; + this.codeSize = codeSize - codeLen; + return codeVal; + } + generateHuffmanTable(lengths) { + const n = lengths.length; + let maxLen = 0; + let i; + for (i = 0; i < n; ++i) { + if (lengths[i] > maxLen) { + maxLen = lengths[i]; + } + } + const size = 1 << maxLen; + const codes = new Int32Array(size); + for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { + for (let val = 0; val < n; ++val) { + if (lengths[val] === len) { + let code2 = 0; + let t = code; + for (i = 0; i < len; ++i) { + code2 = code2 << 1 | t & 1; + t >>= 1; + } + for (i = code2; i < size; i += skip) { + codes[i] = len << 16 | val; + } + ++code; + } + } + } + return [codes, maxLen]; + } + readBlock() { + let buffer, len; + const str = this.str; + let hdr = this.getBits(3); + if (hdr & 1) { + this.eof = true; + } + hdr >>= 1; + if (hdr === 0) { + let b; + if ((b = str.getByte()) === -1) { + throw new _util.FormatError("Bad block header in flate stream"); + } + let blockLen = b; + if ((b = str.getByte()) === -1) { + throw new _util.FormatError("Bad block header in flate stream"); + } + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + throw new _util.FormatError("Bad block header in flate stream"); + } + let check = b; + if ((b = str.getByte()) === -1) { + throw new _util.FormatError("Bad block header in flate stream"); + } + check |= b << 8; + if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { + throw new _util.FormatError("Bad uncompressed block length in flate stream"); + } + this.codeBuf = 0; + this.codeSize = 0; + const bufferLength = this.bufferLength, + end = bufferLength + blockLen; + buffer = this.ensureBuffer(end); + this.bufferLength = end; + if (blockLen === 0) { + if (str.peekByte() === -1) { + this.eof = true; + } + } else { + const block = str.getBytes(blockLen); + buffer.set(block, bufferLength); + if (block.length < blockLen) { + this.eof = true; + } + } + return; + } + let litCodeTable; + let distCodeTable; + if (hdr === 1) { + litCodeTable = fixedLitCodeTab; + distCodeTable = fixedDistCodeTab; + } else if (hdr === 2) { + const numLitCodes = this.getBits(5) + 257; + const numDistCodes = this.getBits(5) + 1; + const numCodeLenCodes = this.getBits(4) + 4; + const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); + let i; + for (i = 0; i < numCodeLenCodes; ++i) { + codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); + } + const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); + len = 0; + i = 0; + const codes = numLitCodes + numDistCodes; + const codeLengths = new Uint8Array(codes); + let bitsLength, bitsOffset, what; + while (i < codes) { + const code = this.getCode(codeLenCodeTab); + if (code === 16) { + bitsLength = 2; + bitsOffset = 3; + what = len; + } else if (code === 17) { + bitsLength = 3; + bitsOffset = 3; + what = len = 0; + } else if (code === 18) { + bitsLength = 7; + bitsOffset = 11; + what = len = 0; + } else { + codeLengths[i++] = len = code; + continue; + } + let repeatLength = this.getBits(bitsLength) + bitsOffset; + while (repeatLength-- > 0) { + codeLengths[i++] = what; + } + } + litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); + distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); + } else { + throw new _util.FormatError("Unknown block type in flate stream"); + } + buffer = this.buffer; + let limit = buffer ? buffer.length : 0; + let pos = this.bufferLength; + while (true) { + let code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; + continue; + } + if (code1 === 256) { + this.bufferLength = pos; + return; + } + code1 -= 257; + code1 = lengthDecode[code1]; + let code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + const dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; + } + for (let k = 0; k < len; ++k, ++pos) { + buffer[pos] = buffer[pos - dist]; + } + } + } +} +exports.FlateStream = FlateStream; + +/***/ }), +/* 153 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Jbig2Stream = void 0; +var _base_stream = __w_pdfjs_require__(136); +var _decode_stream = __w_pdfjs_require__(148); +var _primitives = __w_pdfjs_require__(134); +var _jbig = __w_pdfjs_require__(154); +var _util = __w_pdfjs_require__(2); +class Jbig2Stream extends _decode_stream.DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + if (this.eof) { + return; + } + const jbig2Image = new _jbig.Jbig2Image(); + const chunks = []; + if (this.params instanceof _primitives.Dict) { + const globalsStream = this.params.get("JBIG2Globals"); + if (globalsStream instanceof _base_stream.BaseStream) { + const globals = globalsStream.getBytes(); + chunks.push({ + data: globals, + start: 0, + end: globals.length + }); + } + } + chunks.push({ + data: this.bytes, + start: 0, + end: this.bytes.length + }); + const data = jbig2Image.parseChunks(chunks); + const dataLength = data.length; + for (let i = 0; i < dataLength; i++) { + data[i] ^= 0xff; + } + this.buffer = data; + this.bufferLength = dataLength; + this.eof = true; + } +} +exports.Jbig2Stream = Jbig2Stream; + +/***/ }), +/* 154 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Jbig2Image = void 0; +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +var _arithmetic_decoder = __w_pdfjs_require__(155); +var _ccitt = __w_pdfjs_require__(151); +class Jbig2Error extends _util.BaseException { + constructor(msg) { + super(`JBIG2 error: ${msg}`, "Jbig2Error"); + } +} +class ContextCache { + getContexts(id) { + if (id in this) { + return this[id]; + } + return this[id] = new Int8Array(1 << 16); + } +} +class DecodingContext { + constructor(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + } + get decoder() { + const decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end); + return (0, _util.shadow)(this, "decoder", decoder); + } + get contextCache() { + const cache = new ContextCache(); + return (0, _util.shadow)(this, "contextCache", cache); + } +} +function decodeInteger(contextCache, procedure, decoder) { + const contexts = contextCache.getContexts(procedure); + let prev = 1; + function readBits(length) { + let v = 0; + for (let i = 0; i < length; i++) { + const bit = decoder.readBit(contexts, prev); + prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; + v = v << 1 | bit; + } + return v >>> 0; + } + const sign = readBits(1); + const value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2); + if (sign === 0) { + return value; + } else if (value > 0) { + return -value; + } + return null; +} +function decodeIAID(contextCache, decoder, codeLength) { + const contexts = contextCache.getContexts("IAID"); + let prev = 1; + for (let i = 0; i < codeLength; i++) { + const bit = decoder.readBit(contexts, prev); + prev = prev << 1 | bit; + } + if (codeLength < 31) { + return prev & (1 << codeLength) - 1; + } + return prev & 0x7fffffff; +} +const SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, "ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, "PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", "ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, "IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", "IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", "ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", "EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, "Extension"]; +const CodingTemplates = [[{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: 2, + y: -1 +}, { + x: -4, + y: 0 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: 2, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: 2, + y: -1 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -1, + y: -2 +}, { + x: 0, + y: -2 +}, { + x: 1, + y: -2 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}], [{ + x: -3, + y: -1 +}, { + x: -2, + y: -1 +}, { + x: -1, + y: -1 +}, { + x: 0, + y: -1 +}, { + x: 1, + y: -1 +}, { + x: -4, + y: 0 +}, { + x: -3, + y: 0 +}, { + x: -2, + y: 0 +}, { + x: -1, + y: 0 +}]]; +const RefinementTemplates = [{ + coding: [{ + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }], + reference: [{ + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }, { + x: 0, + y: 0 + }, { + x: 1, + y: 0 + }, { + x: -1, + y: 1 + }, { + x: 0, + y: 1 + }, { + x: 1, + y: 1 + }] +}, { + coding: [{ + x: -1, + y: -1 + }, { + x: 0, + y: -1 + }, { + x: 1, + y: -1 + }, { + x: -1, + y: 0 + }], + reference: [{ + x: 0, + y: -1 + }, { + x: -1, + y: 0 + }, { + x: 0, + y: 0 + }, { + x: 1, + y: 0 + }, { + x: 0, + y: 1 + }, { + x: 1, + y: 1 + }] +}]; +const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195]; +const RefinementReusedContexts = [0x0020, 0x0008]; +function decodeBitmapTemplate0(width, height, decodingContext) { + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GB"); + const bitmap = []; + let contextLabel, i, j, pixel, row, row1, row2; + const OLD_PIXEL_MASK = 0x7bf7; + for (i = 0; i < height; i++) { + row = bitmap[i] = new Uint8Array(width); + row1 = i < 1 ? row : bitmap[i - 1]; + row2 = i < 2 ? row : bitmap[i - 2]; + contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; + for (j = 0; j < width; j++) { + row[j] = pixel = decoder.readBit(contexts, contextLabel); + contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; + } + } + return bitmap; +} +function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { + if (mmr) { + const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); + return decodeMMRBitmap(input, width, height, false); + } + if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { + return decodeBitmapTemplate0(width, height, decodingContext); + } + const useskip = !!skip; + const template = CodingTemplates[templateIndex].concat(at); + template.sort(function (a, b) { + return a.y - b.y || a.x - b.x; + }); + const templateLength = template.length; + const templateX = new Int8Array(templateLength); + const templateY = new Int8Array(templateLength); + const changingTemplateEntries = []; + let reuseMask = 0, + minX = 0, + maxX = 0, + minY = 0; + let c, k; + for (k = 0; k < templateLength; k++) { + templateX[k] = template[k].x; + templateY[k] = template[k].y; + minX = Math.min(minX, template[k].x); + maxX = Math.max(maxX, template[k].x); + minY = Math.min(minY, template[k].y); + if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { + reuseMask |= 1 << templateLength - 1 - k; + } else { + changingTemplateEntries.push(k); + } + } + const changingEntriesLength = changingTemplateEntries.length; + const changingTemplateX = new Int8Array(changingEntriesLength); + const changingTemplateY = new Int8Array(changingEntriesLength); + const changingTemplateBit = new Uint16Array(changingEntriesLength); + for (c = 0; c < changingEntriesLength; c++) { + k = changingTemplateEntries[c]; + changingTemplateX[c] = template[k].x; + changingTemplateY[c] = template[k].y; + changingTemplateBit[c] = 1 << templateLength - 1 - k; + } + const sbb_left = -minX; + const sbb_top = -minY; + const sbb_right = width - maxX; + const pseudoPixelContext = ReusedContexts[templateIndex]; + let row = new Uint8Array(width); + const bitmap = []; + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GB"); + let ltp = 0, + j, + i0, + j0, + contextLabel = 0, + bit, + shift; + for (let i = 0; i < height; i++) { + if (prediction) { + const sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + bitmap.push(row); + continue; + } + } + row = new Uint8Array(row); + bitmap.push(row); + for (j = 0; j < width; j++) { + if (useskip && skip[i][j]) { + row[j] = 0; + continue; + } + if (j >= sbb_left && j < sbb_right && i >= sbb_top) { + contextLabel = contextLabel << 1 & reuseMask; + for (k = 0; k < changingEntriesLength; k++) { + i0 = i + changingTemplateY[k]; + j0 = j + changingTemplateX[k]; + bit = bitmap[i0][j0]; + if (bit) { + bit = changingTemplateBit[k]; + contextLabel |= bit; + } + } + } else { + contextLabel = 0; + shift = templateLength - 1; + for (k = 0; k < templateLength; k++, shift--) { + j0 = j + templateX[k]; + if (j0 >= 0 && j0 < width) { + i0 = i + templateY[k]; + if (i0 >= 0) { + bit = bitmap[i0][j0]; + if (bit) { + contextLabel |= bit << shift; + } + } + } + } + } + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; +} +function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { + let codingTemplate = RefinementTemplates[templateIndex].coding; + if (templateIndex === 0) { + codingTemplate = codingTemplate.concat([at[0]]); + } + const codingTemplateLength = codingTemplate.length; + const codingTemplateX = new Int32Array(codingTemplateLength); + const codingTemplateY = new Int32Array(codingTemplateLength); + let k; + for (k = 0; k < codingTemplateLength; k++) { + codingTemplateX[k] = codingTemplate[k].x; + codingTemplateY[k] = codingTemplate[k].y; + } + let referenceTemplate = RefinementTemplates[templateIndex].reference; + if (templateIndex === 0) { + referenceTemplate = referenceTemplate.concat([at[1]]); + } + const referenceTemplateLength = referenceTemplate.length; + const referenceTemplateX = new Int32Array(referenceTemplateLength); + const referenceTemplateY = new Int32Array(referenceTemplateLength); + for (k = 0; k < referenceTemplateLength; k++) { + referenceTemplateX[k] = referenceTemplate[k].x; + referenceTemplateY[k] = referenceTemplate[k].y; + } + const referenceWidth = referenceBitmap[0].length; + const referenceHeight = referenceBitmap.length; + const pseudoPixelContext = RefinementReusedContexts[templateIndex]; + const bitmap = []; + const decoder = decodingContext.decoder; + const contexts = decodingContext.contextCache.getContexts("GR"); + let ltp = 0; + for (let i = 0; i < height; i++) { + if (prediction) { + const sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + throw new Jbig2Error("prediction is not supported"); + } + } + const row = new Uint8Array(width); + bitmap.push(row); + for (let j = 0; j < width; j++) { + let i0, j0; + let contextLabel = 0; + for (k = 0; k < codingTemplateLength; k++) { + i0 = i + codingTemplateY[k]; + j0 = j + codingTemplateX[k]; + if (i0 < 0 || j0 < 0 || j0 >= width) { + contextLabel <<= 1; + } else { + contextLabel = contextLabel << 1 | bitmap[i0][j0]; + } + } + for (k = 0; k < referenceTemplateLength; k++) { + i0 = i + referenceTemplateY[k] - offsetY; + j0 = j + referenceTemplateX[k] - offsetX; + if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { + contextLabel <<= 1; + } else { + contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; + } + } + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; +} +function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) { + if (huffman && refinement) { + throw new Jbig2Error("symbol refinement with Huffman is not supported"); + } + const newSymbols = []; + let currentHeight = 0; + let symbolCodeLength = (0, _core_utils.log2)(symbols.length + numberOfNewSymbols); + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let tableB1, symbolWidths; + if (huffman) { + tableB1 = getStandardTable(1); + symbolWidths = []; + symbolCodeLength = Math.max(symbolCodeLength, 1); + } + while (newSymbols.length < numberOfNewSymbols) { + const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, "IADH", decoder); + currentHeight += deltaHeight; + let currentWidth = 0, + totalWidth = 0; + const firstSymbol = huffman ? symbolWidths.length : 0; + while (true) { + const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, "IADW", decoder); + if (deltaWidth === null) { + break; + } + currentWidth += deltaWidth; + totalWidth += currentWidth; + let bitmap; + if (refinement) { + const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); + if (numberOfInstances > 1) { + bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput); + } else { + const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); + const rdx = decodeInteger(contextCache, "IARDX", decoder); + const rdy = decodeInteger(contextCache, "IARDY", decoder); + const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; + bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); + } + newSymbols.push(bitmap); + } else if (huffman) { + symbolWidths.push(currentWidth); + } else { + bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); + newSymbols.push(bitmap); + } + } + if (huffman && !refinement) { + const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput); + huffmanInput.byteAlign(); + let collectiveBitmap; + if (bitmapSize === 0) { + collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight); + } else { + const originalEnd = huffmanInput.end; + const bitmapEnd = huffmanInput.position + bitmapSize; + huffmanInput.end = bitmapEnd; + collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false); + huffmanInput.end = originalEnd; + huffmanInput.position = bitmapEnd; + } + const numberOfSymbolsDecoded = symbolWidths.length; + if (firstSymbol === numberOfSymbolsDecoded - 1) { + newSymbols.push(collectiveBitmap); + } else { + let i, + y, + xMin = 0, + xMax, + bitmapWidth, + symbolBitmap; + for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) { + bitmapWidth = symbolWidths[i]; + xMax = xMin + bitmapWidth; + symbolBitmap = []; + for (y = 0; y < currentHeight; y++) { + symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); + } + newSymbols.push(symbolBitmap); + xMin = xMax; + } + } + } + } + const exportedSymbols = [], + flags = []; + let currentFlag = false, + i, + ii; + const totalSymbolsLength = symbols.length + numberOfNewSymbols; + while (flags.length < totalSymbolsLength) { + let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder); + while (runLength--) { + flags.push(currentFlag); + } + currentFlag = !currentFlag; + } + for (i = 0, ii = symbols.length; i < ii; i++) { + if (flags[i]) { + exportedSymbols.push(symbols[i]); + } + } + for (let j = 0; j < numberOfNewSymbols; i++, j++) { + if (flags[i]) { + exportedSymbols.push(newSymbols[j]); + } + } + return exportedSymbols; +} +function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) { + if (huffman && refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); + } + const bitmap = []; + let i, row; + for (i = 0; i < height; i++) { + row = new Uint8Array(width); + if (defaultPixelValue) { + for (let j = 0; j < width; j++) { + row[j] = defaultPixelValue; + } + } + bitmap.push(row); + } + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, "IADT", decoder); + let firstS = 0; + i = 0; + while (i < numberOfSymbolInstances) { + const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, "IADT", decoder); + stripT += deltaT; + const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, "IAFS", decoder); + firstS += deltaFirstS; + let currentS = firstS; + do { + let currentT = 0; + if (stripSize > 1) { + currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", decoder); + } + const t = stripSize * stripT + currentT; + const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength); + const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, "IARI", decoder)); + let symbolBitmap = inputSymbols[symbolId]; + let symbolWidth = symbolBitmap[0].length; + let symbolHeight = symbolBitmap.length; + if (applyRefinement) { + const rdw = decodeInteger(contextCache, "IARDW", decoder); + const rdh = decodeInteger(contextCache, "IARDH", decoder); + const rdx = decodeInteger(contextCache, "IARDX", decoder); + const rdy = decodeInteger(contextCache, "IARDY", decoder); + symbolWidth += rdw; + symbolHeight += rdh; + symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); + } + const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1); + const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0); + let s2, t2, symbolRow; + if (transposed) { + for (s2 = 0; s2 < symbolHeight; s2++) { + row = bitmap[offsetS + s2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[s2]; + const maxWidth = Math.min(width - offsetT, symbolWidth); + switch (combinationOperator) { + case 0: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] |= symbolRow[t2]; + } + break; + case 2: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] ^= symbolRow[t2]; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + currentS += symbolHeight - 1; + } else { + for (t2 = 0; t2 < symbolHeight; t2++) { + row = bitmap[offsetT + t2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[t2]; + switch (combinationOperator) { + case 0: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] |= symbolRow[s2]; + } + break; + case 2: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] ^= symbolRow[s2]; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + currentS += symbolWidth - 1; + } + i++; + const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, "IADS", decoder); + if (deltaS === null) { + break; + } + currentS += deltaS + dsOffset; + } while (true); + } + return bitmap; +} +function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) { + const at = []; + if (!mmr) { + at.push({ + x: -patternWidth, + y: 0 + }); + if (template === 0) { + at.push({ + x: -3, + y: -1 + }, { + x: 2, + y: -2 + }, { + x: -2, + y: -2 + }); + } + } + const collectiveWidth = (maxPatternIndex + 1) * patternWidth; + const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext); + const patterns = []; + for (let i = 0; i <= maxPatternIndex; i++) { + const patternBitmap = []; + const xMin = patternWidth * i; + const xMax = xMin + patternWidth; + for (let y = 0; y < patternHeight; y++) { + patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); + } + patterns.push(patternBitmap); + } + return patterns; +} +function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) { + const skip = null; + if (enableSkip) { + throw new Jbig2Error("skip is not supported"); + } + if (combinationOperator !== 0) { + throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`); + } + const regionBitmap = []; + let i, j, row; + for (i = 0; i < regionHeight; i++) { + row = new Uint8Array(regionWidth); + if (defaultPixelValue) { + for (j = 0; j < regionWidth; j++) { + row[j] = defaultPixelValue; + } + } + regionBitmap.push(row); + } + const numberOfPatterns = patterns.length; + const pattern0 = patterns[0]; + const patternWidth = pattern0[0].length, + patternHeight = pattern0.length; + const bitsPerValue = (0, _core_utils.log2)(numberOfPatterns); + const at = []; + if (!mmr) { + at.push({ + x: template <= 1 ? 3 : 2, + y: -1 + }); + if (template === 0) { + at.push({ + x: -3, + y: -1 + }, { + x: 2, + y: -2 + }, { + x: -2, + y: -2 + }); + } + } + const grayScaleBitPlanes = []; + let mmrInput, bitmap; + if (mmr) { + mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); + } + for (i = bitsPerValue - 1; i >= 0; i--) { + if (mmr) { + bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true); + } else { + bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext); + } + grayScaleBitPlanes[i] = bitmap; + } + let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow; + for (mg = 0; mg < gridHeight; mg++) { + for (ng = 0; ng < gridWidth; ng++) { + bit = 0; + patternIndex = 0; + for (j = bitsPerValue - 1; j >= 0; j--) { + bit ^= grayScaleBitPlanes[j][mg][ng]; + patternIndex |= bit << j; + } + patternBitmap = patterns[patternIndex]; + x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8; + y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8; + if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) { + for (i = 0; i < patternHeight; i++) { + regionRow = regionBitmap[y + i]; + patternRow = patternBitmap[i]; + for (j = 0; j < patternWidth; j++) { + regionRow[x + j] |= patternRow[j]; + } + } + } else { + let regionX, regionY; + for (i = 0; i < patternHeight; i++) { + regionY = y + i; + if (regionY < 0 || regionY >= regionHeight) { + continue; + } + regionRow = regionBitmap[regionY]; + patternRow = patternBitmap[i]; + for (j = 0; j < patternWidth; j++) { + regionX = x + j; + if (regionX >= 0 && regionX < regionWidth) { + regionRow[regionX] |= patternRow[j]; + } + } + } + } + } + } + return regionBitmap; +} +function readSegmentHeader(data, start) { + const segmentHeader = {}; + segmentHeader.number = (0, _core_utils.readUint32)(data, start); + const flags = data[start + 4]; + const segmentType = flags & 0x3f; + if (!SegmentTypes[segmentType]) { + throw new Jbig2Error("invalid segment type: " + segmentType); + } + segmentHeader.type = segmentType; + segmentHeader.typeName = SegmentTypes[segmentType]; + segmentHeader.deferredNonRetain = !!(flags & 0x80); + const pageAssociationFieldSize = !!(flags & 0x40); + const referredFlags = data[start + 5]; + let referredToCount = referredFlags >> 5 & 7; + const retainBits = [referredFlags & 31]; + let position = start + 6; + if (referredFlags === 7) { + referredToCount = (0, _core_utils.readUint32)(data, position - 1) & 0x1fffffff; + position += 3; + let bytes = referredToCount + 7 >> 3; + retainBits[0] = data[position++]; + while (--bytes > 0) { + retainBits.push(data[position++]); + } + } else if (referredFlags === 5 || referredFlags === 6) { + throw new Jbig2Error("invalid referred-to flags"); + } + segmentHeader.retainBits = retainBits; + let referredToSegmentNumberSize = 4; + if (segmentHeader.number <= 256) { + referredToSegmentNumberSize = 1; + } else if (segmentHeader.number <= 65536) { + referredToSegmentNumberSize = 2; + } + const referredTo = []; + let i, ii; + for (i = 0; i < referredToCount; i++) { + let number; + if (referredToSegmentNumberSize === 1) { + number = data[position]; + } else if (referredToSegmentNumberSize === 2) { + number = (0, _core_utils.readUint16)(data, position); + } else { + number = (0, _core_utils.readUint32)(data, position); + } + referredTo.push(number); + position += referredToSegmentNumberSize; + } + segmentHeader.referredTo = referredTo; + if (!pageAssociationFieldSize) { + segmentHeader.pageAssociation = data[position++]; + } else { + segmentHeader.pageAssociation = (0, _core_utils.readUint32)(data, position); + position += 4; + } + segmentHeader.length = (0, _core_utils.readUint32)(data, position); + position += 4; + if (segmentHeader.length === 0xffffffff) { + if (segmentType === 38) { + const genericRegionInfo = readRegionSegmentInformation(data, position); + const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; + const genericRegionMmr = !!(genericRegionSegmentFlags & 1); + const searchPatternLength = 6; + const searchPattern = new Uint8Array(searchPatternLength); + if (!genericRegionMmr) { + searchPattern[0] = 0xff; + searchPattern[1] = 0xac; + } + searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff; + searchPattern[3] = genericRegionInfo.height >> 16 & 0xff; + searchPattern[4] = genericRegionInfo.height >> 8 & 0xff; + searchPattern[5] = genericRegionInfo.height & 0xff; + for (i = position, ii = data.length; i < ii; i++) { + let j = 0; + while (j < searchPatternLength && searchPattern[j] === data[i + j]) { + j++; + } + if (j === searchPatternLength) { + segmentHeader.length = i + searchPatternLength; + break; + } + } + if (segmentHeader.length === 0xffffffff) { + throw new Jbig2Error("segment end was not found"); + } + } else { + throw new Jbig2Error("invalid unknown segment length"); + } + } + segmentHeader.headerEnd = position; + return segmentHeader; +} +function readSegments(header, data, start, end) { + const segments = []; + let position = start; + while (position < end) { + const segmentHeader = readSegmentHeader(data, position); + position = segmentHeader.headerEnd; + const segment = { + header: segmentHeader, + data + }; + if (!header.randomAccess) { + segment.start = position; + position += segmentHeader.length; + segment.end = position; + } + segments.push(segment); + if (segmentHeader.type === 51) { + break; + } + } + if (header.randomAccess) { + for (let i = 0, ii = segments.length; i < ii; i++) { + segments[i].start = position; + position += segments[i].header.length; + segments[i].end = position; + } + } + return segments; +} +function readRegionSegmentInformation(data, start) { + return { + width: (0, _core_utils.readUint32)(data, start), + height: (0, _core_utils.readUint32)(data, start + 4), + x: (0, _core_utils.readUint32)(data, start + 8), + y: (0, _core_utils.readUint32)(data, start + 12), + combinationOperator: data[start + 16] & 7 + }; +} +const RegionSegmentInformationFieldLength = 17; +function processSegment(segment, visitor) { + const header = segment.header; + const data = segment.data, + end = segment.end; + let position = segment.start; + let args, at, i, atLength; + switch (header.type) { + case 0: + const dictionary = {}; + const dictionaryFlags = (0, _core_utils.readUint16)(data, position); + dictionary.huffman = !!(dictionaryFlags & 1); + dictionary.refinement = !!(dictionaryFlags & 2); + dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; + dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; + dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; + dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; + dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); + dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); + dictionary.template = dictionaryFlags >> 10 & 3; + dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; + position += 2; + if (!dictionary.huffman) { + atLength = dictionary.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: (0, _core_utils.readInt8)(data, position), + y: (0, _core_utils.readInt8)(data, position + 1) + }); + position += 2; + } + dictionary.at = at; + } + if (dictionary.refinement && !dictionary.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: (0, _core_utils.readInt8)(data, position), + y: (0, _core_utils.readInt8)(data, position + 1) + }); + position += 2; + } + dictionary.refinementAt = at; + } + dictionary.numberOfExportedSymbols = (0, _core_utils.readUint32)(data, position); + position += 4; + dictionary.numberOfNewSymbols = (0, _core_utils.readUint32)(data, position); + position += 4; + args = [dictionary, header.number, header.referredTo, data, position, end]; + break; + case 6: + case 7: + const textRegion = {}; + textRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const textRegionSegmentFlags = (0, _core_utils.readUint16)(data, position); + position += 2; + textRegion.huffman = !!(textRegionSegmentFlags & 1); + textRegion.refinement = !!(textRegionSegmentFlags & 2); + textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3; + textRegion.stripSize = 1 << textRegion.logStripSize; + textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; + textRegion.transposed = !!(textRegionSegmentFlags & 64); + textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; + textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; + textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; + textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; + if (textRegion.huffman) { + const textRegionHuffmanFlags = (0, _core_utils.readUint16)(data, position); + position += 2; + textRegion.huffmanFS = textRegionHuffmanFlags & 3; + textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; + textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; + textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; + textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; + textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; + textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; + textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000); + } + if (textRegion.refinement && !textRegion.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: (0, _core_utils.readInt8)(data, position), + y: (0, _core_utils.readInt8)(data, position + 1) + }); + position += 2; + } + textRegion.refinementAt = at; + } + textRegion.numberOfSymbolInstances = (0, _core_utils.readUint32)(data, position); + position += 4; + args = [textRegion, header.referredTo, data, position, end]; + break; + case 16: + const patternDictionary = {}; + const patternDictionaryFlags = data[position++]; + patternDictionary.mmr = !!(patternDictionaryFlags & 1); + patternDictionary.template = patternDictionaryFlags >> 1 & 3; + patternDictionary.patternWidth = data[position++]; + patternDictionary.patternHeight = data[position++]; + patternDictionary.maxPatternIndex = (0, _core_utils.readUint32)(data, position); + position += 4; + args = [patternDictionary, header.number, data, position, end]; + break; + case 22: + case 23: + const halftoneRegion = {}; + halftoneRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const halftoneRegionFlags = data[position++]; + halftoneRegion.mmr = !!(halftoneRegionFlags & 1); + halftoneRegion.template = halftoneRegionFlags >> 1 & 3; + halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8); + halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7; + halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1; + halftoneRegion.gridWidth = (0, _core_utils.readUint32)(data, position); + position += 4; + halftoneRegion.gridHeight = (0, _core_utils.readUint32)(data, position); + position += 4; + halftoneRegion.gridOffsetX = (0, _core_utils.readUint32)(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridOffsetY = (0, _core_utils.readUint32)(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridVectorX = (0, _core_utils.readUint16)(data, position); + position += 2; + halftoneRegion.gridVectorY = (0, _core_utils.readUint16)(data, position); + position += 2; + args = [halftoneRegion, header.referredTo, data, position, end]; + break; + case 38: + case 39: + const genericRegion = {}; + genericRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const genericRegionSegmentFlags = data[position++]; + genericRegion.mmr = !!(genericRegionSegmentFlags & 1); + genericRegion.template = genericRegionSegmentFlags >> 1 & 3; + genericRegion.prediction = !!(genericRegionSegmentFlags & 8); + if (!genericRegion.mmr) { + atLength = genericRegion.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: (0, _core_utils.readInt8)(data, position), + y: (0, _core_utils.readInt8)(data, position + 1) + }); + position += 2; + } + genericRegion.at = at; + } + args = [genericRegion, data, position, end]; + break; + case 48: + const pageInfo = { + width: (0, _core_utils.readUint32)(data, position), + height: (0, _core_utils.readUint32)(data, position + 4), + resolutionX: (0, _core_utils.readUint32)(data, position + 8), + resolutionY: (0, _core_utils.readUint32)(data, position + 12) + }; + if (pageInfo.height === 0xffffffff) { + delete pageInfo.height; + } + const pageSegmentFlags = data[position + 16]; + (0, _core_utils.readUint16)(data, position + 17); + pageInfo.lossless = !!(pageSegmentFlags & 1); + pageInfo.refinement = !!(pageSegmentFlags & 2); + pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; + pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; + pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); + pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); + args = [pageInfo]; + break; + case 49: + break; + case 50: + break; + case 51: + break; + case 53: + args = [header.number, data, position, end]; + break; + case 62: + break; + default: + throw new Jbig2Error(`segment type ${header.typeName}(${header.type}) is not implemented`); + } + const callbackName = "on" + header.typeName; + if (callbackName in visitor) { + visitor[callbackName].apply(visitor, args); + } +} +function processSegments(segments, visitor) { + for (let i = 0, ii = segments.length; i < ii; i++) { + processSegment(segments[i], visitor); + } +} +function parseJbig2Chunks(chunks) { + const visitor = new SimpleSegmentVisitor(); + for (let i = 0, ii = chunks.length; i < ii; i++) { + const chunk = chunks[i]; + const segments = readSegments({}, chunk.data, chunk.start, chunk.end); + processSegments(segments, visitor); + } + return visitor.buffer; +} +function parseJbig2(data) { + throw new Error("Not implemented: parseJbig2"); +} +class SimpleSegmentVisitor { + onPageInformation(info) { + this.currentPageInfo = info; + const rowSize = info.width + 7 >> 3; + const buffer = new Uint8ClampedArray(rowSize * info.height); + if (info.defaultPixelValue) { + buffer.fill(0xff); + } + this.buffer = buffer; + } + drawBitmap(regionInfo, bitmap) { + const pageInfo = this.currentPageInfo; + const width = regionInfo.width, + height = regionInfo.height; + const rowSize = pageInfo.width + 7 >> 3; + const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; + const buffer = this.buffer; + const mask0 = 128 >> (regionInfo.x & 7); + let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); + let i, j, mask, offset; + switch (combinationOperator) { + case 0: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] |= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + case 2: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] ^= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + default: + throw new Jbig2Error(`operator ${combinationOperator} is not supported`); + } + } + onImmediateGenericRegion(region, data, start, end) { + const regionInfo = region.info; + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessGenericRegion() { + this.onImmediateGenericRegion(...arguments); + } + onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { + let huffmanTables, huffmanInput; + if (dictionary.huffman) { + huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables); + huffmanInput = new Reader(data, start, end); + } + let symbols = this.symbols; + if (!symbols) { + this.symbols = symbols = {}; + } + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); + } + } + const decodingContext = new DecodingContext(data, start, end); + symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput); + } + onImmediateTextRegion(region, referredSegments, data, start, end) { + const regionInfo = region.info; + let huffmanTables, huffmanInput; + const symbols = this.symbols; + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); + } + } + const symbolCodeLength = (0, _core_utils.log2)(inputSymbols.length); + if (region.huffman) { + huffmanInput = new Reader(data, start, end); + huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput); + } + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessTextRegion() { + this.onImmediateTextRegion(...arguments); + } + onPatternDictionary(dictionary, currentSegment, data, start, end) { + let patterns = this.patterns; + if (!patterns) { + this.patterns = patterns = {}; + } + const decodingContext = new DecodingContext(data, start, end); + patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext); + } + onImmediateHalftoneRegion(region, referredSegments, data, start, end) { + const patterns = this.patterns[referredSegments[0]]; + const regionInfo = region.info; + const decodingContext = new DecodingContext(data, start, end); + const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext); + this.drawBitmap(regionInfo, bitmap); + } + onImmediateLosslessHalftoneRegion() { + this.onImmediateHalftoneRegion(...arguments); + } + onTables(currentSegment, data, start, end) { + let customTables = this.customTables; + if (!customTables) { + this.customTables = customTables = {}; + } + customTables[currentSegment] = decodeTablesSegment(data, start, end); + } +} +class HuffmanLine { + constructor(lineData) { + if (lineData.length === 2) { + this.isOOB = true; + this.rangeLow = 0; + this.prefixLength = lineData[0]; + this.rangeLength = 0; + this.prefixCode = lineData[1]; + this.isLowerRange = false; + } else { + this.isOOB = false; + this.rangeLow = lineData[0]; + this.prefixLength = lineData[1]; + this.rangeLength = lineData[2]; + this.prefixCode = lineData[3]; + this.isLowerRange = lineData[4] === "lower"; + } + } +} +class HuffmanTreeNode { + constructor(line) { + this.children = []; + if (line) { + this.isLeaf = true; + this.rangeLength = line.rangeLength; + this.rangeLow = line.rangeLow; + this.isLowerRange = line.isLowerRange; + this.isOOB = line.isOOB; + } else { + this.isLeaf = false; + } + } + buildTree(line, shift) { + const bit = line.prefixCode >> shift & 1; + if (shift <= 0) { + this.children[bit] = new HuffmanTreeNode(line); + } else { + let node = this.children[bit]; + if (!node) { + this.children[bit] = node = new HuffmanTreeNode(null); + } + node.buildTree(line, shift - 1); + } + } + decodeNode(reader) { + if (this.isLeaf) { + if (this.isOOB) { + return null; + } + const htOffset = reader.readBits(this.rangeLength); + return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset); + } + const node = this.children[reader.readBit()]; + if (!node) { + throw new Jbig2Error("invalid Huffman data"); + } + return node.decodeNode(reader); + } +} +class HuffmanTable { + constructor(lines, prefixCodesDone) { + if (!prefixCodesDone) { + this.assignPrefixCodes(lines); + } + this.rootNode = new HuffmanTreeNode(null); + for (let i = 0, ii = lines.length; i < ii; i++) { + const line = lines[i]; + if (line.prefixLength > 0) { + this.rootNode.buildTree(line, line.prefixLength - 1); + } + } + } + decode(reader) { + return this.rootNode.decodeNode(reader); + } + assignPrefixCodes(lines) { + const linesLength = lines.length; + let prefixLengthMax = 0; + for (let i = 0; i < linesLength; i++) { + prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength); + } + const histogram = new Uint32Array(prefixLengthMax + 1); + for (let i = 0; i < linesLength; i++) { + histogram[lines[i].prefixLength]++; + } + let currentLength = 1, + firstCode = 0, + currentCode, + currentTemp, + line; + histogram[0] = 0; + while (currentLength <= prefixLengthMax) { + firstCode = firstCode + histogram[currentLength - 1] << 1; + currentCode = firstCode; + currentTemp = 0; + while (currentTemp < linesLength) { + line = lines[currentTemp]; + if (line.prefixLength === currentLength) { + line.prefixCode = currentCode; + currentCode++; + } + currentTemp++; + } + currentLength++; + } + } +} +function decodeTablesSegment(data, start, end) { + const flags = data[start]; + const lowestValue = (0, _core_utils.readUint32)(data, start + 1) & 0xffffffff; + const highestValue = (0, _core_utils.readUint32)(data, start + 5) & 0xffffffff; + const reader = new Reader(data, start + 9, end); + const prefixSizeBits = (flags >> 1 & 7) + 1; + const rangeSizeBits = (flags >> 4 & 7) + 1; + const lines = []; + let prefixLength, + rangeLength, + currentRangeLow = lowestValue; + do { + prefixLength = reader.readBits(prefixSizeBits); + rangeLength = reader.readBits(rangeSizeBits); + lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0])); + currentRangeLow += 1 << rangeLength; + } while (currentRangeLow < highestValue); + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"])); + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0])); + if (flags & 1) { + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([prefixLength, 0])); + } + return new HuffmanTable(lines, false); +} +const standardTablesCache = {}; +function getStandardTable(number) { + let table = standardTablesCache[number]; + if (table) { + return table; + } + let lines; + switch (number) { + case 1: + lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]]; + break; + case 2: + lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 0x3e], [6, 0x3f]]; + break; + case 3: + lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]]; + break; + case 4: + lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 0x1f]]; + break; + case 5: + lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]]; + break; + case 6: + lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]]; + break; + case 7: + lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]]; + break; + case 8: + lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]]; + break; + case 9: + lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], [39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], [779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]]; + break; + case 10: + lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], [2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]]; + break; + case 11: + lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; + break; + case 12: + lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 0xfe], [73, 8, 32, 0xff]]; + break; + case 13: + lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; + break; + case 14: + lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]]; + break; + case 15: + lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 0x7e, "lower"], [25, 7, 32, 0x7f]]; + break; + default: + throw new Jbig2Error(`standard table B.${number} does not exist`); + } + for (let i = 0, ii = lines.length; i < ii; i++) { + lines[i] = new HuffmanLine(lines[i]); + } + table = new HuffmanTable(lines, true); + standardTablesCache[number] = table; + return table; +} +class Reader { + constructor(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + this.position = start; + this.shift = -1; + this.currentByte = 0; + } + readBit() { + if (this.shift < 0) { + if (this.position >= this.end) { + throw new Jbig2Error("end of data while reading bit"); + } + this.currentByte = this.data[this.position++]; + this.shift = 7; + } + const bit = this.currentByte >> this.shift & 1; + this.shift--; + return bit; + } + readBits(numBits) { + let result = 0, + i; + for (i = numBits - 1; i >= 0; i--) { + result |= this.readBit() << i; + } + return result; + } + byteAlign() { + this.shift = -1; + } + next() { + if (this.position >= this.end) { + return -1; + } + return this.data[this.position++]; + } +} +function getCustomHuffmanTable(index, referredTo, customTables) { + let currentIndex = 0; + for (let i = 0, ii = referredTo.length; i < ii; i++) { + const table = customTables[referredTo[i]]; + if (table) { + if (index === currentIndex) { + return table; + } + currentIndex++; + } + } + throw new Jbig2Error("can't find custom Huffman table"); +} +function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) { + const codes = []; + for (let i = 0; i <= 34; i++) { + const codeLength = reader.readBits(4); + codes.push(new HuffmanLine([i, codeLength, 0, 0])); + } + const runCodesTable = new HuffmanTable(codes, false); + codes.length = 0; + for (let i = 0; i < numberOfSymbols;) { + const codeLength = runCodesTable.decode(reader); + if (codeLength >= 32) { + let repeatedLength, numberOfRepeats, j; + switch (codeLength) { + case 32: + if (i === 0) { + throw new Jbig2Error("no previous value in symbol ID table"); + } + numberOfRepeats = reader.readBits(2) + 3; + repeatedLength = codes[i - 1].prefixLength; + break; + case 33: + numberOfRepeats = reader.readBits(3) + 3; + repeatedLength = 0; + break; + case 34: + numberOfRepeats = reader.readBits(7) + 11; + repeatedLength = 0; + break; + default: + throw new Jbig2Error("invalid code length in symbol ID table"); + } + for (j = 0; j < numberOfRepeats; j++) { + codes.push(new HuffmanLine([i, repeatedLength, 0, 0])); + i++; + } + } else { + codes.push(new HuffmanLine([i, codeLength, 0, 0])); + i++; + } + } + reader.byteAlign(); + const symbolIDTable = new HuffmanTable(codes, false); + let customIndex = 0, + tableFirstS, + tableDeltaS, + tableDeltaT; + switch (textRegion.huffmanFS) { + case 0: + case 1: + tableFirstS = getStandardTable(textRegion.huffmanFS + 6); + break; + case 3: + tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman FS selector"); + } + switch (textRegion.huffmanDS) { + case 0: + case 1: + case 2: + tableDeltaS = getStandardTable(textRegion.huffmanDS + 8); + break; + case 3: + tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DS selector"); + } + switch (textRegion.huffmanDT) { + case 0: + case 1: + case 2: + tableDeltaT = getStandardTable(textRegion.huffmanDT + 11); + break; + case 3: + tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DT selector"); + } + if (textRegion.refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); + } + return { + symbolIDTable, + tableFirstS, + tableDeltaS, + tableDeltaT + }; +} +function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) { + let customIndex = 0, + tableDeltaHeight, + tableDeltaWidth; + switch (dictionary.huffmanDHSelector) { + case 0: + case 1: + tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4); + break; + case 3: + tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DH selector"); + } + switch (dictionary.huffmanDWSelector) { + case 0: + case 1: + tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2); + break; + case 3: + tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DW selector"); + } + let tableBitmapSize, tableAggregateInstances; + if (dictionary.bitmapSizeSelector) { + tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables); + customIndex++; + } else { + tableBitmapSize = getStandardTable(1); + } + if (dictionary.aggregationInstancesSelector) { + tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables); + } else { + tableAggregateInstances = getStandardTable(1); + } + return { + tableDeltaHeight, + tableDeltaWidth, + tableBitmapSize, + tableAggregateInstances + }; +} +function readUncompressedBitmap(reader, width, height) { + const bitmap = []; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + for (let x = 0; x < width; x++) { + row[x] = reader.readBit(); + } + reader.byteAlign(); + } + return bitmap; +} +function decodeMMRBitmap(input, width, height, endOfBlock) { + const params = { + K: -1, + Columns: width, + Rows: height, + BlackIs1: true, + EndOfBlock: endOfBlock + }; + const decoder = new _ccitt.CCITTFaxDecoder(input, params); + const bitmap = []; + let currentByte, + eof = false; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + let shift = -1; + for (let x = 0; x < width; x++) { + if (shift < 0) { + currentByte = decoder.readNextChar(); + if (currentByte === -1) { + currentByte = 0; + eof = true; + } + shift = 7; + } + row[x] = currentByte >> shift & 1; + shift--; + } + } + if (endOfBlock && !eof) { + const lookForEOFLimit = 5; + for (let i = 0; i < lookForEOFLimit; i++) { + if (decoder.readNextChar() === -1) { + break; + } + } + } + return bitmap; +} +class Jbig2Image { + parseChunks(chunks) { + return parseJbig2Chunks(chunks); + } + parse(data) { + throw new Error("Not implemented: Jbig2Image.parse"); + } +} +exports.Jbig2Image = Jbig2Image; + +/***/ }), +/* 155 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ArithmeticDecoder = void 0; +const QeTable = [{ + qe: 0x5601, + nmps: 1, + nlps: 1, + switchFlag: 1 +}, { + qe: 0x3401, + nmps: 2, + nlps: 6, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 3, + nlps: 9, + switchFlag: 0 +}, { + qe: 0x0ac1, + nmps: 4, + nlps: 12, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 5, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 38, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 7, + nlps: 6, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 8, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 9, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 10, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 11, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 12, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x1c01, + nmps: 13, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 29, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 15, + nlps: 14, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 16, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x5101, + nmps: 17, + nlps: 15, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 18, + nlps: 16, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 19, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x3401, + nmps: 20, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 21, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2801, + nmps: 22, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 23, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x2201, + nmps: 24, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x1c01, + nmps: 25, + nlps: 22, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 26, + nlps: 23, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 27, + nlps: 24, + switchFlag: 0 +}, { + qe: 0x1401, + nmps: 28, + nlps: 25, + switchFlag: 0 +}, { + qe: 0x1201, + nmps: 29, + nlps: 26, + switchFlag: 0 +}, { + qe: 0x1101, + nmps: 30, + nlps: 27, + switchFlag: 0 +}, { + qe: 0x0ac1, + nmps: 31, + nlps: 28, + switchFlag: 0 +}, { + qe: 0x09c1, + nmps: 32, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x08a1, + nmps: 33, + nlps: 30, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 34, + nlps: 31, + switchFlag: 0 +}, { + qe: 0x0441, + nmps: 35, + nlps: 32, + switchFlag: 0 +}, { + qe: 0x02a1, + nmps: 36, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 37, + nlps: 34, + switchFlag: 0 +}, { + qe: 0x0141, + nmps: 38, + nlps: 35, + switchFlag: 0 +}, { + qe: 0x0111, + nmps: 39, + nlps: 36, + switchFlag: 0 +}, { + qe: 0x0085, + nmps: 40, + nlps: 37, + switchFlag: 0 +}, { + qe: 0x0049, + nmps: 41, + nlps: 38, + switchFlag: 0 +}, { + qe: 0x0025, + nmps: 42, + nlps: 39, + switchFlag: 0 +}, { + qe: 0x0015, + nmps: 43, + nlps: 40, + switchFlag: 0 +}, { + qe: 0x0009, + nmps: 44, + nlps: 41, + switchFlag: 0 +}, { + qe: 0x0005, + nmps: 45, + nlps: 42, + switchFlag: 0 +}, { + qe: 0x0001, + nmps: 45, + nlps: 43, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 46, + nlps: 46, + switchFlag: 0 +}]; +class ArithmeticDecoder { + constructor(data, start, end) { + this.data = data; + this.bp = start; + this.dataEnd = end; + this.chigh = data[start]; + this.clow = 0; + this.byteIn(); + this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f; + this.clow = this.clow << 7 & 0xffff; + this.ct -= 7; + this.a = 0x8000; + } + byteIn() { + const data = this.data; + let bp = this.bp; + if (data[bp] === 0xff) { + if (data[bp + 1] > 0x8f) { + this.clow += 0xff00; + this.ct = 8; + } else { + bp++; + this.clow += data[bp] << 9; + this.ct = 7; + this.bp = bp; + } + } else { + bp++; + this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00; + this.ct = 8; + this.bp = bp; + } + if (this.clow > 0xffff) { + this.chigh += this.clow >> 16; + this.clow &= 0xffff; + } + } + readBit(contexts, pos) { + let cx_index = contexts[pos] >> 1, + cx_mps = contexts[pos] & 1; + const qeTableIcx = QeTable[cx_index]; + const qeIcx = qeTableIcx.qe; + let d; + let a = this.a - qeIcx; + if (this.chigh < qeIcx) { + if (a < qeIcx) { + a = qeIcx; + d = cx_mps; + cx_index = qeTableIcx.nmps; + } else { + a = qeIcx; + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } + } else { + this.chigh -= qeIcx; + if ((a & 0x8000) !== 0) { + this.a = a; + return cx_mps; + } + if (a < qeIcx) { + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } else { + d = cx_mps; + cx_index = qeTableIcx.nmps; + } + } + do { + if (this.ct === 0) { + this.byteIn(); + } + a <<= 1; + this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1; + this.clow = this.clow << 1 & 0xffff; + this.ct--; + } while ((a & 0x8000) === 0); + this.a = a; + contexts[pos] = cx_index << 1 | cx_mps; + return d; + } +} +exports.ArithmeticDecoder = ArithmeticDecoder; + +/***/ }), +/* 156 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.JpegStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +var _primitives = __w_pdfjs_require__(134); +var _jpg = __w_pdfjs_require__(157); +var _util = __w_pdfjs_require__(2); +class JpegStream extends _decode_stream.DecodeStream { + constructor(stream, maybeLength, params) { + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === 0xff) { + stream.skip(-1); + break; + } + } + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + var this_byte=this.stream.getBytes(this.maybeLength); + // console.log('获取bytes',this_byte); + // var image_src=URL.createObjectURL( + // new Blob([this_byte], { type: `image/jpg` }) + // ); + // console.log('图片链接',image_src); + var img_byte=(0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength)); + // console.log('获取bytes结果',img_byte); + return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + if (this.eof) { + return; + } + const jpegOptions = { + decodeTransform: undefined, + colorTransform: undefined + }; + const decodeArr = this.dict.getArray("D", "Decode"); + if (this.forceRGB && Array.isArray(decodeArr)) { + const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8; + const decodeArrLength = decodeArr.length; + const transform = new Int32Array(decodeArrLength); + let transformNeeded = false; + const maxValue = (1 << bitsPerComponent) - 1; + for (let i = 0; i < decodeArrLength; i += 2) { + transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0; + transform[i + 1] = decodeArr[i] * maxValue | 0; + if (transform[i] !== 256 || transform[i + 1] !== 0) { + transformNeeded = true; + } + } + if (transformNeeded) { + jpegOptions.decodeTransform = transform; + } + } + if (this.params instanceof _primitives.Dict) { + const colorTransform = this.params.get("ColorTransform"); + if (Number.isInteger(colorTransform)) { + jpegOptions.colorTransform = colorTransform; + } + } + const jpegImage = new _jpg.JpegImage(jpegOptions); + jpegImage.parse(this.bytes); + const data = jpegImage.getData({ + width: this.drawWidth, + height: this.drawHeight, + forceRGB: this.forceRGB, + isSourcePDF: true + }); + this.buffer = data; + this.bufferLength = data.length; + this.eof = true; + } +} +exports.JpegStream = JpegStream; + +/***/ }), +/* 157 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.JpegImage = void 0; +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +class JpegError extends _util.BaseException { + constructor(msg) { + super(`JPEG error: ${msg}`, "JpegError"); + } +} +class DNLMarkerError extends _util.BaseException { + constructor(message, scanLines) { + super(message, "DNLMarkerError"); + this.scanLines = scanLines; + } +} +class EOIMarkerError extends _util.BaseException { + constructor(msg) { + super(msg, "EOIMarkerError"); + } +} +const dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]); +const dctCos1 = 4017; +const dctSin1 = 799; +const dctCos3 = 3406; +const dctSin3 = 2276; +const dctCos6 = 1567; +const dctSin6 = 3784; +const dctSqrt2 = 5793; +const dctSqrt1d2 = 2896; +function buildHuffmanTable(codeLengths, values) { + let k = 0, + i, + j, + length = 16; + while (length > 0 && !codeLengths[length - 1]) { + length--; + } + const code = [{ + children: [], + index: 0 + }]; + let p = code[0], + q; + for (i = 0; i < length; i++) { + for (j = 0; j < codeLengths[i]; j++) { + p = code.pop(); + p.children[p.index] = values[k]; + while (p.index > 0) { + p = code.pop(); + } + p.index++; + code.push(p); + while (code.length <= i) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + k++; + } + if (i + 1 < length) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; +} +function getBlockBufferOffset(component, row, col) { + return 64 * ((component.blocksPerLine + 1) * row + col); +} +function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) { + let parseDNLMarker = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : false; + const mcusPerLine = frame.mcusPerLine; + const progressive = frame.progressive; + const startOffset = offset; + let bitsData = 0, + bitsCount = 0; + function readBit() { + if (bitsCount > 0) { + bitsCount--; + return bitsData >> bitsCount & 1; + } + bitsData = data[offset++]; + if (bitsData === 0xff) { + const nextByte = data[offset++]; + if (nextByte) { + if (nextByte === 0xdc && parseDNLMarker) { + offset += 2; + const scanLines = (0, _core_utils.readUint16)(data, offset); + offset += 2; + if (scanLines > 0 && scanLines !== frame.scanLines) { + throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines); + } + } else if (nextByte === 0xd9) { + if (parseDNLMarker) { + const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); + if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) { + throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines); + } + } + throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data"); + } + throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`); + } + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + let node = tree; + while (true) { + node = node[readBit()]; + switch (typeof node) { + case "number": + return node; + case "object": + continue; + } + throw new JpegError("invalid huffman sequence"); + } + } + function receive(length) { + let n = 0; + while (length > 0) { + n = n << 1 | readBit(); + length--; + } + return n; + } + function receiveAndExtend(length) { + if (length === 1) { + return readBit() === 1 ? 1 : -1; + } + const n = receive(length); + if (n >= 1 << length - 1) { + return n; + } + return n + (-1 << length) + 1; + } + function decodeBaseline(component, blockOffset) { + const t = decodeHuffman(component.huffmanTableDC); + const diff = t === 0 ? 0 : receiveAndExtend(t); + component.blockData[blockOffset] = component.pred += diff; + let k = 1; + while (k < 64) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = receiveAndExtend(s); + k++; + } + } + function decodeDCFirst(component, blockOffset) { + const t = decodeHuffman(component.huffmanTableDC); + const diff = t === 0 ? 0 : receiveAndExtend(t) << successive; + component.blockData[blockOffset] = component.pred += diff; + } + function decodeDCSuccessive(component, blockOffset) { + component.blockData[blockOffset] |= readBit() << successive; + } + let eobrun = 0; + function decodeACFirst(component, blockOffset) { + if (eobrun > 0) { + eobrun--; + return; + } + let k = spectralStart; + const e = spectralEnd; + while (k <= e) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive); + k++; + } + } + let successiveACState = 0, + successiveACNextValue; + function decodeACSuccessive(component, blockOffset) { + let k = spectralStart; + const e = spectralEnd; + let r = 0; + let s; + let rs; + while (k <= e) { + const offsetZ = blockOffset + dctZigZag[k]; + const sign = component.blockData[offsetZ] < 0 ? -1 : 1; + switch (successiveACState) { + case 0: + rs = decodeHuffman(component.huffmanTableAC); + s = rs & 15; + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r); + successiveACState = 4; + } else { + r = 16; + successiveACState = 1; + } + } else { + if (s !== 1) { + throw new JpegError("invalid ACn encoding"); + } + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + case 1: + case 2: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + r--; + if (r === 0) { + successiveACState = successiveACState === 2 ? 3 : 0; + } + } + break; + case 3: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + component.blockData[offsetZ] = successiveACNextValue << successive; + successiveACState = 0; + } + break; + case 4: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } + break; + } + k++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) { + successiveACState = 0; + } + } + } + let blockRow = 0; + function decodeMcu(component, decode, mcu, row, col) { + const mcuRow = mcu / mcusPerLine | 0; + const mcuCol = mcu % mcusPerLine; + blockRow = mcuRow * component.v + row; + const blockCol = mcuCol * component.h + col; + const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, blockOffset); + } + function decodeBlock(component, decode, mcu) { + blockRow = mcu / component.blocksPerLine | 0; + const blockCol = mcu % component.blocksPerLine; + const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, blockOffset); + } + const componentsLength = components.length; + let component, i, j, k, n; + let decodeFn; + if (progressive) { + if (spectralStart === 0) { + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + } else { + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } + } else { + decodeFn = decodeBaseline; + } + let mcu = 0, + fileMarker; + let mcuExpected; + if (componentsLength === 1) { + mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; + } else { + mcuExpected = mcusPerLine * frame.mcusPerColumn; + } + let h, v; + while (mcu <= mcuExpected) { + const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected; + if (mcuToRead > 0) { + for (i = 0; i < componentsLength; i++) { + components[i].pred = 0; + } + eobrun = 0; + if (componentsLength === 1) { + component = components[0]; + for (n = 0; n < mcuToRead; n++) { + decodeBlock(component, decodeFn, mcu); + mcu++; + } + } else { + for (n = 0; n < mcuToRead; n++) { + for (i = 0; i < componentsLength; i++) { + component = components[i]; + h = component.h; + v = component.v; + for (j = 0; j < v; j++) { + for (k = 0; k < h; k++) { + decodeMcu(component, decodeFn, mcu, j, k); + } + } + } + mcu++; + } + } + } + bitsCount = 0; + fileMarker = findNextFileMarker(data, offset); + if (!fileMarker) { + break; + } + if (fileMarker.invalid) { + const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive"; + (0, _util.warn)(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`); + offset = fileMarker.offset; + } + if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) { + offset += 2; + } else { + break; + } + } + return offset - startOffset; +} +function quantizeAndInverse(component, blockBufferOffset, p) { + const qt = component.quantizationTable, + blockData = component.blockData; + let v0, v1, v2, v3, v4, v5, v6, v7; + let p0, p1, p2, p3, p4, p5, p6, p7; + let t; + if (!qt) { + throw new JpegError("missing required Quantization Table."); + } + for (let row = 0; row < 64; row += 8) { + p0 = blockData[blockBufferOffset + row]; + p1 = blockData[blockBufferOffset + row + 1]; + p2 = blockData[blockBufferOffset + row + 2]; + p3 = blockData[blockBufferOffset + row + 3]; + p4 = blockData[blockBufferOffset + row + 4]; + p5 = blockData[blockBufferOffset + row + 5]; + p6 = blockData[blockBufferOffset + row + 6]; + p7 = blockData[blockBufferOffset + row + 7]; + p0 *= qt[row]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 512 >> 10; + p[row] = t; + p[row + 1] = t; + p[row + 2] = t; + p[row + 3] = t; + p[row + 4] = t; + p[row + 5] = t; + p[row + 6] = t; + p[row + 7] = t; + continue; + } + p1 *= qt[row + 1]; + p2 *= qt[row + 2]; + p3 *= qt[row + 3]; + p4 *= qt[row + 4]; + p5 *= qt[row + 5]; + p6 *= qt[row + 6]; + p7 *= qt[row + 7]; + v0 = dctSqrt2 * p0 + 128 >> 8; + v1 = dctSqrt2 * p4 + 128 >> 8; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8; + v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8; + v5 = p3 << 4; + v6 = p5 << 4; + v0 = v0 + v1 + 1 >> 1; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; + v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p[row] = v0 + v7; + p[row + 7] = v0 - v7; + p[row + 1] = v1 + v6; + p[row + 6] = v1 - v6; + p[row + 2] = v2 + v5; + p[row + 5] = v2 - v5; + p[row + 3] = v3 + v4; + p[row + 4] = v3 - v4; + } + for (let col = 0; col < 8; ++col) { + p0 = p[col]; + p1 = p[col + 8]; + p2 = p[col + 16]; + p3 = p[col + 24]; + p4 = p[col + 32]; + p5 = p[col + 40]; + p6 = p[col + 48]; + p7 = p[col + 56]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 8192 >> 14; + if (t < -2040) { + t = 0; + } else if (t >= 2024) { + t = 255; + } else { + t = t + 2056 >> 4; + } + blockData[blockBufferOffset + col] = t; + blockData[blockBufferOffset + col + 8] = t; + blockData[blockBufferOffset + col + 16] = t; + blockData[blockBufferOffset + col + 24] = t; + blockData[blockBufferOffset + col + 32] = t; + blockData[blockBufferOffset + col + 40] = t; + blockData[blockBufferOffset + col + 48] = t; + blockData[blockBufferOffset + col + 56] = t; + continue; + } + v0 = dctSqrt2 * p0 + 2048 >> 12; + v1 = dctSqrt2 * p4 + 2048 >> 12; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12; + v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12; + v5 = p3; + v6 = p5; + v0 = (v0 + v1 + 1 >> 1) + 4112; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; + v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p0 = v0 + v7; + p7 = v0 - v7; + p1 = v1 + v6; + p6 = v1 - v6; + p2 = v2 + v5; + p5 = v2 - v5; + p3 = v3 + v4; + p4 = v3 - v4; + if (p0 < 16) { + p0 = 0; + } else if (p0 >= 4080) { + p0 = 255; + } else { + p0 >>= 4; + } + if (p1 < 16) { + p1 = 0; + } else if (p1 >= 4080) { + p1 = 255; + } else { + p1 >>= 4; + } + if (p2 < 16) { + p2 = 0; + } else if (p2 >= 4080) { + p2 = 255; + } else { + p2 >>= 4; + } + if (p3 < 16) { + p3 = 0; + } else if (p3 >= 4080) { + p3 = 255; + } else { + p3 >>= 4; + } + if (p4 < 16) { + p4 = 0; + } else if (p4 >= 4080) { + p4 = 255; + } else { + p4 >>= 4; + } + if (p5 < 16) { + p5 = 0; + } else if (p5 >= 4080) { + p5 = 255; + } else { + p5 >>= 4; + } + if (p6 < 16) { + p6 = 0; + } else if (p6 >= 4080) { + p6 = 255; + } else { + p6 >>= 4; + } + if (p7 < 16) { + p7 = 0; + } else if (p7 >= 4080) { + p7 = 255; + } else { + p7 >>= 4; + } + blockData[blockBufferOffset + col] = p0; + blockData[blockBufferOffset + col + 8] = p1; + blockData[blockBufferOffset + col + 16] = p2; + blockData[blockBufferOffset + col + 24] = p3; + blockData[blockBufferOffset + col + 32] = p4; + blockData[blockBufferOffset + col + 40] = p5; + blockData[blockBufferOffset + col + 48] = p6; + blockData[blockBufferOffset + col + 56] = p7; + } +} +function buildComponentData(frame, component) { + const blocksPerLine = component.blocksPerLine; + const blocksPerColumn = component.blocksPerColumn; + const computationBuffer = new Int16Array(64); + for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) { + const offset = getBlockBufferOffset(component, blockRow, blockCol); + quantizeAndInverse(component, offset, computationBuffer); + } + } + return component.blockData; +} +function findNextFileMarker(data, currentPos) { + let startPos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : currentPos; + const maxPos = data.length - 1; + let newPos = startPos < currentPos ? startPos : currentPos; + if (currentPos >= maxPos) { + return null; + } + const currentMarker = (0, _core_utils.readUint16)(data, currentPos); + if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { + return { + invalid: null, + marker: currentMarker, + offset: currentPos + }; + } + let newMarker = (0, _core_utils.readUint16)(data, newPos); + while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { + if (++newPos >= maxPos) { + return null; + } + newMarker = (0, _core_utils.readUint16)(data, newPos); + } + return { + invalid: currentMarker.toString(16), + marker: newMarker, + offset: newPos + }; +} +class JpegImage { + constructor() { + let { + decodeTransform = null, + colorTransform = -1 + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this._decodeTransform = decodeTransform; + this._colorTransform = colorTransform; + } + parse(data) { + let { + dnlScanLines = null + } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + function readDataBlock() { + const length = (0, _core_utils.readUint16)(data, offset); + offset += 2; + let endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, endOffset, offset); + if (fileMarker && fileMarker.invalid) { + (0, _util.warn)("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); + endOffset = fileMarker.offset; + } + const array = data.subarray(offset, endOffset); + offset += array.length; + return array; + } + function prepareComponents(frame) { + const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); + const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); + for (const component of frame.components) { + const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); + const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); + const blocksPerLineForMcu = mcusPerLine * component.h; + const blocksPerColumnForMcu = mcusPerColumn * component.v; + const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); + component.blockData = new Int16Array(blocksBufferSize); + component.blocksPerLine = blocksPerLine; + component.blocksPerColumn = blocksPerColumn; + } + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; + } + let offset = 0; + let jfif = null; + let adobe = null; + let frame, resetInterval; + let numSOSMarkers = 0; + const quantizationTables = []; + const huffmanTablesAC = [], + huffmanTablesDC = []; + let fileMarker = (0, _core_utils.readUint16)(data, offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = (0, _core_utils.readUint16)(data, offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + let i, j, l; + switch (fileMarker) { + case 0xffe0: + case 0xffe1: + case 0xffe2: + case 0xffe3: + case 0xffe4: + case 0xffe5: + case 0xffe6: + case 0xffe7: + case 0xffe8: + case 0xffe9: + case 0xffea: + case 0xffeb: + case 0xffec: + case 0xffed: + case 0xffee: + case 0xffef: + case 0xfffe: + const appData = readDataBlock(); + if (fileMarker === 0xffe0) { + if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { + jfif = { + version: { + major: appData[5], + minor: appData[6] + }, + densityUnits: appData[7], + xDensity: appData[8] << 8 | appData[9], + yDensity: appData[10] << 8 | appData[11], + thumbWidth: appData[12], + thumbHeight: appData[13], + thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) + }; + } + } + if (fileMarker === 0xffee) { + if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) { + adobe = { + version: appData[5] << 8 | appData[6], + flags0: appData[7] << 8 | appData[8], + flags1: appData[9] << 8 | appData[10], + transformCode: appData[11] + }; + } + } + break; + case 0xffdb: + const quantizationTablesLength = (0, _core_utils.readUint16)(data, offset); + offset += 2; + const quantizationTablesEnd = quantizationTablesLength + offset - 2; + let z; + while (offset < quantizationTablesEnd) { + const quantizationTableSpec = data[offset++]; + const tableData = new Uint16Array(64); + if (quantizationTableSpec >> 4 === 0) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = data[offset++]; + } + } else if (quantizationTableSpec >> 4 === 1) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = (0, _core_utils.readUint16)(data, offset); + offset += 2; + } + } else { + throw new JpegError("DQT - invalid table spec"); + } + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + case 0xffc0: + case 0xffc1: + case 0xffc2: + if (frame) { + throw new JpegError("Only single frame JPEGs supported"); + } + offset += 2; + frame = {}; + frame.extended = fileMarker === 0xffc1; + frame.progressive = fileMarker === 0xffc2; + frame.precision = data[offset++]; + const sofScanLines = (0, _core_utils.readUint16)(data, offset); + offset += 2; + frame.scanLines = dnlScanLines || sofScanLines; + frame.samplesPerLine = (0, _core_utils.readUint16)(data, offset); + offset += 2; + frame.components = []; + frame.componentIds = {}; + const componentsCount = data[offset++]; + let maxH = 0, + maxV = 0; + for (i = 0; i < componentsCount; i++) { + const componentId = data[offset]; + const h = data[offset + 1] >> 4; + const v = data[offset + 1] & 15; + if (maxH < h) { + maxH = h; + } + if (maxV < v) { + maxV = v; + } + const qId = data[offset + 2]; + l = frame.components.push({ + h, + v, + quantizationId: qId, + quantizationTable: null + }); + frame.componentIds[componentId] = l - 1; + offset += 3; + } + frame.maxH = maxH; + frame.maxV = maxV; + prepareComponents(frame); + break; + case 0xffc4: + const huffmanLength = (0, _core_utils.readUint16)(data, offset); + offset += 2; + for (i = 2; i < huffmanLength;) { + const huffmanTableSpec = data[offset++]; + const codeLengths = new Uint8Array(16); + let codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) { + codeLengthSum += codeLengths[j] = data[offset]; + } + const huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) { + huffmanValues[j] = data[offset]; + } + i += 17 + codeLengthSum; + (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); + } + break; + case 0xffdd: + offset += 2; + resetInterval = (0, _core_utils.readUint16)(data, offset); + offset += 2; + break; + case 0xffda: + const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines; + offset += 2; + const selectorsCount = data[offset++], + components = []; + for (i = 0; i < selectorsCount; i++) { + const index = data[offset++]; + const componentIndex = frame.componentIds[index]; + const component = frame.components[componentIndex]; + component.index = index; + const tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + const spectralStart = data[offset++], + spectralEnd = data[offset++], + successiveApproximation = data[offset++]; + try { + const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker); + offset += processed; + } catch (ex) { + if (ex instanceof DNLMarkerError) { + (0, _util.warn)(`${ex.message} -- attempting to re-parse the JPEG image.`); + return this.parse(data, { + dnlScanLines: ex.scanLines + }); + } else if (ex instanceof EOIMarkerError) { + (0, _util.warn)(`${ex.message} -- ignoring the rest of the image data.`); + break markerLoop; + } + throw ex; + } + break; + case 0xffdc: + offset += 4; + break; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; + default: + const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3); + if (nextFileMarker && nextFileMarker.invalid) { + (0, _util.warn)("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid); + offset = nextFileMarker.offset; + break; + } + if (!nextFileMarker || offset >= data.length - 1) { + (0, _util.warn)("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9)."); + break markerLoop; + } + throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16)); + } + fileMarker = (0, _core_utils.readUint16)(data, offset); + offset += 2; + } + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; + this.components = []; + for (const component of frame.components) { + const quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } + this.components.push({ + index: component.index, + output: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV, + blocksPerLine: component.blocksPerLine, + blocksPerColumn: component.blocksPerColumn + }); + } + this.numComponents = this.components.length; + return undefined; + } + _getLinearizedBlockData(width, height) { + let isSourcePDF = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + const scaleX = this.width / width, + scaleY = this.height / height; + let component, componentScaleX, componentScaleY, blocksPerScanline; + let x, y, i, j, k; + let index; + let offset = 0; + let output; + const numComponents = this.components.length; + const dataLength = width * height * numComponents; + const data = new Uint8ClampedArray(dataLength); + const xScaleBlockOffset = new Uint32Array(width); + const mask3LSB = 0xfffffff8; + let lastComponentScaleX; + for (i = 0; i < numComponents; i++) { + component = this.components[i]; + componentScaleX = component.scaleX * scaleX; + componentScaleY = component.scaleY * scaleY; + offset = i; + output = component.output; + blocksPerScanline = component.blocksPerLine + 1 << 3; + if (componentScaleX !== lastComponentScaleX) { + for (x = 0; x < width; x++) { + j = 0 | x * componentScaleX; + xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7; + } + lastComponentScaleX = componentScaleX; + } + for (y = 0; y < height; y++) { + j = 0 | y * componentScaleY; + index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; + for (x = 0; x < width; x++) { + data[offset] = output[index + xScaleBlockOffset[x]]; + offset += numComponents; + } + } + } + let transform = this._decodeTransform; + if (!isSourcePDF && numComponents === 4 && !transform) { + transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]); + } + if (transform) { + for (i = 0; i < dataLength;) { + for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { + data[i] = (data[i] * transform[k] >> 8) + transform[k + 1]; + } + } + } + return data; + } + get _isColorConversionNeeded() { + if (this.adobe) { + return !!this.adobe.transformCode; + } + if (this.numComponents === 3) { + if (this._colorTransform === 0) { + return false; + } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) { + return false; + } + return true; + } + if (this._colorTransform === 1) { + return true; + } + return false; + } + _convertYccToRgb(data) { + let Y, Cb, Cr; + for (let i = 0, length = data.length; i < length; i += 3) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = Y - 179.456 + 1.402 * Cr; + data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; + data[i + 2] = Y - 226.816 + 1.772 * Cb; + } + return data; + } + _convertYcckToRgb(data) { + let Y, Cb, Cr, k; + let offset = 0; + for (let i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + k = data[i + 3]; + data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); + data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); + data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); + } + return data.subarray(0, offset); + } + _convertYcckToCmyk(data) { + let Y, Cb, Cr; + for (let i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = 434.456 - Y - 1.402 * Cr; + data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr; + data[i + 2] = 481.816 - Y - 1.772 * Cb; + } + return data; + } + _convertCmykToRgb(data) { + let c, m, y, k; + let offset = 0; + for (let i = 0, length = data.length; i < length; i += 4) { + c = data[i]; + m = data[i + 1]; + y = data[i + 2]; + k = data[i + 3]; + data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); + data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); + data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); + } + return data.subarray(0, offset); + } + getData(_ref) { + let { + width, + height, + forceRGB = false, + isSourcePDF = false + } = _ref; + if (this.numComponents > 4) { + throw new JpegError("Unsupported color mode"); + } + const data = this._getLinearizedBlockData(width, height, isSourcePDF); + if (this.numComponents === 1 && forceRGB) { + const rgbData = new Uint8ClampedArray(data.length * 3); + let offset = 0; + for (const grayColor of data) { + rgbData[offset++] = grayColor; + rgbData[offset++] = grayColor; + rgbData[offset++] = grayColor; + } + return rgbData; + } else if (this.numComponents === 3 && this._isColorConversionNeeded) { + return this._convertYccToRgb(data); + } else if (this.numComponents === 4) { + if (this._isColorConversionNeeded) { + if (forceRGB) { + return this._convertYcckToRgb(data); + } + return this._convertYcckToCmyk(data); + } else if (forceRGB) { + return this._convertCmykToRgb(data); + } + } + return data; + } +} +exports.JpegImage = JpegImage; + +/***/ }), +/* 158 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.JpxStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +var _jpx = __w_pdfjs_require__(159); +var _util = __w_pdfjs_require__(2); +class JpxStream extends _decode_stream.DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + readBlock() { + if (this.eof) { + return; + } + const jpxImage = new _jpx.JpxImage(); + jpxImage.parse(this.bytes); + const width = jpxImage.width; + const height = jpxImage.height; + const componentsCount = jpxImage.componentsCount; + const tileCount = jpxImage.tiles.length; + if (tileCount === 1) { + this.buffer = jpxImage.tiles[0].items; + } else { + const data = new Uint8ClampedArray(width * height * componentsCount); + for (let k = 0; k < tileCount; k++) { + const tileComponents = jpxImage.tiles[k]; + const tileWidth = tileComponents.width; + const tileHeight = tileComponents.height; + const tileLeft = tileComponents.left; + const tileTop = tileComponents.top; + const src = tileComponents.items; + let srcPosition = 0; + let dataPosition = (width * tileTop + tileLeft) * componentsCount; + const imgRowSize = width * componentsCount; + const tileRowSize = tileWidth * componentsCount; + for (let j = 0; j < tileHeight; j++) { + const rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); + data.set(rowBytes, dataPosition); + srcPosition += tileRowSize; + dataPosition += imgRowSize; + } + } + this.buffer = data; + } + this.bufferLength = this.buffer.length; + this.eof = true; + } +} +exports.JpxStream = JpxStream; + +/***/ }), +/* 159 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.JpxImage = void 0; +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +var _arithmetic_decoder = __w_pdfjs_require__(155); +class JpxError extends _util.BaseException { + constructor(msg) { + super(`JPX error: ${msg}`, "JpxError"); + } +} +const SubbandsGainLog2 = { + LL: 0, + LH: 1, + HL: 1, + HH: 2 +}; +class JpxImage { + constructor() { + this.failOnCorruptedImage = false; + } + parse(data) { + const head = (0, _core_utils.readUint16)(data, 0); + if (head === 0xff4f) { + this.parseCodestream(data, 0, data.length); + return; + } + const length = data.length; + let position = 0; + while (position < length) { + let headerSize = 8; + let lbox = (0, _core_utils.readUint32)(data, position); + const tbox = (0, _core_utils.readUint32)(data, position + 4); + position += headerSize; + if (lbox === 1) { + lbox = (0, _core_utils.readUint32)(data, position) * 4294967296 + (0, _core_utils.readUint32)(data, position + 4); + position += 8; + headerSize += 8; + } + if (lbox === 0) { + lbox = length - position + headerSize; + } + if (lbox < headerSize) { + throw new JpxError("Invalid box field size"); + } + const dataLength = lbox - headerSize; + let jumpDataLength = true; + switch (tbox) { + case 0x6a703268: + jumpDataLength = false; + break; + case 0x636f6c72: + const method = data[position]; + if (method === 1) { + const colorspace = (0, _core_utils.readUint32)(data, position + 3); + switch (colorspace) { + case 16: + case 17: + case 18: + break; + default: + (0, _util.warn)("Unknown colorspace " + colorspace); + break; + } + } else if (method === 2) { + (0, _util.info)("ICC profile not supported"); + } + break; + case 0x6a703263: + this.parseCodestream(data, position, position + dataLength); + break; + case 0x6a502020: + if ((0, _core_utils.readUint32)(data, position) !== 0x0d0a870a) { + (0, _util.warn)("Invalid JP2 signature"); + } + break; + case 0x6a501a1a: + case 0x66747970: + case 0x72726571: + case 0x72657320: + case 0x69686472: + break; + default: + const headerType = String.fromCharCode(tbox >> 24 & 0xff, tbox >> 16 & 0xff, tbox >> 8 & 0xff, tbox & 0xff); + (0, _util.warn)(`Unsupported header type ${tbox} (${headerType}).`); + break; + } + if (jumpDataLength) { + position += dataLength; + } + } + } + parseImageProperties(stream) { + let newByte = stream.getByte(); + while (newByte >= 0) { + const oldByte = newByte; + newByte = stream.getByte(); + const code = oldByte << 8 | newByte; + if (code === 0xff51) { + stream.skip(4); + const Xsiz = stream.getInt32() >>> 0; + const Ysiz = stream.getInt32() >>> 0; + const XOsiz = stream.getInt32() >>> 0; + const YOsiz = stream.getInt32() >>> 0; + stream.skip(16); + const Csiz = stream.getUint16(); + this.width = Xsiz - XOsiz; + this.height = Ysiz - YOsiz; + this.componentsCount = Csiz; + this.bitsPerComponent = 8; + return; + } + } + throw new JpxError("No size marker found in JPX stream"); + } + parseCodestream(data, start, end) { + const context = {}; + let doNotRecover = false; + try { + let position = start; + while (position + 1 < end) { + const code = (0, _core_utils.readUint16)(data, position); + position += 2; + let length = 0, + j, + sqcd, + spqcds, + spqcdSize, + scalarExpounded, + tile; + switch (code) { + case 0xff4f: + context.mainHeader = true; + break; + case 0xffd9: + break; + case 0xff51: + length = (0, _core_utils.readUint16)(data, position); + const siz = {}; + siz.Xsiz = (0, _core_utils.readUint32)(data, position + 4); + siz.Ysiz = (0, _core_utils.readUint32)(data, position + 8); + siz.XOsiz = (0, _core_utils.readUint32)(data, position + 12); + siz.YOsiz = (0, _core_utils.readUint32)(data, position + 16); + siz.XTsiz = (0, _core_utils.readUint32)(data, position + 20); + siz.YTsiz = (0, _core_utils.readUint32)(data, position + 24); + siz.XTOsiz = (0, _core_utils.readUint32)(data, position + 28); + siz.YTOsiz = (0, _core_utils.readUint32)(data, position + 32); + const componentsCount = (0, _core_utils.readUint16)(data, position + 36); + siz.Csiz = componentsCount; + const components = []; + j = position + 38; + for (let i = 0; i < componentsCount; i++) { + const component = { + precision: (data[j] & 0x7f) + 1, + isSigned: !!(data[j] & 0x80), + XRsiz: data[j + 1], + YRsiz: data[j + 2] + }; + j += 3; + calculateComponentDimensions(component, siz); + components.push(component); + } + context.SIZ = siz; + context.components = components; + calculateTileGrids(context, components); + context.QCC = []; + context.COC = []; + break; + case 0xff5c: + length = (0, _core_utils.readUint16)(data, position); + const qcd = {}; + j = position + 2; + sqcd = data[j++]; + switch (sqcd & 0x1f) { + case 0: + spqcdSize = 8; + scalarExpounded = true; + break; + case 1: + spqcdSize = 16; + scalarExpounded = false; + break; + case 2: + spqcdSize = 16; + scalarExpounded = true; + break; + default: + throw new Error("Invalid SQcd value " + sqcd); + } + qcd.noQuantization = spqcdSize === 8; + qcd.scalarExpounded = scalarExpounded; + qcd.guardBits = sqcd >> 5; + spqcds = []; + while (j < length + position) { + const spqcd = {}; + if (spqcdSize === 8) { + spqcd.epsilon = data[j++] >> 3; + spqcd.mu = 0; + } else { + spqcd.epsilon = data[j] >> 3; + spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1]; + j += 2; + } + spqcds.push(spqcd); + } + qcd.SPqcds = spqcds; + if (context.mainHeader) { + context.QCD = qcd; + } else { + context.currentTile.QCD = qcd; + context.currentTile.QCC = []; + } + break; + case 0xff5d: + length = (0, _core_utils.readUint16)(data, position); + const qcc = {}; + j = position + 2; + let cqcc; + if (context.SIZ.Csiz < 257) { + cqcc = data[j++]; + } else { + cqcc = (0, _core_utils.readUint16)(data, j); + j += 2; + } + sqcd = data[j++]; + switch (sqcd & 0x1f) { + case 0: + spqcdSize = 8; + scalarExpounded = true; + break; + case 1: + spqcdSize = 16; + scalarExpounded = false; + break; + case 2: + spqcdSize = 16; + scalarExpounded = true; + break; + default: + throw new Error("Invalid SQcd value " + sqcd); + } + qcc.noQuantization = spqcdSize === 8; + qcc.scalarExpounded = scalarExpounded; + qcc.guardBits = sqcd >> 5; + spqcds = []; + while (j < length + position) { + const spqcd = {}; + if (spqcdSize === 8) { + spqcd.epsilon = data[j++] >> 3; + spqcd.mu = 0; + } else { + spqcd.epsilon = data[j] >> 3; + spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1]; + j += 2; + } + spqcds.push(spqcd); + } + qcc.SPqcds = spqcds; + if (context.mainHeader) { + context.QCC[cqcc] = qcc; + } else { + context.currentTile.QCC[cqcc] = qcc; + } + break; + case 0xff52: + length = (0, _core_utils.readUint16)(data, position); + const cod = {}; + j = position + 2; + const scod = data[j++]; + cod.entropyCoderWithCustomPrecincts = !!(scod & 1); + cod.sopMarkerUsed = !!(scod & 2); + cod.ephMarkerUsed = !!(scod & 4); + cod.progressionOrder = data[j++]; + cod.layersCount = (0, _core_utils.readUint16)(data, j); + j += 2; + cod.multipleComponentTransform = data[j++]; + cod.decompositionLevelsCount = data[j++]; + cod.xcb = (data[j++] & 0xf) + 2; + cod.ycb = (data[j++] & 0xf) + 2; + const blockStyle = data[j++]; + cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); + cod.resetContextProbabilities = !!(blockStyle & 2); + cod.terminationOnEachCodingPass = !!(blockStyle & 4); + cod.verticallyStripe = !!(blockStyle & 8); + cod.predictableTermination = !!(blockStyle & 16); + cod.segmentationSymbolUsed = !!(blockStyle & 32); + cod.reversibleTransformation = data[j++]; + if (cod.entropyCoderWithCustomPrecincts) { + const precinctsSizes = []; + while (j < length + position) { + const precinctsSize = data[j++]; + precinctsSizes.push({ + PPx: precinctsSize & 0xf, + PPy: precinctsSize >> 4 + }); + } + cod.precinctsSizes = precinctsSizes; + } + const unsupported = []; + if (cod.selectiveArithmeticCodingBypass) { + unsupported.push("selectiveArithmeticCodingBypass"); + } + if (cod.terminationOnEachCodingPass) { + unsupported.push("terminationOnEachCodingPass"); + } + if (cod.verticallyStripe) { + unsupported.push("verticallyStripe"); + } + if (cod.predictableTermination) { + unsupported.push("predictableTermination"); + } + if (unsupported.length > 0) { + doNotRecover = true; + (0, _util.warn)(`JPX: Unsupported COD options (${unsupported.join(", ")}).`); + } + if (context.mainHeader) { + context.COD = cod; + } else { + context.currentTile.COD = cod; + context.currentTile.COC = []; + } + break; + case 0xff90: + length = (0, _core_utils.readUint16)(data, position); + tile = {}; + tile.index = (0, _core_utils.readUint16)(data, position + 2); + tile.length = (0, _core_utils.readUint32)(data, position + 4); + tile.dataEnd = tile.length + position - 2; + tile.partIndex = data[position + 8]; + tile.partsCount = data[position + 9]; + context.mainHeader = false; + if (tile.partIndex === 0) { + tile.COD = context.COD; + tile.COC = context.COC.slice(0); + tile.QCD = context.QCD; + tile.QCC = context.QCC.slice(0); + } + context.currentTile = tile; + break; + case 0xff93: + tile = context.currentTile; + if (tile.partIndex === 0) { + initializeTile(context, tile.index); + buildPackets(context); + } + length = tile.dataEnd - position; + parseTilePackets(context, data, position, length); + break; + case 0xff53: + (0, _util.warn)("JPX: Codestream code 0xFF53 (COC) is not implemented."); + case 0xff55: + case 0xff57: + case 0xff58: + case 0xff64: + length = (0, _core_utils.readUint16)(data, position); + break; + default: + throw new Error("Unknown codestream code: " + code.toString(16)); + } + position += length; + } + } catch (e) { + if (doNotRecover || this.failOnCorruptedImage) { + throw new JpxError(e.message); + } else { + (0, _util.warn)(`JPX: Trying to recover from: "${e.message}".`); + } + } + this.tiles = transformComponents(context); + this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; + this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; + this.componentsCount = context.SIZ.Csiz; + } +} +exports.JpxImage = JpxImage; +function calculateComponentDimensions(component, siz) { + component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); + component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); + component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); + component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); + component.width = component.x1 - component.x0; + component.height = component.y1 - component.y0; +} +function calculateTileGrids(context, components) { + const siz = context.SIZ; + const tiles = []; + let tile; + const numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); + const numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); + for (let q = 0; q < numYtiles; q++) { + for (let p = 0; p < numXtiles; p++) { + tile = {}; + tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); + tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); + tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); + tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); + tile.width = tile.tx1 - tile.tx0; + tile.height = tile.ty1 - tile.ty0; + tile.components = []; + tiles.push(tile); + } + } + context.tiles = tiles; + const componentsCount = siz.Csiz; + for (let i = 0, ii = componentsCount; i < ii; i++) { + const component = components[i]; + for (let j = 0, jj = tiles.length; j < jj; j++) { + const tileComponent = {}; + tile = tiles[j]; + tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); + tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); + tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); + tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); + tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; + tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; + tile.components[i] = tileComponent; + } + } +} +function getBlocksDimensions(context, component, r) { + const codOrCoc = component.codingStyleParameters; + const result = {}; + if (!codOrCoc.entropyCoderWithCustomPrecincts) { + result.PPx = 15; + result.PPy = 15; + } else { + result.PPx = codOrCoc.precinctsSizes[r].PPx; + result.PPy = codOrCoc.precinctsSizes[r].PPy; + } + result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx); + result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy); + return result; +} +function buildPrecincts(context, resolution, dimensions) { + const precinctWidth = 1 << dimensions.PPx; + const precinctHeight = 1 << dimensions.PPy; + const isZeroRes = resolution.resLevel === 0; + const precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1); + const precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1); + const numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0; + const numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0; + const numprecincts = numprecinctswide * numprecinctshigh; + resolution.precinctParameters = { + precinctWidth, + precinctHeight, + numprecinctswide, + numprecinctshigh, + numprecincts, + precinctWidthInSubband, + precinctHeightInSubband + }; +} +function buildCodeblocks(context, subband, dimensions) { + const xcb_ = dimensions.xcb_; + const ycb_ = dimensions.ycb_; + const codeblockWidth = 1 << xcb_; + const codeblockHeight = 1 << ycb_; + const cbx0 = subband.tbx0 >> xcb_; + const cby0 = subband.tby0 >> ycb_; + const cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_; + const cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_; + const precinctParameters = subband.resolution.precinctParameters; + const codeblocks = []; + const precincts = []; + let i, j, codeblock, precinctNumber; + for (j = cby0; j < cby1; j++) { + for (i = cbx0; i < cbx1; i++) { + codeblock = { + cbx: i, + cby: j, + tbx0: codeblockWidth * i, + tby0: codeblockHeight * j, + tbx1: codeblockWidth * (i + 1), + tby1: codeblockHeight * (j + 1) + }; + codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); + codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); + codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); + codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); + const pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband); + const pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband); + precinctNumber = pi + pj * precinctParameters.numprecinctswide; + codeblock.precinctNumber = precinctNumber; + codeblock.subbandType = subband.type; + codeblock.Lblock = 3; + if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) { + continue; + } + codeblocks.push(codeblock); + let precinct = precincts[precinctNumber]; + if (precinct !== undefined) { + if (i < precinct.cbxMin) { + precinct.cbxMin = i; + } else if (i > precinct.cbxMax) { + precinct.cbxMax = i; + } + if (j < precinct.cbyMin) { + precinct.cbxMin = j; + } else if (j > precinct.cbyMax) { + precinct.cbyMax = j; + } + } else { + precincts[precinctNumber] = precinct = { + cbxMin: i, + cbyMin: j, + cbxMax: i, + cbyMax: j + }; + } + codeblock.precinct = precinct; + } + } + subband.codeblockParameters = { + codeblockWidth: xcb_, + codeblockHeight: ycb_, + numcodeblockwide: cbx1 - cbx0 + 1, + numcodeblockhigh: cby1 - cby0 + 1 + }; + subband.codeblocks = codeblocks; + subband.precincts = precincts; +} +function createPacket(resolution, precinctNumber, layerNumber) { + const precinctCodeblocks = []; + const subbands = resolution.subbands; + for (let i = 0, ii = subbands.length; i < ii; i++) { + const subband = subbands[i]; + const codeblocks = subband.codeblocks; + for (let j = 0, jj = codeblocks.length; j < jj; j++) { + const codeblock = codeblocks[j]; + if (codeblock.precinctNumber !== precinctNumber) { + continue; + } + precinctCodeblocks.push(codeblock); + } + } + return { + layerNumber, + codeblocks: precinctCodeblocks + }; +} +function LayerResolutionComponentPositionIterator(context) { + const siz = context.SIZ; + const tileIndex = context.currentTile.index; + const tile = context.tiles[tileIndex]; + const layersCount = tile.codingStyleDefaultParameters.layersCount; + const componentsCount = siz.Csiz; + let maxDecompositionLevelsCount = 0; + for (let q = 0; q < componentsCount; q++) { + maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); + } + let l = 0, + r = 0, + i = 0, + k = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; l < layersCount; l++) { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; i < componentsCount; i++) { + const component = tile.components[i]; + if (r > component.codingStyleParameters.decompositionLevelsCount) { + continue; + } + const resolution = component.resolutions[r]; + const numprecincts = resolution.precinctParameters.numprecincts; + for (; k < numprecincts;) { + const packet = createPacket(resolution, k, l); + k++; + return packet; + } + k = 0; + } + i = 0; + } + r = 0; + } + throw new JpxError("Out of packets"); + }; +} +function ResolutionLayerComponentPositionIterator(context) { + const siz = context.SIZ; + const tileIndex = context.currentTile.index; + const tile = context.tiles[tileIndex]; + const layersCount = tile.codingStyleDefaultParameters.layersCount; + const componentsCount = siz.Csiz; + let maxDecompositionLevelsCount = 0; + for (let q = 0; q < componentsCount; q++) { + maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); + } + let r = 0, + l = 0, + i = 0, + k = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; l < layersCount; l++) { + for (; i < componentsCount; i++) { + const component = tile.components[i]; + if (r > component.codingStyleParameters.decompositionLevelsCount) { + continue; + } + const resolution = component.resolutions[r]; + const numprecincts = resolution.precinctParameters.numprecincts; + for (; k < numprecincts;) { + const packet = createPacket(resolution, k, l); + k++; + return packet; + } + k = 0; + } + i = 0; + } + l = 0; + } + throw new JpxError("Out of packets"); + }; +} +function ResolutionPositionComponentLayerIterator(context) { + const siz = context.SIZ; + const tileIndex = context.currentTile.index; + const tile = context.tiles[tileIndex]; + const layersCount = tile.codingStyleDefaultParameters.layersCount; + const componentsCount = siz.Csiz; + let l, r, c, p; + let maxDecompositionLevelsCount = 0; + for (c = 0; c < componentsCount; c++) { + const component = tile.components[c]; + maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount); + } + const maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1); + for (r = 0; r <= maxDecompositionLevelsCount; ++r) { + let maxNumPrecincts = 0; + for (c = 0; c < componentsCount; ++c) { + const resolutions = tile.components[c].resolutions; + if (r < resolutions.length) { + maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts); + } + } + maxNumPrecinctsInLevel[r] = maxNumPrecincts; + } + l = 0; + r = 0; + c = 0; + p = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; p < maxNumPrecinctsInLevel[r]; p++) { + for (; c < componentsCount; c++) { + const component = tile.components[c]; + if (r > component.codingStyleParameters.decompositionLevelsCount) { + continue; + } + const resolution = component.resolutions[r]; + const numprecincts = resolution.precinctParameters.numprecincts; + if (p >= numprecincts) { + continue; + } + for (; l < layersCount;) { + const packet = createPacket(resolution, p, l); + l++; + return packet; + } + l = 0; + } + c = 0; + } + p = 0; + } + throw new JpxError("Out of packets"); + }; +} +function PositionComponentResolutionLayerIterator(context) { + const siz = context.SIZ; + const tileIndex = context.currentTile.index; + const tile = context.tiles[tileIndex]; + const layersCount = tile.codingStyleDefaultParameters.layersCount; + const componentsCount = siz.Csiz; + const precinctsSizes = getPrecinctSizesInImageScale(tile); + const precinctsIterationSizes = precinctsSizes; + let l = 0, + r = 0, + c = 0, + px = 0, + py = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; py < precinctsIterationSizes.maxNumHigh; py++) { + for (; px < precinctsIterationSizes.maxNumWide; px++) { + for (; c < componentsCount; c++) { + const component = tile.components[c]; + const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + for (; r <= decompositionLevelsCount; r++) { + const resolution = component.resolutions[r]; + const sizeInImageScale = precinctsSizes.components[c].resolutions[r]; + const k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); + if (k === null) { + continue; + } + for (; l < layersCount;) { + const packet = createPacket(resolution, k, l); + l++; + return packet; + } + l = 0; + } + r = 0; + } + c = 0; + } + px = 0; + } + throw new JpxError("Out of packets"); + }; +} +function ComponentPositionResolutionLayerIterator(context) { + const siz = context.SIZ; + const tileIndex = context.currentTile.index; + const tile = context.tiles[tileIndex]; + const layersCount = tile.codingStyleDefaultParameters.layersCount; + const componentsCount = siz.Csiz; + const precinctsSizes = getPrecinctSizesInImageScale(tile); + let l = 0, + r = 0, + c = 0, + px = 0, + py = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; c < componentsCount; ++c) { + const component = tile.components[c]; + const precinctsIterationSizes = precinctsSizes.components[c]; + const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + for (; py < precinctsIterationSizes.maxNumHigh; py++) { + for (; px < precinctsIterationSizes.maxNumWide; px++) { + for (; r <= decompositionLevelsCount; r++) { + const resolution = component.resolutions[r]; + const sizeInImageScale = precinctsIterationSizes.resolutions[r]; + const k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); + if (k === null) { + continue; + } + for (; l < layersCount;) { + const packet = createPacket(resolution, k, l); + l++; + return packet; + } + l = 0; + } + r = 0; + } + px = 0; + } + py = 0; + } + throw new JpxError("Out of packets"); + }; +} +function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { + const posX = pxIndex * precinctIterationSizes.minWidth; + const posY = pyIndex * precinctIterationSizes.minHeight; + if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) { + return null; + } + const startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide; + return posX / sizeInImageScale.height + startPrecinctRowIndex; +} +function getPrecinctSizesInImageScale(tile) { + const componentsCount = tile.components.length; + let minWidth = Number.MAX_VALUE; + let minHeight = Number.MAX_VALUE; + let maxNumWide = 0; + let maxNumHigh = 0; + const sizePerComponent = new Array(componentsCount); + for (let c = 0; c < componentsCount; c++) { + const component = tile.components[c]; + const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + const sizePerResolution = new Array(decompositionLevelsCount + 1); + let minWidthCurrentComponent = Number.MAX_VALUE; + let minHeightCurrentComponent = Number.MAX_VALUE; + let maxNumWideCurrentComponent = 0; + let maxNumHighCurrentComponent = 0; + let scale = 1; + for (let r = decompositionLevelsCount; r >= 0; --r) { + const resolution = component.resolutions[r]; + const widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth; + const heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight; + minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution); + minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution); + maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide); + maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh); + sizePerResolution[r] = { + width: widthCurrentResolution, + height: heightCurrentResolution + }; + scale <<= 1; + } + minWidth = Math.min(minWidth, minWidthCurrentComponent); + minHeight = Math.min(minHeight, minHeightCurrentComponent); + maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); + maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); + sizePerComponent[c] = { + resolutions: sizePerResolution, + minWidth: minWidthCurrentComponent, + minHeight: minHeightCurrentComponent, + maxNumWide: maxNumWideCurrentComponent, + maxNumHigh: maxNumHighCurrentComponent + }; + } + return { + components: sizePerComponent, + minWidth, + minHeight, + maxNumWide, + maxNumHigh + }; +} +function buildPackets(context) { + const siz = context.SIZ; + const tileIndex = context.currentTile.index; + const tile = context.tiles[tileIndex]; + const componentsCount = siz.Csiz; + for (let c = 0; c < componentsCount; c++) { + const component = tile.components[c]; + const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + const resolutions = []; + const subbands = []; + for (let r = 0; r <= decompositionLevelsCount; r++) { + const blocksDimensions = getBlocksDimensions(context, component, r); + const resolution = {}; + const scale = 1 << decompositionLevelsCount - r; + resolution.trx0 = Math.ceil(component.tcx0 / scale); + resolution.try0 = Math.ceil(component.tcy0 / scale); + resolution.trx1 = Math.ceil(component.tcx1 / scale); + resolution.try1 = Math.ceil(component.tcy1 / scale); + resolution.resLevel = r; + buildPrecincts(context, resolution, blocksDimensions); + resolutions.push(resolution); + let subband; + if (r === 0) { + subband = {}; + subband.type = "LL"; + subband.tbx0 = Math.ceil(component.tcx0 / scale); + subband.tby0 = Math.ceil(component.tcy0 / scale); + subband.tbx1 = Math.ceil(component.tcx1 / scale); + subband.tby1 = Math.ceil(component.tcy1 / scale); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolution.subbands = [subband]; + } else { + const bscale = 1 << decompositionLevelsCount - r + 1; + const resolutionSubbands = []; + subband = {}; + subband.type = "HL"; + subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); + subband.tby0 = Math.ceil(component.tcy0 / bscale); + subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); + subband.tby1 = Math.ceil(component.tcy1 / bscale); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + subband = {}; + subband.type = "LH"; + subband.tbx0 = Math.ceil(component.tcx0 / bscale); + subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); + subband.tbx1 = Math.ceil(component.tcx1 / bscale); + subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + subband = {}; + subband.type = "HH"; + subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); + subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); + subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); + subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + resolution.subbands = resolutionSubbands; + } + } + component.resolutions = resolutions; + component.subbands = subbands; + } + const progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; + switch (progressionOrder) { + case 0: + tile.packetsIterator = new LayerResolutionComponentPositionIterator(context); + break; + case 1: + tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context); + break; + case 2: + tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context); + break; + case 3: + tile.packetsIterator = new PositionComponentResolutionLayerIterator(context); + break; + case 4: + tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context); + break; + default: + throw new JpxError(`Unsupported progression order ${progressionOrder}`); + } +} +function parseTilePackets(context, data, offset, dataLength) { + let position = 0; + let buffer, + bufferSize = 0, + skipNextBit = false; + function readBits(count) { + while (bufferSize < count) { + const b = data[offset + position]; + position++; + if (skipNextBit) { + buffer = buffer << 7 | b; + bufferSize += 7; + skipNextBit = false; + } else { + buffer = buffer << 8 | b; + bufferSize += 8; + } + if (b === 0xff) { + skipNextBit = true; + } + } + bufferSize -= count; + return buffer >>> bufferSize & (1 << count) - 1; + } + function skipMarkerIfEqual(value) { + if (data[offset + position - 1] === 0xff && data[offset + position] === value) { + skipBytes(1); + return true; + } else if (data[offset + position] === 0xff && data[offset + position + 1] === value) { + skipBytes(2); + return true; + } + return false; + } + function skipBytes(count) { + position += count; + } + function alignToByte() { + bufferSize = 0; + if (skipNextBit) { + position++; + skipNextBit = false; + } + } + function readCodingpasses() { + if (readBits(1) === 0) { + return 1; + } + if (readBits(1) === 0) { + return 2; + } + let value = readBits(2); + if (value < 3) { + return value + 3; + } + value = readBits(5); + if (value < 31) { + return value + 6; + } + value = readBits(7); + return value + 37; + } + const tileIndex = context.currentTile.index; + const tile = context.tiles[tileIndex]; + const sopMarkerUsed = context.COD.sopMarkerUsed; + const ephMarkerUsed = context.COD.ephMarkerUsed; + const packetsIterator = tile.packetsIterator; + while (position < dataLength) { + alignToByte(); + if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { + skipBytes(4); + } + const packet = packetsIterator.nextPacket(); + if (!readBits(1)) { + continue; + } + const layerNumber = packet.layerNumber, + queue = []; + let codeblock; + for (let i = 0, ii = packet.codeblocks.length; i < ii; i++) { + codeblock = packet.codeblocks[i]; + let precinct = codeblock.precinct; + const codeblockColumn = codeblock.cbx - precinct.cbxMin; + const codeblockRow = codeblock.cby - precinct.cbyMin; + let codeblockIncluded = false; + let firstTimeInclusion = false; + let valueReady, zeroBitPlanesTree; + if (codeblock.included !== undefined) { + codeblockIncluded = !!readBits(1); + } else { + precinct = codeblock.precinct; + let inclusionTree; + if (precinct.inclusionTree !== undefined) { + inclusionTree = precinct.inclusionTree; + } else { + const width = precinct.cbxMax - precinct.cbxMin + 1; + const height = precinct.cbyMax - precinct.cbyMin + 1; + inclusionTree = new InclusionTree(width, height, layerNumber); + zeroBitPlanesTree = new TagTree(width, height); + precinct.inclusionTree = inclusionTree; + precinct.zeroBitPlanesTree = zeroBitPlanesTree; + for (let l = 0; l < layerNumber; l++) { + if (readBits(1) !== 0) { + throw new JpxError("Invalid tag tree"); + } + } + } + if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { + while (true) { + if (readBits(1)) { + valueReady = !inclusionTree.nextLevel(); + if (valueReady) { + codeblock.included = true; + codeblockIncluded = firstTimeInclusion = true; + break; + } + } else { + inclusionTree.incrementValue(layerNumber); + break; + } + } + } + } + if (!codeblockIncluded) { + continue; + } + if (firstTimeInclusion) { + zeroBitPlanesTree = precinct.zeroBitPlanesTree; + zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); + while (true) { + if (readBits(1)) { + valueReady = !zeroBitPlanesTree.nextLevel(); + if (valueReady) { + break; + } + } else { + zeroBitPlanesTree.incrementValue(); + } + } + codeblock.zeroBitPlanes = zeroBitPlanesTree.value; + } + const codingpasses = readCodingpasses(); + while (readBits(1)) { + codeblock.Lblock++; + } + const codingpassesLog2 = (0, _core_utils.log2)(codingpasses); + const bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; + const codedDataLength = readBits(bits); + queue.push({ + codeblock, + codingpasses, + dataLength: codedDataLength + }); + } + alignToByte(); + if (ephMarkerUsed) { + skipMarkerIfEqual(0x92); + } + while (queue.length > 0) { + const packetItem = queue.shift(); + codeblock = packetItem.codeblock; + if (codeblock.data === undefined) { + codeblock.data = []; + } + codeblock.data.push({ + data, + start: offset + position, + end: offset + position + packetItem.dataLength, + codingpasses: packetItem.codingpasses + }); + position += packetItem.dataLength; + } + } + return position; +} +function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed, resetContextProbabilities) { + const x0 = subband.tbx0; + const y0 = subband.tby0; + const width = subband.tbx1 - subband.tbx0; + const codeblocks = subband.codeblocks; + const right = subband.type.charAt(0) === "H" ? 1 : 0; + const bottom = subband.type.charAt(1) === "H" ? levelWidth : 0; + for (let i = 0, ii = codeblocks.length; i < ii; ++i) { + const codeblock = codeblocks[i]; + const blockWidth = codeblock.tbx1_ - codeblock.tbx0_; + const blockHeight = codeblock.tby1_ - codeblock.tby0_; + if (blockWidth === 0 || blockHeight === 0) { + continue; + } + if (codeblock.data === undefined) { + continue; + } + const bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb); + let currentCodingpassType = 2; + const data = codeblock.data; + let totalLength = 0, + codingpasses = 0; + let j, jj, dataItem; + for (j = 0, jj = data.length; j < jj; j++) { + dataItem = data[j]; + totalLength += dataItem.end - dataItem.start; + codingpasses += dataItem.codingpasses; + } + const encodedData = new Uint8Array(totalLength); + let position = 0; + for (j = 0, jj = data.length; j < jj; j++) { + dataItem = data[j]; + const chunk = dataItem.data.subarray(dataItem.start, dataItem.end); + encodedData.set(chunk, position); + position += chunk.length; + } + const decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength); + bitModel.setDecoder(decoder); + for (j = 0; j < codingpasses; j++) { + switch (currentCodingpassType) { + case 0: + bitModel.runSignificancePropagationPass(); + break; + case 1: + bitModel.runMagnitudeRefinementPass(); + break; + case 2: + bitModel.runCleanupPass(); + if (segmentationSymbolUsed) { + bitModel.checkSegmentationSymbol(); + } + break; + } + if (resetContextProbabilities) { + bitModel.reset(); + } + currentCodingpassType = (currentCodingpassType + 1) % 3; + } + let offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width; + const sign = bitModel.coefficentsSign; + const magnitude = bitModel.coefficentsMagnitude; + const bitsDecoded = bitModel.bitsDecoded; + const magnitudeCorrection = reversible ? 0 : 0.5; + let k, n, nb; + position = 0; + const interleave = subband.type !== "LL"; + for (j = 0; j < blockHeight; j++) { + const row = offset / width | 0; + const levelOffset = 2 * row * (levelWidth - width) + right + bottom; + for (k = 0; k < blockWidth; k++) { + n = magnitude[position]; + if (n !== 0) { + n = (n + magnitudeCorrection) * delta; + if (sign[position] !== 0) { + n = -n; + } + nb = bitsDecoded[position]; + const pos = interleave ? levelOffset + (offset << 1) : offset; + if (reversible && nb >= mb) { + coefficients[pos] = n; + } else { + coefficients[pos] = n * (1 << mb - nb); + } + } + offset++; + position++; + } + offset += width - blockWidth; + } + } +} +function transformTile(context, tile, c) { + const component = tile.components[c]; + const codingStyleParameters = component.codingStyleParameters; + const quantizationParameters = component.quantizationParameters; + const decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount; + const spqcds = quantizationParameters.SPqcds; + const scalarExpounded = quantizationParameters.scalarExpounded; + const guardBits = quantizationParameters.guardBits; + const segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; + const resetContextProbabilities = codingStyleParameters.resetContextProbabilities; + const precision = context.components[c].precision; + const reversible = codingStyleParameters.reversibleTransformation; + const transform = reversible ? new ReversibleTransform() : new IrreversibleTransform(); + const subbandCoefficients = []; + let b = 0; + for (let i = 0; i <= decompositionLevelsCount; i++) { + const resolution = component.resolutions[i]; + const width = resolution.trx1 - resolution.trx0; + const height = resolution.try1 - resolution.try0; + const coefficients = new Float32Array(width * height); + for (let j = 0, jj = resolution.subbands.length; j < jj; j++) { + let mu, epsilon; + if (!scalarExpounded) { + mu = spqcds[0].mu; + epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); + } else { + mu = spqcds[b].mu; + epsilon = spqcds[b].epsilon; + b++; + } + const subband = resolution.subbands[j]; + const gainLog2 = SubbandsGainLog2[subband.type]; + const delta = reversible ? 1 : 2 ** (precision + gainLog2 - epsilon) * (1 + mu / 2048); + const mb = guardBits + epsilon - 1; + copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed, resetContextProbabilities); + } + subbandCoefficients.push({ + width, + height, + items: coefficients + }); + } + const result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0); + return { + left: component.tcx0, + top: component.tcy0, + width: result.width, + height: result.height, + items: result.items + }; +} +function transformComponents(context) { + const siz = context.SIZ; + const components = context.components; + const componentsCount = siz.Csiz; + const resultImages = []; + for (let i = 0, ii = context.tiles.length; i < ii; i++) { + const tile = context.tiles[i]; + const transformedTiles = []; + for (let c = 0; c < componentsCount; c++) { + transformedTiles[c] = transformTile(context, tile, c); + } + const tile0 = transformedTiles[0]; + const out = new Uint8ClampedArray(tile0.items.length * componentsCount); + const result = { + left: tile0.left, + top: tile0.top, + width: tile0.width, + height: tile0.height, + items: out + }; + let shift, offset; + let pos = 0, + j, + jj, + y0, + y1, + y2; + if (tile.codingStyleDefaultParameters.multipleComponentTransform) { + const fourComponents = componentsCount === 4; + const y0items = transformedTiles[0].items; + const y1items = transformedTiles[1].items; + const y2items = transformedTiles[2].items; + const y3items = fourComponents ? transformedTiles[3].items : null; + shift = components[0].precision - 8; + offset = (128 << shift) + 0.5; + const component0 = tile.components[0]; + const alpha01 = componentsCount - 3; + jj = y0items.length; + if (!component0.codingStyleParameters.reversibleTransformation) { + for (j = 0; j < jj; j++, pos += alpha01) { + y0 = y0items[j] + offset; + y1 = y1items[j]; + y2 = y2items[j]; + out[pos++] = y0 + 1.402 * y2 >> shift; + out[pos++] = y0 - 0.34413 * y1 - 0.71414 * y2 >> shift; + out[pos++] = y0 + 1.772 * y1 >> shift; + } + } else { + for (j = 0; j < jj; j++, pos += alpha01) { + y0 = y0items[j] + offset; + y1 = y1items[j]; + y2 = y2items[j]; + const g = y0 - (y2 + y1 >> 2); + out[pos++] = g + y2 >> shift; + out[pos++] = g >> shift; + out[pos++] = g + y1 >> shift; + } + } + if (fourComponents) { + for (j = 0, pos = 3; j < jj; j++, pos += 4) { + out[pos] = y3items[j] + offset >> shift; + } + } + } else { + for (let c = 0; c < componentsCount; c++) { + const items = transformedTiles[c].items; + shift = components[c].precision - 8; + offset = (128 << shift) + 0.5; + for (pos = c, j = 0, jj = items.length; j < jj; j++) { + out[pos] = items[j] + offset >> shift; + pos += componentsCount; + } + } + } + resultImages.push(result); + } + return resultImages; +} +function initializeTile(context, tileIndex) { + const siz = context.SIZ; + const componentsCount = siz.Csiz; + const tile = context.tiles[tileIndex]; + for (let c = 0; c < componentsCount; c++) { + const component = tile.components[c]; + const qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD; + component.quantizationParameters = qcdOrQcc; + const codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD; + component.codingStyleParameters = codOrCoc; + } + tile.codingStyleDefaultParameters = context.currentTile.COD; +} +class TagTree { + constructor(width, height) { + const levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1; + this.levels = []; + for (let i = 0; i < levelsLength; i++) { + const level = { + width, + height, + items: [] + }; + this.levels.push(level); + width = Math.ceil(width / 2); + height = Math.ceil(height / 2); + } + } + reset(i, j) { + let currentLevel = 0, + value = 0, + level; + while (currentLevel < this.levels.length) { + level = this.levels[currentLevel]; + const index = i + j * level.width; + if (level.items[index] !== undefined) { + value = level.items[index]; + break; + } + level.index = index; + i >>= 1; + j >>= 1; + currentLevel++; + } + currentLevel--; + level = this.levels[currentLevel]; + level.items[level.index] = value; + this.currentLevel = currentLevel; + delete this.value; + } + incrementValue() { + const level = this.levels[this.currentLevel]; + level.items[level.index]++; + } + nextLevel() { + let currentLevel = this.currentLevel; + let level = this.levels[currentLevel]; + const value = level.items[level.index]; + currentLevel--; + if (currentLevel < 0) { + this.value = value; + return false; + } + this.currentLevel = currentLevel; + level = this.levels[currentLevel]; + level.items[level.index] = value; + return true; + } +} +class InclusionTree { + constructor(width, height, defaultValue) { + const levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1; + this.levels = []; + for (let i = 0; i < levelsLength; i++) { + const items = new Uint8Array(width * height); + for (let j = 0, jj = items.length; j < jj; j++) { + items[j] = defaultValue; + } + const level = { + width, + height, + items + }; + this.levels.push(level); + width = Math.ceil(width / 2); + height = Math.ceil(height / 2); + } + } + reset(i, j, stopValue) { + let currentLevel = 0; + while (currentLevel < this.levels.length) { + const level = this.levels[currentLevel]; + const index = i + j * level.width; + level.index = index; + const value = level.items[index]; + if (value === 0xff) { + break; + } + if (value > stopValue) { + this.currentLevel = currentLevel; + this.propagateValues(); + return false; + } + i >>= 1; + j >>= 1; + currentLevel++; + } + this.currentLevel = currentLevel - 1; + return true; + } + incrementValue(stopValue) { + const level = this.levels[this.currentLevel]; + level.items[level.index] = stopValue + 1; + this.propagateValues(); + } + propagateValues() { + let levelIndex = this.currentLevel; + let level = this.levels[levelIndex]; + const currentValue = level.items[level.index]; + while (--levelIndex >= 0) { + level = this.levels[levelIndex]; + level.items[level.index] = currentValue; + } + } + nextLevel() { + let currentLevel = this.currentLevel; + let level = this.levels[currentLevel]; + const value = level.items[level.index]; + level.items[level.index] = 0xff; + currentLevel--; + if (currentLevel < 0) { + return false; + } + this.currentLevel = currentLevel; + level = this.levels[currentLevel]; + level.items[level.index] = value; + return true; + } +} +const BitModel = function BitModelClosure() { + const UNIFORM_CONTEXT = 17; + const RUNLENGTH_CONTEXT = 18; + const LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]); + const HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]); + const HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]); + class BitModel { + constructor(width, height, subband, zeroBitPlanes, mb) { + this.width = width; + this.height = height; + let contextLabelTable; + if (subband === "HH") { + contextLabelTable = HHContextLabel; + } else if (subband === "HL") { + contextLabelTable = HLContextLabel; + } else { + contextLabelTable = LLAndLHContextsLabel; + } + this.contextLabelTable = contextLabelTable; + const coefficientCount = width * height; + this.neighborsSignificance = new Uint8Array(coefficientCount); + this.coefficentsSign = new Uint8Array(coefficientCount); + let coefficentsMagnitude; + if (mb > 14) { + coefficentsMagnitude = new Uint32Array(coefficientCount); + } else if (mb > 6) { + coefficentsMagnitude = new Uint16Array(coefficientCount); + } else { + coefficentsMagnitude = new Uint8Array(coefficientCount); + } + this.coefficentsMagnitude = coefficentsMagnitude; + this.processingFlags = new Uint8Array(coefficientCount); + const bitsDecoded = new Uint8Array(coefficientCount); + if (zeroBitPlanes !== 0) { + for (let i = 0; i < coefficientCount; i++) { + bitsDecoded[i] = zeroBitPlanes; + } + } + this.bitsDecoded = bitsDecoded; + this.reset(); + } + setDecoder(decoder) { + this.decoder = decoder; + } + reset() { + this.contexts = new Int8Array(19); + this.contexts[0] = 4 << 1 | 0; + this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0; + this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0; + } + setNeighborsSignificance(row, column, index) { + const neighborsSignificance = this.neighborsSignificance; + const width = this.width, + height = this.height; + const left = column > 0; + const right = column + 1 < width; + let i; + if (row > 0) { + i = index - width; + if (left) { + neighborsSignificance[i - 1] += 0x10; + } + if (right) { + neighborsSignificance[i + 1] += 0x10; + } + neighborsSignificance[i] += 0x04; + } + if (row + 1 < height) { + i = index + width; + if (left) { + neighborsSignificance[i - 1] += 0x10; + } + if (right) { + neighborsSignificance[i + 1] += 0x10; + } + neighborsSignificance[i] += 0x04; + } + if (left) { + neighborsSignificance[index - 1] += 0x01; + } + if (right) { + neighborsSignificance[index + 1] += 0x01; + } + neighborsSignificance[index] |= 0x80; + } + runSignificancePropagationPass() { + const decoder = this.decoder; + const width = this.width, + height = this.height; + const coefficentsMagnitude = this.coefficentsMagnitude; + const coefficentsSign = this.coefficentsSign; + const neighborsSignificance = this.neighborsSignificance; + const processingFlags = this.processingFlags; + const contexts = this.contexts; + const labels = this.contextLabelTable; + const bitsDecoded = this.bitsDecoded; + const processedInverseMask = ~1; + const processedMask = 1; + const firstMagnitudeBitMask = 2; + for (let i0 = 0; i0 < height; i0 += 4) { + for (let j = 0; j < width; j++) { + let index = i0 * width + j; + for (let i1 = 0; i1 < 4; i1++, index += width) { + const i = i0 + i1; + if (i >= height) { + break; + } + processingFlags[index] &= processedInverseMask; + if (coefficentsMagnitude[index] || !neighborsSignificance[index]) { + continue; + } + const contextLabel = labels[neighborsSignificance[index]]; + const decision = decoder.readBit(contexts, contextLabel); + if (decision) { + const sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + } + bitsDecoded[index]++; + processingFlags[index] |= processedMask; + } + } + } + } + decodeSignBit(row, column, index) { + const width = this.width, + height = this.height; + const coefficentsMagnitude = this.coefficentsMagnitude; + const coefficentsSign = this.coefficentsSign; + let contribution, sign0, sign1, significance1; + let contextLabel, decoded; + significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0; + if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { + sign1 = coefficentsSign[index + 1]; + if (significance1) { + sign0 = coefficentsSign[index - 1]; + contribution = 1 - sign1 - sign0; + } else { + contribution = 1 - sign1 - sign1; + } + } else if (significance1) { + sign0 = coefficentsSign[index - 1]; + contribution = 1 - sign0 - sign0; + } else { + contribution = 0; + } + const horizontalContribution = 3 * contribution; + significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0; + if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { + sign1 = coefficentsSign[index + width]; + if (significance1) { + sign0 = coefficentsSign[index - width]; + contribution = 1 - sign1 - sign0 + horizontalContribution; + } else { + contribution = 1 - sign1 - sign1 + horizontalContribution; + } + } else if (significance1) { + sign0 = coefficentsSign[index - width]; + contribution = 1 - sign0 - sign0 + horizontalContribution; + } else { + contribution = horizontalContribution; + } + if (contribution >= 0) { + contextLabel = 9 + contribution; + decoded = this.decoder.readBit(this.contexts, contextLabel); + } else { + contextLabel = 9 - contribution; + decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; + } + return decoded; + } + runMagnitudeRefinementPass() { + const decoder = this.decoder; + const width = this.width, + height = this.height; + const coefficentsMagnitude = this.coefficentsMagnitude; + const neighborsSignificance = this.neighborsSignificance; + const contexts = this.contexts; + const bitsDecoded = this.bitsDecoded; + const processingFlags = this.processingFlags; + const processedMask = 1; + const firstMagnitudeBitMask = 2; + const length = width * height; + const width4 = width * 4; + for (let index0 = 0, indexNext; index0 < length; index0 = indexNext) { + indexNext = Math.min(length, index0 + width4); + for (let j = 0; j < width; j++) { + for (let index = index0 + j; index < indexNext; index += width) { + if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { + continue; + } + let contextLabel = 16; + if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { + processingFlags[index] ^= firstMagnitudeBitMask; + const significance = neighborsSignificance[index] & 127; + contextLabel = significance === 0 ? 15 : 14; + } + const bit = decoder.readBit(contexts, contextLabel); + coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit; + bitsDecoded[index]++; + processingFlags[index] |= processedMask; + } + } + } + } + runCleanupPass() { + const decoder = this.decoder; + const width = this.width, + height = this.height; + const neighborsSignificance = this.neighborsSignificance; + const coefficentsMagnitude = this.coefficentsMagnitude; + const coefficentsSign = this.coefficentsSign; + const contexts = this.contexts; + const labels = this.contextLabelTable; + const bitsDecoded = this.bitsDecoded; + const processingFlags = this.processingFlags; + const processedMask = 1; + const firstMagnitudeBitMask = 2; + const oneRowDown = width; + const twoRowsDown = width * 2; + const threeRowsDown = width * 3; + let iNext; + for (let i0 = 0; i0 < height; i0 = iNext) { + iNext = Math.min(i0 + 4, height); + const indexBase = i0 * width; + const checkAllEmpty = i0 + 3 < height; + for (let j = 0; j < width; j++) { + const index0 = indexBase + j; + const allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0; + let i1 = 0, + index = index0; + let i = i0, + sign; + if (allEmpty) { + const hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT); + if (!hasSignificantCoefficent) { + bitsDecoded[index0]++; + bitsDecoded[index0 + oneRowDown]++; + bitsDecoded[index0 + twoRowsDown]++; + bitsDecoded[index0 + threeRowsDown]++; + continue; + } + i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT); + if (i1 !== 0) { + i = i0 + i1; + index += i1 * width; + } + sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + index = index0; + for (let i2 = i0; i2 <= i; i2++, index += width) { + bitsDecoded[index]++; + } + i1++; + } + for (i = i0 + i1; i < iNext; i++, index += width) { + if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { + continue; + } + const contextLabel = labels[neighborsSignificance[index]]; + const decision = decoder.readBit(contexts, contextLabel); + if (decision === 1) { + sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + } + bitsDecoded[index]++; + } + } + } + } + checkSegmentationSymbol() { + const decoder = this.decoder; + const contexts = this.contexts; + const symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT); + if (symbol !== 0xa) { + throw new JpxError("Invalid segmentation symbol"); + } + } + } + return BitModel; +}(); +class Transform { + constructor() { + if (this.constructor === Transform) { + (0, _util.unreachable)("Cannot initialize Transform."); + } + } + calculate(subbands, u0, v0) { + let ll = subbands[0]; + for (let i = 1, ii = subbands.length; i < ii; i++) { + ll = this.iterate(ll, subbands[i], u0, v0); + } + return ll; + } + extend(buffer, offset, size) { + let i1 = offset - 1, + j1 = offset + 1; + let i2 = offset + size - 2, + j2 = offset + size; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1] = buffer[j1]; + buffer[j2] = buffer[i2]; + } + filter(x, offset, length) { + (0, _util.unreachable)("Abstract method `filter` called"); + } + iterate(ll, hl_lh_hh, u0, v0) { + const llWidth = ll.width, + llHeight = ll.height; + let llItems = ll.items; + const width = hl_lh_hh.width; + const height = hl_lh_hh.height; + const items = hl_lh_hh.items; + let i, j, k, l, u, v; + for (k = 0, i = 0; i < llHeight; i++) { + l = i * 2 * width; + for (j = 0; j < llWidth; j++, k++, l += 2) { + items[l] = llItems[k]; + } + } + llItems = ll.items = null; + const bufferPadding = 4; + const rowBuffer = new Float32Array(width + 2 * bufferPadding); + if (width === 1) { + if ((u0 & 1) !== 0) { + for (v = 0, k = 0; v < height; v++, k += width) { + items[k] *= 0.5; + } + } + } else { + for (v = 0, k = 0; v < height; v++, k += width) { + rowBuffer.set(items.subarray(k, k + width), bufferPadding); + this.extend(rowBuffer, bufferPadding, width); + this.filter(rowBuffer, bufferPadding, width); + items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k); + } + } + let numBuffers = 16; + const colBuffers = []; + for (i = 0; i < numBuffers; i++) { + colBuffers.push(new Float32Array(height + 2 * bufferPadding)); + } + let b, + currentBuffer = 0; + ll = bufferPadding + height; + if (height === 1) { + if ((v0 & 1) !== 0) { + for (u = 0; u < width; u++) { + items[u] *= 0.5; + } + } + } else { + for (u = 0; u < width; u++) { + if (currentBuffer === 0) { + numBuffers = Math.min(width - u, numBuffers); + for (k = u, l = bufferPadding; l < ll; k += width, l++) { + for (b = 0; b < numBuffers; b++) { + colBuffers[b][l] = items[k + b]; + } + } + currentBuffer = numBuffers; + } + currentBuffer--; + const buffer = colBuffers[currentBuffer]; + this.extend(buffer, bufferPadding, height); + this.filter(buffer, bufferPadding, height); + if (currentBuffer === 0) { + k = u - numBuffers + 1; + for (l = bufferPadding; l < ll; k += width, l++) { + for (b = 0; b < numBuffers; b++) { + items[k + b] = colBuffers[b][l]; + } + } + } + } + } + return { + width, + height, + items + }; + } +} +class IrreversibleTransform extends Transform { + filter(x, offset, length) { + const len = length >> 1; + offset |= 0; + let j, n, current, next; + const alpha = -1.586134342059924; + const beta = -0.052980118572961; + const gamma = 0.882911075530934; + const delta = 0.443506852043971; + const K = 1.230174104914001; + const K_ = 1 / K; + j = offset - 3; + for (n = len + 4; n--; j += 2) { + x[j] *= K_; + } + j = offset - 2; + current = delta * x[j - 1]; + for (n = len + 3; n--; j += 2) { + next = delta * x[j + 1]; + x[j] = K * x[j] - current - next; + if (n--) { + j += 2; + current = delta * x[j + 1]; + x[j] = K * x[j] - current - next; + } else { + break; + } + } + j = offset - 1; + current = gamma * x[j - 1]; + for (n = len + 2; n--; j += 2) { + next = gamma * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = gamma * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + j = offset; + current = beta * x[j - 1]; + for (n = len + 1; n--; j += 2) { + next = beta * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = beta * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + if (len !== 0) { + j = offset + 1; + current = alpha * x[j - 1]; + for (n = len; n--; j += 2) { + next = alpha * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = alpha * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + } + } +} +class ReversibleTransform extends Transform { + filter(x, offset, length) { + const len = length >> 1; + offset |= 0; + let j, n; + for (j = offset, n = len + 1; n--; j += 2) { + x[j] -= x[j - 1] + x[j + 1] + 2 >> 2; + } + for (j = offset + 1, n = len; n--; j += 2) { + x[j] += x[j - 1] + x[j + 1] >> 1; + } + } +} + +/***/ }), +/* 160 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.LZWStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +class LZWStream extends _decode_stream.DecodeStream { + constructor(str, maybeLength, earlyChange) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.cachedData = 0; + this.bitsCached = 0; + const maxLzwDictionarySize = 4096; + const lzwState = { + earlyChange, + codeLength: 9, + nextCode: 258, + dictionaryValues: new Uint8Array(maxLzwDictionarySize), + dictionaryLengths: new Uint16Array(maxLzwDictionarySize), + dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), + currentSequence: new Uint8Array(maxLzwDictionarySize), + currentSequenceLength: 0 + }; + for (let i = 0; i < 256; ++i) { + lzwState.dictionaryValues[i] = i; + lzwState.dictionaryLengths[i] = 1; + } + this.lzwState = lzwState; + } + readBits(n) { + let bitsCached = this.bitsCached; + let cachedData = this.cachedData; + while (bitsCached < n) { + const c = this.str.getByte(); + if (c === -1) { + this.eof = true; + return null; + } + cachedData = cachedData << 8 | c; + bitsCached += 8; + } + this.bitsCached = bitsCached -= n; + this.cachedData = cachedData; + this.lastCode = null; + return cachedData >>> bitsCached & (1 << n) - 1; + } + readBlock() { + const blockSize = 512, + decodedSizeDelta = blockSize; + let estimatedDecodedSize = blockSize * 2; + let i, j, q; + const lzwState = this.lzwState; + if (!lzwState) { + return; + } + const earlyChange = lzwState.earlyChange; + let nextCode = lzwState.nextCode; + const dictionaryValues = lzwState.dictionaryValues; + const dictionaryLengths = lzwState.dictionaryLengths; + const dictionaryPrevCodes = lzwState.dictionaryPrevCodes; + let codeLength = lzwState.codeLength; + let prevCode = lzwState.prevCode; + const currentSequence = lzwState.currentSequence; + let currentSequenceLength = lzwState.currentSequenceLength; + let decodedLength = 0; + let currentBufferLength = this.bufferLength; + let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + for (i = 0; i < blockSize; i++) { + const code = this.readBits(codeLength); + const hasPrev = currentSequenceLength > 0; + if (code < 256) { + currentSequence[0] = code; + currentSequenceLength = 1; + } else if (code >= 258) { + if (code < nextCode) { + currentSequenceLength = dictionaryLengths[code]; + for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { + currentSequence[j] = dictionaryValues[q]; + q = dictionaryPrevCodes[q]; + } + } else { + currentSequence[currentSequenceLength++] = currentSequence[0]; + } + } else if (code === 256) { + codeLength = 9; + nextCode = 258; + currentSequenceLength = 0; + continue; + } else { + this.eof = true; + delete this.lzwState; + break; + } + if (hasPrev) { + dictionaryPrevCodes[nextCode] = prevCode; + dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; + dictionaryValues[nextCode] = currentSequence[0]; + nextCode++; + codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; + } + prevCode = code; + decodedLength += currentSequenceLength; + if (estimatedDecodedSize < decodedLength) { + do { + estimatedDecodedSize += decodedSizeDelta; + } while (estimatedDecodedSize < decodedLength); + buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + } + for (j = 0; j < currentSequenceLength; j++) { + buffer[currentBufferLength++] = currentSequence[j]; + } + } + lzwState.nextCode = nextCode; + lzwState.codeLength = codeLength; + lzwState.prevCode = prevCode; + lzwState.currentSequenceLength = currentSequenceLength; + this.bufferLength = currentBufferLength; + } +} +exports.LZWStream = LZWStream; + +/***/ }), +/* 161 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PredictorStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +var _primitives = __w_pdfjs_require__(134); +var _util = __w_pdfjs_require__(2); +class PredictorStream extends _decode_stream.DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + if (!(params instanceof _primitives.Dict)) { + return str; + } + const predictor = this.predictor = params.get("Predictor") || 1; + if (predictor <= 1) { + return str; + } + if (predictor !== 2 && (predictor < 10 || predictor > 15)) { + throw new _util.FormatError(`Unsupported predictor: ${predictor}`); + } + if (predictor === 2) { + this.readBlock = this.readBlockTiff; + } else { + this.readBlock = this.readBlockPng; + } + this.str = str; + this.dict = str.dict; + const colors = this.colors = params.get("Colors") || 1; + const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8; + const columns = this.columns = params.get("Columns") || 1; + this.pixBytes = colors * bits + 7 >> 3; + this.rowBytes = columns * colors * bits + 7 >> 3; + return this; + } + readBlockTiff() { + const rowBytes = this.rowBytes; + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + const bits = this.bits; + const colors = this.colors; + const rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + let inbuf = 0, + outbuf = 0; + let inbits = 0, + outbits = 0; + let pos = bufferLength; + let i; + if (bits === 1 && colors === 1) { + for (i = 0; i < rowBytes; ++i) { + let c = rawBytes[i] ^ inbuf; + c ^= c >> 1; + c ^= c >> 2; + c ^= c >> 4; + inbuf = (c & 1) << 7; + buffer[pos++] = c; + } + } else if (bits === 8) { + for (i = 0; i < colors; ++i) { + buffer[pos++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[pos] = buffer[pos - colors] + rawBytes[i]; + pos++; + } + } else if (bits === 16) { + const bytesPerPixel = colors * 2; + for (i = 0; i < bytesPerPixel; ++i) { + buffer[pos++] = rawBytes[i]; + } + for (; i < rowBytes; i += 2) { + const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff); + buffer[pos++] = sum >> 8 & 0xff; + buffer[pos++] = sum & 0xff; + } + } else { + const compArray = new Uint8Array(colors + 1); + const bitMask = (1 << bits) - 1; + let j = 0, + k = bufferLength; + const columns = this.columns; + for (i = 0; i < columns; ++i) { + for (let kk = 0; kk < colors; ++kk) { + if (inbits < bits) { + inbuf = inbuf << 8 | rawBytes[j++] & 0xff; + inbits += 8; + } + compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask; + inbits -= bits; + outbuf = outbuf << bits | compArray[kk]; + outbits += bits; + if (outbits >= 8) { + buffer[k++] = outbuf >> outbits - 8 & 0xff; + outbits -= 8; + } + } + } + if (outbits > 0) { + buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1); + } + } + this.bufferLength += rowBytes; + } + readBlockPng() { + const rowBytes = this.rowBytes; + const pixBytes = this.pixBytes; + const predictor = this.str.getByte(); + const rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); + if (prevRow.length === 0) { + prevRow = new Uint8Array(rowBytes); + } + let i, + j = bufferLength, + up, + c; + switch (predictor) { + case 0: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + break; + case 1: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff; + j++; + } + break; + case 2: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = prevRow[i] + rawBytes[i] & 0xff; + } + break; + case 3: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff; + j++; + } + break; + case 4: + for (i = 0; i < pixBytes; ++i) { + up = prevRow[i]; + c = rawBytes[i]; + buffer[j++] = up + c; + } + for (; i < rowBytes; ++i) { + up = prevRow[i]; + const upLeft = prevRow[i - pixBytes]; + const left = buffer[j - pixBytes]; + const p = left + up - upLeft; + let pa = p - left; + if (pa < 0) { + pa = -pa; + } + let pb = p - up; + if (pb < 0) { + pb = -pb; + } + let pc = p - upLeft; + if (pc < 0) { + pc = -pc; + } + c = rawBytes[i]; + if (pa <= pb && pa <= pc) { + buffer[j++] = left + c; + } else if (pb <= pc) { + buffer[j++] = up + c; + } else { + buffer[j++] = upLeft + c; + } + } + break; + default: + throw new _util.FormatError(`Unsupported predictor: ${predictor}`); + } + this.bufferLength += rowBytes; + } +} +exports.PredictorStream = PredictorStream; + +/***/ }), +/* 162 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.RunLengthStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +class RunLengthStream extends _decode_stream.DecodeStream { + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + } + readBlock() { + const repeatHeader = this.str.getBytes(2); + if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { + this.eof = true; + return; + } + let buffer; + let bufferLength = this.bufferLength; + let n = repeatHeader[0]; + if (n < 128) { + buffer = this.ensureBuffer(bufferLength + n + 1); + buffer[bufferLength++] = repeatHeader[1]; + if (n > 0) { + const source = this.str.getBytes(n); + buffer.set(source, bufferLength); + bufferLength += n; + } + } else { + n = 257 - n; + const b = repeatHeader[1]; + buffer = this.ensureBuffer(bufferLength + n + 1); + for (let i = 0; i < n; i++) { + buffer[bufferLength++] = b; + } + } + this.bufferLength = bufferLength; + } +} +exports.RunLengthStream = RunLengthStream; + +/***/ }), +/* 163 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Font = exports.ErrorFont = void 0; +var _util = __w_pdfjs_require__(2); +var _cff_parser = __w_pdfjs_require__(164); +var _fonts_utils = __w_pdfjs_require__(167); +var _unicode = __w_pdfjs_require__(169); +var _glyphlist = __w_pdfjs_require__(168); +var _encodings = __w_pdfjs_require__(166); +var _standard_fonts = __w_pdfjs_require__(170); +var _to_unicode_map = __w_pdfjs_require__(171); +var _cff_font = __w_pdfjs_require__(172); +var _font_renderer = __w_pdfjs_require__(173); +var _metrics = __w_pdfjs_require__(174); +var _glyf = __w_pdfjs_require__(175); +var _cmap = __w_pdfjs_require__(145); +var _opentype_file_builder = __w_pdfjs_require__(176); +var _core_utils = __w_pdfjs_require__(135); +var _stream = __w_pdfjs_require__(139); +var _type1_font = __w_pdfjs_require__(177); +const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; +const PDF_GLYPH_SPACE_UNITS = 1000; +const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", "fontType", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "subtype", "type", "vertical"]; +const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "toFontChar", "toUnicode", "vmetrics", "widths"]; +function adjustWidths(properties) { + if (!properties.fontMatrix) { + return; + } + if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) { + return; + } + const scale = 0.001 / properties.fontMatrix[0]; + const glyphsWidths = properties.widths; + for (const glyph in glyphsWidths) { + glyphsWidths[glyph] *= scale; + } + properties.defaultWidth *= scale; +} +function adjustToUnicode(properties, builtInEncoding) { + if (properties.isInternalFont) { + return; + } + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (builtInEncoding === properties.defaultEncoding) { + return; + } + if (properties.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap) { + return; + } + const toUnicode = [], + glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)(); + for (const charCode in builtInEncoding) { + if (properties.hasEncoding) { + if (properties.differences.length === 0 || properties.differences[charCode] !== undefined) { + continue; + } + } + const glyphName = builtInEncoding[charCode]; + const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + toUnicode[charCode] = String.fromCharCode(unicode); + } + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +function amendFallbackToUnicode(properties) { + if (!properties.fallbackToUnicode) { + return; + } + if (properties.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap) { + return; + } + const toUnicode = []; + for (const charCode in properties.fallbackToUnicode) { + if (properties.toUnicode.has(charCode)) { + continue; + } + toUnicode[charCode] = properties.fallbackToUnicode[charCode]; + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } +} +class Glyph { + constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { + this.originalCharCode = originalCharCode; + this.fontChar = fontChar; + this.unicode = unicode; + this.accent = accent; + this.width = width; + this.vmetric = vmetric; + this.operatorListId = operatorListId; + this.isSpace = isSpace; + this.isInFont = isInFont; + } + get category() { + return (0, _util.shadow)(this, "category", (0, _unicode.getCharUnicodeCategory)(this.unicode), true); + } + get normalizedUnicode() { + return (0, _util.shadow)(this, "normalizedUnicode", (0, _unicode.reverseIfRtl)(Glyph._NormalizedUnicodes[this.unicode] || this.unicode), true); + } + static get _NormalizedUnicodes() { + return (0, _util.shadow)(this, "_NormalizedUnicodes", (0, _unicode.getNormalizedUnicodes)()); + } +} +function int16(b0, b1) { + return (b0 << 8) + b1; +} +function writeSignedInt16(bytes, index, value) { + bytes[index + 1] = value; + bytes[index] = value >>> 8; +} +function signedInt16(b0, b1) { + const value = (b0 << 8) + b1; + return value & 1 << 15 ? value - 0x10000 : value; +} +function int32(b0, b1, b2, b3) { + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; +} +function string16(value) { + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); +} +function safeString16(value) { + if (value > 0x7fff) { + value = 0x7fff; + } else if (value < -0x8000) { + value = -0x8000; + } + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); +} +function isTrueTypeFile(file) { + const header = file.peekBytes(4); + return (0, _core_utils.readUint32)(header, 0) === 0x00010000 || (0, _util.bytesToString)(header) === "true"; +} +function isTrueTypeCollectionFile(file) { + const header = file.peekBytes(4); + return (0, _util.bytesToString)(header) === "ttcf"; +} +function isOpenTypeFile(file) { + const header = file.peekBytes(4); + return (0, _util.bytesToString)(header) === "OTTO"; +} +function isType1File(file) { + const header = file.peekBytes(2); + if (header[0] === 0x25 && header[1] === 0x21) { + return true; + } + if (header[0] === 0x80 && header[1] === 0x01) { + return true; + } + return false; +} +function isCFFFile(file) { + const header = file.peekBytes(4); + if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) { + return true; + } + return false; +} +function getFontFileType(file, _ref) { + let { + type, + subtype, + composite + } = _ref; + let fileType, fileSubtype; + if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) { + if (composite) { + fileType = "CIDFontType2"; + } else { + fileType = "TrueType"; + } + } else if (isOpenTypeFile(file)) { + if (composite) { + fileType = "CIDFontType2"; + } else { + fileType = "OpenType"; + } + } else if (isType1File(file)) { + if (composite) { + fileType = "CIDFontType0"; + } else { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + } + } else if (isCFFFile(file)) { + if (composite) { + fileType = "CIDFontType0"; + fileSubtype = "CIDFontType0C"; + } else { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + fileSubtype = "Type1C"; + } + } else { + (0, _util.warn)("getFontFileType: Unable to detect correct font file Type/Subtype."); + fileType = type; + fileSubtype = subtype; + } + return [fileType, fileSubtype]; +} +function applyStandardFontGlyphMap(map, glyphMap) { + for (const charCode in glyphMap) { + map[+charCode] = glyphMap[charCode]; + } +} +function buildToFontChar(encoding, glyphsUnicodeMap, differences) { + const toFontChar = []; + let unicode; + for (let i = 0, ii = encoding.length; i < ii; i++) { + unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[i] = unicode; + } + } + for (const charCode in differences) { + unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[+charCode] = unicode; + } + } + return toFontChar; +} +function convertCidString(charCode, cid) { + let shouldThrow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + switch (cid.length) { + case 1: + return cid.charCodeAt(0); + case 2: + return cid.charCodeAt(0) << 8 | cid.charCodeAt(1); + } + const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; + if (shouldThrow) { + throw new _util.FormatError(msg); + } + (0, _util.warn)(msg); + return cid; +} +function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { + const newMap = Object.create(null); + const toUnicodeExtraMap = new Map(); + const toFontChar = []; + const usedGlyphIds = new Set(); + let privateUseAreaIndex = 0; + const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + let nextAvailableFontCharCode = privateUseOffetStart; + let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + for (let originalCharCode in charCodeToGlyphId) { + originalCharCode |= 0; + let glyphId = charCodeToGlyphId[originalCharCode]; + if (!hasGlyph(glyphId)) { + continue; + } + if (nextAvailableFontCharCode > privateUseOffetEnd) { + privateUseAreaIndex++; + if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) { + (0, _util.warn)("Ran out of space in font private use area."); + break; + } + nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + } + const fontCharCode = nextAvailableFontCharCode++; + if (glyphId === 0) { + glyphId = newGlyphZeroId; + } + let unicode = toUnicode.get(originalCharCode); + if (typeof unicode === "string") { + unicode = unicode.codePointAt(0); + } + if (unicode && unicode < privateUseOffetStart && !usedGlyphIds.has(glyphId)) { + toUnicodeExtraMap.set(unicode, glyphId); + usedGlyphIds.add(glyphId); + } + newMap[fontCharCode] = glyphId; + toFontChar[originalCharCode] = fontCharCode; + } + return { + toFontChar, + charCodeToGlyphId: newMap, + toUnicodeExtraMap, + nextAvailableFontCharCode + }; +} +function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) { + const codes = []; + for (const charCode in glyphs) { + if (glyphs[charCode] >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: charCode | 0, + glyphId: glyphs[charCode] + }); + } + if (toUnicodeExtraMap) { + for (const [unicode, glyphId] of toUnicodeExtraMap) { + if (glyphId >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: unicode, + glyphId + }); + } + } + if (codes.length === 0) { + codes.push({ + fontCharCode: 0, + glyphId: 0 + }); + } + codes.sort(function fontGetRangesSort(a, b) { + return a.fontCharCode - b.fontCharCode; + }); + const ranges = []; + const length = codes.length; + for (let n = 0; n < length;) { + const start = codes[n].fontCharCode; + const codeIndices = [codes[n].glyphId]; + ++n; + let end = start; + while (n < length && end + 1 === codes[n].fontCharCode) { + codeIndices.push(codes[n].glyphId); + ++end; + ++n; + if (end === 0xffff) { + break; + } + } + ranges.push([start, end, codeIndices]); + } + return ranges; +} +function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) { + const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs); + const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1; + let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + (0, _util.string32)(4 + numTables * 8); + let i, ii, j, jj; + for (i = ranges.length - 1; i >= 0; --i) { + if (ranges[i][0] <= 0xffff) { + break; + } + } + const bmpLength = i + 1; + if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) { + ranges[i][1] = 0xfffe; + } + const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0; + const segCount = bmpLength + trailingRangesCount; + const searchParams = _opentype_file_builder.OpenTypeFileBuilder.getSearchParams(segCount, 2); + let startCount = ""; + let endCount = ""; + let idDeltas = ""; + let idRangeOffsets = ""; + let glyphsIds = ""; + let bias = 0; + let range, start, end, codes; + for (i = 0, ii = bmpLength; i < ii; i++) { + range = ranges[i]; + start = range[0]; + end = range[1]; + startCount += string16(start); + endCount += string16(end); + codes = range[2]; + let contiguous = true; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + contiguous = false; + break; + } + } + if (!contiguous) { + const offset = (segCount - i) * 2 + bias * 2; + bias += end - start + 1; + idDeltas += string16(0); + idRangeOffsets += string16(offset); + for (j = 0, jj = codes.length; j < jj; ++j) { + glyphsIds += string16(codes[j]); + } + } else { + const startCode = codes[0]; + idDeltas += string16(startCode - start & 0xffff); + idRangeOffsets += string16(0); + } + } + if (trailingRangesCount > 0) { + endCount += "\xFF\xFF"; + startCount += "\xFF\xFF"; + idDeltas += "\x00\x01"; + idRangeOffsets += "\x00\x00"; + } + const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + idDeltas + idRangeOffsets + glyphsIds; + let format31012 = ""; + let header31012 = ""; + if (numTables > 1) { + cmap += "\x00\x03" + "\x00\x0A" + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length); + format31012 = ""; + for (i = 0, ii = ranges.length; i < ii; i++) { + range = ranges[i]; + start = range[0]; + codes = range[2]; + let code = codes[0]; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + end = range[0] + j - 1; + format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code); + start = end + 1; + code = codes[j]; + } + } + format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, _util.string32)(code); + } + header31012 = "\x00\x0C" + "\x00\x00" + (0, _util.string32)(format31012.length + 16) + "\x00\x00\x00\x00" + (0, _util.string32)(format31012.length / 12); + } + return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012; +} +function validateOS2Table(os2, file) { + file.pos = (file.start || 0) + os2.offset; + const version = file.getUint16(); + file.skip(60); + const selection = file.getUint16(); + if (version < 4 && selection & 0x0300) { + return false; + } + const firstChar = file.getUint16(); + const lastChar = file.getUint16(); + if (firstChar > lastChar) { + return false; + } + file.skip(6); + const usWinAscent = file.getUint16(); + if (usWinAscent === 0) { + return false; + } + os2.data[8] = os2.data[9] = 0; + return true; +} +function createOS2Table(properties, charstrings, override) { + override = override || { + unitsPerEm: 0, + yMax: 0, + yMin: 0, + ascent: 0, + descent: 0 + }; + let ulUnicodeRange1 = 0; + let ulUnicodeRange2 = 0; + let ulUnicodeRange3 = 0; + let ulUnicodeRange4 = 0; + let firstCharIndex = null; + let lastCharIndex = 0; + if (charstrings) { + for (let code in charstrings) { + code |= 0; + if (firstCharIndex > code || !firstCharIndex) { + firstCharIndex = code; + } + if (lastCharIndex < code) { + lastCharIndex = code; + } + const position = (0, _unicode.getUnicodeRangeFor)(code); + if (position < 32) { + ulUnicodeRange1 |= 1 << position; + } else if (position < 64) { + ulUnicodeRange2 |= 1 << position - 32; + } else if (position < 96) { + ulUnicodeRange3 |= 1 << position - 64; + } else if (position < 123) { + ulUnicodeRange4 |= 1 << position - 96; + } else { + throw new _util.FormatError("Unicode ranges Bits > 123 are reserved for internal usage"); + } + } + if (lastCharIndex > 0xffff) { + lastCharIndex = 0xffff; + } + } else { + firstCharIndex = 0; + lastCharIndex = 255; + } + const bbox = properties.bbox || [0, 0, 0, 0]; + const unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0]; + const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; + const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); + let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); + if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { + typoDescent = -typoDescent; + } + const winAscent = override.yMax || typoAscent; + const winDescent = -override.yMin || -typoDescent; + return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + "\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + "\x00\x00\x00\x00\x00\x00" + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + (0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + "\x00\x03"; +} +function createPostTable(properties) { + const angle = Math.floor(properties.italicAngle * 2 ** 16); + return "\x00\x03\x00\x00" + (0, _util.string32)(angle) + "\x00\x00" + "\x00\x00" + (0, _util.string32)(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00"; +} +function createPostscriptName(name) { + return name.replace(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); +} +function createNameTable(name, proto) { + if (!proto) { + proto = [[], []]; + } + const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"]; + const stringsUnicode = []; + let i, ii, j, jj, str; + for (i = 0, ii = strings.length; i < ii; i++) { + str = proto[1][i] || strings[i]; + const strBufUnicode = []; + for (j = 0, jj = str.length; j < jj; j++) { + strBufUnicode.push(string16(str.charCodeAt(j))); + } + stringsUnicode.push(strBufUnicode.join("")); + } + const names = [strings, stringsUnicode]; + const platforms = ["\x00\x01", "\x00\x03"]; + const encodings = ["\x00\x00", "\x00\x01"]; + const languages = ["\x00\x00", "\x04\x09"]; + const namesRecordCount = strings.length * platforms.length; + let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6); + let strOffset = 0; + for (i = 0, ii = platforms.length; i < ii; i++) { + const strs = names[i]; + for (j = 0, jj = strs.length; j < jj; j++) { + str = strs[j]; + const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset); + nameTable += nameRecord; + strOffset += str.length; + } + } + nameTable += strings.join("") + stringsUnicode.join(""); + return nameTable; +} +class Font { + constructor(name, file, properties) { + this.name = name; + this.psName = null; + this.mimetype = null; + this.disableFontFace = false; + this.loadedName = properties.loadedName; + this.isType3Font = properties.isType3Font; + this.missingFile = false; + this.cssFontInfo = properties.cssFontInfo; + this._charsCache = Object.create(null); + this._glyphCache = Object.create(null); + let isSerifFont = !!(properties.flags & _fonts_utils.FontFlags.Serif); + if (!isSerifFont && !properties.isSimulatedFlags) { + const baseName = name.replace(/[,_]/g, "-").split("-")[0], + serifFonts = (0, _standard_fonts.getSerifFonts)(); + for (const namePart of baseName.split("+")) { + if (serifFonts[namePart]) { + isSerifFont = true; + break; + } + } + } + this.isSerifFont = isSerifFont; + this.isSymbolicFont = !!(properties.flags & _fonts_utils.FontFlags.Symbolic); + this.isMonospace = !!(properties.flags & _fonts_utils.FontFlags.FixedPitch); + let type = properties.type; + let subtype = properties.subtype; + this.type = type; + this.subtype = subtype; + const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/); + this.isInvalidPDFjsFont = !!matches; + if (this.isInvalidPDFjsFont) { + this.fallbackName = matches[1]; + } else if (this.isMonospace) { + this.fallbackName = "monospace"; + } else if (this.isSerifFont) { + this.fallbackName = "serif"; + } else { + this.fallbackName = "sans-serif"; + } + this.differences = properties.differences; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.composite = properties.composite; + this.cMap = properties.cMap; + this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS; + this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; + this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; + this.lineHeight = this.ascent - this.descent; + this.fontMatrix = properties.fontMatrix; + this.bbox = properties.bbox; + this.defaultEncoding = properties.defaultEncoding; + this.toUnicode = properties.toUnicode; + this.toFontChar = []; + if (properties.type === "Type3") { + for (let charCode = 0; charCode < 256; charCode++) { + this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode]; + } + this.fontType = _util.FontType.TYPE3; + return; + } + this.cidEncoding = properties.cidEncoding || ""; + this.vertical = !!properties.vertical; + if (this.vertical) { + this.vmetrics = properties.vmetrics; + this.defaultVMetrics = properties.defaultVMetrics; + } + if (!file || file.isEmpty) { + if (file) { + (0, _util.warn)('Font file is empty in "' + name + '" (' + this.loadedName + ")"); + } + this.fallbackToSystemFont(properties); + return; + } + [type, subtype] = getFontFileType(file, properties); + if (type !== this.type || subtype !== this.subtype) { + (0, _util.info)("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`); + } + let data; + try { + switch (type) { + case "MMType1": + (0, _util.info)("MMType1 font (" + name + "), falling back to Type1."); + case "Type1": + case "CIDFontType0": + this.mimetype = "font/opentype"; + const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new _cff_font.CFFFont(file, properties) : new _type1_font.Type1Font(name, file, properties); + adjustWidths(properties); + data = this.convert(name, cff, properties); + break; + case "OpenType": + case "TrueType": + case "CIDFontType2": + this.mimetype = "font/opentype"; + data = this.checkAndRepair(name, file, properties); + if (this.isOpenType) { + adjustWidths(properties); + type = "OpenType"; + } + break; + default: + throw new _util.FormatError(`Font ${type} is not supported`); + } + } catch (e) { + (0, _util.warn)(e); + this.fallbackToSystemFont(properties); + return; + } + amendFallbackToUnicode(properties); + this.data = data; + this.fontType = (0, _fonts_utils.getFontType)(type, subtype, properties.isStandardFont); + this.fontMatrix = properties.fontMatrix; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.toUnicode = properties.toUnicode; + this.seacMap = properties.seacMap; + } + get renderer() { + const renderer = _font_renderer.FontRendererFactory.create(this, _fonts_utils.SEAC_ANALYSIS_ENABLED); + return (0, _util.shadow)(this, "renderer", renderer); + } + exportData() { + let extraProperties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES; + const data = Object.create(null); + let property, value; + for (property of exportDataProperties) { + value = this[property]; + if (value !== undefined) { + data[property] = value; + } + } + return data; + } + fallbackToSystemFont(properties) { + this.missingFile = true; + const name = this.name; + const type = this.type; + const subtype = this.subtype; + let fontName = (0, _fonts_utils.normalizeFontName)(name); + const stdFontMap = (0, _standard_fonts.getStdFontMap)(), + nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)(); + const isStandardFont = !!stdFontMap[fontName]; + const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + const fontBasicMetricsMap = (0, _metrics.getFontBasicMetrics)(); + const metrics = fontBasicMetricsMap[fontName]; + if (metrics) { + if (isNaN(this.ascent)) { + this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.descent)) { + this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.capHeight)) { + this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS; + } + } + this.bold = /bold/gi.test(fontName); + this.italic = /oblique|italic/gi.test(fontName); + this.black = /Black/g.test(name); + const isNarrow = /Narrow/g.test(name); + this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; + if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) { + const cidToGidMap = properties.cidToGidMap; + const map = []; + applyStandardFontGlyphMap(map, (0, _standard_fonts.getGlyphMapForStandardFonts)()); + if (/Arial-?Black/i.test(name)) { + applyStandardFontGlyphMap(map, (0, _standard_fonts.getSupplementalGlyphMapForArialBlack)()); + } else if (/Calibri/i.test(name)) { + applyStandardFontGlyphMap(map, (0, _standard_fonts.getSupplementalGlyphMapForCalibri)()); + } + if (cidToGidMap) { + for (const charCode in map) { + const cid = map[charCode]; + if (cidToGidMap[cid] !== undefined) { + map[+charCode] = cidToGidMap[cid]; + } + } + if (cidToGidMap.length !== this.toUnicode.length && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + const cid = map[charCode]; + if (cidToGidMap[cid] === undefined) { + map[+charCode] = unicodeCharCode; + } + }); + } + } + if (!(this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap)) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + this.toUnicode = new _to_unicode_map.ToUnicodeMap(map); + } else if (/Symbol/i.test(fontName)) { + this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences); + } else if (/Dingbats/i.test(fontName)) { + if (/Wingdings/i.test(name)) { + (0, _util.warn)("Non-embedded Wingdings font, falling back to ZapfDingbats."); + } + this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, _glyphlist.getDingbatsGlyphsUnicode)(), this.differences); + } else if (isStandardFont) { + const map = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences); + if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap)) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + } else { + const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)(); + const map = []; + this.toUnicode.forEach((charCode, unicodeCharCode) => { + if (!this.composite) { + const glyphName = this.differences[charCode] || this.defaultEncoding[charCode]; + const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + unicodeCharCode = unicode; + } + } + map[+charCode] = unicodeCharCode; + }); + if (this.composite && this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap) { + if (/Tahoma|Verdana/i.test(name)) { + applyStandardFontGlyphMap(map, (0, _standard_fonts.getGlyphMapForStandardFonts)()); + } + } + this.toFontChar = map; + } + amendFallbackToUnicode(properties); + this.loadedName = fontName.split("-")[0]; + this.fontType = (0, _fonts_utils.getFontType)(type, subtype, properties.isStandardFont); + } + checkAndRepair(name, font, properties) { + const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "]; + function readTables(file, numTables) { + const tables = Object.create(null); + tables["OS/2"] = null; + tables.cmap = null; + tables.head = null; + tables.hhea = null; + tables.hmtx = null; + tables.maxp = null; + tables.name = null; + tables.post = null; + for (let i = 0; i < numTables; i++) { + const table = readTableEntry(file); + if (!VALID_TABLES.includes(table.tag)) { + continue; + } + if (table.length === 0) { + continue; + } + tables[table.tag] = table; + } + return tables; + } + function readTableEntry(file) { + const tag = file.getString(4); + const checksum = file.getInt32() >>> 0; + const offset = file.getInt32() >>> 0; + const length = file.getInt32() >>> 0; + const previousPosition = file.pos; + file.pos = file.start || 0; + file.skip(offset); + const data = file.getBytes(length); + file.pos = previousPosition; + if (tag === "head") { + data[8] = data[9] = data[10] = data[11] = 0; + data[17] |= 0x20; + } + return { + tag, + checksum, + length, + offset, + data + }; + } + function readOpenTypeHeader(ttf) { + return { + version: ttf.getString(4), + numTables: ttf.getUint16(), + searchRange: ttf.getUint16(), + entrySelector: ttf.getUint16(), + rangeShift: ttf.getUint16() + }; + } + function readTrueTypeCollectionHeader(ttc) { + const ttcTag = ttc.getString(4); + (0, _util.assert)(ttcTag === "ttcf", "Must be a TrueType Collection font."); + const majorVersion = ttc.getUint16(); + const minorVersion = ttc.getUint16(); + const numFonts = ttc.getInt32() >>> 0; + const offsetTable = []; + for (let i = 0; i < numFonts; i++) { + offsetTable.push(ttc.getInt32() >>> 0); + } + const header = { + ttcTag, + majorVersion, + minorVersion, + numFonts, + offsetTable + }; + switch (majorVersion) { + case 1: + return header; + case 2: + header.dsigTag = ttc.getInt32() >>> 0; + header.dsigLength = ttc.getInt32() >>> 0; + header.dsigOffset = ttc.getInt32() >>> 0; + return header; + } + throw new _util.FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`); + } + function readTrueTypeCollectionData(ttc, fontName) { + const { + numFonts, + offsetTable + } = readTrueTypeCollectionHeader(ttc); + const fontNameParts = fontName.split("+"); + let fallbackData; + for (let i = 0; i < numFonts; i++) { + ttc.pos = (ttc.start || 0) + offsetTable[i]; + const potentialHeader = readOpenTypeHeader(ttc); + const potentialTables = readTables(ttc, potentialHeader.numTables); + if (!potentialTables.name) { + throw new _util.FormatError('TrueType Collection font must contain a "name" table.'); + } + const nameTable = readNameTable(potentialTables.name); + for (let j = 0, jj = nameTable.length; j < jj; j++) { + for (let k = 0, kk = nameTable[j].length; k < kk; k++) { + const nameEntry = nameTable[j][k] && nameTable[j][k].replace(/\s/g, ""); + if (!nameEntry) { + continue; + } + if (nameEntry === fontName) { + return { + header: potentialHeader, + tables: potentialTables + }; + } + if (fontNameParts.length < 2) { + continue; + } + for (const part of fontNameParts) { + if (nameEntry === part) { + fallbackData = { + name: part, + header: potentialHeader, + tables: potentialTables + }; + } + } + } + } + } + if (fallbackData) { + (0, _util.warn)(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`); + return { + header: fallbackData.header, + tables: fallbackData.tables + }; + } + throw new _util.FormatError(`TrueType Collection does not contain "${fontName}" font.`); + } + function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) { + if (!cmap) { + (0, _util.warn)("No cmap table available."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + let segment; + let start = (file.start || 0) + cmap.offset; + file.pos = start; + file.skip(2); + const numTables = file.getUint16(); + let potentialTable; + let canBreak = false; + for (let i = 0; i < numTables; i++) { + const platformId = file.getUint16(); + const encodingId = file.getUint16(); + const offset = file.getInt32() >>> 0; + let useTable = false; + if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === encodingId) { + continue; + } + if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) { + useTable = true; + } else if (platformId === 1 && encodingId === 0) { + useTable = true; + } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) { + useTable = true; + if (!isSymbolicFont) { + canBreak = true; + } + } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { + useTable = true; + let correctlySorted = true; + if (i < numTables - 1) { + const nextBytes = file.peekBytes(2), + nextPlatformId = int16(nextBytes[0], nextBytes[1]); + if (nextPlatformId < platformId) { + correctlySorted = false; + } + } + if (correctlySorted) { + canBreak = true; + } + } + if (useTable) { + potentialTable = { + platformId, + encodingId, + offset + }; + } + if (canBreak) { + break; + } + } + if (potentialTable) { + file.pos = start + potentialTable.offset; + } + if (!potentialTable || file.peekByte() === -1) { + (0, _util.warn)("Could not find a preferred cmap table."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + const format = file.getUint16(); + let hasShortCmap = false; + const mappings = []; + let j, glyphId; + if (format === 0) { + file.skip(2 + 2); + for (j = 0; j < 256; j++) { + const index = file.getByte(); + if (!index) { + continue; + } + mappings.push({ + charCode: j, + glyphId: index + }); + } + hasShortCmap = true; + } else if (format === 2) { + file.skip(2 + 2); + const subHeaderKeys = []; + let maxSubHeaderKey = 0; + for (let i = 0; i < 256; i++) { + const subHeaderKey = file.getUint16() >> 3; + subHeaderKeys.push(subHeaderKey); + maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey); + } + const subHeaders = []; + for (let i = 0; i <= maxSubHeaderKey; i++) { + subHeaders.push({ + firstCode: file.getUint16(), + entryCount: file.getUint16(), + idDelta: signedInt16(file.getByte(), file.getByte()), + idRangePos: file.pos + file.getUint16() + }); + } + for (let i = 0; i < 256; i++) { + if (subHeaderKeys[i] === 0) { + file.pos = subHeaders[0].idRangePos + 2 * i; + glyphId = file.getUint16(); + mappings.push({ + charCode: i, + glyphId + }); + } else { + const s = subHeaders[subHeaderKeys[i]]; + for (j = 0; j < s.entryCount; j++) { + const charCode = (i << 8) + j + s.firstCode; + file.pos = s.idRangePos + 2 * j; + glyphId = file.getUint16(); + if (glyphId !== 0) { + glyphId = (glyphId + s.idDelta) % 65536; + } + mappings.push({ + charCode, + glyphId + }); + } + } + } + } else if (format === 4) { + file.skip(2 + 2); + const segCount = file.getUint16() >> 1; + file.skip(6); + const segments = []; + let segIndex; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments.push({ + end: file.getUint16() + }); + } + file.skip(2); + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].start = file.getUint16(); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].delta = file.getUint16(); + } + let offsetsCount = 0, + offsetIndex; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + const rangeOffset = file.getUint16(); + if (!rangeOffset) { + segment.offsetIndex = -1; + continue; + } + offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); + segment.offsetIndex = offsetIndex; + offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1); + } + const offsets = []; + for (j = 0; j < offsetsCount; j++) { + offsets.push(file.getUint16()); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + start = segment.start; + const end = segment.end; + const delta = segment.delta; + offsetIndex = segment.offsetIndex; + for (j = start; j <= end; j++) { + if (j === 0xffff) { + continue; + } + glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; + glyphId = glyphId + delta & 0xffff; + mappings.push({ + charCode: j, + glyphId + }); + } + } + } else if (format === 6) { + file.skip(2 + 2); + const firstCode = file.getUint16(); + const entryCount = file.getUint16(); + for (j = 0; j < entryCount; j++) { + glyphId = file.getUint16(); + const charCode = firstCode + j; + mappings.push({ + charCode, + glyphId + }); + } + } else if (format === 12) { + file.skip(2 + 4 + 4); + const nGroups = file.getInt32() >>> 0; + for (j = 0; j < nGroups; j++) { + const startCharCode = file.getInt32() >>> 0; + const endCharCode = file.getInt32() >>> 0; + let glyphCode = file.getInt32() >>> 0; + for (let charCode = startCharCode; charCode <= endCharCode; charCode++) { + mappings.push({ + charCode, + glyphId: glyphCode++ + }); + } + } + } else { + (0, _util.warn)("cmap table has unsupported format: " + format); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + mappings.sort(function (a, b) { + return a.charCode - b.charCode; + }); + for (let i = 1; i < mappings.length; i++) { + if (mappings[i - 1].charCode === mappings[i].charCode) { + mappings.splice(i, 1); + i--; + } + } + return { + platformId: potentialTable.platformId, + encodingId: potentialTable.encodingId, + mappings, + hasShortCmap + }; + } + function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) { + if (!header) { + if (metrics) { + metrics.data = null; + } + return; + } + file.pos = (file.start || 0) + header.offset; + file.pos += 4; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + file.pos += 2; + const caretOffset = file.getUint16(); + file.pos += 8; + file.pos += 2; + let numOfMetrics = file.getUint16(); + if (caretOffset !== 0) { + const macStyle = int16(headTable.data[44], headTable.data[45]); + if (!(macStyle & 2)) { + header.data[22] = 0; + header.data[23] = 0; + } + } + if (numOfMetrics > numGlyphs) { + (0, _util.info)(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs (${numGlyphs}).`); + numOfMetrics = numGlyphs; + header.data[34] = (numOfMetrics & 0xff00) >> 8; + header.data[35] = numOfMetrics & 0x00ff; + } + const numOfSidebearings = numGlyphs - numOfMetrics; + const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1); + if (numMissing > 0) { + const entries = new Uint8Array(metrics.length + numMissing * 2); + entries.set(metrics.data); + if (dupFirstEntry) { + entries[metrics.length] = metrics.data[2]; + entries[metrics.length + 1] = metrics.data[3]; + } + metrics.data = entries; + } + } + function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) { + const glyphProfile = { + length: 0, + sizeOfInstructions: 0 + }; + if (sourceEnd - sourceStart <= 12) { + return glyphProfile; + } + const glyf = source.subarray(sourceStart, sourceEnd); + let contoursCount = signedInt16(glyf[0], glyf[1]); + if (contoursCount < 0) { + contoursCount = -1; + writeSignedInt16(glyf, 0, contoursCount); + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + let i, + j = 10, + flagsCount = 0; + for (i = 0; i < contoursCount; i++) { + const endPoint = glyf[j] << 8 | glyf[j + 1]; + flagsCount = endPoint + 1; + j += 2; + } + const instructionsStart = j; + const instructionsLength = glyf[j] << 8 | glyf[j + 1]; + glyphProfile.sizeOfInstructions = instructionsLength; + j += 2 + instructionsLength; + const instructionsEnd = j; + let coordinatesLength = 0; + for (i = 0; i < flagsCount; i++) { + const flag = glyf[j++]; + if (flag & 0xc0) { + glyf[j - 1] = flag & 0x3f; + } + let xLength = 2; + if (flag & 2) { + xLength = 1; + } else if (flag & 16) { + xLength = 0; + } + let yLength = 2; + if (flag & 4) { + yLength = 1; + } else if (flag & 32) { + yLength = 0; + } + const xyLength = xLength + yLength; + coordinatesLength += xyLength; + if (flag & 8) { + const repeat = glyf[j++]; + i += repeat; + coordinatesLength += repeat * xyLength; + } + } + if (coordinatesLength === 0) { + return glyphProfile; + } + let glyphDataLength = j + coordinatesLength; + if (glyphDataLength > glyf.length) { + return glyphProfile; + } + if (!hintsValid && instructionsLength > 0) { + dest.set(glyf.subarray(0, instructionsStart), destStart); + dest.set([0, 0], destStart + instructionsStart); + dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2); + glyphDataLength -= instructionsLength; + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + } + glyphProfile.length = glyphDataLength; + return glyphProfile; + } + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + dest.set(glyf.subarray(0, glyphDataLength), destStart); + glyphProfile.length = glyphDataLength; + return glyphProfile; + } + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + function sanitizeHead(head, numGlyphs, locaLength) { + const data = head.data; + const version = int32(data[0], data[1], data[2], data[3]); + if (version >> 16 !== 1) { + (0, _util.info)("Attempting to fix invalid version in head table: " + version); + data[0] = 0; + data[1] = 1; + data[2] = 0; + data[3] = 0; + } + const indexToLocFormat = int16(data[50], data[51]); + if (indexToLocFormat < 0 || indexToLocFormat > 1) { + (0, _util.info)("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat); + const numGlyphsPlusOne = numGlyphs + 1; + if (locaLength === numGlyphsPlusOne << 1) { + data[50] = 0; + data[51] = 0; + } else if (locaLength === numGlyphsPlusOne << 2) { + data[50] = 0; + data[51] = 1; + } else { + throw new _util.FormatError("Could not fix indexToLocFormat: " + indexToLocFormat); + } + } + } + function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) { + let itemSize, itemDecode, itemEncode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = function fontItemDecodeLong(data, offset) { + return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; + }; + itemEncode = function fontItemEncodeLong(data, offset, value) { + data[offset] = value >>> 24 & 0xff; + data[offset + 1] = value >> 16 & 0xff; + data[offset + 2] = value >> 8 & 0xff; + data[offset + 3] = value & 0xff; + }; + } else { + itemSize = 2; + itemDecode = function fontItemDecode(data, offset) { + return data[offset] << 9 | data[offset + 1] << 1; + }; + itemEncode = function fontItemEncode(data, offset, value) { + data[offset] = value >> 9 & 0xff; + data[offset + 1] = value >> 1 & 0xff; + }; + } + const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs; + const locaDataSize = itemSize * (1 + numGlyphsOut); + const locaData = new Uint8Array(locaDataSize); + locaData.set(loca.data.subarray(0, locaDataSize)); + loca.data = locaData; + const oldGlyfData = glyf.data; + const oldGlyfDataLength = oldGlyfData.length; + const newGlyfData = new Uint8Array(oldGlyfDataLength); + let i, j; + const locaEntries = []; + for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) { + let offset = itemDecode(locaData, j); + if (offset > oldGlyfDataLength) { + offset = oldGlyfDataLength; + } + locaEntries.push({ + index: i, + offset, + endOffset: 0 + }); + } + locaEntries.sort((a, b) => { + return a.offset - b.offset; + }); + for (i = 0; i < numGlyphs; i++) { + locaEntries[i].endOffset = locaEntries[i + 1].offset; + } + locaEntries.sort((a, b) => { + return a.index - b.index; + }); + for (i = 0; i < numGlyphs; i++) { + const { + offset, + endOffset + } = locaEntries[i]; + if (offset !== 0 || endOffset !== 0) { + break; + } + const nextOffset = locaEntries[i + 1].offset; + if (nextOffset === 0) { + continue; + } + locaEntries[i].endOffset = nextOffset; + break; + } + const missingGlyphs = Object.create(null); + let writeOffset = 0; + itemEncode(locaData, 0, writeOffset); + for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { + const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); + const newLength = glyphProfile.length; + if (newLength === 0) { + missingGlyphs[i] = true; + } + if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) { + maxSizeOfInstructions = glyphProfile.sizeOfInstructions; + } + writeOffset += newLength; + itemEncode(locaData, j, writeOffset); + } + if (writeOffset === 0) { + const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); + for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) { + itemEncode(locaData, j, simpleGlyph.length); + } + glyf.data = simpleGlyph; + } else if (dupFirstEntry) { + const firstEntryLength = itemDecode(locaData, itemSize); + if (newGlyfData.length > firstEntryLength + writeOffset) { + glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); + } else { + glyf.data = new Uint8Array(firstEntryLength + writeOffset); + glyf.data.set(newGlyfData.subarray(0, writeOffset)); + } + glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); + itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength); + } else { + glyf.data = newGlyfData.subarray(0, writeOffset); + } + return { + missingGlyphs, + maxSizeOfInstructions + }; + } + function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) { + const start = (font.start || 0) + post.offset; + font.pos = start; + const length = post.length, + end = start + length; + const version = font.getInt32(); + font.skip(28); + let glyphNames; + let valid = true; + let i; + switch (version) { + case 0x00010000: + glyphNames = _fonts_utils.MacStandardGlyphOrdering; + break; + case 0x00020000: + const numGlyphs = font.getUint16(); + if (numGlyphs !== maxpNumGlyphs) { + valid = false; + break; + } + const glyphNameIndexes = []; + for (i = 0; i < numGlyphs; ++i) { + const index = font.getUint16(); + if (index >= 32768) { + valid = false; + break; + } + glyphNameIndexes.push(index); + } + if (!valid) { + break; + } + const customNames = [], + strBuf = []; + while (font.pos < end) { + const stringLength = font.getByte(); + strBuf.length = stringLength; + for (i = 0; i < stringLength; ++i) { + strBuf[i] = String.fromCharCode(font.getByte()); + } + customNames.push(strBuf.join("")); + } + glyphNames = []; + for (i = 0; i < numGlyphs; ++i) { + const j = glyphNameIndexes[i]; + if (j < 258) { + glyphNames.push(_fonts_utils.MacStandardGlyphOrdering[j]); + continue; + } + glyphNames.push(customNames[j - 258]); + } + break; + case 0x00030000: + break; + default: + (0, _util.warn)("Unknown/unsupported post table version " + version); + valid = false; + if (propertiesObj.defaultEncoding) { + glyphNames = propertiesObj.defaultEncoding; + } + break; + } + propertiesObj.glyphNames = glyphNames; + return valid; + } + function readNameTable(nameTable) { + const start = (font.start || 0) + nameTable.offset; + font.pos = start; + const names = [[], []]; + const length = nameTable.length, + end = start + length; + const format = font.getUint16(); + const FORMAT_0_HEADER_LENGTH = 6; + if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { + return names; + } + const numRecords = font.getUint16(); + const stringsStart = font.getUint16(); + const records = []; + const NAME_RECORD_LENGTH = 12; + let i, ii; + for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) { + const r = { + platform: font.getUint16(), + encoding: font.getUint16(), + language: font.getUint16(), + name: font.getUint16(), + length: font.getUint16(), + offset: font.getUint16() + }; + if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 && r.language === 0x409) { + records.push(r); + } + } + for (i = 0, ii = records.length; i < ii; i++) { + const record = records[i]; + if (record.length <= 0) { + continue; + } + const pos = start + stringsStart + record.offset; + if (pos + record.length > end) { + continue; + } + font.pos = pos; + const nameIndex = record.name; + if (record.encoding) { + let str = ""; + for (let j = 0, jj = record.length; j < jj; j += 2) { + str += String.fromCharCode(font.getUint16()); + } + names[1][nameIndex] = str; + } else { + names[0][nameIndex] = font.getString(record.length); + } + } + return names; + } + const TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; + function sanitizeTTProgram(table, ttContext) { + let data = table.data; + let i = 0, + j, + n, + b, + funcId, + pc, + lastEndf = 0, + lastDeff = 0; + const stack = []; + const callstack = []; + const functionsCalled = []; + let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; + let inFDEF = false, + ifLevel = 0, + inELSE = 0; + for (let ii = data.length; i < ii;) { + const op = data[i++]; + if (op === 0x40) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if (op === 0x41) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(b << 8 | data[i++]); + } + } + } else if ((op & 0xf8) === 0xb0) { + n = op - 0xb0 + 1; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if ((op & 0xf8) === 0xb8) { + n = op - 0xb8 + 1; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(b << 8 | data[i++]); + } + } + } else if (op === 0x2b && !tooComplexToFollowFunctions) { + if (!inFDEF && !inELSE) { + funcId = stack.at(-1); + if (isNaN(funcId)) { + (0, _util.info)("TT: CALL empty stack (or invalid entry)."); + } else { + ttContext.functionsUsed[funcId] = true; + if (funcId in ttContext.functionsStackDeltas) { + const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId]; + if (newStackLength < 0) { + (0, _util.warn)("TT: CALL invalid functions stack delta."); + ttContext.hintsValid = false; + return; + } + stack.length = newStackLength; + } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) { + callstack.push({ + data, + i, + stackTop: stack.length - 1 + }); + functionsCalled.push(funcId); + pc = ttContext.functionsDefined[funcId]; + if (!pc) { + (0, _util.warn)("TT: CALL non-existent function"); + ttContext.hintsValid = false; + return; + } + data = pc.data; + i = pc.i; + } + } + } + } else if (op === 0x2c && !tooComplexToFollowFunctions) { + if (inFDEF || inELSE) { + (0, _util.warn)("TT: nested FDEFs not allowed"); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + funcId = stack.pop(); + ttContext.functionsDefined[funcId] = { + data, + i + }; + } else if (op === 0x2d) { + if (inFDEF) { + inFDEF = false; + lastEndf = i; + } else { + pc = callstack.pop(); + if (!pc) { + (0, _util.warn)("TT: ENDF bad stack"); + ttContext.hintsValid = false; + return; + } + funcId = functionsCalled.pop(); + data = pc.data; + i = pc.i; + ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; + } + } else if (op === 0x89) { + if (inFDEF || inELSE) { + (0, _util.warn)("TT: nested IDEFs not allowed"); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + } else if (op === 0x58) { + ++ifLevel; + } else if (op === 0x1b) { + inELSE = ifLevel; + } else if (op === 0x59) { + if (inELSE === ifLevel) { + inELSE = 0; + } + --ifLevel; + } else if (op === 0x1c) { + if (!inFDEF && !inELSE) { + const offset = stack.at(-1); + if (offset > 0) { + i += offset - 1; + } + } + } + if (!inFDEF && !inELSE) { + let stackDelta = 0; + if (op <= 0x8e) { + stackDelta = TTOpsStackDeltas[op]; + } else if (op >= 0xc0 && op <= 0xdf) { + stackDelta = -1; + } else if (op >= 0xe0) { + stackDelta = -2; + } + if (op >= 0x71 && op <= 0x75) { + n = stack.pop(); + if (!isNaN(n)) { + stackDelta = -n * 2; + } + } + while (stackDelta < 0 && stack.length > 0) { + stack.pop(); + stackDelta++; + } + while (stackDelta > 0) { + stack.push(NaN); + stackDelta--; + } + } + } + ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; + const content = [data]; + if (i > data.length) { + content.push(new Uint8Array(i - data.length)); + } + if (lastDeff > lastEndf) { + (0, _util.warn)("TT: complementing a missing function tail"); + content.push(new Uint8Array([0x22, 0x2d])); + } + foldTTTable(table, content); + } + function checkInvalidFunctions(ttContext, maxFunctionDefs) { + if (ttContext.tooComplexToFollowFunctions) { + return; + } + if (ttContext.functionsDefined.length > maxFunctionDefs) { + (0, _util.warn)("TT: more functions defined than expected"); + ttContext.hintsValid = false; + return; + } + for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { + if (j > maxFunctionDefs) { + (0, _util.warn)("TT: invalid function id: " + j); + ttContext.hintsValid = false; + return; + } + if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { + (0, _util.warn)("TT: undefined function: " + j); + ttContext.hintsValid = false; + return; + } + } + } + function foldTTTable(table, content) { + if (content.length > 1) { + let newLength = 0; + let j, jj; + for (j = 0, jj = content.length; j < jj; j++) { + newLength += content[j].length; + } + newLength = newLength + 3 & ~3; + const result = new Uint8Array(newLength); + let pos = 0; + for (j = 0, jj = content.length; j < jj; j++) { + result.set(content[j], pos); + pos += content[j].length; + } + table.data = result; + table.length = newLength; + } + } + function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { + const ttContext = { + functionsDefined: [], + functionsUsed: [], + functionsStackDeltas: [], + tooComplexToFollowFunctions: false, + hintsValid: true + }; + if (fpgm) { + sanitizeTTProgram(fpgm, ttContext); + } + if (prep) { + sanitizeTTProgram(prep, ttContext); + } + if (fpgm) { + checkInvalidFunctions(ttContext, maxFunctionDefs); + } + if (cvt && cvt.length & 1) { + const cvtData = new Uint8Array(cvt.length + 1); + cvtData.set(cvt.data); + cvt.data = cvtData; + } + return ttContext.hintsValid; + } + font = new _stream.Stream(new Uint8Array(font.getBytes())); + let header, tables; + if (isTrueTypeCollectionFile(font)) { + const ttcData = readTrueTypeCollectionData(font, this.name); + header = ttcData.header; + tables = ttcData.tables; + } else { + header = readOpenTypeHeader(font); + tables = readTables(font, header.numTables); + } + let cff, cffFile; + const isTrueType = !tables["CFF "]; + if (!isTrueType) { + const isComposite = properties.composite && ((properties.cidToGidMap || []).length > 0 || !(properties.cMap instanceof _cmap.IdentityCMap)); + if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { + cffFile = new _stream.Stream(tables["CFF "].data); + cff = new _cff_font.CFFFont(cffFile, properties); + adjustWidths(properties); + return this.convert(name, cff, properties); + } + delete tables.glyf; + delete tables.loca; + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + this.isOpenType = true; + } else { + if (!tables.loca) { + throw new _util.FormatError('Required "loca" table is not found'); + } + if (!tables.glyf) { + (0, _util.warn)('Required "glyf" table is not found -- trying to recover.'); + tables.glyf = { + tag: "glyf", + data: new Uint8Array(0) + }; + } + this.isOpenType = false; + } + if (!tables.maxp) { + throw new _util.FormatError('Required "maxp" table is not found'); + } + font.pos = (font.start || 0) + tables.maxp.offset; + const version = font.getInt32(); + const numGlyphs = font.getUint16(); + if (properties.scaleFactors && properties.scaleFactors.length === numGlyphs && isTrueType) { + const { + scaleFactors + } = properties; + const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + const glyphs = new _glyf.GlyfTable({ + glyfTable: tables.glyf.data, + isGlyphLocationsLong, + locaTable: tables.loca.data, + numGlyphs + }); + glyphs.scale(scaleFactors); + const { + glyf, + loca, + isLocationLong + } = glyphs.write(); + tables.glyf.data = glyf; + tables.loca.data = loca; + if (isLocationLong !== !!isGlyphLocationsLong) { + tables.head.data[50] = 0; + tables.head.data[51] = isLocationLong ? 1 : 0; + } + const metrics = tables.hmtx.data; + for (let i = 0; i < numGlyphs; i++) { + const j = 4 * i; + const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1])); + metrics[j] = advanceWidth >> 8 & 0xff; + metrics[j + 1] = advanceWidth & 0xff; + const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3])); + writeSignedInt16(metrics, j + 2, lsb); + } + } + let numGlyphsOut = numGlyphs + 1; + let dupFirstEntry = true; + if (numGlyphsOut > 0xffff) { + dupFirstEntry = false; + numGlyphsOut = numGlyphs; + (0, _util.warn)("Not enough space in glyfs to duplicate first glyph."); + } + let maxFunctionDefs = 0; + let maxSizeOfInstructions = 0; + if (version >= 0x00010000 && tables.maxp.length >= 22) { + font.pos += 8; + const maxZones = font.getUint16(); + if (maxZones > 2) { + tables.maxp.data[14] = 0; + tables.maxp.data[15] = 2; + } + font.pos += 4; + maxFunctionDefs = font.getUint16(); + font.pos += 4; + maxSizeOfInstructions = font.getUint16(); + } + tables.maxp.data[4] = numGlyphsOut >> 8; + tables.maxp.data[5] = numGlyphsOut & 255; + const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs); + if (!hintsValid) { + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + } + sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry); + if (!tables.head) { + throw new _util.FormatError('Required "head" table is not found'); + } + sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); + let missingGlyphs = Object.create(null); + if (isTrueType) { + const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions); + missingGlyphs = glyphsInfo.missingGlyphs; + if (version >= 0x00010000 && tables.maxp.length >= 22) { + tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8; + tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255; + } + } + if (!tables.hhea) { + throw new _util.FormatError('Required "hhea" table is not found'); + } + if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { + tables.hhea.data[10] = 0xff; + tables.hhea.data[11] = 0xff; + } + const metricsOverride = { + unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), + yMax: int16(tables.head.data[42], tables.head.data[43]), + yMin: signedInt16(tables.head.data[38], tables.head.data[39]), + ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]), + descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]), + lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9]) + }; + this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; + this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; + this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm; + if (this.cssFontInfo && this.cssFontInfo.lineHeight) { + this.lineHeight = this.cssFontInfo.metrics.lineHeight; + this.lineGap = this.cssFontInfo.metrics.lineGap; + } else { + this.lineHeight = this.ascent - this.descent + this.lineGap; + } + if (tables.post) { + readPostScriptTable(tables.post, properties, numGlyphs); + } + tables.post = { + tag: "post", + data: createPostTable(properties) + }; + const charCodeToGlyphId = []; + function hasGlyph(glyphId) { + return !missingGlyphs[glyphId]; + } + if (properties.composite) { + const cidToGidMap = properties.cidToGidMap || []; + const isCidToGidMapEmpty = cidToGidMap.length === 0; + properties.cMap.forEach(function (charCode, cid) { + if (typeof cid === "string") { + cid = convertCidString(charCode, cid, true); + } + if (cid > 0xffff) { + throw new _util.FormatError("Max size of CID is 65,535"); + } + let glyphId = -1; + if (isCidToGidMapEmpty) { + glyphId = cid; + } else if (cidToGidMap[cid] !== undefined) { + glyphId = cidToGidMap[cid]; + } + if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) { + charCodeToGlyphId[charCode] = glyphId; + } + }); + } else { + const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding); + const cmapPlatformId = cmapTable.platformId; + const cmapEncodingId = cmapTable.encodingId; + const cmapMappings = cmapTable.mappings; + let baseEncoding = [], + forcePostTable = false; + if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) { + baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName); + } + if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) { + const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)(); + for (let charCode = 0; charCode < 256; charCode++) { + let glyphName; + if (this.differences[charCode] !== undefined) { + glyphName = this.differences[charCode]; + } else if (baseEncoding.length && baseEncoding[charCode] !== "") { + glyphName = baseEncoding[charCode]; + } else { + glyphName = _encodings.StandardEncoding[charCode]; + } + if (!glyphName) { + continue; + } + const standardGlyphName = (0, _fonts_utils.recoverGlyphName)(glyphName, glyphsUnicodeMap); + let unicodeOrCharCode; + if (cmapPlatformId === 3 && cmapEncodingId === 1) { + unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; + } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { + unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName); + } + if (unicodeOrCharCode === undefined) { + if (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap)) { + const unicode = this.toUnicode.get(charCode); + if (unicode) { + unicodeOrCharCode = unicode.codePointAt(0); + } + } + if (unicodeOrCharCode === undefined) { + continue; + } + } + for (const mapping of cmapMappings) { + if (mapping.charCode !== unicodeOrCharCode) { + continue; + } + charCodeToGlyphId[charCode] = mapping.glyphId; + break; + } + } + } else if (cmapPlatformId === 0) { + for (const mapping of cmapMappings) { + charCodeToGlyphId[mapping.charCode] = mapping.glyphId; + } + forcePostTable = true; + } else { + for (const mapping of cmapMappings) { + let charCode = mapping.charCode; + if (cmapPlatformId === 3 && charCode >= 0xf000 && charCode <= 0xf0ff) { + charCode &= 0xff; + } + charCodeToGlyphId[charCode] = mapping.glyphId; + } + } + if (properties.glyphNames && (baseEncoding.length || this.differences.length)) { + for (let i = 0; i < 256; ++i) { + if (!forcePostTable && charCodeToGlyphId[i] !== undefined) { + continue; + } + const glyphName = this.differences[i] || baseEncoding[i]; + if (!glyphName) { + continue; + } + const glyphId = properties.glyphNames.indexOf(glyphName); + if (glyphId > 0 && hasGlyph(glyphId)) { + charCodeToGlyphId[i] = glyphId; + } + } + } + } + if (charCodeToGlyphId.length === 0) { + charCodeToGlyphId[0] = 0; + } + let glyphZeroId = numGlyphsOut - 1; + if (!dupFirstEntry) { + glyphZeroId = 0; + } + if (!properties.cssFontInfo) { + const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode); + this.toFontChar = newMapping.toFontChar; + tables.cmap = { + tag: "cmap", + data: createCmapTable(newMapping.charCodeToGlyphId, newMapping.toUnicodeExtraMap, numGlyphsOut) + }; + if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) { + tables["OS/2"] = { + tag: "OS/2", + data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride) + }; + } + } + if (!isTrueType) { + try { + cffFile = new _stream.Stream(tables["CFF "].data); + const parser = new _cff_parser.CFFParser(cffFile, properties, _fonts_utils.SEAC_ANALYSIS_ENABLED); + cff = parser.parse(); + cff.duplicateFirstGlyph(); + const compiler = new _cff_parser.CFFCompiler(cff); + tables["CFF "].data = compiler.compile(); + } catch (e) { + (0, _util.warn)("Failed to compile font " + properties.loadedName); + } + } + if (!tables.name) { + tables.name = { + tag: "name", + data: createNameTable(this.name) + }; + } else { + const namePrototype = readNameTable(tables.name); + tables.name.data = createNameTable(name, namePrototype); + this.psName = namePrototype[0][6] || null; + } + const builder = new _opentype_file_builder.OpenTypeFileBuilder(header.version); + for (const tableTag in tables) { + builder.addTable(tableTag, tables[tableTag].data); + } + return builder.toArray(); + } + convert(fontName, font, properties) { + properties.fixedPitch = false; + if (properties.builtInEncoding) { + adjustToUnicode(properties, properties.builtInEncoding); + } + let glyphZeroId = 1; + if (font instanceof _cff_font.CFFFont) { + glyphZeroId = font.numGlyphs - 1; + } + const mapping = font.getGlyphMapping(properties); + let newMapping = null; + let newCharCodeToGlyphId = mapping; + let toUnicodeExtraMap = null; + if (!properties.cssFontInfo) { + newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId, this.toUnicode); + this.toFontChar = newMapping.toFontChar; + newCharCodeToGlyphId = newMapping.charCodeToGlyphId; + toUnicodeExtraMap = newMapping.toUnicodeExtraMap; + } + const numGlyphs = font.numGlyphs; + function getCharCodes(charCodeToGlyphId, glyphId) { + let charCodes = null; + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + if (!charCodes) { + charCodes = []; + } + charCodes.push(charCode | 0); + } + } + return charCodes; + } + function createCharCode(charCodeToGlyphId, glyphId) { + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + return charCode | 0; + } + } + newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId; + return newMapping.nextAvailableFontCharCode++; + } + const seacs = font.seacs; + if (newMapping && _fonts_utils.SEAC_ANALYSIS_ENABLED && seacs && seacs.length) { + const matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX; + const charset = font.getCharset(); + const seacMap = Object.create(null); + for (let glyphId in seacs) { + glyphId |= 0; + const seac = seacs[glyphId]; + const baseGlyphName = _encodings.StandardEncoding[seac[2]]; + const accentGlyphName = _encodings.StandardEncoding[seac[3]]; + const baseGlyphId = charset.indexOf(baseGlyphName); + const accentGlyphId = charset.indexOf(accentGlyphName); + if (baseGlyphId < 0 || accentGlyphId < 0) { + continue; + } + const accentOffset = { + x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], + y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] + }; + const charCodes = getCharCodes(mapping, glyphId); + if (!charCodes) { + continue; + } + for (const charCode of charCodes) { + const charCodeToGlyphId = newMapping.charCodeToGlyphId; + const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); + const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); + seacMap[charCode] = { + baseFontCharCode, + accentFontCharCode, + accentOffset + }; + } + } + properties.seacMap = seacMap; + } + const unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0]; + const builder = new _opentype_file_builder.OpenTypeFileBuilder("\x4F\x54\x54\x4F"); + builder.addTable("CFF ", font.data); + builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); + builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs)); + builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + "\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + "\x00\x00" + "\x00\x00"); + builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs)); + builder.addTable("hmtx", function fontFieldsHmtx() { + const charstrings = font.charstrings; + const cffWidths = font.cff ? font.cff.widths : null; + let hmtx = "\x00\x00\x00\x00"; + for (let i = 1, ii = numGlyphs; i < ii; i++) { + let width = 0; + if (charstrings) { + const charstring = charstrings[i - 1]; + width = "width" in charstring ? charstring.width : 0; + } else if (cffWidths) { + width = Math.ceil(cffWidths[i] || 0); + } + hmtx += string16(width) + string16(0); + } + return hmtx; + }()); + builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs)); + builder.addTable("name", createNameTable(fontName)); + builder.addTable("post", createPostTable(properties)); + return builder.toArray(); + } + get spaceWidth() { + const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; + let width; + for (const glyphName of possibleSpaceReplacements) { + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)(); + const glyphUnicode = glyphsUnicodeMap[glyphName]; + let charcode = 0; + if (this.composite && this.cMap.contains(glyphUnicode)) { + charcode = this.cMap.lookup(glyphUnicode); + if (typeof charcode === "string") { + charcode = convertCidString(glyphUnicode, charcode); + } + } + if (!charcode && this.toUnicode) { + charcode = this.toUnicode.charCodeOf(glyphUnicode); + } + if (charcode <= 0) { + charcode = glyphUnicode; + } + width = this.widths[charcode]; + if (width) { + break; + } + } + width = width || this.defaultWidth; + return (0, _util.shadow)(this, "spaceWidth", width); + } + _charToGlyph(charcode) { + let isSpace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + let glyph = this._glyphCache[charcode]; + if (glyph && glyph.isSpace === isSpace) { + return glyph; + } + let fontCharCode, width, operatorListId; + let widthCode = charcode; + if (this.cMap && this.cMap.contains(charcode)) { + widthCode = this.cMap.lookup(charcode); + if (typeof widthCode === "string") { + widthCode = convertCidString(charcode, widthCode); + } + } + width = this.widths[widthCode]; + if (typeof width !== "number") { + width = this.defaultWidth; + } + const vmetric = this.vmetrics && this.vmetrics[widthCode]; + let unicode = this.toUnicode.get(charcode) || charcode; + if (typeof unicode === "number") { + unicode = String.fromCharCode(unicode); + } + let isInFont = this.toFontChar[charcode] !== undefined; + fontCharCode = this.toFontChar[charcode] || charcode; + if (this.missingFile) { + const glyphName = this.differences[charcode] || this.defaultEncoding[charcode]; + if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { + fontCharCode = 0x20; + } + fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode); + } + if (this.isType3Font) { + operatorListId = fontCharCode; + } + let accent = null; + if (this.seacMap && this.seacMap[charcode]) { + isInFont = true; + const seac = this.seacMap[charcode]; + fontCharCode = seac.baseFontCharCode; + accent = { + fontChar: String.fromCodePoint(seac.accentFontCharCode), + offset: seac.accentOffset + }; + } + let fontChar = ""; + if (typeof fontCharCode === "number") { + if (fontCharCode <= 0x10ffff) { + fontChar = String.fromCodePoint(fontCharCode); + } else { + (0, _util.warn)(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); + } + } + glyph = new Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); + return this._glyphCache[charcode] = glyph; + } + charsToGlyphs(chars) { + let glyphs = this._charsCache[chars]; + if (glyphs) { + return glyphs; + } + glyphs = []; + if (this.cMap) { + const c = Object.create(null), + ii = chars.length; + let i = 0; + while (i < ii) { + this.cMap.readCharCode(chars, i, c); + const { + charcode, + length + } = c; + i += length; + const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20); + glyphs.push(glyph); + } + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + const charcode = chars.charCodeAt(i); + const glyph = this._charToGlyph(charcode, charcode === 0x20); + glyphs.push(glyph); + } + } + return this._charsCache[chars] = glyphs; + } + getCharPositions(chars) { + const positions = []; + if (this.cMap) { + const c = Object.create(null); + let i = 0; + while (i < chars.length) { + this.cMap.readCharCode(chars, i, c); + const length = c.length; + positions.push([i, i + length]); + i += length; + } + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + positions.push([i, i + 1]); + } + } + return positions; + } + get glyphCacheValues() { + return Object.values(this._glyphCache); + } + encodeString(str) { + const buffers = []; + const currentBuf = []; + const hasCurrentBufErrors = () => buffers.length % 2 === 1; + const getCharCode = this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap ? unicode => this.toUnicode.charCodeOf(unicode) : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode)); + for (let i = 0, ii = str.length; i < ii; i++) { + const unicode = str.codePointAt(i); + if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) { + i++; + } + if (this.toUnicode) { + const charCode = getCharCode(unicode); + if (charCode !== -1) { + if (hasCurrentBufErrors()) { + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1; + for (let j = charCodeLength - 1; j >= 0; j--) { + currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff)); + } + continue; + } + } + if (!hasCurrentBufErrors()) { + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + currentBuf.push(String.fromCodePoint(unicode)); + } + buffers.push(currentBuf.join("")); + return buffers; + } +} +exports.Font = Font; +class ErrorFont { + constructor(error) { + this.error = error; + this.loadedName = "g_font_error"; + this.missingFile = true; + } + charsToGlyphs() { + return []; + } + encodeString(chars) { + return [chars]; + } + exportData() { + let extraProperties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return { + error: this.error + }; + } +} +exports.ErrorFont = ErrorFont; + +/***/ }), +/* 164 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.CFFTopDict = exports.CFFStrings = exports.CFFStandardStrings = exports.CFFPrivateDict = exports.CFFParser = exports.CFFIndex = exports.CFFHeader = exports.CFFFDSelect = exports.CFFCompiler = exports.CFFCharset = exports.CFF = void 0; +var _util = __w_pdfjs_require__(2); +var _charsets = __w_pdfjs_require__(165); +var _encodings = __w_pdfjs_require__(166); +const MAX_SUBR_NESTING = 10; +const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; +exports.CFFStandardStrings = CFFStandardStrings; +const NUM_STANDARD_CFF_STRINGS = 391; +const CharstringValidationData = [null, { + id: "hstem", + min: 2, + stackClearing: true, + stem: true +}, null, { + id: "vstem", + min: 2, + stackClearing: true, + stem: true +}, { + id: "vmoveto", + min: 1, + stackClearing: true +}, { + id: "rlineto", + min: 2, + resetStack: true +}, { + id: "hlineto", + min: 1, + resetStack: true +}, { + id: "vlineto", + min: 1, + resetStack: true +}, { + id: "rrcurveto", + min: 6, + resetStack: true +}, null, { + id: "callsubr", + min: 1, + undefStack: true +}, { + id: "return", + min: 0, + undefStack: true +}, null, null, { + id: "endchar", + min: 0, + stackClearing: true +}, null, null, null, { + id: "hstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "hintmask", + min: 0, + stackClearing: true +}, { + id: "cntrmask", + min: 0, + stackClearing: true +}, { + id: "rmoveto", + min: 2, + stackClearing: true +}, { + id: "hmoveto", + min: 1, + stackClearing: true +}, { + id: "vstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "rcurveline", + min: 8, + resetStack: true +}, { + id: "rlinecurve", + min: 8, + resetStack: true +}, { + id: "vvcurveto", + min: 4, + resetStack: true +}, { + id: "hhcurveto", + min: 4, + resetStack: true +}, null, { + id: "callgsubr", + min: 1, + undefStack: true +}, { + id: "vhcurveto", + min: 4, + resetStack: true +}, { + id: "hvcurveto", + min: 4, + resetStack: true +}]; +const CharstringValidationData12 = [null, null, null, { + id: "and", + min: 2, + stackDelta: -1 +}, { + id: "or", + min: 2, + stackDelta: -1 +}, { + id: "not", + min: 1, + stackDelta: 0 +}, null, null, null, { + id: "abs", + min: 1, + stackDelta: 0 +}, { + id: "add", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] + stack[index - 1]; + } +}, { + id: "sub", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] - stack[index - 1]; + } +}, { + id: "div", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] / stack[index - 1]; + } +}, null, { + id: "neg", + min: 1, + stackDelta: 0, + stackFn(stack, index) { + stack[index - 1] = -stack[index - 1]; + } +}, { + id: "eq", + min: 2, + stackDelta: -1 +}, null, null, { + id: "drop", + min: 1, + stackDelta: -1 +}, null, { + id: "put", + min: 2, + stackDelta: -2 +}, { + id: "get", + min: 1, + stackDelta: 0 +}, { + id: "ifelse", + min: 4, + stackDelta: -3 +}, { + id: "random", + min: 0, + stackDelta: 1 +}, { + id: "mul", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] * stack[index - 1]; + } +}, null, { + id: "sqrt", + min: 1, + stackDelta: 0 +}, { + id: "dup", + min: 1, + stackDelta: 1 +}, { + id: "exch", + min: 2, + stackDelta: 0 +}, { + id: "index", + min: 2, + stackDelta: 0 +}, { + id: "roll", + min: 3, + stackDelta: -2 +}, null, null, null, { + id: "hflex", + min: 7, + resetStack: true +}, { + id: "flex", + min: 13, + resetStack: true +}, { + id: "hflex1", + min: 9, + resetStack: true +}, { + id: "flex1", + min: 11, + resetStack: true +}]; +class CFFParser { + constructor(file, properties, seacAnalysisEnabled) { + this.bytes = file.getBytes(); + this.properties = properties; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + } + parse() { + const properties = this.properties; + const cff = new CFF(); + this.cff = cff; + const header = this.parseHeader(); + const nameIndex = this.parseIndex(header.endPos); + const topDictIndex = this.parseIndex(nameIndex.endPos); + const stringIndex = this.parseIndex(topDictIndex.endPos); + const globalSubrIndex = this.parseIndex(stringIndex.endPos); + const topDictParsed = this.parseDict(topDictIndex.obj.get(0)); + const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); + cff.header = header.obj; + cff.names = this.parseNameIndex(nameIndex.obj); + cff.strings = this.parseStringIndex(stringIndex.obj); + cff.topDict = topDict; + cff.globalSubrIndex = globalSubrIndex.obj; + this.parsePrivateDict(cff.topDict); + cff.isCIDFont = topDict.hasName("ROS"); + const charStringOffset = topDict.getByName("CharStrings"); + const charStringIndex = this.parseIndex(charStringOffset).obj; + const fontMatrix = topDict.getByName("FontMatrix"); + if (fontMatrix) { + properties.fontMatrix = fontMatrix; + } + const fontBBox = topDict.getByName("FontBBox"); + if (fontBBox) { + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + } + let charset, encoding; + if (cff.isCIDFont) { + const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; + for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) { + const dictRaw = fdArrayIndex.get(i); + const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); + this.parsePrivateDict(fontDict); + cff.fdArray.push(fontDict); + } + encoding = null; + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); + cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); + } else { + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); + encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); + } + cff.charset = charset; + cff.encoding = encoding; + const charStringsAndSeacs = this.parseCharStrings({ + charStrings: charStringIndex, + localSubrIndex: topDict.privateDict.subrsIndex, + globalSubrIndex: globalSubrIndex.obj, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray, + privateDict: topDict.privateDict + }); + cff.charStrings = charStringsAndSeacs.charStrings; + cff.seacs = charStringsAndSeacs.seacs; + cff.widths = charStringsAndSeacs.widths; + return cff; + } + parseHeader() { + let bytes = this.bytes; + const bytesLength = bytes.length; + let offset = 0; + while (offset < bytesLength && bytes[offset] !== 1) { + ++offset; + } + if (offset >= bytesLength) { + throw new _util.FormatError("Invalid CFF header"); + } + if (offset !== 0) { + (0, _util.info)("cff data is shifted"); + bytes = bytes.subarray(offset); + this.bytes = bytes; + } + const major = bytes[0]; + const minor = bytes[1]; + const hdrSize = bytes[2]; + const offSize = bytes[3]; + const header = new CFFHeader(major, minor, hdrSize, offSize); + return { + obj: header, + endPos: hdrSize + }; + } + parseDict(dict) { + let pos = 0; + function parseOperand() { + let value = dict[pos++]; + if (value === 30) { + return parseFloatOperand(); + } else if (value === 28) { + value = dict[pos++]; + value = (value << 24 | dict[pos++] << 16) >> 16; + return value; + } else if (value === 29) { + value = dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + return value; + } else if (value >= 32 && value <= 246) { + return value - 139; + } else if (value >= 247 && value <= 250) { + return (value - 247) * 256 + dict[pos++] + 108; + } else if (value >= 251 && value <= 254) { + return -((value - 251) * 256) - dict[pos++] - 108; + } + (0, _util.warn)('CFFParser_parseDict: "' + value + '" is a reserved command.'); + return NaN; + } + function parseFloatOperand() { + let str = ""; + const eof = 15; + const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"]; + const length = dict.length; + while (pos < length) { + const b = dict[pos++]; + const b1 = b >> 4; + const b2 = b & 15; + if (b1 === eof) { + break; + } + str += lookup[b1]; + if (b2 === eof) { + break; + } + str += lookup[b2]; + } + return parseFloat(str); + } + let operands = []; + const entries = []; + pos = 0; + const end = dict.length; + while (pos < end) { + let b = dict[pos]; + if (b <= 21) { + if (b === 12) { + b = b << 8 | dict[++pos]; + } + entries.push([b, operands]); + operands = []; + ++pos; + } else { + operands.push(parseOperand()); + } + } + return entries; + } + parseIndex(pos) { + const cffIndex = new CFFIndex(); + const bytes = this.bytes; + const count = bytes[pos++] << 8 | bytes[pos++]; + const offsets = []; + let end = pos; + let i, ii; + if (count !== 0) { + const offsetSize = bytes[pos++]; + const startPos = pos + (count + 1) * offsetSize - 1; + for (i = 0, ii = count + 1; i < ii; ++i) { + let offset = 0; + for (let j = 0; j < offsetSize; ++j) { + offset <<= 8; + offset += bytes[pos++]; + } + offsets.push(startPos + offset); + } + end = offsets[count]; + } + for (i = 0, ii = offsets.length - 1; i < ii; ++i) { + const offsetStart = offsets[i]; + const offsetEnd = offsets[i + 1]; + cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); + } + return { + obj: cffIndex, + endPos: end + }; + } + parseNameIndex(index) { + const names = []; + for (let i = 0, ii = index.count; i < ii; ++i) { + const name = index.get(i); + names.push((0, _util.bytesToString)(name)); + } + return names; + } + parseStringIndex(index) { + const strings = new CFFStrings(); + for (let i = 0, ii = index.count; i < ii; ++i) { + const data = index.get(i); + strings.add((0, _util.bytesToString)(data)); + } + return strings; + } + createDict(Type, dict, strings) { + const cffDict = new Type(strings); + for (const [key, value] of dict) { + cffDict.setByKey(key, value); + } + return cffDict; + } + parseCharString(state, data, localSubrIndex, globalSubrIndex) { + if (!data || state.callDepth > MAX_SUBR_NESTING) { + return false; + } + let stackSize = state.stackSize; + const stack = state.stack; + let length = data.length; + for (let j = 0; j < length;) { + const value = data[j++]; + let validationCommand = null; + if (value === 12) { + const q = data[j++]; + if (q === 0) { + data[j - 2] = 139; + data[j - 1] = 22; + stackSize = 0; + } else { + validationCommand = CharstringValidationData12[q]; + } + } else if (value === 28) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16; + j += 2; + stackSize++; + } else if (value === 14) { + if (stackSize >= 4) { + stackSize -= 4; + if (this.seacAnalysisEnabled) { + state.seac = stack.slice(stackSize, stackSize + 4); + return false; + } + } + validationCommand = CharstringValidationData[value]; + } else if (value >= 32 && value <= 246) { + stack[stackSize] = value - 139; + stackSize++; + } else if (value >= 247 && value <= 254) { + stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; + j++; + stackSize++; + } else if (value === 255) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536; + j += 4; + stackSize++; + } else if (value === 19 || value === 20) { + state.hints += stackSize >> 1; + j += state.hints + 7 >> 3; + stackSize %= 2; + validationCommand = CharstringValidationData[value]; + } else if (value === 10 || value === 29) { + let subrsIndex; + if (value === 10) { + subrsIndex = localSubrIndex; + } else { + subrsIndex = globalSubrIndex; + } + if (!subrsIndex) { + validationCommand = CharstringValidationData[value]; + (0, _util.warn)("Missing subrsIndex for " + validationCommand.id); + return false; + } + let bias = 32768; + if (subrsIndex.count < 1240) { + bias = 107; + } else if (subrsIndex.count < 33900) { + bias = 1131; + } + const subrNumber = stack[--stackSize] + bias; + if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) { + validationCommand = CharstringValidationData[value]; + (0, _util.warn)("Out of bounds subrIndex for " + validationCommand.id); + return false; + } + state.stackSize = stackSize; + state.callDepth++; + const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); + if (!valid) { + return false; + } + state.callDepth--; + stackSize = state.stackSize; + continue; + } else if (value === 11) { + state.stackSize = stackSize; + return true; + } else if (value === 0 && j === data.length) { + data[j - 1] = 14; + validationCommand = CharstringValidationData[14]; + } else if (value === 9) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } else { + validationCommand = CharstringValidationData[value]; + } + if (validationCommand) { + if (validationCommand.stem) { + state.hints += stackSize >> 1; + if (value === 3 || value === 23) { + state.hasVStems = true; + } else if (state.hasVStems && (value === 1 || value === 18)) { + (0, _util.warn)("CFF stem hints are in wrong order"); + data[j - 1] = value === 1 ? 3 : 23; + } + } + if ("min" in validationCommand) { + if (!state.undefStack && stackSize < validationCommand.min) { + (0, _util.warn)("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min); + if (stackSize === 0) { + data[j - 1] = 14; + return true; + } + return false; + } + } + if (state.firstStackClearing && validationCommand.stackClearing) { + state.firstStackClearing = false; + stackSize -= validationCommand.min; + if (stackSize >= 2 && validationCommand.stem) { + stackSize %= 2; + } else if (stackSize > 1) { + (0, _util.warn)("Found too many parameters for stack-clearing command"); + } + if (stackSize > 0) { + state.width = stack[stackSize - 1]; + } + } + if ("stackDelta" in validationCommand) { + if ("stackFn" in validationCommand) { + validationCommand.stackFn(stack, stackSize); + } + stackSize += validationCommand.stackDelta; + } else if (validationCommand.stackClearing) { + stackSize = 0; + } else if (validationCommand.resetStack) { + stackSize = 0; + state.undefStack = false; + } else if (validationCommand.undefStack) { + stackSize = 0; + state.undefStack = true; + state.firstStackClearing = false; + } + } + } + if (length < data.length) { + data.fill(14, length); + } + state.stackSize = stackSize; + return true; + } + parseCharStrings(_ref) { + let { + charStrings, + localSubrIndex, + globalSubrIndex, + fdSelect, + fdArray, + privateDict + } = _ref; + const seacs = []; + const widths = []; + const count = charStrings.count; + for (let i = 0; i < count; i++) { + const charstring = charStrings.get(i); + const state = { + callDepth: 0, + stackSize: 0, + stack: [], + undefStack: true, + hints: 0, + firstStackClearing: true, + seac: null, + width: null, + hasVStems: false + }; + let valid = true; + let localSubrToUse = null; + let privateDictToUse = privateDict; + if (fdSelect && fdArray.length) { + const fdIndex = fdSelect.getFDIndex(i); + if (fdIndex === -1) { + (0, _util.warn)("Glyph index is not in fd select."); + valid = false; + } + if (fdIndex >= fdArray.length) { + (0, _util.warn)("Invalid fd index for glyph index."); + valid = false; + } + if (valid) { + privateDictToUse = fdArray[fdIndex].privateDict; + localSubrToUse = privateDictToUse.subrsIndex; + } + } else if (localSubrIndex) { + localSubrToUse = localSubrIndex; + } + if (valid) { + valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); + } + if (state.width !== null) { + const nominalWidth = privateDictToUse.getByName("nominalWidthX"); + widths[i] = nominalWidth + state.width; + } else { + const defaultWidth = privateDictToUse.getByName("defaultWidthX"); + widths[i] = defaultWidth; + } + if (state.seac !== null) { + seacs[i] = state.seac; + } + if (!valid) { + charStrings.set(i, new Uint8Array([14])); + } + } + return { + charStrings, + seacs, + widths + }; + } + emptyPrivateDictionary(parentDict) { + const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); + parentDict.setByKey(18, [0, 0]); + parentDict.privateDict = privateDict; + } + parsePrivateDict(parentDict) { + if (!parentDict.hasName("Private")) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateOffset = parentDict.getByName("Private"); + if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { + parentDict.removeByName("Private"); + return; + } + const size = privateOffset[0]; + const offset = privateOffset[1]; + if (size === 0 || offset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateDictEnd = offset + size; + const dictData = this.bytes.subarray(offset, privateDictEnd); + const dict = this.parseDict(dictData); + const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); + parentDict.privateDict = privateDict; + if (!privateDict.getByName("Subrs")) { + return; + } + const subrsOffset = privateDict.getByName("Subrs"); + const relativeOffset = offset + subrsOffset; + if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const subrsIndex = this.parseIndex(relativeOffset); + privateDict.subrsIndex = subrsIndex.obj; + } + parseCharsets(pos, length, strings, cid) { + if (pos === 0) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset); + } else if (pos === 1) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset); + } else if (pos === 2) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset); + } + const bytes = this.bytes; + const start = pos; + const format = bytes[pos++]; + const charset = [cid ? 0 : ".notdef"]; + let id, count, i; + length -= 1; + switch (format) { + case 0: + for (i = 0; i < length; i++) { + id = bytes[pos++] << 8 | bytes[pos++]; + charset.push(cid ? id : strings.get(id)); + } + break; + case 1: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + case 2: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + default: + throw new _util.FormatError("Unknown charset format"); + } + const end = pos; + const raw = bytes.subarray(start, end); + return new CFFCharset(false, format, charset, raw); + } + parseEncoding(pos, properties, strings, charset) { + const encoding = Object.create(null); + const bytes = this.bytes; + let predefined = false; + let format, i, ii; + let raw = null; + function readSupplement() { + const supplementsCount = bytes[pos++]; + for (i = 0; i < supplementsCount; i++) { + const code = bytes[pos++]; + const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); + encoding[code] = charset.indexOf(strings.get(sid)); + } + } + if (pos === 0 || pos === 1) { + predefined = true; + format = pos; + const baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding; + for (i = 0, ii = charset.length; i < ii; i++) { + const index = baseEncoding.indexOf(charset[i]); + if (index !== -1) { + encoding[index] = i; + } + } + } else { + const dataStart = pos; + format = bytes[pos++]; + switch (format & 0x7f) { + case 0: + const glyphsCount = bytes[pos++]; + for (i = 1; i <= glyphsCount; i++) { + encoding[bytes[pos++]] = i; + } + break; + case 1: + const rangesCount = bytes[pos++]; + let gid = 1; + for (i = 0; i < rangesCount; i++) { + const start = bytes[pos++]; + const left = bytes[pos++]; + for (let j = start; j <= start + left; j++) { + encoding[j] = gid++; + } + } + break; + default: + throw new _util.FormatError(`Unknown encoding format: ${format} in CFF`); + } + const dataEnd = pos; + if (format & 0x80) { + bytes[dataStart] &= 0x7f; + readSupplement(); + } + raw = bytes.subarray(dataStart, dataEnd); + } + format &= 0x7f; + return new CFFEncoding(predefined, format, encoding, raw); + } + parseFDSelect(pos, length) { + const bytes = this.bytes; + const format = bytes[pos++]; + const fdSelect = []; + let i; + switch (format) { + case 0: + for (i = 0; i < length; ++i) { + const id = bytes[pos++]; + fdSelect.push(id); + } + break; + case 3: + const rangesCount = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i < rangesCount; ++i) { + let first = bytes[pos++] << 8 | bytes[pos++]; + if (i === 0 && first !== 0) { + (0, _util.warn)("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover."); + first = 0; + } + const fdIndex = bytes[pos++]; + const next = bytes[pos] << 8 | bytes[pos + 1]; + for (let j = first; j < next; ++j) { + fdSelect.push(fdIndex); + } + } + pos += 2; + break; + default: + throw new _util.FormatError(`parseFDSelect: Unknown format "${format}".`); + } + if (fdSelect.length !== length) { + throw new _util.FormatError("parseFDSelect: Invalid font data."); + } + return new CFFFDSelect(format, fdSelect); + } +} +exports.CFFParser = CFFParser; +class CFF { + constructor() { + this.header = null; + this.names = []; + this.topDict = null; + this.strings = new CFFStrings(); + this.globalSubrIndex = null; + this.encoding = null; + this.charset = null; + this.charStrings = null; + this.fdArray = []; + this.fdSelect = null; + this.isCIDFont = false; + } + duplicateFirstGlyph() { + if (this.charStrings.count >= 65535) { + (0, _util.warn)("Not enough space in charstrings to duplicate first glyph."); + return; + } + const glyphZero = this.charStrings.get(0); + this.charStrings.add(glyphZero); + if (this.isCIDFont) { + this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + } + } + hasGlyphId(id) { + if (id < 0 || id >= this.charStrings.count) { + return false; + } + const glyph = this.charStrings.get(id); + return glyph.length > 0; + } +} +exports.CFF = CFF; +class CFFHeader { + constructor(major, minor, hdrSize, offSize) { + this.major = major; + this.minor = minor; + this.hdrSize = hdrSize; + this.offSize = offSize; + } +} +exports.CFFHeader = CFFHeader; +class CFFStrings { + constructor() { + this.strings = []; + } + get(index) { + if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { + return CFFStandardStrings[index]; + } + if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { + return this.strings[index - NUM_STANDARD_CFF_STRINGS]; + } + return CFFStandardStrings[0]; + } + getSID(str) { + let index = CFFStandardStrings.indexOf(str); + if (index !== -1) { + return index; + } + index = this.strings.indexOf(str); + if (index !== -1) { + return index + NUM_STANDARD_CFF_STRINGS; + } + return -1; + } + add(value) { + this.strings.push(value); + } + get count() { + return this.strings.length; + } +} +exports.CFFStrings = CFFStrings; +class CFFIndex { + constructor() { + this.objects = []; + this.length = 0; + } + add(data) { + this.length += data.length; + this.objects.push(data); + } + set(index, data) { + this.length += data.length - this.objects[index].length; + this.objects[index] = data; + } + get(index) { + return this.objects[index]; + } + get count() { + return this.objects.length; + } +} +exports.CFFIndex = CFFIndex; +class CFFDict { + constructor(tables, strings) { + this.keyToNameMap = tables.keyToNameMap; + this.nameToKeyMap = tables.nameToKeyMap; + this.defaults = tables.defaults; + this.types = tables.types; + this.opcodes = tables.opcodes; + this.order = tables.order; + this.strings = strings; + this.values = Object.create(null); + } + setByKey(key, value) { + if (!(key in this.keyToNameMap)) { + return false; + } + if (value.length === 0) { + return true; + } + for (const val of value) { + if (isNaN(val)) { + (0, _util.warn)(`Invalid CFFDict value: "${value}" for key "${key}".`); + return true; + } + } + const type = this.types[key]; + if (type === "num" || type === "sid" || type === "offset") { + value = value[0]; + } + this.values[key] = value; + return true; + } + setByName(name, value) { + if (!(name in this.nameToKeyMap)) { + throw new _util.FormatError(`Invalid dictionary name "${name}"`); + } + this.values[this.nameToKeyMap[name]] = value; + } + hasName(name) { + return this.nameToKeyMap[name] in this.values; + } + getByName(name) { + if (!(name in this.nameToKeyMap)) { + throw new _util.FormatError(`Invalid dictionary name ${name}"`); + } + const key = this.nameToKeyMap[name]; + if (!(key in this.values)) { + return this.defaults[key]; + } + return this.values[key]; + } + removeByName(name) { + delete this.values[this.nameToKeyMap[name]]; + } + static createTables(layout) { + const tables = { + keyToNameMap: {}, + nameToKeyMap: {}, + defaults: {}, + types: {}, + opcodes: {}, + order: [] + }; + for (const entry of layout) { + const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; + tables.keyToNameMap[key] = entry[1]; + tables.nameToKeyMap[entry[1]] = key; + tables.types[key] = entry[2]; + tables.defaults[key] = entry[3]; + tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]]; + tables.order.push(key); + } + return tables; + } +} +const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]]; +class CFFTopDict extends CFFDict { + static get tables() { + return (0, _util.shadow)(this, "tables", this.createTables(CFFTopDictLayout)); + } + constructor(strings) { + super(CFFTopDict.tables, strings); + this.privateDict = null; + } +} +exports.CFFTopDict = CFFTopDict; +const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], "BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]]; +class CFFPrivateDict extends CFFDict { + static get tables() { + return (0, _util.shadow)(this, "tables", this.createTables(CFFPrivateDictLayout)); + } + constructor(strings) { + super(CFFPrivateDict.tables, strings); + this.subrsIndex = null; + } +} +exports.CFFPrivateDict = CFFPrivateDict; +const CFFCharsetPredefinedTypes = { + ISO_ADOBE: 0, + EXPERT: 1, + EXPERT_SUBSET: 2 +}; +class CFFCharset { + constructor(predefined, format, charset, raw) { + this.predefined = predefined; + this.format = format; + this.charset = charset; + this.raw = raw; + } +} +exports.CFFCharset = CFFCharset; +class CFFEncoding { + constructor(predefined, format, encoding, raw) { + this.predefined = predefined; + this.format = format; + this.encoding = encoding; + this.raw = raw; + } +} +class CFFFDSelect { + constructor(format, fdSelect) { + this.format = format; + this.fdSelect = fdSelect; + } + getFDIndex(glyphIndex) { + if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { + return -1; + } + return this.fdSelect[glyphIndex]; + } +} +exports.CFFFDSelect = CFFFDSelect; +class CFFOffsetTracker { + constructor() { + this.offsets = Object.create(null); + } + isTracking(key) { + return key in this.offsets; + } + track(key, location) { + if (key in this.offsets) { + throw new _util.FormatError(`Already tracking location of ${key}`); + } + this.offsets[key] = location; + } + offset(value) { + for (const key in this.offsets) { + this.offsets[key] += value; + } + } + setEntryLocation(key, values, output) { + if (!(key in this.offsets)) { + throw new _util.FormatError(`Not tracking location of ${key}`); + } + const data = output.data; + const dataOffset = this.offsets[key]; + const size = 5; + for (let i = 0, ii = values.length; i < ii; ++i) { + const offset0 = i * size + dataOffset; + const offset1 = offset0 + 1; + const offset2 = offset0 + 2; + const offset3 = offset0 + 3; + const offset4 = offset0 + 4; + if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { + throw new _util.FormatError("writing to an offset that is not empty"); + } + const value = values[i]; + data[offset0] = 0x1d; + data[offset1] = value >> 24 & 0xff; + data[offset2] = value >> 16 & 0xff; + data[offset3] = value >> 8 & 0xff; + data[offset4] = value & 0xff; + } + } +} +class CFFCompiler { + constructor(cff) { + this.cff = cff; + } + compile() { + const cff = this.cff; + const output = { + data: [], + length: 0, + add(data) { + this.data = this.data.concat(data); + this.length = this.data.length; + } + }; + const header = this.compileHeader(cff.header); + output.add(header); + const nameIndex = this.compileNameIndex(cff.names); + output.add(nameIndex); + if (cff.isCIDFont) { + if (cff.topDict.hasName("FontMatrix")) { + const base = cff.topDict.getByName("FontMatrix"); + cff.topDict.removeByName("FontMatrix"); + for (const subDict of cff.fdArray) { + let matrix = base.slice(0); + if (subDict.hasName("FontMatrix")) { + matrix = _util.Util.transform(matrix, subDict.getByName("FontMatrix")); + } + subDict.setByName("FontMatrix", matrix); + } + } + } + const xuid = cff.topDict.getByName("XUID"); + if (xuid && xuid.length > 16) { + cff.topDict.removeByName("XUID"); + } + cff.topDict.setByName("charset", 0); + let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); + output.add(compiled.output); + const topDictTracker = compiled.trackers[0]; + const stringIndex = this.compileStringIndex(cff.strings.strings); + output.add(stringIndex); + const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); + output.add(globalSubrIndex); + if (cff.encoding && cff.topDict.hasName("Encoding")) { + if (cff.encoding.predefined) { + topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output); + } else { + const encoding = this.compileEncoding(cff.encoding); + topDictTracker.setEntryLocation("Encoding", [output.length], output); + output.add(encoding); + } + } + const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); + topDictTracker.setEntryLocation("charset", [output.length], output); + output.add(charset); + const charStrings = this.compileCharStrings(cff.charStrings); + topDictTracker.setEntryLocation("CharStrings", [output.length], output); + output.add(charStrings); + if (cff.isCIDFont) { + topDictTracker.setEntryLocation("FDSelect", [output.length], output); + const fdSelect = this.compileFDSelect(cff.fdSelect); + output.add(fdSelect); + compiled = this.compileTopDicts(cff.fdArray, output.length, true); + topDictTracker.setEntryLocation("FDArray", [output.length], output); + output.add(compiled.output); + const fontDictTrackers = compiled.trackers; + this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); + } + this.compilePrivateDicts([cff.topDict], [topDictTracker], output); + output.add([0]); + return output.data; + } + encodeNumber(value) { + if (Number.isInteger(value)) { + return this.encodeInteger(value); + } + return this.encodeFloat(value); + } + static get EncodeFloatRegExp() { + return (0, _util.shadow)(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); + } + encodeFloat(num) { + let value = num.toString(); + const m = CFFCompiler.EncodeFloatRegExp.exec(value); + if (m) { + const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); + value = (Math.round(num * epsilon) / epsilon).toString(); + } + let nibbles = ""; + let i, ii; + for (i = 0, ii = value.length; i < ii; ++i) { + const a = value[i]; + if (a === "e") { + nibbles += value[++i] === "-" ? "c" : "b"; + } else if (a === ".") { + nibbles += "a"; + } else if (a === "-") { + nibbles += "e"; + } else { + nibbles += a; + } + } + nibbles += nibbles.length & 1 ? "f" : "ff"; + const out = [30]; + for (i = 0, ii = nibbles.length; i < ii; i += 2) { + out.push(parseInt(nibbles.substring(i, i + 2), 16)); + } + return out; + } + encodeInteger(value) { + let code; + if (value >= -107 && value <= 107) { + code = [value + 139]; + } else if (value >= 108 && value <= 1131) { + value -= 108; + code = [(value >> 8) + 247, value & 0xff]; + } else if (value >= -1131 && value <= -108) { + value = -value - 108; + code = [(value >> 8) + 251, value & 0xff]; + } else if (value >= -32768 && value <= 32767) { + code = [0x1c, value >> 8 & 0xff, value & 0xff]; + } else { + code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]; + } + return code; + } + compileHeader(header) { + return [header.major, header.minor, 4, header.offSize]; + } + compileNameIndex(names) { + const nameIndex = new CFFIndex(); + for (const name of names) { + const length = Math.min(name.length, 127); + let sanitizedName = new Array(length); + for (let j = 0; j < length; j++) { + let char = name[j]; + if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") { + char = "_"; + } + sanitizedName[j] = char; + } + sanitizedName = sanitizedName.join(""); + if (sanitizedName === "") { + sanitizedName = "Bad_Font_Name"; + } + nameIndex.add((0, _util.stringToBytes)(sanitizedName)); + } + return this.compileIndex(nameIndex); + } + compileTopDicts(dicts, length, removeCidKeys) { + const fontDictTrackers = []; + let fdArrayIndex = new CFFIndex(); + for (const fontDict of dicts) { + if (removeCidKeys) { + fontDict.removeByName("CIDFontVersion"); + fontDict.removeByName("CIDFontRevision"); + fontDict.removeByName("CIDFontType"); + fontDict.removeByName("CIDCount"); + fontDict.removeByName("UIDBase"); + } + const fontDictTracker = new CFFOffsetTracker(); + const fontDictData = this.compileDict(fontDict, fontDictTracker); + fontDictTrackers.push(fontDictTracker); + fdArrayIndex.add(fontDictData); + fontDictTracker.offset(length); + } + fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); + return { + trackers: fontDictTrackers, + output: fdArrayIndex + }; + } + compilePrivateDicts(dicts, trackers, output) { + for (let i = 0, ii = dicts.length; i < ii; ++i) { + const fontDict = dicts[i]; + const privateDict = fontDict.privateDict; + if (!privateDict || !fontDict.hasName("Private")) { + throw new _util.FormatError("There must be a private dictionary."); + } + const privateDictTracker = new CFFOffsetTracker(); + const privateDictData = this.compileDict(privateDict, privateDictTracker); + let outputLength = output.length; + privateDictTracker.offset(outputLength); + if (!privateDictData.length) { + outputLength = 0; + } + trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output); + output.add(privateDictData); + if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { + const subrs = this.compileIndex(privateDict.subrsIndex); + privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); + output.add(subrs); + } + } + } + compileDict(dict, offsetTracker) { + const out = []; + for (const key of dict.order) { + if (!(key in dict.values)) { + continue; + } + let values = dict.values[key]; + let types = dict.types[key]; + if (!Array.isArray(types)) { + types = [types]; + } + if (!Array.isArray(values)) { + values = [values]; + } + if (values.length === 0) { + continue; + } + for (let j = 0, jj = types.length; j < jj; ++j) { + const type = types[j]; + const value = values[j]; + switch (type) { + case "num": + case "sid": + out.push(...this.encodeNumber(value)); + break; + case "offset": + const name = dict.keyToNameMap[key]; + if (!offsetTracker.isTracking(name)) { + offsetTracker.track(name, out.length); + } + out.push(0x1d, 0, 0, 0, 0); + break; + case "array": + case "delta": + out.push(...this.encodeNumber(value)); + for (let k = 1, kk = values.length; k < kk; ++k) { + out.push(...this.encodeNumber(values[k])); + } + break; + default: + throw new _util.FormatError(`Unknown data type of ${type}`); + } + } + out.push(...dict.opcodes[key]); + } + return out; + } + compileStringIndex(strings) { + const stringIndex = new CFFIndex(); + for (const string of strings) { + stringIndex.add((0, _util.stringToBytes)(string)); + } + return this.compileIndex(stringIndex); + } + compileGlobalSubrIndex() { + const globalSubrIndex = this.cff.globalSubrIndex; + this.out.writeByteArray(this.compileIndex(globalSubrIndex)); + } + compileCharStrings(charStrings) { + const charStringsIndex = new CFFIndex(); + for (let i = 0; i < charStrings.count; i++) { + const glyph = charStrings.get(i); + if (glyph.length === 0) { + charStringsIndex.add(new Uint8Array([0x8b, 0x0e])); + continue; + } + charStringsIndex.add(glyph); + } + return this.compileIndex(charStringsIndex); + } + compileCharset(charset, numGlyphs, strings, isCIDFont) { + let out; + const numGlyphsLessNotDef = numGlyphs - 1; + if (isCIDFont) { + out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]); + } else { + const length = 1 + numGlyphsLessNotDef * 2; + out = new Uint8Array(length); + out[0] = 0; + let charsetIndex = 0; + const numCharsets = charset.charset.length; + let warned = false; + for (let i = 1; i < out.length; i += 2) { + let sid = 0; + if (charsetIndex < numCharsets) { + const name = charset.charset[charsetIndex++]; + sid = strings.getSID(name); + if (sid === -1) { + sid = 0; + if (!warned) { + warned = true; + (0, _util.warn)(`Couldn't find ${name} in CFF strings`); + } + } + } + out[i] = sid >> 8 & 0xff; + out[i + 1] = sid & 0xff; + } + } + return this.compileTypedArray(out); + } + compileEncoding(encoding) { + return this.compileTypedArray(encoding.raw); + } + compileFDSelect(fdSelect) { + const format = fdSelect.format; + let out, i; + switch (format) { + case 0: + out = new Uint8Array(1 + fdSelect.fdSelect.length); + out[0] = format; + for (i = 0; i < fdSelect.fdSelect.length; i++) { + out[i + 1] = fdSelect.fdSelect[i]; + } + break; + case 3: + const start = 0; + let lastFD = fdSelect.fdSelect[0]; + const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; + for (i = 1; i < fdSelect.fdSelect.length; i++) { + const currentFD = fdSelect.fdSelect[i]; + if (currentFD !== lastFD) { + ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); + lastFD = currentFD; + } + } + const numRanges = (ranges.length - 3) / 3; + ranges[1] = numRanges >> 8 & 0xff; + ranges[2] = numRanges & 0xff; + ranges.push(i >> 8 & 0xff, i & 0xff); + out = new Uint8Array(ranges); + break; + } + return this.compileTypedArray(out); + } + compileTypedArray(data) { + const out = []; + for (let i = 0, ii = data.length; i < ii; ++i) { + out[i] = data[i]; + } + return out; + } + compileIndex(index) { + let trackers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + const objects = index.objects; + const count = objects.length; + if (count === 0) { + return [0, 0]; + } + const data = [count >> 8 & 0xff, count & 0xff]; + let lastOffset = 1, + i; + for (i = 0; i < count; ++i) { + lastOffset += objects[i].length; + } + let offsetSize; + if (lastOffset < 0x100) { + offsetSize = 1; + } else if (lastOffset < 0x10000) { + offsetSize = 2; + } else if (lastOffset < 0x1000000) { + offsetSize = 3; + } else { + offsetSize = 4; + } + data.push(offsetSize); + let relativeOffset = 1; + for (i = 0; i < count + 1; i++) { + if (offsetSize === 1) { + data.push(relativeOffset & 0xff); + } else if (offsetSize === 2) { + data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } else if (offsetSize === 3) { + data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } else { + data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } + if (objects[i]) { + relativeOffset += objects[i].length; + } + } + for (i = 0; i < count; i++) { + if (trackers[i]) { + trackers[i].offset(data.length); + } + data.push(...objects[i]); + } + return data; + } +} +exports.CFFCompiler = CFFCompiler; + +/***/ }), +/* 165 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ISOAdobeCharset = exports.ExpertSubsetCharset = exports.ExpertCharset = void 0; +const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"]; +exports.ISOAdobeCharset = ISOAdobeCharset; +const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +exports.ExpertCharset = ExpertCharset; +const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", "onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior"]; +exports.ExpertSubsetCharset = ExpertSubsetCharset; + +/***/ }), +/* 166 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ZapfDingbatsEncoding = exports.WinAnsiEncoding = exports.SymbolSetEncoding = exports.StandardEncoding = exports.MacRomanEncoding = exports.ExpertEncoding = void 0; +exports.getEncoding = getEncoding; +const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", "osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", "hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +exports.ExpertEncoding = ExpertEncoding; +const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""]; +const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"]; +exports.MacRomanEncoding = MacRomanEncoding; +const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", "dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", "ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", "ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", "", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""]; +exports.StandardEncoding = StandardEncoding; +const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"]; +exports.WinAnsiEncoding = WinAnsiEncoding; +const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""]; +exports.SymbolSetEncoding = SymbolSetEncoding; +const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""]; +exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding; +function getEncoding(encodingName) { + switch (encodingName) { + case "WinAnsiEncoding": + return WinAnsiEncoding; + case "StandardEncoding": + return StandardEncoding; + case "MacRomanEncoding": + return MacRomanEncoding; + case "SymbolSetEncoding": + return SymbolSetEncoding; + case "ZapfDingbatsEncoding": + return ZapfDingbatsEncoding; + case "ExpertEncoding": + return ExpertEncoding; + case "MacExpertEncoding": + return MacExpertEncoding; + default: + return null; + } +} + +/***/ }), +/* 167 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.SEAC_ANALYSIS_ENABLED = exports.MacStandardGlyphOrdering = exports.FontFlags = void 0; +exports.getFontType = getFontType; +exports.normalizeFontName = normalizeFontName; +exports.recoverGlyphName = recoverGlyphName; +exports.type1FontGlyphMapping = type1FontGlyphMapping; +var _util = __w_pdfjs_require__(2); +var _encodings = __w_pdfjs_require__(166); +var _glyphlist = __w_pdfjs_require__(168); +var _unicode = __w_pdfjs_require__(169); +const SEAC_ANALYSIS_ENABLED = true; +exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED; +const FontFlags = { + FixedPitch: 1, + Serif: 2, + Symbolic: 4, + Script: 8, + Nonsymbolic: 32, + Italic: 64, + AllCap: 65536, + SmallCap: 131072, + ForceBold: 262144 +}; +exports.FontFlags = FontFlags; +const MacStandardGlyphOrdering = [".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "Lslash", "lslash", "Scaron", "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", "Thorn", "thorn", "minus", "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", "onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", "Ccaron", "ccaron", "dcroat"]; +exports.MacStandardGlyphOrdering = MacStandardGlyphOrdering; +function getFontType(type, subtype) { + let isStandardFont = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + switch (type) { + case "Type1": + if (isStandardFont) { + return _util.FontType.TYPE1STANDARD; + } + return subtype === "Type1C" ? _util.FontType.TYPE1C : _util.FontType.TYPE1; + case "CIDFontType0": + return subtype === "CIDFontType0C" ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0; + case "OpenType": + return _util.FontType.OPENTYPE; + case "TrueType": + return _util.FontType.TRUETYPE; + case "CIDFontType2": + return _util.FontType.CIDFONTTYPE2; + case "MMType1": + return _util.FontType.MMTYPE1; + case "Type0": + return _util.FontType.TYPE0; + default: + return _util.FontType.UNKNOWN; + } +} +function recoverGlyphName(name, glyphsUnicodeMap) { + if (glyphsUnicodeMap[name] !== undefined) { + return name; + } + const unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap); + if (unicode !== -1) { + for (const key in glyphsUnicodeMap) { + if (glyphsUnicodeMap[key] === unicode) { + return key; + } + } + } + (0, _util.info)("Unable to recover a standard glyph name for: " + name); + return name; +} +function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { + const charCodeToGlyphId = Object.create(null); + let glyphId, charCode, baseEncoding; + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + if (properties.isInternalFont) { + baseEncoding = builtInEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + if (glyphId >= 0) { + charCodeToGlyphId[charCode] = glyphId; + } else { + charCodeToGlyphId[charCode] = 0; + } + } + } else if (properties.baseEncodingName) { + baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName); + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + if (glyphId >= 0) { + charCodeToGlyphId[charCode] = glyphId; + } else { + charCodeToGlyphId[charCode] = 0; + } + } + } else if (isSymbolicFont) { + for (charCode in builtInEncoding) { + charCodeToGlyphId[charCode] = builtInEncoding[charCode]; + } + } else { + baseEncoding = _encodings.StandardEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + if (glyphId >= 0) { + charCodeToGlyphId[charCode] = glyphId; + } else { + charCodeToGlyphId[charCode] = 0; + } + } + } + const differences = properties.differences; + let glyphsUnicodeMap; + if (differences) { + for (charCode in differences) { + const glyphName = differences[charCode]; + glyphId = glyphNames.indexOf(glyphName); + if (glyphId === -1) { + if (!glyphsUnicodeMap) { + glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)(); + } + const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + if (standardGlyphName !== glyphName) { + glyphId = glyphNames.indexOf(standardGlyphName); + } + } + if (glyphId >= 0) { + charCodeToGlyphId[charCode] = glyphId; + } else { + charCodeToGlyphId[charCode] = 0; + } + } + } + return charCodeToGlyphId; +} +function normalizeFontName(name) { + return name.replace(/[,_]/g, "-").replace(/\s/g, ""); +} + +/***/ }), +/* 168 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => { + +"use strict"; +__w_pdfjs_require__.r(__webpack_exports__); +/* harmony export */ __w_pdfjs_require__.d(__webpack_exports__, { +/* harmony export */ "getDingbatsGlyphsUnicode": () => (/* binding */ getDingbatsGlyphsUnicode), +/* harmony export */ "getGlyphsUnicode": () => (/* binding */ getGlyphsUnicode) +/* harmony export */ }); +/* harmony import */ var _core_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __w_pdfjs_require__(135); + +const getGlyphsUnicode = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () { + return [ + "A", + 0x0041, + "AE", + 0x00c6, + "AEacute", + 0x01fc, + "AEmacron", + 0x01e2, + "AEsmall", + 0xf7e6, + "Aacute", + 0x00c1, + "Aacutesmall", + 0xf7e1, + "Abreve", + 0x0102, + "Abreveacute", + 0x1eae, + "Abrevecyrillic", + 0x04d0, + "Abrevedotbelow", + 0x1eb6, + "Abrevegrave", + 0x1eb0, + "Abrevehookabove", + 0x1eb2, + "Abrevetilde", + 0x1eb4, + "Acaron", + 0x01cd, + "Acircle", + 0x24b6, + "Acircumflex", + 0x00c2, + "Acircumflexacute", + 0x1ea4, + "Acircumflexdotbelow", + 0x1eac, + "Acircumflexgrave", + 0x1ea6, + "Acircumflexhookabove", + 0x1ea8, + "Acircumflexsmall", + 0xf7e2, + "Acircumflextilde", + 0x1eaa, + "Acute", + 0xf6c9, + "Acutesmall", + 0xf7b4, + "Acyrillic", + 0x0410, + "Adblgrave", + 0x0200, + "Adieresis", + 0x00c4, + "Adieresiscyrillic", + 0x04d2, + "Adieresismacron", + 0x01de, + "Adieresissmall", + 0xf7e4, + "Adotbelow", + 0x1ea0, + "Adotmacron", + 0x01e0, + "Agrave", + 0x00c0, + "Agravesmall", + 0xf7e0, + "Ahookabove", + 0x1ea2, + "Aiecyrillic", + 0x04d4, + "Ainvertedbreve", + 0x0202, + "Alpha", + 0x0391, + "Alphatonos", + 0x0386, + "Amacron", + 0x0100, + "Amonospace", + 0xff21, + "Aogonek", + 0x0104, + "Aring", + 0x00c5, + "Aringacute", + 0x01fa, + "Aringbelow", + 0x1e00, + "Aringsmall", + 0xf7e5, + "Asmall", + 0xf761, + "Atilde", + 0x00c3, + "Atildesmall", + 0xf7e3, + "Aybarmenian", + 0x0531, + "B", + 0x0042, + "Bcircle", + 0x24b7, + "Bdotaccent", + 0x1e02, + "Bdotbelow", + 0x1e04, + "Becyrillic", + 0x0411, + "Benarmenian", + 0x0532, + "Beta", + 0x0392, + "Bhook", + 0x0181, + "Blinebelow", + 0x1e06, + "Bmonospace", + 0xff22, + "Brevesmall", + 0xf6f4, + "Bsmall", + 0xf762, + "Btopbar", + 0x0182, + "C", + 0x0043, + "Caarmenian", + 0x053e, + "Cacute", + 0x0106, + "Caron", + 0xf6ca, + "Caronsmall", + 0xf6f5, + "Ccaron", + 0x010c, + "Ccedilla", + 0x00c7, + "Ccedillaacute", + 0x1e08, + "Ccedillasmall", + 0xf7e7, + "Ccircle", + 0x24b8, + "Ccircumflex", + 0x0108, + "Cdot", + 0x010a, + "Cdotaccent", + 0x010a, + "Cedillasmall", + 0xf7b8, + "Chaarmenian", + 0x0549, + "Cheabkhasiancyrillic", + 0x04bc, + "Checyrillic", + 0x0427, + "Chedescenderabkhasiancyrillic", + 0x04be, + "Chedescendercyrillic", + 0x04b6, + "Chedieresiscyrillic", + 0x04f4, + "Cheharmenian", + 0x0543, + "Chekhakassiancyrillic", + 0x04cb, + "Cheverticalstrokecyrillic", + 0x04b8, + "Chi", + 0x03a7, + "Chook", + 0x0187, + "Circumflexsmall", + 0xf6f6, + "Cmonospace", + 0xff23, + "Coarmenian", + 0x0551, + "Csmall", + 0xf763, + "D", + 0x0044, + "DZ", + 0x01f1, + "DZcaron", + 0x01c4, + "Daarmenian", + 0x0534, + "Dafrican", + 0x0189, + "Dcaron", + 0x010e, + "Dcedilla", + 0x1e10, + "Dcircle", + 0x24b9, + "Dcircumflexbelow", + 0x1e12, + "Dcroat", + 0x0110, + "Ddotaccent", + 0x1e0a, + "Ddotbelow", + 0x1e0c, + "Decyrillic", + 0x0414, + "Deicoptic", + 0x03ee, + "Delta", + 0x2206, + "Deltagreek", + 0x0394, + "Dhook", + 0x018a, + "Dieresis", + 0xf6cb, + "DieresisAcute", + 0xf6cc, + "DieresisGrave", + 0xf6cd, + "Dieresissmall", + 0xf7a8, + "Digammagreek", + 0x03dc, + "Djecyrillic", + 0x0402, + "Dlinebelow", + 0x1e0e, + "Dmonospace", + 0xff24, + "Dotaccentsmall", + 0xf6f7, + "Dslash", + 0x0110, + "Dsmall", + 0xf764, + "Dtopbar", + 0x018b, + "Dz", + 0x01f2, + "Dzcaron", + 0x01c5, + "Dzeabkhasiancyrillic", + 0x04e0, + "Dzecyrillic", + 0x0405, + "Dzhecyrillic", + 0x040f, + "E", + 0x0045, + "Eacute", + 0x00c9, + "Eacutesmall", + 0xf7e9, + "Ebreve", + 0x0114, + "Ecaron", + 0x011a, + "Ecedillabreve", + 0x1e1c, + "Echarmenian", + 0x0535, + "Ecircle", + 0x24ba, + "Ecircumflex", + 0x00ca, + "Ecircumflexacute", + 0x1ebe, + "Ecircumflexbelow", + 0x1e18, + "Ecircumflexdotbelow", + 0x1ec6, + "Ecircumflexgrave", + 0x1ec0, + "Ecircumflexhookabove", + 0x1ec2, + "Ecircumflexsmall", + 0xf7ea, + "Ecircumflextilde", + 0x1ec4, + "Ecyrillic", + 0x0404, + "Edblgrave", + 0x0204, + "Edieresis", + 0x00cb, + "Edieresissmall", + 0xf7eb, + "Edot", + 0x0116, + "Edotaccent", + 0x0116, + "Edotbelow", + 0x1eb8, + "Efcyrillic", + 0x0424, + "Egrave", + 0x00c8, + "Egravesmall", + 0xf7e8, + "Eharmenian", + 0x0537, + "Ehookabove", + 0x1eba, + "Eightroman", + 0x2167, + "Einvertedbreve", + 0x0206, + "Eiotifiedcyrillic", + 0x0464, + "Elcyrillic", + 0x041b, + "Elevenroman", + 0x216a, + "Emacron", + 0x0112, + "Emacronacute", + 0x1e16, + "Emacrongrave", + 0x1e14, + "Emcyrillic", + 0x041c, + "Emonospace", + 0xff25, + "Encyrillic", + 0x041d, + "Endescendercyrillic", + 0x04a2, + "Eng", + 0x014a, + "Enghecyrillic", + 0x04a4, + "Enhookcyrillic", + 0x04c7, + "Eogonek", + 0x0118, + "Eopen", + 0x0190, + "Epsilon", + 0x0395, + "Epsilontonos", + 0x0388, + "Ercyrillic", + 0x0420, + "Ereversed", + 0x018e, + "Ereversedcyrillic", + 0x042d, + "Escyrillic", + 0x0421, + "Esdescendercyrillic", + 0x04aa, + "Esh", + 0x01a9, + "Esmall", + 0xf765, + "Eta", + 0x0397, + "Etarmenian", + 0x0538, + "Etatonos", + 0x0389, + "Eth", + 0x00d0, + "Ethsmall", + 0xf7f0, + "Etilde", + 0x1ebc, + "Etildebelow", + 0x1e1a, + "Euro", + 0x20ac, + "Ezh", + 0x01b7, + "Ezhcaron", + 0x01ee, + "Ezhreversed", + 0x01b8, + "F", + 0x0046, + "Fcircle", + 0x24bb, + "Fdotaccent", + 0x1e1e, + "Feharmenian", + 0x0556, + "Feicoptic", + 0x03e4, + "Fhook", + 0x0191, + "Fitacyrillic", + 0x0472, + "Fiveroman", + 0x2164, + "Fmonospace", + 0xff26, + "Fourroman", + 0x2163, + "Fsmall", + 0xf766, + "G", + 0x0047, + "GBsquare", + 0x3387, + "Gacute", + 0x01f4, + "Gamma", + 0x0393, + "Gammaafrican", + 0x0194, + "Gangiacoptic", + 0x03ea, + "Gbreve", + 0x011e, + "Gcaron", + 0x01e6, + "Gcedilla", + 0x0122, + "Gcircle", + 0x24bc, + "Gcircumflex", + 0x011c, + "Gcommaaccent", + 0x0122, + "Gdot", + 0x0120, + "Gdotaccent", + 0x0120, + "Gecyrillic", + 0x0413, + "Ghadarmenian", + 0x0542, + "Ghemiddlehookcyrillic", + 0x0494, + "Ghestrokecyrillic", + 0x0492, + "Gheupturncyrillic", + 0x0490, + "Ghook", + 0x0193, + "Gimarmenian", + 0x0533, + "Gjecyrillic", + 0x0403, + "Gmacron", + 0x1e20, + "Gmonospace", + 0xff27, + "Grave", + 0xf6ce, + "Gravesmall", + 0xf760, + "Gsmall", + 0xf767, + "Gsmallhook", + 0x029b, + "Gstroke", + 0x01e4, + "H", + 0x0048, + "H18533", + 0x25cf, + "H18543", + 0x25aa, + "H18551", + 0x25ab, + "H22073", + 0x25a1, + "HPsquare", + 0x33cb, + "Haabkhasiancyrillic", + 0x04a8, + "Hadescendercyrillic", + 0x04b2, + "Hardsigncyrillic", + 0x042a, + "Hbar", + 0x0126, + "Hbrevebelow", + 0x1e2a, + "Hcedilla", + 0x1e28, + "Hcircle", + 0x24bd, + "Hcircumflex", + 0x0124, + "Hdieresis", + 0x1e26, + "Hdotaccent", + 0x1e22, + "Hdotbelow", + 0x1e24, + "Hmonospace", + 0xff28, + "Hoarmenian", + 0x0540, + "Horicoptic", + 0x03e8, + "Hsmall", + 0xf768, + "Hungarumlaut", + 0xf6cf, + "Hungarumlautsmall", + 0xf6f8, + "Hzsquare", + 0x3390, + "I", + 0x0049, + "IAcyrillic", + 0x042f, + "IJ", + 0x0132, + "IUcyrillic", + 0x042e, + "Iacute", + 0x00cd, + "Iacutesmall", + 0xf7ed, + "Ibreve", + 0x012c, + "Icaron", + 0x01cf, + "Icircle", + 0x24be, + "Icircumflex", + 0x00ce, + "Icircumflexsmall", + 0xf7ee, + "Icyrillic", + 0x0406, + "Idblgrave", + 0x0208, + "Idieresis", + 0x00cf, + "Idieresisacute", + 0x1e2e, + "Idieresiscyrillic", + 0x04e4, + "Idieresissmall", + 0xf7ef, + "Idot", + 0x0130, + "Idotaccent", + 0x0130, + "Idotbelow", + 0x1eca, + "Iebrevecyrillic", + 0x04d6, + "Iecyrillic", + 0x0415, + "Ifraktur", + 0x2111, + "Igrave", + 0x00cc, + "Igravesmall", + 0xf7ec, + "Ihookabove", + 0x1ec8, + "Iicyrillic", + 0x0418, + "Iinvertedbreve", + 0x020a, + "Iishortcyrillic", + 0x0419, + "Imacron", + 0x012a, + "Imacroncyrillic", + 0x04e2, + "Imonospace", + 0xff29, + "Iniarmenian", + 0x053b, + "Iocyrillic", + 0x0401, + "Iogonek", + 0x012e, + "Iota", + 0x0399, + "Iotaafrican", + 0x0196, + "Iotadieresis", + 0x03aa, + "Iotatonos", + 0x038a, + "Ismall", + 0xf769, + "Istroke", + 0x0197, + "Itilde", + 0x0128, + "Itildebelow", + 0x1e2c, + "Izhitsacyrillic", + 0x0474, + "Izhitsadblgravecyrillic", + 0x0476, + "J", + 0x004a, + "Jaarmenian", + 0x0541, + "Jcircle", + 0x24bf, + "Jcircumflex", + 0x0134, + "Jecyrillic", + 0x0408, + "Jheharmenian", + 0x054b, + "Jmonospace", + 0xff2a, + "Jsmall", + 0xf76a, + "K", + 0x004b, + "KBsquare", + 0x3385, + "KKsquare", + 0x33cd, + "Kabashkircyrillic", + 0x04a0, + "Kacute", + 0x1e30, + "Kacyrillic", + 0x041a, + "Kadescendercyrillic", + 0x049a, + "Kahookcyrillic", + 0x04c3, + "Kappa", + 0x039a, + "Kastrokecyrillic", + 0x049e, + "Kaverticalstrokecyrillic", + 0x049c, + "Kcaron", + 0x01e8, + "Kcedilla", + 0x0136, + "Kcircle", + 0x24c0, + "Kcommaaccent", + 0x0136, + "Kdotbelow", + 0x1e32, + "Keharmenian", + 0x0554, + "Kenarmenian", + 0x053f, + "Khacyrillic", + 0x0425, + "Kheicoptic", + 0x03e6, + "Khook", + 0x0198, + "Kjecyrillic", + 0x040c, + "Klinebelow", + 0x1e34, + "Kmonospace", + 0xff2b, + "Koppacyrillic", + 0x0480, + "Koppagreek", + 0x03de, + "Ksicyrillic", + 0x046e, + "Ksmall", + 0xf76b, + "L", + 0x004c, + "LJ", + 0x01c7, + "LL", + 0xf6bf, + "Lacute", + 0x0139, + "Lambda", + 0x039b, + "Lcaron", + 0x013d, + "Lcedilla", + 0x013b, + "Lcircle", + 0x24c1, + "Lcircumflexbelow", + 0x1e3c, + "Lcommaaccent", + 0x013b, + "Ldot", + 0x013f, + "Ldotaccent", + 0x013f, + "Ldotbelow", + 0x1e36, + "Ldotbelowmacron", + 0x1e38, + "Liwnarmenian", + 0x053c, + "Lj", + 0x01c8, + "Ljecyrillic", + 0x0409, + "Llinebelow", + 0x1e3a, + "Lmonospace", + 0xff2c, + "Lslash", + 0x0141, + "Lslashsmall", + 0xf6f9, + "Lsmall", + 0xf76c, + "M", + 0x004d, + "MBsquare", + 0x3386, + "Macron", + 0xf6d0, + "Macronsmall", + 0xf7af, + "Macute", + 0x1e3e, + "Mcircle", + 0x24c2, + "Mdotaccent", + 0x1e40, + "Mdotbelow", + 0x1e42, + "Menarmenian", + 0x0544, + "Mmonospace", + 0xff2d, + "Msmall", + 0xf76d, + "Mturned", + 0x019c, + "Mu", + 0x039c, + "N", + 0x004e, + "NJ", + 0x01ca, + "Nacute", + 0x0143, + "Ncaron", + 0x0147, + "Ncedilla", + 0x0145, + "Ncircle", + 0x24c3, + "Ncircumflexbelow", + 0x1e4a, + "Ncommaaccent", + 0x0145, + "Ndotaccent", + 0x1e44, + "Ndotbelow", + 0x1e46, + "Nhookleft", + 0x019d, + "Nineroman", + 0x2168, + "Nj", + 0x01cb, + "Njecyrillic", + 0x040a, + "Nlinebelow", + 0x1e48, + "Nmonospace", + 0xff2e, + "Nowarmenian", + 0x0546, + "Nsmall", + 0xf76e, + "Ntilde", + 0x00d1, + "Ntildesmall", + 0xf7f1, + "Nu", + 0x039d, + "O", + 0x004f, + "OE", + 0x0152, + "OEsmall", + 0xf6fa, + "Oacute", + 0x00d3, + "Oacutesmall", + 0xf7f3, + "Obarredcyrillic", + 0x04e8, + "Obarreddieresiscyrillic", + 0x04ea, + "Obreve", + 0x014e, + "Ocaron", + 0x01d1, + "Ocenteredtilde", + 0x019f, + "Ocircle", + 0x24c4, + "Ocircumflex", + 0x00d4, + "Ocircumflexacute", + 0x1ed0, + "Ocircumflexdotbelow", + 0x1ed8, + "Ocircumflexgrave", + 0x1ed2, + "Ocircumflexhookabove", + 0x1ed4, + "Ocircumflexsmall", + 0xf7f4, + "Ocircumflextilde", + 0x1ed6, + "Ocyrillic", + 0x041e, + "Odblacute", + 0x0150, + "Odblgrave", + 0x020c, + "Odieresis", + 0x00d6, + "Odieresiscyrillic", + 0x04e6, + "Odieresissmall", + 0xf7f6, + "Odotbelow", + 0x1ecc, + "Ogoneksmall", + 0xf6fb, + "Ograve", + 0x00d2, + "Ogravesmall", + 0xf7f2, + "Oharmenian", + 0x0555, + "Ohm", + 0x2126, + "Ohookabove", + 0x1ece, + "Ohorn", + 0x01a0, + "Ohornacute", + 0x1eda, + "Ohorndotbelow", + 0x1ee2, + "Ohorngrave", + 0x1edc, + "Ohornhookabove", + 0x1ede, + "Ohorntilde", + 0x1ee0, + "Ohungarumlaut", + 0x0150, + "Oi", + 0x01a2, + "Oinvertedbreve", + 0x020e, + "Omacron", + 0x014c, + "Omacronacute", + 0x1e52, + "Omacrongrave", + 0x1e50, + "Omega", + 0x2126, + "Omegacyrillic", + 0x0460, + "Omegagreek", + 0x03a9, + "Omegaroundcyrillic", + 0x047a, + "Omegatitlocyrillic", + 0x047c, + "Omegatonos", + 0x038f, + "Omicron", + 0x039f, + "Omicrontonos", + 0x038c, + "Omonospace", + 0xff2f, + "Oneroman", + 0x2160, + "Oogonek", + 0x01ea, + "Oogonekmacron", + 0x01ec, + "Oopen", + 0x0186, + "Oslash", + 0x00d8, + "Oslashacute", + 0x01fe, + "Oslashsmall", + 0xf7f8, + "Osmall", + 0xf76f, + "Ostrokeacute", + 0x01fe, + "Otcyrillic", + 0x047e, + "Otilde", + 0x00d5, + "Otildeacute", + 0x1e4c, + "Otildedieresis", + 0x1e4e, + "Otildesmall", + 0xf7f5, + "P", + 0x0050, + "Pacute", + 0x1e54, + "Pcircle", + 0x24c5, + "Pdotaccent", + 0x1e56, + "Pecyrillic", + 0x041f, + "Peharmenian", + 0x054a, + "Pemiddlehookcyrillic", + 0x04a6, + "Phi", + 0x03a6, + "Phook", + 0x01a4, + "Pi", + 0x03a0, + "Piwrarmenian", + 0x0553, + "Pmonospace", + 0xff30, + "Psi", + 0x03a8, + "Psicyrillic", + 0x0470, + "Psmall", + 0xf770, + "Q", + 0x0051, + "Qcircle", + 0x24c6, + "Qmonospace", + 0xff31, + "Qsmall", + 0xf771, + "R", + 0x0052, + "Raarmenian", + 0x054c, + "Racute", + 0x0154, + "Rcaron", + 0x0158, + "Rcedilla", + 0x0156, + "Rcircle", + 0x24c7, + "Rcommaaccent", + 0x0156, + "Rdblgrave", + 0x0210, + "Rdotaccent", + 0x1e58, + "Rdotbelow", + 0x1e5a, + "Rdotbelowmacron", + 0x1e5c, + "Reharmenian", + 0x0550, + "Rfraktur", + 0x211c, + "Rho", + 0x03a1, + "Ringsmall", + 0xf6fc, + "Rinvertedbreve", + 0x0212, + "Rlinebelow", + 0x1e5e, + "Rmonospace", + 0xff32, + "Rsmall", + 0xf772, + "Rsmallinverted", + 0x0281, + "Rsmallinvertedsuperior", + 0x02b6, + "S", + 0x0053, + "SF010000", + 0x250c, + "SF020000", + 0x2514, + "SF030000", + 0x2510, + "SF040000", + 0x2518, + "SF050000", + 0x253c, + "SF060000", + 0x252c, + "SF070000", + 0x2534, + "SF080000", + 0x251c, + "SF090000", + 0x2524, + "SF100000", + 0x2500, + "SF110000", + 0x2502, + "SF190000", + 0x2561, + "SF200000", + 0x2562, + "SF210000", + 0x2556, + "SF220000", + 0x2555, + "SF230000", + 0x2563, + "SF240000", + 0x2551, + "SF250000", + 0x2557, + "SF260000", + 0x255d, + "SF270000", + 0x255c, + "SF280000", + 0x255b, + "SF360000", + 0x255e, + "SF370000", + 0x255f, + "SF380000", + 0x255a, + "SF390000", + 0x2554, + "SF400000", + 0x2569, + "SF410000", + 0x2566, + "SF420000", + 0x2560, + "SF430000", + 0x2550, + "SF440000", + 0x256c, + "SF450000", + 0x2567, + "SF460000", + 0x2568, + "SF470000", + 0x2564, + "SF480000", + 0x2565, + "SF490000", + 0x2559, + "SF500000", + 0x2558, + "SF510000", + 0x2552, + "SF520000", + 0x2553, + "SF530000", + 0x256b, + "SF540000", + 0x256a, + "Sacute", + 0x015a, + "Sacutedotaccent", + 0x1e64, + "Sampigreek", + 0x03e0, + "Scaron", + 0x0160, + "Scarondotaccent", + 0x1e66, + "Scaronsmall", + 0xf6fd, + "Scedilla", + 0x015e, + "Schwa", + 0x018f, + "Schwacyrillic", + 0x04d8, + "Schwadieresiscyrillic", + 0x04da, + "Scircle", + 0x24c8, + "Scircumflex", + 0x015c, + "Scommaaccent", + 0x0218, + "Sdotaccent", + 0x1e60, + "Sdotbelow", + 0x1e62, + "Sdotbelowdotaccent", + 0x1e68, + "Seharmenian", + 0x054d, + "Sevenroman", + 0x2166, + "Shaarmenian", + 0x0547, + "Shacyrillic", + 0x0428, + "Shchacyrillic", + 0x0429, + "Sheicoptic", + 0x03e2, + "Shhacyrillic", + 0x04ba, + "Shimacoptic", + 0x03ec, + "Sigma", + 0x03a3, + "Sixroman", + 0x2165, + "Smonospace", + 0xff33, + "Softsigncyrillic", + 0x042c, + "Ssmall", + 0xf773, + "Stigmagreek", + 0x03da, + "T", + 0x0054, + "Tau", + 0x03a4, + "Tbar", + 0x0166, + "Tcaron", + 0x0164, + "Tcedilla", + 0x0162, + "Tcircle", + 0x24c9, + "Tcircumflexbelow", + 0x1e70, + "Tcommaaccent", + 0x0162, + "Tdotaccent", + 0x1e6a, + "Tdotbelow", + 0x1e6c, + "Tecyrillic", + 0x0422, + "Tedescendercyrillic", + 0x04ac, + "Tenroman", + 0x2169, + "Tetsecyrillic", + 0x04b4, + "Theta", + 0x0398, + "Thook", + 0x01ac, + "Thorn", + 0x00de, + "Thornsmall", + 0xf7fe, + "Threeroman", + 0x2162, + "Tildesmall", + 0xf6fe, + "Tiwnarmenian", + 0x054f, + "Tlinebelow", + 0x1e6e, + "Tmonospace", + 0xff34, + "Toarmenian", + 0x0539, + "Tonefive", + 0x01bc, + "Tonesix", + 0x0184, + "Tonetwo", + 0x01a7, + "Tretroflexhook", + 0x01ae, + "Tsecyrillic", + 0x0426, + "Tshecyrillic", + 0x040b, + "Tsmall", + 0xf774, + "Twelveroman", + 0x216b, + "Tworoman", + 0x2161, + "U", + 0x0055, + "Uacute", + 0x00da, + "Uacutesmall", + 0xf7fa, + "Ubreve", + 0x016c, + "Ucaron", + 0x01d3, + "Ucircle", + 0x24ca, + "Ucircumflex", + 0x00db, + "Ucircumflexbelow", + 0x1e76, + "Ucircumflexsmall", + 0xf7fb, + "Ucyrillic", + 0x0423, + "Udblacute", + 0x0170, + "Udblgrave", + 0x0214, + "Udieresis", + 0x00dc, + "Udieresisacute", + 0x01d7, + "Udieresisbelow", + 0x1e72, + "Udieresiscaron", + 0x01d9, + "Udieresiscyrillic", + 0x04f0, + "Udieresisgrave", + 0x01db, + "Udieresismacron", + 0x01d5, + "Udieresissmall", + 0xf7fc, + "Udotbelow", + 0x1ee4, + "Ugrave", + 0x00d9, + "Ugravesmall", + 0xf7f9, + "Uhookabove", + 0x1ee6, + "Uhorn", + 0x01af, + "Uhornacute", + 0x1ee8, + "Uhorndotbelow", + 0x1ef0, + "Uhorngrave", + 0x1eea, + "Uhornhookabove", + 0x1eec, + "Uhorntilde", + 0x1eee, + "Uhungarumlaut", + 0x0170, + "Uhungarumlautcyrillic", + 0x04f2, + "Uinvertedbreve", + 0x0216, + "Ukcyrillic", + 0x0478, + "Umacron", + 0x016a, + "Umacroncyrillic", + 0x04ee, + "Umacrondieresis", + 0x1e7a, + "Umonospace", + 0xff35, + "Uogonek", + 0x0172, + "Upsilon", + 0x03a5, + "Upsilon1", + 0x03d2, + "Upsilonacutehooksymbolgreek", + 0x03d3, + "Upsilonafrican", + 0x01b1, + "Upsilondieresis", + 0x03ab, + "Upsilondieresishooksymbolgreek", + 0x03d4, + "Upsilonhooksymbol", + 0x03d2, + "Upsilontonos", + 0x038e, + "Uring", + 0x016e, + "Ushortcyrillic", + 0x040e, + "Usmall", + 0xf775, + "Ustraightcyrillic", + 0x04ae, + "Ustraightstrokecyrillic", + 0x04b0, + "Utilde", + 0x0168, + "Utildeacute", + 0x1e78, + "Utildebelow", + 0x1e74, + "V", + 0x0056, + "Vcircle", + 0x24cb, + "Vdotbelow", + 0x1e7e, + "Vecyrillic", + 0x0412, + "Vewarmenian", + 0x054e, + "Vhook", + 0x01b2, + "Vmonospace", + 0xff36, + "Voarmenian", + 0x0548, + "Vsmall", + 0xf776, + "Vtilde", + 0x1e7c, + "W", + 0x0057, + "Wacute", + 0x1e82, + "Wcircle", + 0x24cc, + "Wcircumflex", + 0x0174, + "Wdieresis", + 0x1e84, + "Wdotaccent", + 0x1e86, + "Wdotbelow", + 0x1e88, + "Wgrave", + 0x1e80, + "Wmonospace", + 0xff37, + "Wsmall", + 0xf777, + "X", + 0x0058, + "Xcircle", + 0x24cd, + "Xdieresis", + 0x1e8c, + "Xdotaccent", + 0x1e8a, + "Xeharmenian", + 0x053d, + "Xi", + 0x039e, + "Xmonospace", + 0xff38, + "Xsmall", + 0xf778, + "Y", + 0x0059, + "Yacute", + 0x00dd, + "Yacutesmall", + 0xf7fd, + "Yatcyrillic", + 0x0462, + "Ycircle", + 0x24ce, + "Ycircumflex", + 0x0176, + "Ydieresis", + 0x0178, + "Ydieresissmall", + 0xf7ff, + "Ydotaccent", + 0x1e8e, + "Ydotbelow", + 0x1ef4, + "Yericyrillic", + 0x042b, + "Yerudieresiscyrillic", + 0x04f8, + "Ygrave", + 0x1ef2, + "Yhook", + 0x01b3, + "Yhookabove", + 0x1ef6, + "Yiarmenian", + 0x0545, + "Yicyrillic", + 0x0407, + "Yiwnarmenian", + 0x0552, + "Ymonospace", + 0xff39, + "Ysmall", + 0xf779, + "Ytilde", + 0x1ef8, + "Yusbigcyrillic", + 0x046a, + "Yusbigiotifiedcyrillic", + 0x046c, + "Yuslittlecyrillic", + 0x0466, + "Yuslittleiotifiedcyrillic", + 0x0468, + "Z", + 0x005a, + "Zaarmenian", + 0x0536, + "Zacute", + 0x0179, + "Zcaron", + 0x017d, + "Zcaronsmall", + 0xf6ff, + "Zcircle", + 0x24cf, + "Zcircumflex", + 0x1e90, + "Zdot", + 0x017b, + "Zdotaccent", + 0x017b, + "Zdotbelow", + 0x1e92, + "Zecyrillic", + 0x0417, + "Zedescendercyrillic", + 0x0498, + "Zedieresiscyrillic", + 0x04de, + "Zeta", + 0x0396, + "Zhearmenian", + 0x053a, + "Zhebrevecyrillic", + 0x04c1, + "Zhecyrillic", + 0x0416, + "Zhedescendercyrillic", + 0x0496, + "Zhedieresiscyrillic", + 0x04dc, + "Zlinebelow", + 0x1e94, + "Zmonospace", + 0xff3a, + "Zsmall", + 0xf77a, + "Zstroke", + 0x01b5, + "a", + 0x0061, + "aabengali", + 0x0986, + "aacute", + 0x00e1, + "aadeva", + 0x0906, + "aagujarati", + 0x0a86, + "aagurmukhi", + 0x0a06, + "aamatragurmukhi", + 0x0a3e, + "aarusquare", + 0x3303, + "aavowelsignbengali", + 0x09be, + "aavowelsigndeva", + 0x093e, + "aavowelsigngujarati", + 0x0abe, + "abbreviationmarkarmenian", + 0x055f, + "abbreviationsigndeva", + 0x0970, + "abengali", + 0x0985, + "abopomofo", + 0x311a, + "abreve", + 0x0103, + "abreveacute", + 0x1eaf, + "abrevecyrillic", + 0x04d1, + "abrevedotbelow", + 0x1eb7, + "abrevegrave", + 0x1eb1, + "abrevehookabove", + 0x1eb3, + "abrevetilde", + 0x1eb5, + "acaron", + 0x01ce, + "acircle", + 0x24d0, + "acircumflex", + 0x00e2, + "acircumflexacute", + 0x1ea5, + "acircumflexdotbelow", + 0x1ead, + "acircumflexgrave", + 0x1ea7, + "acircumflexhookabove", + 0x1ea9, + "acircumflextilde", + 0x1eab, + "acute", + 0x00b4, + "acutebelowcmb", + 0x0317, + "acutecmb", + 0x0301, + "acutecomb", + 0x0301, + "acutedeva", + 0x0954, + "acutelowmod", + 0x02cf, + "acutetonecmb", + 0x0341, + "acyrillic", + 0x0430, + "adblgrave", + 0x0201, + "addakgurmukhi", + 0x0a71, + "adeva", + 0x0905, + "adieresis", + 0x00e4, + "adieresiscyrillic", + 0x04d3, + "adieresismacron", + 0x01df, + "adotbelow", + 0x1ea1, + "adotmacron", + 0x01e1, + "ae", + 0x00e6, + "aeacute", + 0x01fd, + "aekorean", + 0x3150, + "aemacron", + 0x01e3, + "afii00208", + 0x2015, + "afii08941", + 0x20a4, + "afii10017", + 0x0410, + "afii10018", + 0x0411, + "afii10019", + 0x0412, + "afii10020", + 0x0413, + "afii10021", + 0x0414, + "afii10022", + 0x0415, + "afii10023", + 0x0401, + "afii10024", + 0x0416, + "afii10025", + 0x0417, + "afii10026", + 0x0418, + "afii10027", + 0x0419, + "afii10028", + 0x041a, + "afii10029", + 0x041b, + "afii10030", + 0x041c, + "afii10031", + 0x041d, + "afii10032", + 0x041e, + "afii10033", + 0x041f, + "afii10034", + 0x0420, + "afii10035", + 0x0421, + "afii10036", + 0x0422, + "afii10037", + 0x0423, + "afii10038", + 0x0424, + "afii10039", + 0x0425, + "afii10040", + 0x0426, + "afii10041", + 0x0427, + "afii10042", + 0x0428, + "afii10043", + 0x0429, + "afii10044", + 0x042a, + "afii10045", + 0x042b, + "afii10046", + 0x042c, + "afii10047", + 0x042d, + "afii10048", + 0x042e, + "afii10049", + 0x042f, + "afii10050", + 0x0490, + "afii10051", + 0x0402, + "afii10052", + 0x0403, + "afii10053", + 0x0404, + "afii10054", + 0x0405, + "afii10055", + 0x0406, + "afii10056", + 0x0407, + "afii10057", + 0x0408, + "afii10058", + 0x0409, + "afii10059", + 0x040a, + "afii10060", + 0x040b, + "afii10061", + 0x040c, + "afii10062", + 0x040e, + "afii10063", + 0xf6c4, + "afii10064", + 0xf6c5, + "afii10065", + 0x0430, + "afii10066", + 0x0431, + "afii10067", + 0x0432, + "afii10068", + 0x0433, + "afii10069", + 0x0434, + "afii10070", + 0x0435, + "afii10071", + 0x0451, + "afii10072", + 0x0436, + "afii10073", + 0x0437, + "afii10074", + 0x0438, + "afii10075", + 0x0439, + "afii10076", + 0x043a, + "afii10077", + 0x043b, + "afii10078", + 0x043c, + "afii10079", + 0x043d, + "afii10080", + 0x043e, + "afii10081", + 0x043f, + "afii10082", + 0x0440, + "afii10083", + 0x0441, + "afii10084", + 0x0442, + "afii10085", + 0x0443, + "afii10086", + 0x0444, + "afii10087", + 0x0445, + "afii10088", + 0x0446, + "afii10089", + 0x0447, + "afii10090", + 0x0448, + "afii10091", + 0x0449, + "afii10092", + 0x044a, + "afii10093", + 0x044b, + "afii10094", + 0x044c, + "afii10095", + 0x044d, + "afii10096", + 0x044e, + "afii10097", + 0x044f, + "afii10098", + 0x0491, + "afii10099", + 0x0452, + "afii10100", + 0x0453, + "afii10101", + 0x0454, + "afii10102", + 0x0455, + "afii10103", + 0x0456, + "afii10104", + 0x0457, + "afii10105", + 0x0458, + "afii10106", + 0x0459, + "afii10107", + 0x045a, + "afii10108", + 0x045b, + "afii10109", + 0x045c, + "afii10110", + 0x045e, + "afii10145", + 0x040f, + "afii10146", + 0x0462, + "afii10147", + 0x0472, + "afii10148", + 0x0474, + "afii10192", + 0xf6c6, + "afii10193", + 0x045f, + "afii10194", + 0x0463, + "afii10195", + 0x0473, + "afii10196", + 0x0475, + "afii10831", + 0xf6c7, + "afii10832", + 0xf6c8, + "afii10846", + 0x04d9, + "afii299", + 0x200e, + "afii300", + 0x200f, + "afii301", + 0x200d, + "afii57381", + 0x066a, + "afii57388", + 0x060c, + "afii57392", + 0x0660, + "afii57393", + 0x0661, + "afii57394", + 0x0662, + "afii57395", + 0x0663, + "afii57396", + 0x0664, + "afii57397", + 0x0665, + "afii57398", + 0x0666, + "afii57399", + 0x0667, + "afii57400", + 0x0668, + "afii57401", + 0x0669, + "afii57403", + 0x061b, + "afii57407", + 0x061f, + "afii57409", + 0x0621, + "afii57410", + 0x0622, + "afii57411", + 0x0623, + "afii57412", + 0x0624, + "afii57413", + 0x0625, + "afii57414", + 0x0626, + "afii57415", + 0x0627, + "afii57416", + 0x0628, + "afii57417", + 0x0629, + "afii57418", + 0x062a, + "afii57419", + 0x062b, + "afii57420", + 0x062c, + "afii57421", + 0x062d, + "afii57422", + 0x062e, + "afii57423", + 0x062f, + "afii57424", + 0x0630, + "afii57425", + 0x0631, + "afii57426", + 0x0632, + "afii57427", + 0x0633, + "afii57428", + 0x0634, + "afii57429", + 0x0635, + "afii57430", + 0x0636, + "afii57431", + 0x0637, + "afii57432", + 0x0638, + "afii57433", + 0x0639, + "afii57434", + 0x063a, + "afii57440", + 0x0640, + "afii57441", + 0x0641, + "afii57442", + 0x0642, + "afii57443", + 0x0643, + "afii57444", + 0x0644, + "afii57445", + 0x0645, + "afii57446", + 0x0646, + "afii57448", + 0x0648, + "afii57449", + 0x0649, + "afii57450", + 0x064a, + "afii57451", + 0x064b, + "afii57452", + 0x064c, + "afii57453", + 0x064d, + "afii57454", + 0x064e, + "afii57455", + 0x064f, + "afii57456", + 0x0650, + "afii57457", + 0x0651, + "afii57458", + 0x0652, + "afii57470", + 0x0647, + "afii57505", + 0x06a4, + "afii57506", + 0x067e, + "afii57507", + 0x0686, + "afii57508", + 0x0698, + "afii57509", + 0x06af, + "afii57511", + 0x0679, + "afii57512", + 0x0688, + "afii57513", + 0x0691, + "afii57514", + 0x06ba, + "afii57519", + 0x06d2, + "afii57534", + 0x06d5, + "afii57636", + 0x20aa, + "afii57645", + 0x05be, + "afii57658", + 0x05c3, + "afii57664", + 0x05d0, + "afii57665", + 0x05d1, + "afii57666", + 0x05d2, + "afii57667", + 0x05d3, + "afii57668", + 0x05d4, + "afii57669", + 0x05d5, + "afii57670", + 0x05d6, + "afii57671", + 0x05d7, + "afii57672", + 0x05d8, + "afii57673", + 0x05d9, + "afii57674", + 0x05da, + "afii57675", + 0x05db, + "afii57676", + 0x05dc, + "afii57677", + 0x05dd, + "afii57678", + 0x05de, + "afii57679", + 0x05df, + "afii57680", + 0x05e0, + "afii57681", + 0x05e1, + "afii57682", + 0x05e2, + "afii57683", + 0x05e3, + "afii57684", + 0x05e4, + "afii57685", + 0x05e5, + "afii57686", + 0x05e6, + "afii57687", + 0x05e7, + "afii57688", + 0x05e8, + "afii57689", + 0x05e9, + "afii57690", + 0x05ea, + "afii57694", + 0xfb2a, + "afii57695", + 0xfb2b, + "afii57700", + 0xfb4b, + "afii57705", + 0xfb1f, + "afii57716", + 0x05f0, + "afii57717", + 0x05f1, + "afii57718", + 0x05f2, + "afii57723", + 0xfb35, + "afii57793", + 0x05b4, + "afii57794", + 0x05b5, + "afii57795", + 0x05b6, + "afii57796", + 0x05bb, + "afii57797", + 0x05b8, + "afii57798", + 0x05b7, + "afii57799", + 0x05b0, + "afii57800", + 0x05b2, + "afii57801", + 0x05b1, + "afii57802", + 0x05b3, + "afii57803", + 0x05c2, + "afii57804", + 0x05c1, + "afii57806", + 0x05b9, + "afii57807", + 0x05bc, + "afii57839", + 0x05bd, + "afii57841", + 0x05bf, + "afii57842", + 0x05c0, + "afii57929", + 0x02bc, + "afii61248", + 0x2105, + "afii61289", + 0x2113, + "afii61352", + 0x2116, + "afii61573", + 0x202c, + "afii61574", + 0x202d, + "afii61575", + 0x202e, + "afii61664", + 0x200c, + "afii63167", + 0x066d, + "afii64937", + 0x02bd, + "agrave", + 0x00e0, + "agujarati", + 0x0a85, + "agurmukhi", + 0x0a05, + "ahiragana", + 0x3042, + "ahookabove", + 0x1ea3, + "aibengali", + 0x0990, + "aibopomofo", + 0x311e, + "aideva", + 0x0910, + "aiecyrillic", + 0x04d5, + "aigujarati", + 0x0a90, + "aigurmukhi", + 0x0a10, + "aimatragurmukhi", + 0x0a48, + "ainarabic", + 0x0639, + "ainfinalarabic", + 0xfeca, + "aininitialarabic", + 0xfecb, + "ainmedialarabic", + 0xfecc, + "ainvertedbreve", + 0x0203, + "aivowelsignbengali", + 0x09c8, + "aivowelsigndeva", + 0x0948, + "aivowelsigngujarati", + 0x0ac8, + "akatakana", + 0x30a2, + "akatakanahalfwidth", + 0xff71, + "akorean", + 0x314f, + "alef", + 0x05d0, + "alefarabic", + 0x0627, + "alefdageshhebrew", + 0xfb30, + "aleffinalarabic", + 0xfe8e, + "alefhamzaabovearabic", + 0x0623, + "alefhamzaabovefinalarabic", + 0xfe84, + "alefhamzabelowarabic", + 0x0625, + "alefhamzabelowfinalarabic", + 0xfe88, + "alefhebrew", + 0x05d0, + "aleflamedhebrew", + 0xfb4f, + "alefmaddaabovearabic", + 0x0622, + "alefmaddaabovefinalarabic", + 0xfe82, + "alefmaksuraarabic", + 0x0649, + "alefmaksurafinalarabic", + 0xfef0, + "alefmaksurainitialarabic", + 0xfef3, + "alefmaksuramedialarabic", + 0xfef4, + "alefpatahhebrew", + 0xfb2e, + "alefqamatshebrew", + 0xfb2f, + "aleph", + 0x2135, + "allequal", + 0x224c, + "alpha", + 0x03b1, + "alphatonos", + 0x03ac, + "amacron", + 0x0101, + "amonospace", + 0xff41, + "ampersand", + 0x0026, + "ampersandmonospace", + 0xff06, + "ampersandsmall", + 0xf726, + "amsquare", + 0x33c2, + "anbopomofo", + 0x3122, + "angbopomofo", + 0x3124, + "angbracketleft", + 0x3008, + "angbracketright", + 0x3009, + "angkhankhuthai", + 0x0e5a, + "angle", + 0x2220, + "anglebracketleft", + 0x3008, + "anglebracketleftvertical", + 0xfe3f, + "anglebracketright", + 0x3009, + "anglebracketrightvertical", + 0xfe40, + "angleleft", + 0x2329, + "angleright", + 0x232a, + "angstrom", + 0x212b, + "anoteleia", + 0x0387, + "anudattadeva", + 0x0952, + "anusvarabengali", + 0x0982, + "anusvaradeva", + 0x0902, + "anusvaragujarati", + 0x0a82, + "aogonek", + 0x0105, + "apaatosquare", + 0x3300, + "aparen", + 0x249c, + "apostrophearmenian", + 0x055a, + "apostrophemod", + 0x02bc, + "apple", + 0xf8ff, + "approaches", + 0x2250, + "approxequal", + 0x2248, + "approxequalorimage", + 0x2252, + "approximatelyequal", + 0x2245, + "araeaekorean", + 0x318e, + "araeakorean", + 0x318d, + "arc", + 0x2312, + "arighthalfring", + 0x1e9a, + "aring", + 0x00e5, + "aringacute", + 0x01fb, + "aringbelow", + 0x1e01, + "arrowboth", + 0x2194, + "arrowdashdown", + 0x21e3, + "arrowdashleft", + 0x21e0, + "arrowdashright", + 0x21e2, + "arrowdashup", + 0x21e1, + "arrowdblboth", + 0x21d4, + "arrowdbldown", + 0x21d3, + "arrowdblleft", + 0x21d0, + "arrowdblright", + 0x21d2, + "arrowdblup", + 0x21d1, + "arrowdown", + 0x2193, + "arrowdownleft", + 0x2199, + "arrowdownright", + 0x2198, + "arrowdownwhite", + 0x21e9, + "arrowheaddownmod", + 0x02c5, + "arrowheadleftmod", + 0x02c2, + "arrowheadrightmod", + 0x02c3, + "arrowheadupmod", + 0x02c4, + "arrowhorizex", + 0xf8e7, + "arrowleft", + 0x2190, + "arrowleftdbl", + 0x21d0, + "arrowleftdblstroke", + 0x21cd, + "arrowleftoverright", + 0x21c6, + "arrowleftwhite", + 0x21e6, + "arrowright", + 0x2192, + "arrowrightdblstroke", + 0x21cf, + "arrowrightheavy", + 0x279e, + "arrowrightoverleft", + 0x21c4, + "arrowrightwhite", + 0x21e8, + "arrowtableft", + 0x21e4, + "arrowtabright", + 0x21e5, + "arrowup", + 0x2191, + "arrowupdn", + 0x2195, + "arrowupdnbse", + 0x21a8, + "arrowupdownbase", + 0x21a8, + "arrowupleft", + 0x2196, + "arrowupleftofdown", + 0x21c5, + "arrowupright", + 0x2197, + "arrowupwhite", + 0x21e7, + "arrowvertex", + 0xf8e6, + "asciicircum", + 0x005e, + "asciicircummonospace", + 0xff3e, + "asciitilde", + 0x007e, + "asciitildemonospace", + 0xff5e, + "ascript", + 0x0251, + "ascriptturned", + 0x0252, + "asmallhiragana", + 0x3041, + "asmallkatakana", + 0x30a1, + "asmallkatakanahalfwidth", + 0xff67, + "asterisk", + 0x002a, + "asteriskaltonearabic", + 0x066d, + "asteriskarabic", + 0x066d, + "asteriskmath", + 0x2217, + "asteriskmonospace", + 0xff0a, + "asterisksmall", + 0xfe61, + "asterism", + 0x2042, + "asuperior", + 0xf6e9, + "asymptoticallyequal", + 0x2243, + "at", + 0x0040, + "atilde", + 0x00e3, + "atmonospace", + 0xff20, + "atsmall", + 0xfe6b, + "aturned", + 0x0250, + "aubengali", + 0x0994, + "aubopomofo", + 0x3120, + "audeva", + 0x0914, + "augujarati", + 0x0a94, + "augurmukhi", + 0x0a14, + "aulengthmarkbengali", + 0x09d7, + "aumatragurmukhi", + 0x0a4c, + "auvowelsignbengali", + 0x09cc, + "auvowelsigndeva", + 0x094c, + "auvowelsigngujarati", + 0x0acc, + "avagrahadeva", + 0x093d, + "aybarmenian", + 0x0561, + "ayin", + 0x05e2, + "ayinaltonehebrew", + 0xfb20, + "ayinhebrew", + 0x05e2, + "b", + 0x0062, + "babengali", + 0x09ac, + "backslash", + 0x005c, + "backslashmonospace", + 0xff3c, + "badeva", + 0x092c, + "bagujarati", + 0x0aac, + "bagurmukhi", + 0x0a2c, + "bahiragana", + 0x3070, + "bahtthai", + 0x0e3f, + "bakatakana", + 0x30d0, + "bar", + 0x007c, + "barmonospace", + 0xff5c, + "bbopomofo", + 0x3105, + "bcircle", + 0x24d1, + "bdotaccent", + 0x1e03, + "bdotbelow", + 0x1e05, + "beamedsixteenthnotes", + 0x266c, + "because", + 0x2235, + "becyrillic", + 0x0431, + "beharabic", + 0x0628, + "behfinalarabic", + 0xfe90, + "behinitialarabic", + 0xfe91, + "behiragana", + 0x3079, + "behmedialarabic", + 0xfe92, + "behmeeminitialarabic", + 0xfc9f, + "behmeemisolatedarabic", + 0xfc08, + "behnoonfinalarabic", + 0xfc6d, + "bekatakana", + 0x30d9, + "benarmenian", + 0x0562, + "bet", + 0x05d1, + "beta", + 0x03b2, + "betasymbolgreek", + 0x03d0, + "betdagesh", + 0xfb31, + "betdageshhebrew", + 0xfb31, + "bethebrew", + 0x05d1, + "betrafehebrew", + 0xfb4c, + "bhabengali", + 0x09ad, + "bhadeva", + 0x092d, + "bhagujarati", + 0x0aad, + "bhagurmukhi", + 0x0a2d, + "bhook", + 0x0253, + "bihiragana", + 0x3073, + "bikatakana", + 0x30d3, + "bilabialclick", + 0x0298, + "bindigurmukhi", + 0x0a02, + "birusquare", + 0x3331, + "blackcircle", + 0x25cf, + "blackdiamond", + 0x25c6, + "blackdownpointingtriangle", + 0x25bc, + "blackleftpointingpointer", + 0x25c4, + "blackleftpointingtriangle", + 0x25c0, + "blacklenticularbracketleft", + 0x3010, + "blacklenticularbracketleftvertical", + 0xfe3b, + "blacklenticularbracketright", + 0x3011, + "blacklenticularbracketrightvertical", + 0xfe3c, + "blacklowerlefttriangle", + 0x25e3, + "blacklowerrighttriangle", + 0x25e2, + "blackrectangle", + 0x25ac, + "blackrightpointingpointer", + 0x25ba, + "blackrightpointingtriangle", + 0x25b6, + "blacksmallsquare", + 0x25aa, + "blacksmilingface", + 0x263b, + "blacksquare", + 0x25a0, + "blackstar", + 0x2605, + "blackupperlefttriangle", + 0x25e4, + "blackupperrighttriangle", + 0x25e5, + "blackuppointingsmalltriangle", + 0x25b4, + "blackuppointingtriangle", + 0x25b2, + "blank", + 0x2423, + "blinebelow", + 0x1e07, + "block", + 0x2588, + "bmonospace", + 0xff42, + "bobaimaithai", + 0x0e1a, + "bohiragana", + 0x307c, + "bokatakana", + 0x30dc, + "bparen", + 0x249d, + "bqsquare", + 0x33c3, + "braceex", + 0xf8f4, + "braceleft", + 0x007b, + "braceleftbt", + 0xf8f3, + "braceleftmid", + 0xf8f2, + "braceleftmonospace", + 0xff5b, + "braceleftsmall", + 0xfe5b, + "bracelefttp", + 0xf8f1, + "braceleftvertical", + 0xfe37, + "braceright", + 0x007d, + "bracerightbt", + 0xf8fe, + "bracerightmid", + 0xf8fd, + "bracerightmonospace", + 0xff5d, + "bracerightsmall", + 0xfe5c, + "bracerighttp", + 0xf8fc, + "bracerightvertical", + 0xfe38, + "bracketleft", + 0x005b, + "bracketleftbt", + 0xf8f0, + "bracketleftex", + 0xf8ef, + "bracketleftmonospace", + 0xff3b, + "bracketlefttp", + 0xf8ee, + "bracketright", + 0x005d, + "bracketrightbt", + 0xf8fb, + "bracketrightex", + 0xf8fa, + "bracketrightmonospace", + 0xff3d, + "bracketrighttp", + 0xf8f9, + "breve", + 0x02d8, + "brevebelowcmb", + 0x032e, + "brevecmb", + 0x0306, + "breveinvertedbelowcmb", + 0x032f, + "breveinvertedcmb", + 0x0311, + "breveinverteddoublecmb", + 0x0361, + "bridgebelowcmb", + 0x032a, + "bridgeinvertedbelowcmb", + 0x033a, + "brokenbar", + 0x00a6, + "bstroke", + 0x0180, + "bsuperior", + 0xf6ea, + "btopbar", + 0x0183, + "buhiragana", + 0x3076, + "bukatakana", + 0x30d6, + "bullet", + 0x2022, + "bulletinverse", + 0x25d8, + "bulletoperator", + 0x2219, + "bullseye", + 0x25ce, + "c", + 0x0063, + "caarmenian", + 0x056e, + "cabengali", + 0x099a, + "cacute", + 0x0107, + "cadeva", + 0x091a, + "cagujarati", + 0x0a9a, + "cagurmukhi", + 0x0a1a, + "calsquare", + 0x3388, + "candrabindubengali", + 0x0981, + "candrabinducmb", + 0x0310, + "candrabindudeva", + 0x0901, + "candrabindugujarati", + 0x0a81, + "capslock", + 0x21ea, + "careof", + 0x2105, + "caron", + 0x02c7, + "caronbelowcmb", + 0x032c, + "caroncmb", + 0x030c, + "carriagereturn", + 0x21b5, + "cbopomofo", + 0x3118, + "ccaron", + 0x010d, + "ccedilla", + 0x00e7, + "ccedillaacute", + 0x1e09, + "ccircle", + 0x24d2, + "ccircumflex", + 0x0109, + "ccurl", + 0x0255, + "cdot", + 0x010b, + "cdotaccent", + 0x010b, + "cdsquare", + 0x33c5, + "cedilla", + 0x00b8, + "cedillacmb", + 0x0327, + "cent", + 0x00a2, + "centigrade", + 0x2103, + "centinferior", + 0xf6df, + "centmonospace", + 0xffe0, + "centoldstyle", + 0xf7a2, + "centsuperior", + 0xf6e0, + "chaarmenian", + 0x0579, + "chabengali", + 0x099b, + "chadeva", + 0x091b, + "chagujarati", + 0x0a9b, + "chagurmukhi", + 0x0a1b, + "chbopomofo", + 0x3114, + "cheabkhasiancyrillic", + 0x04bd, + "checkmark", + 0x2713, + "checyrillic", + 0x0447, + "chedescenderabkhasiancyrillic", + 0x04bf, + "chedescendercyrillic", + 0x04b7, + "chedieresiscyrillic", + 0x04f5, + "cheharmenian", + 0x0573, + "chekhakassiancyrillic", + 0x04cc, + "cheverticalstrokecyrillic", + 0x04b9, + "chi", + 0x03c7, + "chieuchacirclekorean", + 0x3277, + "chieuchaparenkorean", + 0x3217, + "chieuchcirclekorean", + 0x3269, + "chieuchkorean", + 0x314a, + "chieuchparenkorean", + 0x3209, + "chochangthai", + 0x0e0a, + "chochanthai", + 0x0e08, + "chochingthai", + 0x0e09, + "chochoethai", + 0x0e0c, + "chook", + 0x0188, + "cieucacirclekorean", + 0x3276, + "cieucaparenkorean", + 0x3216, + "cieuccirclekorean", + 0x3268, + "cieuckorean", + 0x3148, + "cieucparenkorean", + 0x3208, + "cieucuparenkorean", + 0x321c, + "circle", + 0x25cb, + "circlecopyrt", + 0x00a9, + "circlemultiply", + 0x2297, + "circleot", + 0x2299, + "circleplus", + 0x2295, + "circlepostalmark", + 0x3036, + "circlewithlefthalfblack", + 0x25d0, + "circlewithrighthalfblack", + 0x25d1, + "circumflex", + 0x02c6, + "circumflexbelowcmb", + 0x032d, + "circumflexcmb", + 0x0302, + "clear", + 0x2327, + "clickalveolar", + 0x01c2, + "clickdental", + 0x01c0, + "clicklateral", + 0x01c1, + "clickretroflex", + 0x01c3, + "club", + 0x2663, + "clubsuitblack", + 0x2663, + "clubsuitwhite", + 0x2667, + "cmcubedsquare", + 0x33a4, + "cmonospace", + 0xff43, + "cmsquaredsquare", + 0x33a0, + "coarmenian", + 0x0581, + "colon", + 0x003a, + "colonmonetary", + 0x20a1, + "colonmonospace", + 0xff1a, + "colonsign", + 0x20a1, + "colonsmall", + 0xfe55, + "colontriangularhalfmod", + 0x02d1, + "colontriangularmod", + 0x02d0, + "comma", + 0x002c, + "commaabovecmb", + 0x0313, + "commaaboverightcmb", + 0x0315, + "commaaccent", + 0xf6c3, + "commaarabic", + 0x060c, + "commaarmenian", + 0x055d, + "commainferior", + 0xf6e1, + "commamonospace", + 0xff0c, + "commareversedabovecmb", + 0x0314, + "commareversedmod", + 0x02bd, + "commasmall", + 0xfe50, + "commasuperior", + 0xf6e2, + "commaturnedabovecmb", + 0x0312, + "commaturnedmod", + 0x02bb, + "compass", + 0x263c, + "congruent", + 0x2245, + "contourintegral", + 0x222e, + "control", + 0x2303, + "controlACK", + 0x0006, + "controlBEL", + 0x0007, + "controlBS", + 0x0008, + "controlCAN", + 0x0018, + "controlCR", + 0x000d, + "controlDC1", + 0x0011, + "controlDC2", + 0x0012, + "controlDC3", + 0x0013, + "controlDC4", + 0x0014, + "controlDEL", + 0x007f, + "controlDLE", + 0x0010, + "controlEM", + 0x0019, + "controlENQ", + 0x0005, + "controlEOT", + 0x0004, + "controlESC", + 0x001b, + "controlETB", + 0x0017, + "controlETX", + 0x0003, + "controlFF", + 0x000c, + "controlFS", + 0x001c, + "controlGS", + 0x001d, + "controlHT", + 0x0009, + "controlLF", + 0x000a, + "controlNAK", + 0x0015, + "controlNULL", + 0x0000, + "controlRS", + 0x001e, + "controlSI", + 0x000f, + "controlSO", + 0x000e, + "controlSOT", + 0x0002, + "controlSTX", + 0x0001, + "controlSUB", + 0x001a, + "controlSYN", + 0x0016, + "controlUS", + 0x001f, + "controlVT", + 0x000b, + "copyright", + 0x00a9, + "copyrightsans", + 0xf8e9, + "copyrightserif", + 0xf6d9, + "cornerbracketleft", + 0x300c, + "cornerbracketlefthalfwidth", + 0xff62, + "cornerbracketleftvertical", + 0xfe41, + "cornerbracketright", + 0x300d, + "cornerbracketrighthalfwidth", + 0xff63, + "cornerbracketrightvertical", + 0xfe42, + "corporationsquare", + 0x337f, + "cosquare", + 0x33c7, + "coverkgsquare", + 0x33c6, + "cparen", + 0x249e, + "cruzeiro", + 0x20a2, + "cstretched", + 0x0297, + "curlyand", + 0x22cf, + "curlyor", + 0x22ce, + "currency", + 0x00a4, + "cyrBreve", + 0xf6d1, + "cyrFlex", + 0xf6d2, + "cyrbreve", + 0xf6d4, + "cyrflex", + 0xf6d5, + "d", + 0x0064, + "daarmenian", + 0x0564, + "dabengali", + 0x09a6, + "dadarabic", + 0x0636, + "dadeva", + 0x0926, + "dadfinalarabic", + 0xfebe, + "dadinitialarabic", + 0xfebf, + "dadmedialarabic", + 0xfec0, + "dagesh", + 0x05bc, + "dageshhebrew", + 0x05bc, + "dagger", + 0x2020, + "daggerdbl", + 0x2021, + "dagujarati", + 0x0aa6, + "dagurmukhi", + 0x0a26, + "dahiragana", + 0x3060, + "dakatakana", + 0x30c0, + "dalarabic", + 0x062f, + "dalet", + 0x05d3, + "daletdagesh", + 0xfb33, + "daletdageshhebrew", + 0xfb33, + "dalethebrew", + 0x05d3, + "dalfinalarabic", + 0xfeaa, + "dammaarabic", + 0x064f, + "dammalowarabic", + 0x064f, + "dammatanaltonearabic", + 0x064c, + "dammatanarabic", + 0x064c, + "danda", + 0x0964, + "dargahebrew", + 0x05a7, + "dargalefthebrew", + 0x05a7, + "dasiapneumatacyrilliccmb", + 0x0485, + "dblGrave", + 0xf6d3, + "dblanglebracketleft", + 0x300a, + "dblanglebracketleftvertical", + 0xfe3d, + "dblanglebracketright", + 0x300b, + "dblanglebracketrightvertical", + 0xfe3e, + "dblarchinvertedbelowcmb", + 0x032b, + "dblarrowleft", + 0x21d4, + "dblarrowright", + 0x21d2, + "dbldanda", + 0x0965, + "dblgrave", + 0xf6d6, + "dblgravecmb", + 0x030f, + "dblintegral", + 0x222c, + "dbllowline", + 0x2017, + "dbllowlinecmb", + 0x0333, + "dbloverlinecmb", + 0x033f, + "dblprimemod", + 0x02ba, + "dblverticalbar", + 0x2016, + "dblverticallineabovecmb", + 0x030e, + "dbopomofo", + 0x3109, + "dbsquare", + 0x33c8, + "dcaron", + 0x010f, + "dcedilla", + 0x1e11, + "dcircle", + 0x24d3, + "dcircumflexbelow", + 0x1e13, + "dcroat", + 0x0111, + "ddabengali", + 0x09a1, + "ddadeva", + 0x0921, + "ddagujarati", + 0x0aa1, + "ddagurmukhi", + 0x0a21, + "ddalarabic", + 0x0688, + "ddalfinalarabic", + 0xfb89, + "dddhadeva", + 0x095c, + "ddhabengali", + 0x09a2, + "ddhadeva", + 0x0922, + "ddhagujarati", + 0x0aa2, + "ddhagurmukhi", + 0x0a22, + "ddotaccent", + 0x1e0b, + "ddotbelow", + 0x1e0d, + "decimalseparatorarabic", + 0x066b, + "decimalseparatorpersian", + 0x066b, + "decyrillic", + 0x0434, + "degree", + 0x00b0, + "dehihebrew", + 0x05ad, + "dehiragana", + 0x3067, + "deicoptic", + 0x03ef, + "dekatakana", + 0x30c7, + "deleteleft", + 0x232b, + "deleteright", + 0x2326, + "delta", + 0x03b4, + "deltaturned", + 0x018d, + "denominatorminusonenumeratorbengali", + 0x09f8, + "dezh", + 0x02a4, + "dhabengali", + 0x09a7, + "dhadeva", + 0x0927, + "dhagujarati", + 0x0aa7, + "dhagurmukhi", + 0x0a27, + "dhook", + 0x0257, + "dialytikatonos", + 0x0385, + "dialytikatonoscmb", + 0x0344, + "diamond", + 0x2666, + "diamondsuitwhite", + 0x2662, + "dieresis", + 0x00a8, + "dieresisacute", + 0xf6d7, + "dieresisbelowcmb", + 0x0324, + "dieresiscmb", + 0x0308, + "dieresisgrave", + 0xf6d8, + "dieresistonos", + 0x0385, + "dihiragana", + 0x3062, + "dikatakana", + 0x30c2, + "dittomark", + 0x3003, + "divide", + 0x00f7, + "divides", + 0x2223, + "divisionslash", + 0x2215, + "djecyrillic", + 0x0452, + "dkshade", + 0x2593, + "dlinebelow", + 0x1e0f, + "dlsquare", + 0x3397, + "dmacron", + 0x0111, + "dmonospace", + 0xff44, + "dnblock", + 0x2584, + "dochadathai", + 0x0e0e, + "dodekthai", + 0x0e14, + "dohiragana", + 0x3069, + "dokatakana", + 0x30c9, + "dollar", + 0x0024, + "dollarinferior", + 0xf6e3, + "dollarmonospace", + 0xff04, + "dollaroldstyle", + 0xf724, + "dollarsmall", + 0xfe69, + "dollarsuperior", + 0xf6e4, + "dong", + 0x20ab, + "dorusquare", + 0x3326, + "dotaccent", + 0x02d9, + "dotaccentcmb", + 0x0307, + "dotbelowcmb", + 0x0323, + "dotbelowcomb", + 0x0323, + "dotkatakana", + 0x30fb, + "dotlessi", + 0x0131, + "dotlessj", + 0xf6be, + "dotlessjstrokehook", + 0x0284, + "dotmath", + 0x22c5, + "dottedcircle", + 0x25cc, + "doubleyodpatah", + 0xfb1f, + "doubleyodpatahhebrew", + 0xfb1f, + "downtackbelowcmb", + 0x031e, + "downtackmod", + 0x02d5, + "dparen", + 0x249f, + "dsuperior", + 0xf6eb, + "dtail", + 0x0256, + "dtopbar", + 0x018c, + "duhiragana", + 0x3065, + "dukatakana", + 0x30c5, + "dz", + 0x01f3, + "dzaltone", + 0x02a3, + "dzcaron", + 0x01c6, + "dzcurl", + 0x02a5, + "dzeabkhasiancyrillic", + 0x04e1, + "dzecyrillic", + 0x0455, + "dzhecyrillic", + 0x045f, + "e", + 0x0065, + "eacute", + 0x00e9, + "earth", + 0x2641, + "ebengali", + 0x098f, + "ebopomofo", + 0x311c, + "ebreve", + 0x0115, + "ecandradeva", + 0x090d, + "ecandragujarati", + 0x0a8d, + "ecandravowelsigndeva", + 0x0945, + "ecandravowelsigngujarati", + 0x0ac5, + "ecaron", + 0x011b, + "ecedillabreve", + 0x1e1d, + "echarmenian", + 0x0565, + "echyiwnarmenian", + 0x0587, + "ecircle", + 0x24d4, + "ecircumflex", + 0x00ea, + "ecircumflexacute", + 0x1ebf, + "ecircumflexbelow", + 0x1e19, + "ecircumflexdotbelow", + 0x1ec7, + "ecircumflexgrave", + 0x1ec1, + "ecircumflexhookabove", + 0x1ec3, + "ecircumflextilde", + 0x1ec5, + "ecyrillic", + 0x0454, + "edblgrave", + 0x0205, + "edeva", + 0x090f, + "edieresis", + 0x00eb, + "edot", + 0x0117, + "edotaccent", + 0x0117, + "edotbelow", + 0x1eb9, + "eegurmukhi", + 0x0a0f, + "eematragurmukhi", + 0x0a47, + "efcyrillic", + 0x0444, + "egrave", + 0x00e8, + "egujarati", + 0x0a8f, + "eharmenian", + 0x0567, + "ehbopomofo", + 0x311d, + "ehiragana", + 0x3048, + "ehookabove", + 0x1ebb, + "eibopomofo", + 0x311f, + "eight", + 0x0038, + "eightarabic", + 0x0668, + "eightbengali", + 0x09ee, + "eightcircle", + 0x2467, + "eightcircleinversesansserif", + 0x2791, + "eightdeva", + 0x096e, + "eighteencircle", + 0x2471, + "eighteenparen", + 0x2485, + "eighteenperiod", + 0x2499, + "eightgujarati", + 0x0aee, + "eightgurmukhi", + 0x0a6e, + "eighthackarabic", + 0x0668, + "eighthangzhou", + 0x3028, + "eighthnotebeamed", + 0x266b, + "eightideographicparen", + 0x3227, + "eightinferior", + 0x2088, + "eightmonospace", + 0xff18, + "eightoldstyle", + 0xf738, + "eightparen", + 0x247b, + "eightperiod", + 0x248f, + "eightpersian", + 0x06f8, + "eightroman", + 0x2177, + "eightsuperior", + 0x2078, + "eightthai", + 0x0e58, + "einvertedbreve", + 0x0207, + "eiotifiedcyrillic", + 0x0465, + "ekatakana", + 0x30a8, + "ekatakanahalfwidth", + 0xff74, + "ekonkargurmukhi", + 0x0a74, + "ekorean", + 0x3154, + "elcyrillic", + 0x043b, + "element", + 0x2208, + "elevencircle", + 0x246a, + "elevenparen", + 0x247e, + "elevenperiod", + 0x2492, + "elevenroman", + 0x217a, + "ellipsis", + 0x2026, + "ellipsisvertical", + 0x22ee, + "emacron", + 0x0113, + "emacronacute", + 0x1e17, + "emacrongrave", + 0x1e15, + "emcyrillic", + 0x043c, + "emdash", + 0x2014, + "emdashvertical", + 0xfe31, + "emonospace", + 0xff45, + "emphasismarkarmenian", + 0x055b, + "emptyset", + 0x2205, + "enbopomofo", + 0x3123, + "encyrillic", + 0x043d, + "endash", + 0x2013, + "endashvertical", + 0xfe32, + "endescendercyrillic", + 0x04a3, + "eng", + 0x014b, + "engbopomofo", + 0x3125, + "enghecyrillic", + 0x04a5, + "enhookcyrillic", + 0x04c8, + "enspace", + 0x2002, + "eogonek", + 0x0119, + "eokorean", + 0x3153, + "eopen", + 0x025b, + "eopenclosed", + 0x029a, + "eopenreversed", + 0x025c, + "eopenreversedclosed", + 0x025e, + "eopenreversedhook", + 0x025d, + "eparen", + 0x24a0, + "epsilon", + 0x03b5, + "epsilontonos", + 0x03ad, + "equal", + 0x003d, + "equalmonospace", + 0xff1d, + "equalsmall", + 0xfe66, + "equalsuperior", + 0x207c, + "equivalence", + 0x2261, + "erbopomofo", + 0x3126, + "ercyrillic", + 0x0440, + "ereversed", + 0x0258, + "ereversedcyrillic", + 0x044d, + "escyrillic", + 0x0441, + "esdescendercyrillic", + 0x04ab, + "esh", + 0x0283, + "eshcurl", + 0x0286, + "eshortdeva", + 0x090e, + "eshortvowelsigndeva", + 0x0946, + "eshreversedloop", + 0x01aa, + "eshsquatreversed", + 0x0285, + "esmallhiragana", + 0x3047, + "esmallkatakana", + 0x30a7, + "esmallkatakanahalfwidth", + 0xff6a, + "estimated", + 0x212e, + "esuperior", + 0xf6ec, + "eta", + 0x03b7, + "etarmenian", + 0x0568, + "etatonos", + 0x03ae, + "eth", + 0x00f0, + "etilde", + 0x1ebd, + "etildebelow", + 0x1e1b, + "etnahtafoukhhebrew", + 0x0591, + "etnahtafoukhlefthebrew", + 0x0591, + "etnahtahebrew", + 0x0591, + "etnahtalefthebrew", + 0x0591, + "eturned", + 0x01dd, + "eukorean", + 0x3161, + "euro", + 0x20ac, + "evowelsignbengali", + 0x09c7, + "evowelsigndeva", + 0x0947, + "evowelsigngujarati", + 0x0ac7, + "exclam", + 0x0021, + "exclamarmenian", + 0x055c, + "exclamdbl", + 0x203c, + "exclamdown", + 0x00a1, + "exclamdownsmall", + 0xf7a1, + "exclammonospace", + 0xff01, + "exclamsmall", + 0xf721, + "existential", + 0x2203, + "ezh", + 0x0292, + "ezhcaron", + 0x01ef, + "ezhcurl", + 0x0293, + "ezhreversed", + 0x01b9, + "ezhtail", + 0x01ba, + "f", + 0x0066, + "fadeva", + 0x095e, + "fagurmukhi", + 0x0a5e, + "fahrenheit", + 0x2109, + "fathaarabic", + 0x064e, + "fathalowarabic", + 0x064e, + "fathatanarabic", + 0x064b, + "fbopomofo", + 0x3108, + "fcircle", + 0x24d5, + "fdotaccent", + 0x1e1f, + "feharabic", + 0x0641, + "feharmenian", + 0x0586, + "fehfinalarabic", + 0xfed2, + "fehinitialarabic", + 0xfed3, + "fehmedialarabic", + 0xfed4, + "feicoptic", + 0x03e5, + "female", + 0x2640, + "ff", + 0xfb00, + "f_f", + 0xfb00, + "ffi", + 0xfb03, + "f_f_i", + 0xfb03, + "ffl", + 0xfb04, + "f_f_l", + 0xfb04, + "fi", + 0xfb01, + "f_i", + 0xfb01, + "fifteencircle", + 0x246e, + "fifteenparen", + 0x2482, + "fifteenperiod", + 0x2496, + "figuredash", + 0x2012, + "filledbox", + 0x25a0, + "filledrect", + 0x25ac, + "finalkaf", + 0x05da, + "finalkafdagesh", + 0xfb3a, + "finalkafdageshhebrew", + 0xfb3a, + "finalkafhebrew", + 0x05da, + "finalmem", + 0x05dd, + "finalmemhebrew", + 0x05dd, + "finalnun", + 0x05df, + "finalnunhebrew", + 0x05df, + "finalpe", + 0x05e3, + "finalpehebrew", + 0x05e3, + "finaltsadi", + 0x05e5, + "finaltsadihebrew", + 0x05e5, + "firsttonechinese", + 0x02c9, + "fisheye", + 0x25c9, + "fitacyrillic", + 0x0473, + "five", + 0x0035, + "fivearabic", + 0x0665, + "fivebengali", + 0x09eb, + "fivecircle", + 0x2464, + "fivecircleinversesansserif", + 0x278e, + "fivedeva", + 0x096b, + "fiveeighths", + 0x215d, + "fivegujarati", + 0x0aeb, + "fivegurmukhi", + 0x0a6b, + "fivehackarabic", + 0x0665, + "fivehangzhou", + 0x3025, + "fiveideographicparen", + 0x3224, + "fiveinferior", + 0x2085, + "fivemonospace", + 0xff15, + "fiveoldstyle", + 0xf735, + "fiveparen", + 0x2478, + "fiveperiod", + 0x248c, + "fivepersian", + 0x06f5, + "fiveroman", + 0x2174, + "fivesuperior", + 0x2075, + "fivethai", + 0x0e55, + "fl", + 0xfb02, + "f_l", + 0xfb02, + "florin", + 0x0192, + "fmonospace", + 0xff46, + "fmsquare", + 0x3399, + "fofanthai", + 0x0e1f, + "fofathai", + 0x0e1d, + "fongmanthai", + 0x0e4f, + "forall", + 0x2200, + "four", + 0x0034, + "fourarabic", + 0x0664, + "fourbengali", + 0x09ea, + "fourcircle", + 0x2463, + "fourcircleinversesansserif", + 0x278d, + "fourdeva", + 0x096a, + "fourgujarati", + 0x0aea, + "fourgurmukhi", + 0x0a6a, + "fourhackarabic", + 0x0664, + "fourhangzhou", + 0x3024, + "fourideographicparen", + 0x3223, + "fourinferior", + 0x2084, + "fourmonospace", + 0xff14, + "fournumeratorbengali", + 0x09f7, + "fouroldstyle", + 0xf734, + "fourparen", + 0x2477, + "fourperiod", + 0x248b, + "fourpersian", + 0x06f4, + "fourroman", + 0x2173, + "foursuperior", + 0x2074, + "fourteencircle", + 0x246d, + "fourteenparen", + 0x2481, + "fourteenperiod", + 0x2495, + "fourthai", + 0x0e54, + "fourthtonechinese", + 0x02cb, + "fparen", + 0x24a1, + "fraction", + 0x2044, + "franc", + 0x20a3, + "g", + 0x0067, + "gabengali", + 0x0997, + "gacute", + 0x01f5, + "gadeva", + 0x0917, + "gafarabic", + 0x06af, + "gaffinalarabic", + 0xfb93, + "gafinitialarabic", + 0xfb94, + "gafmedialarabic", + 0xfb95, + "gagujarati", + 0x0a97, + "gagurmukhi", + 0x0a17, + "gahiragana", + 0x304c, + "gakatakana", + 0x30ac, + "gamma", + 0x03b3, + "gammalatinsmall", + 0x0263, + "gammasuperior", + 0x02e0, + "gangiacoptic", + 0x03eb, + "gbopomofo", + 0x310d, + "gbreve", + 0x011f, + "gcaron", + 0x01e7, + "gcedilla", + 0x0123, + "gcircle", + 0x24d6, + "gcircumflex", + 0x011d, + "gcommaaccent", + 0x0123, + "gdot", + 0x0121, + "gdotaccent", + 0x0121, + "gecyrillic", + 0x0433, + "gehiragana", + 0x3052, + "gekatakana", + 0x30b2, + "geometricallyequal", + 0x2251, + "gereshaccenthebrew", + 0x059c, + "gereshhebrew", + 0x05f3, + "gereshmuqdamhebrew", + 0x059d, + "germandbls", + 0x00df, + "gershayimaccenthebrew", + 0x059e, + "gershayimhebrew", + 0x05f4, + "getamark", + 0x3013, + "ghabengali", + 0x0998, + "ghadarmenian", + 0x0572, + "ghadeva", + 0x0918, + "ghagujarati", + 0x0a98, + "ghagurmukhi", + 0x0a18, + "ghainarabic", + 0x063a, + "ghainfinalarabic", + 0xfece, + "ghaininitialarabic", + 0xfecf, + "ghainmedialarabic", + 0xfed0, + "ghemiddlehookcyrillic", + 0x0495, + "ghestrokecyrillic", + 0x0493, + "gheupturncyrillic", + 0x0491, + "ghhadeva", + 0x095a, + "ghhagurmukhi", + 0x0a5a, + "ghook", + 0x0260, + "ghzsquare", + 0x3393, + "gihiragana", + 0x304e, + "gikatakana", + 0x30ae, + "gimarmenian", + 0x0563, + "gimel", + 0x05d2, + "gimeldagesh", + 0xfb32, + "gimeldageshhebrew", + 0xfb32, + "gimelhebrew", + 0x05d2, + "gjecyrillic", + 0x0453, + "glottalinvertedstroke", + 0x01be, + "glottalstop", + 0x0294, + "glottalstopinverted", + 0x0296, + "glottalstopmod", + 0x02c0, + "glottalstopreversed", + 0x0295, + "glottalstopreversedmod", + 0x02c1, + "glottalstopreversedsuperior", + 0x02e4, + "glottalstopstroke", + 0x02a1, + "glottalstopstrokereversed", + 0x02a2, + "gmacron", + 0x1e21, + "gmonospace", + 0xff47, + "gohiragana", + 0x3054, + "gokatakana", + 0x30b4, + "gparen", + 0x24a2, + "gpasquare", + 0x33ac, + "gradient", + 0x2207, + "grave", + 0x0060, + "gravebelowcmb", + 0x0316, + "gravecmb", + 0x0300, + "gravecomb", + 0x0300, + "gravedeva", + 0x0953, + "gravelowmod", + 0x02ce, + "gravemonospace", + 0xff40, + "gravetonecmb", + 0x0340, + "greater", + 0x003e, + "greaterequal", + 0x2265, + "greaterequalorless", + 0x22db, + "greatermonospace", + 0xff1e, + "greaterorequivalent", + 0x2273, + "greaterorless", + 0x2277, + "greateroverequal", + 0x2267, + "greatersmall", + 0xfe65, + "gscript", + 0x0261, + "gstroke", + 0x01e5, + "guhiragana", + 0x3050, + "guillemotleft", + 0x00ab, + "guillemotright", + 0x00bb, + "guilsinglleft", + 0x2039, + "guilsinglright", + 0x203a, + "gukatakana", + 0x30b0, + "guramusquare", + 0x3318, + "gysquare", + 0x33c9, + "h", + 0x0068, + "haabkhasiancyrillic", + 0x04a9, + "haaltonearabic", + 0x06c1, + "habengali", + 0x09b9, + "hadescendercyrillic", + 0x04b3, + "hadeva", + 0x0939, + "hagujarati", + 0x0ab9, + "hagurmukhi", + 0x0a39, + "haharabic", + 0x062d, + "hahfinalarabic", + 0xfea2, + "hahinitialarabic", + 0xfea3, + "hahiragana", + 0x306f, + "hahmedialarabic", + 0xfea4, + "haitusquare", + 0x332a, + "hakatakana", + 0x30cf, + "hakatakanahalfwidth", + 0xff8a, + "halantgurmukhi", + 0x0a4d, + "hamzaarabic", + 0x0621, + "hamzalowarabic", + 0x0621, + "hangulfiller", + 0x3164, + "hardsigncyrillic", + 0x044a, + "harpoonleftbarbup", + 0x21bc, + "harpoonrightbarbup", + 0x21c0, + "hasquare", + 0x33ca, + "hatafpatah", + 0x05b2, + "hatafpatah16", + 0x05b2, + "hatafpatah23", + 0x05b2, + "hatafpatah2f", + 0x05b2, + "hatafpatahhebrew", + 0x05b2, + "hatafpatahnarrowhebrew", + 0x05b2, + "hatafpatahquarterhebrew", + 0x05b2, + "hatafpatahwidehebrew", + 0x05b2, + "hatafqamats", + 0x05b3, + "hatafqamats1b", + 0x05b3, + "hatafqamats28", + 0x05b3, + "hatafqamats34", + 0x05b3, + "hatafqamatshebrew", + 0x05b3, + "hatafqamatsnarrowhebrew", + 0x05b3, + "hatafqamatsquarterhebrew", + 0x05b3, + "hatafqamatswidehebrew", + 0x05b3, + "hatafsegol", + 0x05b1, + "hatafsegol17", + 0x05b1, + "hatafsegol24", + 0x05b1, + "hatafsegol30", + 0x05b1, + "hatafsegolhebrew", + 0x05b1, + "hatafsegolnarrowhebrew", + 0x05b1, + "hatafsegolquarterhebrew", + 0x05b1, + "hatafsegolwidehebrew", + 0x05b1, + "hbar", + 0x0127, + "hbopomofo", + 0x310f, + "hbrevebelow", + 0x1e2b, + "hcedilla", + 0x1e29, + "hcircle", + 0x24d7, + "hcircumflex", + 0x0125, + "hdieresis", + 0x1e27, + "hdotaccent", + 0x1e23, + "hdotbelow", + 0x1e25, + "he", + 0x05d4, + "heart", + 0x2665, + "heartsuitblack", + 0x2665, + "heartsuitwhite", + 0x2661, + "hedagesh", + 0xfb34, + "hedageshhebrew", + 0xfb34, + "hehaltonearabic", + 0x06c1, + "heharabic", + 0x0647, + "hehebrew", + 0x05d4, + "hehfinalaltonearabic", + 0xfba7, + "hehfinalalttwoarabic", + 0xfeea, + "hehfinalarabic", + 0xfeea, + "hehhamzaabovefinalarabic", + 0xfba5, + "hehhamzaaboveisolatedarabic", + 0xfba4, + "hehinitialaltonearabic", + 0xfba8, + "hehinitialarabic", + 0xfeeb, + "hehiragana", + 0x3078, + "hehmedialaltonearabic", + 0xfba9, + "hehmedialarabic", + 0xfeec, + "heiseierasquare", + 0x337b, + "hekatakana", + 0x30d8, + "hekatakanahalfwidth", + 0xff8d, + "hekutaarusquare", + 0x3336, + "henghook", + 0x0267, + "herutusquare", + 0x3339, + "het", + 0x05d7, + "hethebrew", + 0x05d7, + "hhook", + 0x0266, + "hhooksuperior", + 0x02b1, + "hieuhacirclekorean", + 0x327b, + "hieuhaparenkorean", + 0x321b, + "hieuhcirclekorean", + 0x326d, + "hieuhkorean", + 0x314e, + "hieuhparenkorean", + 0x320d, + "hihiragana", + 0x3072, + "hikatakana", + 0x30d2, + "hikatakanahalfwidth", + 0xff8b, + "hiriq", + 0x05b4, + "hiriq14", + 0x05b4, + "hiriq21", + 0x05b4, + "hiriq2d", + 0x05b4, + "hiriqhebrew", + 0x05b4, + "hiriqnarrowhebrew", + 0x05b4, + "hiriqquarterhebrew", + 0x05b4, + "hiriqwidehebrew", + 0x05b4, + "hlinebelow", + 0x1e96, + "hmonospace", + 0xff48, + "hoarmenian", + 0x0570, + "hohipthai", + 0x0e2b, + "hohiragana", + 0x307b, + "hokatakana", + 0x30db, + "hokatakanahalfwidth", + 0xff8e, + "holam", + 0x05b9, + "holam19", + 0x05b9, + "holam26", + 0x05b9, + "holam32", + 0x05b9, + "holamhebrew", + 0x05b9, + "holamnarrowhebrew", + 0x05b9, + "holamquarterhebrew", + 0x05b9, + "holamwidehebrew", + 0x05b9, + "honokhukthai", + 0x0e2e, + "hookabovecomb", + 0x0309, + "hookcmb", + 0x0309, + "hookpalatalizedbelowcmb", + 0x0321, + "hookretroflexbelowcmb", + 0x0322, + "hoonsquare", + 0x3342, + "horicoptic", + 0x03e9, + "horizontalbar", + 0x2015, + "horncmb", + 0x031b, + "hotsprings", + 0x2668, + "house", + 0x2302, + "hparen", + 0x24a3, + "hsuperior", + 0x02b0, + "hturned", + 0x0265, + "huhiragana", + 0x3075, + "huiitosquare", + 0x3333, + "hukatakana", + 0x30d5, + "hukatakanahalfwidth", + 0xff8c, + "hungarumlaut", + 0x02dd, + "hungarumlautcmb", + 0x030b, + "hv", + 0x0195, + "hyphen", + 0x002d, + "hypheninferior", + 0xf6e5, + "hyphenmonospace", + 0xff0d, + "hyphensmall", + 0xfe63, + "hyphensuperior", + 0xf6e6, + "hyphentwo", + 0x2010, + "i", + 0x0069, + "iacute", + 0x00ed, + "iacyrillic", + 0x044f, + "ibengali", + 0x0987, + "ibopomofo", + 0x3127, + "ibreve", + 0x012d, + "icaron", + 0x01d0, + "icircle", + 0x24d8, + "icircumflex", + 0x00ee, + "icyrillic", + 0x0456, + "idblgrave", + 0x0209, + "ideographearthcircle", + 0x328f, + "ideographfirecircle", + 0x328b, + "ideographicallianceparen", + 0x323f, + "ideographiccallparen", + 0x323a, + "ideographiccentrecircle", + 0x32a5, + "ideographicclose", + 0x3006, + "ideographiccomma", + 0x3001, + "ideographiccommaleft", + 0xff64, + "ideographiccongratulationparen", + 0x3237, + "ideographiccorrectcircle", + 0x32a3, + "ideographicearthparen", + 0x322f, + "ideographicenterpriseparen", + 0x323d, + "ideographicexcellentcircle", + 0x329d, + "ideographicfestivalparen", + 0x3240, + "ideographicfinancialcircle", + 0x3296, + "ideographicfinancialparen", + 0x3236, + "ideographicfireparen", + 0x322b, + "ideographichaveparen", + 0x3232, + "ideographichighcircle", + 0x32a4, + "ideographiciterationmark", + 0x3005, + "ideographiclaborcircle", + 0x3298, + "ideographiclaborparen", + 0x3238, + "ideographicleftcircle", + 0x32a7, + "ideographiclowcircle", + 0x32a6, + "ideographicmedicinecircle", + 0x32a9, + "ideographicmetalparen", + 0x322e, + "ideographicmoonparen", + 0x322a, + "ideographicnameparen", + 0x3234, + "ideographicperiod", + 0x3002, + "ideographicprintcircle", + 0x329e, + "ideographicreachparen", + 0x3243, + "ideographicrepresentparen", + 0x3239, + "ideographicresourceparen", + 0x323e, + "ideographicrightcircle", + 0x32a8, + "ideographicsecretcircle", + 0x3299, + "ideographicselfparen", + 0x3242, + "ideographicsocietyparen", + 0x3233, + "ideographicspace", + 0x3000, + "ideographicspecialparen", + 0x3235, + "ideographicstockparen", + 0x3231, + "ideographicstudyparen", + 0x323b, + "ideographicsunparen", + 0x3230, + "ideographicsuperviseparen", + 0x323c, + "ideographicwaterparen", + 0x322c, + "ideographicwoodparen", + 0x322d, + "ideographiczero", + 0x3007, + "ideographmetalcircle", + 0x328e, + "ideographmooncircle", + 0x328a, + "ideographnamecircle", + 0x3294, + "ideographsuncircle", + 0x3290, + "ideographwatercircle", + 0x328c, + "ideographwoodcircle", + 0x328d, + "ideva", + 0x0907, + "idieresis", + 0x00ef, + "idieresisacute", + 0x1e2f, + "idieresiscyrillic", + 0x04e5, + "idotbelow", + 0x1ecb, + "iebrevecyrillic", + 0x04d7, + "iecyrillic", + 0x0435, + "ieungacirclekorean", + 0x3275, + "ieungaparenkorean", + 0x3215, + "ieungcirclekorean", + 0x3267, + "ieungkorean", + 0x3147, + "ieungparenkorean", + 0x3207, + "igrave", + 0x00ec, + "igujarati", + 0x0a87, + "igurmukhi", + 0x0a07, + "ihiragana", + 0x3044, + "ihookabove", + 0x1ec9, + "iibengali", + 0x0988, + "iicyrillic", + 0x0438, + "iideva", + 0x0908, + "iigujarati", + 0x0a88, + "iigurmukhi", + 0x0a08, + "iimatragurmukhi", + 0x0a40, + "iinvertedbreve", + 0x020b, + "iishortcyrillic", + 0x0439, + "iivowelsignbengali", + 0x09c0, + "iivowelsigndeva", + 0x0940, + "iivowelsigngujarati", + 0x0ac0, + "ij", + 0x0133, + "ikatakana", + 0x30a4, + "ikatakanahalfwidth", + 0xff72, + "ikorean", + 0x3163, + "ilde", + 0x02dc, + "iluyhebrew", + 0x05ac, + "imacron", + 0x012b, + "imacroncyrillic", + 0x04e3, + "imageorapproximatelyequal", + 0x2253, + "imatragurmukhi", + 0x0a3f, + "imonospace", + 0xff49, + "increment", + 0x2206, + "infinity", + 0x221e, + "iniarmenian", + 0x056b, + "integral", + 0x222b, + "integralbottom", + 0x2321, + "integralbt", + 0x2321, + "integralex", + 0xf8f5, + "integraltop", + 0x2320, + "integraltp", + 0x2320, + "intersection", + 0x2229, + "intisquare", + 0x3305, + "invbullet", + 0x25d8, + "invcircle", + 0x25d9, + "invsmileface", + 0x263b, + "iocyrillic", + 0x0451, + "iogonek", + 0x012f, + "iota", + 0x03b9, + "iotadieresis", + 0x03ca, + "iotadieresistonos", + 0x0390, + "iotalatin", + 0x0269, + "iotatonos", + 0x03af, + "iparen", + 0x24a4, + "irigurmukhi", + 0x0a72, + "ismallhiragana", + 0x3043, + "ismallkatakana", + 0x30a3, + "ismallkatakanahalfwidth", + 0xff68, + "issharbengali", + 0x09fa, + "istroke", + 0x0268, + "isuperior", + 0xf6ed, + "iterationhiragana", + 0x309d, + "iterationkatakana", + 0x30fd, + "itilde", + 0x0129, + "itildebelow", + 0x1e2d, + "iubopomofo", + 0x3129, + "iucyrillic", + 0x044e, + "ivowelsignbengali", + 0x09bf, + "ivowelsigndeva", + 0x093f, + "ivowelsigngujarati", + 0x0abf, + "izhitsacyrillic", + 0x0475, + "izhitsadblgravecyrillic", + 0x0477, + "j", + 0x006a, + "jaarmenian", + 0x0571, + "jabengali", + 0x099c, + "jadeva", + 0x091c, + "jagujarati", + 0x0a9c, + "jagurmukhi", + 0x0a1c, + "jbopomofo", + 0x3110, + "jcaron", + 0x01f0, + "jcircle", + 0x24d9, + "jcircumflex", + 0x0135, + "jcrossedtail", + 0x029d, + "jdotlessstroke", + 0x025f, + "jecyrillic", + 0x0458, + "jeemarabic", + 0x062c, + "jeemfinalarabic", + 0xfe9e, + "jeeminitialarabic", + 0xfe9f, + "jeemmedialarabic", + 0xfea0, + "jeharabic", + 0x0698, + "jehfinalarabic", + 0xfb8b, + "jhabengali", + 0x099d, + "jhadeva", + 0x091d, + "jhagujarati", + 0x0a9d, + "jhagurmukhi", + 0x0a1d, + "jheharmenian", + 0x057b, + "jis", + 0x3004, + "jmonospace", + 0xff4a, + "jparen", + 0x24a5, + "jsuperior", + 0x02b2, + "k", + 0x006b, + "kabashkircyrillic", + 0x04a1, + "kabengali", + 0x0995, + "kacute", + 0x1e31, + "kacyrillic", + 0x043a, + "kadescendercyrillic", + 0x049b, + "kadeva", + 0x0915, + "kaf", + 0x05db, + "kafarabic", + 0x0643, + "kafdagesh", + 0xfb3b, + "kafdageshhebrew", + 0xfb3b, + "kaffinalarabic", + 0xfeda, + "kafhebrew", + 0x05db, + "kafinitialarabic", + 0xfedb, + "kafmedialarabic", + 0xfedc, + "kafrafehebrew", + 0xfb4d, + "kagujarati", + 0x0a95, + "kagurmukhi", + 0x0a15, + "kahiragana", + 0x304b, + "kahookcyrillic", + 0x04c4, + "kakatakana", + 0x30ab, + "kakatakanahalfwidth", + 0xff76, + "kappa", + 0x03ba, + "kappasymbolgreek", + 0x03f0, + "kapyeounmieumkorean", + 0x3171, + "kapyeounphieuphkorean", + 0x3184, + "kapyeounpieupkorean", + 0x3178, + "kapyeounssangpieupkorean", + 0x3179, + "karoriisquare", + 0x330d, + "kashidaautoarabic", + 0x0640, + "kashidaautonosidebearingarabic", + 0x0640, + "kasmallkatakana", + 0x30f5, + "kasquare", + 0x3384, + "kasraarabic", + 0x0650, + "kasratanarabic", + 0x064d, + "kastrokecyrillic", + 0x049f, + "katahiraprolongmarkhalfwidth", + 0xff70, + "kaverticalstrokecyrillic", + 0x049d, + "kbopomofo", + 0x310e, + "kcalsquare", + 0x3389, + "kcaron", + 0x01e9, + "kcedilla", + 0x0137, + "kcircle", + 0x24da, + "kcommaaccent", + 0x0137, + "kdotbelow", + 0x1e33, + "keharmenian", + 0x0584, + "kehiragana", + 0x3051, + "kekatakana", + 0x30b1, + "kekatakanahalfwidth", + 0xff79, + "kenarmenian", + 0x056f, + "kesmallkatakana", + 0x30f6, + "kgreenlandic", + 0x0138, + "khabengali", + 0x0996, + "khacyrillic", + 0x0445, + "khadeva", + 0x0916, + "khagujarati", + 0x0a96, + "khagurmukhi", + 0x0a16, + "khaharabic", + 0x062e, + "khahfinalarabic", + 0xfea6, + "khahinitialarabic", + 0xfea7, + "khahmedialarabic", + 0xfea8, + "kheicoptic", + 0x03e7, + "khhadeva", + 0x0959, + "khhagurmukhi", + 0x0a59, + "khieukhacirclekorean", + 0x3278, + "khieukhaparenkorean", + 0x3218, + "khieukhcirclekorean", + 0x326a, + "khieukhkorean", + 0x314b, + "khieukhparenkorean", + 0x320a, + "khokhaithai", + 0x0e02, + "khokhonthai", + 0x0e05, + "khokhuatthai", + 0x0e03, + "khokhwaithai", + 0x0e04, + "khomutthai", + 0x0e5b, + "khook", + 0x0199, + "khorakhangthai", + 0x0e06, + "khzsquare", + 0x3391, + "kihiragana", + 0x304d, + "kikatakana", + 0x30ad, + "kikatakanahalfwidth", + 0xff77, + "kiroguramusquare", + 0x3315, + "kiromeetorusquare", + 0x3316, + "kirosquare", + 0x3314, + "kiyeokacirclekorean", + 0x326e, + "kiyeokaparenkorean", + 0x320e, + "kiyeokcirclekorean", + 0x3260, + "kiyeokkorean", + 0x3131, + "kiyeokparenkorean", + 0x3200, + "kiyeoksioskorean", + 0x3133, + "kjecyrillic", + 0x045c, + "klinebelow", + 0x1e35, + "klsquare", + 0x3398, + "kmcubedsquare", + 0x33a6, + "kmonospace", + 0xff4b, + "kmsquaredsquare", + 0x33a2, + "kohiragana", + 0x3053, + "kohmsquare", + 0x33c0, + "kokaithai", + 0x0e01, + "kokatakana", + 0x30b3, + "kokatakanahalfwidth", + 0xff7a, + "kooposquare", + 0x331e, + "koppacyrillic", + 0x0481, + "koreanstandardsymbol", + 0x327f, + "koroniscmb", + 0x0343, + "kparen", + 0x24a6, + "kpasquare", + 0x33aa, + "ksicyrillic", + 0x046f, + "ktsquare", + 0x33cf, + "kturned", + 0x029e, + "kuhiragana", + 0x304f, + "kukatakana", + 0x30af, + "kukatakanahalfwidth", + 0xff78, + "kvsquare", + 0x33b8, + "kwsquare", + 0x33be, + "l", + 0x006c, + "labengali", + 0x09b2, + "lacute", + 0x013a, + "ladeva", + 0x0932, + "lagujarati", + 0x0ab2, + "lagurmukhi", + 0x0a32, + "lakkhangyaothai", + 0x0e45, + "lamaleffinalarabic", + 0xfefc, + "lamalefhamzaabovefinalarabic", + 0xfef8, + "lamalefhamzaaboveisolatedarabic", + 0xfef7, + "lamalefhamzabelowfinalarabic", + 0xfefa, + "lamalefhamzabelowisolatedarabic", + 0xfef9, + "lamalefisolatedarabic", + 0xfefb, + "lamalefmaddaabovefinalarabic", + 0xfef6, + "lamalefmaddaaboveisolatedarabic", + 0xfef5, + "lamarabic", + 0x0644, + "lambda", + 0x03bb, + "lambdastroke", + 0x019b, + "lamed", + 0x05dc, + "lameddagesh", + 0xfb3c, + "lameddageshhebrew", + 0xfb3c, + "lamedhebrew", + 0x05dc, + "lamfinalarabic", + 0xfede, + "lamhahinitialarabic", + 0xfcca, + "laminitialarabic", + 0xfedf, + "lamjeeminitialarabic", + 0xfcc9, + "lamkhahinitialarabic", + 0xfccb, + "lamlamhehisolatedarabic", + 0xfdf2, + "lammedialarabic", + 0xfee0, + "lammeemhahinitialarabic", + 0xfd88, + "lammeeminitialarabic", + 0xfccc, + "largecircle", + 0x25ef, + "lbar", + 0x019a, + "lbelt", + 0x026c, + "lbopomofo", + 0x310c, + "lcaron", + 0x013e, + "lcedilla", + 0x013c, + "lcircle", + 0x24db, + "lcircumflexbelow", + 0x1e3d, + "lcommaaccent", + 0x013c, + "ldot", + 0x0140, + "ldotaccent", + 0x0140, + "ldotbelow", + 0x1e37, + "ldotbelowmacron", + 0x1e39, + "leftangleabovecmb", + 0x031a, + "lefttackbelowcmb", + 0x0318, + "less", + 0x003c, + "lessequal", + 0x2264, + "lessequalorgreater", + 0x22da, + "lessmonospace", + 0xff1c, + "lessorequivalent", + 0x2272, + "lessorgreater", + 0x2276, + "lessoverequal", + 0x2266, + "lesssmall", + 0xfe64, + "lezh", + 0x026e, + "lfblock", + 0x258c, + "lhookretroflex", + 0x026d, + "lira", + 0x20a4, + "liwnarmenian", + 0x056c, + "lj", + 0x01c9, + "ljecyrillic", + 0x0459, + "ll", + 0xf6c0, + "lladeva", + 0x0933, + "llagujarati", + 0x0ab3, + "llinebelow", + 0x1e3b, + "llladeva", + 0x0934, + "llvocalicbengali", + 0x09e1, + "llvocalicdeva", + 0x0961, + "llvocalicvowelsignbengali", + 0x09e3, + "llvocalicvowelsigndeva", + 0x0963, + "lmiddletilde", + 0x026b, + "lmonospace", + 0xff4c, + "lmsquare", + 0x33d0, + "lochulathai", + 0x0e2c, + "logicaland", + 0x2227, + "logicalnot", + 0x00ac, + "logicalnotreversed", + 0x2310, + "logicalor", + 0x2228, + "lolingthai", + 0x0e25, + "longs", + 0x017f, + "lowlinecenterline", + 0xfe4e, + "lowlinecmb", + 0x0332, + "lowlinedashed", + 0xfe4d, + "lozenge", + 0x25ca, + "lparen", + 0x24a7, + "lslash", + 0x0142, + "lsquare", + 0x2113, + "lsuperior", + 0xf6ee, + "ltshade", + 0x2591, + "luthai", + 0x0e26, + "lvocalicbengali", + 0x098c, + "lvocalicdeva", + 0x090c, + "lvocalicvowelsignbengali", + 0x09e2, + "lvocalicvowelsigndeva", + 0x0962, + "lxsquare", + 0x33d3, + "m", + 0x006d, + "mabengali", + 0x09ae, + "macron", + 0x00af, + "macronbelowcmb", + 0x0331, + "macroncmb", + 0x0304, + "macronlowmod", + 0x02cd, + "macronmonospace", + 0xffe3, + "macute", + 0x1e3f, + "madeva", + 0x092e, + "magujarati", + 0x0aae, + "magurmukhi", + 0x0a2e, + "mahapakhhebrew", + 0x05a4, + "mahapakhlefthebrew", + 0x05a4, + "mahiragana", + 0x307e, + "maichattawalowleftthai", + 0xf895, + "maichattawalowrightthai", + 0xf894, + "maichattawathai", + 0x0e4b, + "maichattawaupperleftthai", + 0xf893, + "maieklowleftthai", + 0xf88c, + "maieklowrightthai", + 0xf88b, + "maiekthai", + 0x0e48, + "maiekupperleftthai", + 0xf88a, + "maihanakatleftthai", + 0xf884, + "maihanakatthai", + 0x0e31, + "maitaikhuleftthai", + 0xf889, + "maitaikhuthai", + 0x0e47, + "maitholowleftthai", + 0xf88f, + "maitholowrightthai", + 0xf88e, + "maithothai", + 0x0e49, + "maithoupperleftthai", + 0xf88d, + "maitrilowleftthai", + 0xf892, + "maitrilowrightthai", + 0xf891, + "maitrithai", + 0x0e4a, + "maitriupperleftthai", + 0xf890, + "maiyamokthai", + 0x0e46, + "makatakana", + 0x30de, + "makatakanahalfwidth", + 0xff8f, + "male", + 0x2642, + "mansyonsquare", + 0x3347, + "maqafhebrew", + 0x05be, + "mars", + 0x2642, + "masoracirclehebrew", + 0x05af, + "masquare", + 0x3383, + "mbopomofo", + 0x3107, + "mbsquare", + 0x33d4, + "mcircle", + 0x24dc, + "mcubedsquare", + 0x33a5, + "mdotaccent", + 0x1e41, + "mdotbelow", + 0x1e43, + "meemarabic", + 0x0645, + "meemfinalarabic", + 0xfee2, + "meeminitialarabic", + 0xfee3, + "meemmedialarabic", + 0xfee4, + "meemmeeminitialarabic", + 0xfcd1, + "meemmeemisolatedarabic", + 0xfc48, + "meetorusquare", + 0x334d, + "mehiragana", + 0x3081, + "meizierasquare", + 0x337e, + "mekatakana", + 0x30e1, + "mekatakanahalfwidth", + 0xff92, + "mem", + 0x05de, + "memdagesh", + 0xfb3e, + "memdageshhebrew", + 0xfb3e, + "memhebrew", + 0x05de, + "menarmenian", + 0x0574, + "merkhahebrew", + 0x05a5, + "merkhakefulahebrew", + 0x05a6, + "merkhakefulalefthebrew", + 0x05a6, + "merkhalefthebrew", + 0x05a5, + "mhook", + 0x0271, + "mhzsquare", + 0x3392, + "middledotkatakanahalfwidth", + 0xff65, + "middot", + 0x00b7, + "mieumacirclekorean", + 0x3272, + "mieumaparenkorean", + 0x3212, + "mieumcirclekorean", + 0x3264, + "mieumkorean", + 0x3141, + "mieumpansioskorean", + 0x3170, + "mieumparenkorean", + 0x3204, + "mieumpieupkorean", + 0x316e, + "mieumsioskorean", + 0x316f, + "mihiragana", + 0x307f, + "mikatakana", + 0x30df, + "mikatakanahalfwidth", + 0xff90, + "minus", + 0x2212, + "minusbelowcmb", + 0x0320, + "minuscircle", + 0x2296, + "minusmod", + 0x02d7, + "minusplus", + 0x2213, + "minute", + 0x2032, + "miribaarusquare", + 0x334a, + "mirisquare", + 0x3349, + "mlonglegturned", + 0x0270, + "mlsquare", + 0x3396, + "mmcubedsquare", + 0x33a3, + "mmonospace", + 0xff4d, + "mmsquaredsquare", + 0x339f, + "mohiragana", + 0x3082, + "mohmsquare", + 0x33c1, + "mokatakana", + 0x30e2, + "mokatakanahalfwidth", + 0xff93, + "molsquare", + 0x33d6, + "momathai", + 0x0e21, + "moverssquare", + 0x33a7, + "moverssquaredsquare", + 0x33a8, + "mparen", + 0x24a8, + "mpasquare", + 0x33ab, + "mssquare", + 0x33b3, + "msuperior", + 0xf6ef, + "mturned", + 0x026f, + "mu", + 0x00b5, + "mu1", + 0x00b5, + "muasquare", + 0x3382, + "muchgreater", + 0x226b, + "muchless", + 0x226a, + "mufsquare", + 0x338c, + "mugreek", + 0x03bc, + "mugsquare", + 0x338d, + "muhiragana", + 0x3080, + "mukatakana", + 0x30e0, + "mukatakanahalfwidth", + 0xff91, + "mulsquare", + 0x3395, + "multiply", + 0x00d7, + "mumsquare", + 0x339b, + "munahhebrew", + 0x05a3, + "munahlefthebrew", + 0x05a3, + "musicalnote", + 0x266a, + "musicalnotedbl", + 0x266b, + "musicflatsign", + 0x266d, + "musicsharpsign", + 0x266f, + "mussquare", + 0x33b2, + "muvsquare", + 0x33b6, + "muwsquare", + 0x33bc, + "mvmegasquare", + 0x33b9, + "mvsquare", + 0x33b7, + "mwmegasquare", + 0x33bf, + "mwsquare", + 0x33bd, + "n", + 0x006e, + "nabengali", + 0x09a8, + "nabla", + 0x2207, + "nacute", + 0x0144, + "nadeva", + 0x0928, + "nagujarati", + 0x0aa8, + "nagurmukhi", + 0x0a28, + "nahiragana", + 0x306a, + "nakatakana", + 0x30ca, + "nakatakanahalfwidth", + 0xff85, + "napostrophe", + 0x0149, + "nasquare", + 0x3381, + "nbopomofo", + 0x310b, + "nbspace", + 0x00a0, + "ncaron", + 0x0148, + "ncedilla", + 0x0146, + "ncircle", + 0x24dd, + "ncircumflexbelow", + 0x1e4b, + "ncommaaccent", + 0x0146, + "ndotaccent", + 0x1e45, + "ndotbelow", + 0x1e47, + "nehiragana", + 0x306d, + "nekatakana", + 0x30cd, + "nekatakanahalfwidth", + 0xff88, + "newsheqelsign", + 0x20aa, + "nfsquare", + 0x338b, + "ngabengali", + 0x0999, + "ngadeva", + 0x0919, + "ngagujarati", + 0x0a99, + "ngagurmukhi", + 0x0a19, + "ngonguthai", + 0x0e07, + "nhiragana", + 0x3093, + "nhookleft", + 0x0272, + "nhookretroflex", + 0x0273, + "nieunacirclekorean", + 0x326f, + "nieunaparenkorean", + 0x320f, + "nieuncieuckorean", + 0x3135, + "nieuncirclekorean", + 0x3261, + "nieunhieuhkorean", + 0x3136, + "nieunkorean", + 0x3134, + "nieunpansioskorean", + 0x3168, + "nieunparenkorean", + 0x3201, + "nieunsioskorean", + 0x3167, + "nieuntikeutkorean", + 0x3166, + "nihiragana", + 0x306b, + "nikatakana", + 0x30cb, + "nikatakanahalfwidth", + 0xff86, + "nikhahitleftthai", + 0xf899, + "nikhahitthai", + 0x0e4d, + "nine", + 0x0039, + "ninearabic", + 0x0669, + "ninebengali", + 0x09ef, + "ninecircle", + 0x2468, + "ninecircleinversesansserif", + 0x2792, + "ninedeva", + 0x096f, + "ninegujarati", + 0x0aef, + "ninegurmukhi", + 0x0a6f, + "ninehackarabic", + 0x0669, + "ninehangzhou", + 0x3029, + "nineideographicparen", + 0x3228, + "nineinferior", + 0x2089, + "ninemonospace", + 0xff19, + "nineoldstyle", + 0xf739, + "nineparen", + 0x247c, + "nineperiod", + 0x2490, + "ninepersian", + 0x06f9, + "nineroman", + 0x2178, + "ninesuperior", + 0x2079, + "nineteencircle", + 0x2472, + "nineteenparen", + 0x2486, + "nineteenperiod", + 0x249a, + "ninethai", + 0x0e59, + "nj", + 0x01cc, + "njecyrillic", + 0x045a, + "nkatakana", + 0x30f3, + "nkatakanahalfwidth", + 0xff9d, + "nlegrightlong", + 0x019e, + "nlinebelow", + 0x1e49, + "nmonospace", + 0xff4e, + "nmsquare", + 0x339a, + "nnabengali", + 0x09a3, + "nnadeva", + 0x0923, + "nnagujarati", + 0x0aa3, + "nnagurmukhi", + 0x0a23, + "nnnadeva", + 0x0929, + "nohiragana", + 0x306e, + "nokatakana", + 0x30ce, + "nokatakanahalfwidth", + 0xff89, + "nonbreakingspace", + 0x00a0, + "nonenthai", + 0x0e13, + "nonuthai", + 0x0e19, + "noonarabic", + 0x0646, + "noonfinalarabic", + 0xfee6, + "noonghunnaarabic", + 0x06ba, + "noonghunnafinalarabic", + 0xfb9f, + "nooninitialarabic", + 0xfee7, + "noonjeeminitialarabic", + 0xfcd2, + "noonjeemisolatedarabic", + 0xfc4b, + "noonmedialarabic", + 0xfee8, + "noonmeeminitialarabic", + 0xfcd5, + "noonmeemisolatedarabic", + 0xfc4e, + "noonnoonfinalarabic", + 0xfc8d, + "notcontains", + 0x220c, + "notelement", + 0x2209, + "notelementof", + 0x2209, + "notequal", + 0x2260, + "notgreater", + 0x226f, + "notgreaternorequal", + 0x2271, + "notgreaternorless", + 0x2279, + "notidentical", + 0x2262, + "notless", + 0x226e, + "notlessnorequal", + 0x2270, + "notparallel", + 0x2226, + "notprecedes", + 0x2280, + "notsubset", + 0x2284, + "notsucceeds", + 0x2281, + "notsuperset", + 0x2285, + "nowarmenian", + 0x0576, + "nparen", + 0x24a9, + "nssquare", + 0x33b1, + "nsuperior", + 0x207f, + "ntilde", + 0x00f1, + "nu", + 0x03bd, + "nuhiragana", + 0x306c, + "nukatakana", + 0x30cc, + "nukatakanahalfwidth", + 0xff87, + "nuktabengali", + 0x09bc, + "nuktadeva", + 0x093c, + "nuktagujarati", + 0x0abc, + "nuktagurmukhi", + 0x0a3c, + "numbersign", + 0x0023, + "numbersignmonospace", + 0xff03, + "numbersignsmall", + 0xfe5f, + "numeralsigngreek", + 0x0374, + "numeralsignlowergreek", + 0x0375, + "numero", + 0x2116, + "nun", + 0x05e0, + "nundagesh", + 0xfb40, + "nundageshhebrew", + 0xfb40, + "nunhebrew", + 0x05e0, + "nvsquare", + 0x33b5, + "nwsquare", + 0x33bb, + "nyabengali", + 0x099e, + "nyadeva", + 0x091e, + "nyagujarati", + 0x0a9e, + "nyagurmukhi", + 0x0a1e, + "o", + 0x006f, + "oacute", + 0x00f3, + "oangthai", + 0x0e2d, + "obarred", + 0x0275, + "obarredcyrillic", + 0x04e9, + "obarreddieresiscyrillic", + 0x04eb, + "obengali", + 0x0993, + "obopomofo", + 0x311b, + "obreve", + 0x014f, + "ocandradeva", + 0x0911, + "ocandragujarati", + 0x0a91, + "ocandravowelsigndeva", + 0x0949, + "ocandravowelsigngujarati", + 0x0ac9, + "ocaron", + 0x01d2, + "ocircle", + 0x24de, + "ocircumflex", + 0x00f4, + "ocircumflexacute", + 0x1ed1, + "ocircumflexdotbelow", + 0x1ed9, + "ocircumflexgrave", + 0x1ed3, + "ocircumflexhookabove", + 0x1ed5, + "ocircumflextilde", + 0x1ed7, + "ocyrillic", + 0x043e, + "odblacute", + 0x0151, + "odblgrave", + 0x020d, + "odeva", + 0x0913, + "odieresis", + 0x00f6, + "odieresiscyrillic", + 0x04e7, + "odotbelow", + 0x1ecd, + "oe", + 0x0153, + "oekorean", + 0x315a, + "ogonek", + 0x02db, + "ogonekcmb", + 0x0328, + "ograve", + 0x00f2, + "ogujarati", + 0x0a93, + "oharmenian", + 0x0585, + "ohiragana", + 0x304a, + "ohookabove", + 0x1ecf, + "ohorn", + 0x01a1, + "ohornacute", + 0x1edb, + "ohorndotbelow", + 0x1ee3, + "ohorngrave", + 0x1edd, + "ohornhookabove", + 0x1edf, + "ohorntilde", + 0x1ee1, + "ohungarumlaut", + 0x0151, + "oi", + 0x01a3, + "oinvertedbreve", + 0x020f, + "okatakana", + 0x30aa, + "okatakanahalfwidth", + 0xff75, + "okorean", + 0x3157, + "olehebrew", + 0x05ab, + "omacron", + 0x014d, + "omacronacute", + 0x1e53, + "omacrongrave", + 0x1e51, + "omdeva", + 0x0950, + "omega", + 0x03c9, + "omega1", + 0x03d6, + "omegacyrillic", + 0x0461, + "omegalatinclosed", + 0x0277, + "omegaroundcyrillic", + 0x047b, + "omegatitlocyrillic", + 0x047d, + "omegatonos", + 0x03ce, + "omgujarati", + 0x0ad0, + "omicron", + 0x03bf, + "omicrontonos", + 0x03cc, + "omonospace", + 0xff4f, + "one", + 0x0031, + "onearabic", + 0x0661, + "onebengali", + 0x09e7, + "onecircle", + 0x2460, + "onecircleinversesansserif", + 0x278a, + "onedeva", + 0x0967, + "onedotenleader", + 0x2024, + "oneeighth", + 0x215b, + "onefitted", + 0xf6dc, + "onegujarati", + 0x0ae7, + "onegurmukhi", + 0x0a67, + "onehackarabic", + 0x0661, + "onehalf", + 0x00bd, + "onehangzhou", + 0x3021, + "oneideographicparen", + 0x3220, + "oneinferior", + 0x2081, + "onemonospace", + 0xff11, + "onenumeratorbengali", + 0x09f4, + "oneoldstyle", + 0xf731, + "oneparen", + 0x2474, + "oneperiod", + 0x2488, + "onepersian", + 0x06f1, + "onequarter", + 0x00bc, + "oneroman", + 0x2170, + "onesuperior", + 0x00b9, + "onethai", + 0x0e51, + "onethird", + 0x2153, + "oogonek", + 0x01eb, + "oogonekmacron", + 0x01ed, + "oogurmukhi", + 0x0a13, + "oomatragurmukhi", + 0x0a4b, + "oopen", + 0x0254, + "oparen", + 0x24aa, + "openbullet", + 0x25e6, + "option", + 0x2325, + "ordfeminine", + 0x00aa, + "ordmasculine", + 0x00ba, + "orthogonal", + 0x221f, + "oshortdeva", + 0x0912, + "oshortvowelsigndeva", + 0x094a, + "oslash", + 0x00f8, + "oslashacute", + 0x01ff, + "osmallhiragana", + 0x3049, + "osmallkatakana", + 0x30a9, + "osmallkatakanahalfwidth", + 0xff6b, + "ostrokeacute", + 0x01ff, + "osuperior", + 0xf6f0, + "otcyrillic", + 0x047f, + "otilde", + 0x00f5, + "otildeacute", + 0x1e4d, + "otildedieresis", + 0x1e4f, + "oubopomofo", + 0x3121, + "overline", + 0x203e, + "overlinecenterline", + 0xfe4a, + "overlinecmb", + 0x0305, + "overlinedashed", + 0xfe49, + "overlinedblwavy", + 0xfe4c, + "overlinewavy", + 0xfe4b, + "overscore", + 0x00af, + "ovowelsignbengali", + 0x09cb, + "ovowelsigndeva", + 0x094b, + "ovowelsigngujarati", + 0x0acb, + "p", + 0x0070, + "paampssquare", + 0x3380, + "paasentosquare", + 0x332b, + "pabengali", + 0x09aa, + "pacute", + 0x1e55, + "padeva", + 0x092a, + "pagedown", + 0x21df, + "pageup", + 0x21de, + "pagujarati", + 0x0aaa, + "pagurmukhi", + 0x0a2a, + "pahiragana", + 0x3071, + "paiyannoithai", + 0x0e2f, + "pakatakana", + 0x30d1, + "palatalizationcyrilliccmb", + 0x0484, + "palochkacyrillic", + 0x04c0, + "pansioskorean", + 0x317f, + "paragraph", + 0x00b6, + "parallel", + 0x2225, + "parenleft", + 0x0028, + "parenleftaltonearabic", + 0xfd3e, + "parenleftbt", + 0xf8ed, + "parenleftex", + 0xf8ec, + "parenleftinferior", + 0x208d, + "parenleftmonospace", + 0xff08, + "parenleftsmall", + 0xfe59, + "parenleftsuperior", + 0x207d, + "parenlefttp", + 0xf8eb, + "parenleftvertical", + 0xfe35, + "parenright", + 0x0029, + "parenrightaltonearabic", + 0xfd3f, + "parenrightbt", + 0xf8f8, + "parenrightex", + 0xf8f7, + "parenrightinferior", + 0x208e, + "parenrightmonospace", + 0xff09, + "parenrightsmall", + 0xfe5a, + "parenrightsuperior", + 0x207e, + "parenrighttp", + 0xf8f6, + "parenrightvertical", + 0xfe36, + "partialdiff", + 0x2202, + "paseqhebrew", + 0x05c0, + "pashtahebrew", + 0x0599, + "pasquare", + 0x33a9, + "patah", + 0x05b7, + "patah11", + 0x05b7, + "patah1d", + 0x05b7, + "patah2a", + 0x05b7, + "patahhebrew", + 0x05b7, + "patahnarrowhebrew", + 0x05b7, + "patahquarterhebrew", + 0x05b7, + "patahwidehebrew", + 0x05b7, + "pazerhebrew", + 0x05a1, + "pbopomofo", + 0x3106, + "pcircle", + 0x24df, + "pdotaccent", + 0x1e57, + "pe", + 0x05e4, + "pecyrillic", + 0x043f, + "pedagesh", + 0xfb44, + "pedageshhebrew", + 0xfb44, + "peezisquare", + 0x333b, + "pefinaldageshhebrew", + 0xfb43, + "peharabic", + 0x067e, + "peharmenian", + 0x057a, + "pehebrew", + 0x05e4, + "pehfinalarabic", + 0xfb57, + "pehinitialarabic", + 0xfb58, + "pehiragana", + 0x307a, + "pehmedialarabic", + 0xfb59, + "pekatakana", + 0x30da, + "pemiddlehookcyrillic", + 0x04a7, + "perafehebrew", + 0xfb4e, + "percent", + 0x0025, + "percentarabic", + 0x066a, + "percentmonospace", + 0xff05, + "percentsmall", + 0xfe6a, + "period", + 0x002e, + "periodarmenian", + 0x0589, + "periodcentered", + 0x00b7, + "periodhalfwidth", + 0xff61, + "periodinferior", + 0xf6e7, + "periodmonospace", + 0xff0e, + "periodsmall", + 0xfe52, + "periodsuperior", + 0xf6e8, + "perispomenigreekcmb", + 0x0342, + "perpendicular", + 0x22a5, + "perthousand", + 0x2030, + "peseta", + 0x20a7, + "pfsquare", + 0x338a, + "phabengali", + 0x09ab, + "phadeva", + 0x092b, + "phagujarati", + 0x0aab, + "phagurmukhi", + 0x0a2b, + "phi", + 0x03c6, + "phi1", + 0x03d5, + "phieuphacirclekorean", + 0x327a, + "phieuphaparenkorean", + 0x321a, + "phieuphcirclekorean", + 0x326c, + "phieuphkorean", + 0x314d, + "phieuphparenkorean", + 0x320c, + "philatin", + 0x0278, + "phinthuthai", + 0x0e3a, + "phisymbolgreek", + 0x03d5, + "phook", + 0x01a5, + "phophanthai", + 0x0e1e, + "phophungthai", + 0x0e1c, + "phosamphaothai", + 0x0e20, + "pi", + 0x03c0, + "pieupacirclekorean", + 0x3273, + "pieupaparenkorean", + 0x3213, + "pieupcieuckorean", + 0x3176, + "pieupcirclekorean", + 0x3265, + "pieupkiyeokkorean", + 0x3172, + "pieupkorean", + 0x3142, + "pieupparenkorean", + 0x3205, + "pieupsioskiyeokkorean", + 0x3174, + "pieupsioskorean", + 0x3144, + "pieupsiostikeutkorean", + 0x3175, + "pieupthieuthkorean", + 0x3177, + "pieuptikeutkorean", + 0x3173, + "pihiragana", + 0x3074, + "pikatakana", + 0x30d4, + "pisymbolgreek", + 0x03d6, + "piwrarmenian", + 0x0583, + "plus", + 0x002b, + "plusbelowcmb", + 0x031f, + "pluscircle", + 0x2295, + "plusminus", + 0x00b1, + "plusmod", + 0x02d6, + "plusmonospace", + 0xff0b, + "plussmall", + 0xfe62, + "plussuperior", + 0x207a, + "pmonospace", + 0xff50, + "pmsquare", + 0x33d8, + "pohiragana", + 0x307d, + "pointingindexdownwhite", + 0x261f, + "pointingindexleftwhite", + 0x261c, + "pointingindexrightwhite", + 0x261e, + "pointingindexupwhite", + 0x261d, + "pokatakana", + 0x30dd, + "poplathai", + 0x0e1b, + "postalmark", + 0x3012, + "postalmarkface", + 0x3020, + "pparen", + 0x24ab, + "precedes", + 0x227a, + "prescription", + 0x211e, + "primemod", + 0x02b9, + "primereversed", + 0x2035, + "product", + 0x220f, + "projective", + 0x2305, + "prolongedkana", + 0x30fc, + "propellor", + 0x2318, + "propersubset", + 0x2282, + "propersuperset", + 0x2283, + "proportion", + 0x2237, + "proportional", + 0x221d, + "psi", + 0x03c8, + "psicyrillic", + 0x0471, + "psilipneumatacyrilliccmb", + 0x0486, + "pssquare", + 0x33b0, + "puhiragana", + 0x3077, + "pukatakana", + 0x30d7, + "pvsquare", + 0x33b4, + "pwsquare", + 0x33ba, + "q", + 0x0071, + "qadeva", + 0x0958, + "qadmahebrew", + 0x05a8, + "qafarabic", + 0x0642, + "qaffinalarabic", + 0xfed6, + "qafinitialarabic", + 0xfed7, + "qafmedialarabic", + 0xfed8, + "qamats", + 0x05b8, + "qamats10", + 0x05b8, + "qamats1a", + 0x05b8, + "qamats1c", + 0x05b8, + "qamats27", + 0x05b8, + "qamats29", + 0x05b8, + "qamats33", + 0x05b8, + "qamatsde", + 0x05b8, + "qamatshebrew", + 0x05b8, + "qamatsnarrowhebrew", + 0x05b8, + "qamatsqatanhebrew", + 0x05b8, + "qamatsqatannarrowhebrew", + 0x05b8, + "qamatsqatanquarterhebrew", + 0x05b8, + "qamatsqatanwidehebrew", + 0x05b8, + "qamatsquarterhebrew", + 0x05b8, + "qamatswidehebrew", + 0x05b8, + "qarneyparahebrew", + 0x059f, + "qbopomofo", + 0x3111, + "qcircle", + 0x24e0, + "qhook", + 0x02a0, + "qmonospace", + 0xff51, + "qof", + 0x05e7, + "qofdagesh", + 0xfb47, + "qofdageshhebrew", + 0xfb47, + "qofhebrew", + 0x05e7, + "qparen", + 0x24ac, + "quarternote", + 0x2669, + "qubuts", + 0x05bb, + "qubuts18", + 0x05bb, + "qubuts25", + 0x05bb, + "qubuts31", + 0x05bb, + "qubutshebrew", + 0x05bb, + "qubutsnarrowhebrew", + 0x05bb, + "qubutsquarterhebrew", + 0x05bb, + "qubutswidehebrew", + 0x05bb, + "question", + 0x003f, + "questionarabic", + 0x061f, + "questionarmenian", + 0x055e, + "questiondown", + 0x00bf, + "questiondownsmall", + 0xf7bf, + "questiongreek", + 0x037e, + "questionmonospace", + 0xff1f, + "questionsmall", + 0xf73f, + "quotedbl", + 0x0022, + "quotedblbase", + 0x201e, + "quotedblleft", + 0x201c, + "quotedblmonospace", + 0xff02, + "quotedblprime", + 0x301e, + "quotedblprimereversed", + 0x301d, + "quotedblright", + 0x201d, + "quoteleft", + 0x2018, + "quoteleftreversed", + 0x201b, + "quotereversed", + 0x201b, + "quoteright", + 0x2019, + "quoterightn", + 0x0149, + "quotesinglbase", + 0x201a, + "quotesingle", + 0x0027, + "quotesinglemonospace", + 0xff07, + "r", + 0x0072, + "raarmenian", + 0x057c, + "rabengali", + 0x09b0, + "racute", + 0x0155, + "radeva", + 0x0930, + "radical", + 0x221a, + "radicalex", + 0xf8e5, + "radoverssquare", + 0x33ae, + "radoverssquaredsquare", + 0x33af, + "radsquare", + 0x33ad, + "rafe", + 0x05bf, + "rafehebrew", + 0x05bf, + "ragujarati", + 0x0ab0, + "ragurmukhi", + 0x0a30, + "rahiragana", + 0x3089, + "rakatakana", + 0x30e9, + "rakatakanahalfwidth", + 0xff97, + "ralowerdiagonalbengali", + 0x09f1, + "ramiddlediagonalbengali", + 0x09f0, + "ramshorn", + 0x0264, + "ratio", + 0x2236, + "rbopomofo", + 0x3116, + "rcaron", + 0x0159, + "rcedilla", + 0x0157, + "rcircle", + 0x24e1, + "rcommaaccent", + 0x0157, + "rdblgrave", + 0x0211, + "rdotaccent", + 0x1e59, + "rdotbelow", + 0x1e5b, + "rdotbelowmacron", + 0x1e5d, + "referencemark", + 0x203b, + "reflexsubset", + 0x2286, + "reflexsuperset", + 0x2287, + "registered", + 0x00ae, + "registersans", + 0xf8e8, + "registerserif", + 0xf6da, + "reharabic", + 0x0631, + "reharmenian", + 0x0580, + "rehfinalarabic", + 0xfeae, + "rehiragana", + 0x308c, + "rekatakana", + 0x30ec, + "rekatakanahalfwidth", + 0xff9a, + "resh", + 0x05e8, + "reshdageshhebrew", + 0xfb48, + "reshhebrew", + 0x05e8, + "reversedtilde", + 0x223d, + "reviahebrew", + 0x0597, + "reviamugrashhebrew", + 0x0597, + "revlogicalnot", + 0x2310, + "rfishhook", + 0x027e, + "rfishhookreversed", + 0x027f, + "rhabengali", + 0x09dd, + "rhadeva", + 0x095d, + "rho", + 0x03c1, + "rhook", + 0x027d, + "rhookturned", + 0x027b, + "rhookturnedsuperior", + 0x02b5, + "rhosymbolgreek", + 0x03f1, + "rhotichookmod", + 0x02de, + "rieulacirclekorean", + 0x3271, + "rieulaparenkorean", + 0x3211, + "rieulcirclekorean", + 0x3263, + "rieulhieuhkorean", + 0x3140, + "rieulkiyeokkorean", + 0x313a, + "rieulkiyeoksioskorean", + 0x3169, + "rieulkorean", + 0x3139, + "rieulmieumkorean", + 0x313b, + "rieulpansioskorean", + 0x316c, + "rieulparenkorean", + 0x3203, + "rieulphieuphkorean", + 0x313f, + "rieulpieupkorean", + 0x313c, + "rieulpieupsioskorean", + 0x316b, + "rieulsioskorean", + 0x313d, + "rieulthieuthkorean", + 0x313e, + "rieultikeutkorean", + 0x316a, + "rieulyeorinhieuhkorean", + 0x316d, + "rightangle", + 0x221f, + "righttackbelowcmb", + 0x0319, + "righttriangle", + 0x22bf, + "rihiragana", + 0x308a, + "rikatakana", + 0x30ea, + "rikatakanahalfwidth", + 0xff98, + "ring", + 0x02da, + "ringbelowcmb", + 0x0325, + "ringcmb", + 0x030a, + "ringhalfleft", + 0x02bf, + "ringhalfleftarmenian", + 0x0559, + "ringhalfleftbelowcmb", + 0x031c, + "ringhalfleftcentered", + 0x02d3, + "ringhalfright", + 0x02be, + "ringhalfrightbelowcmb", + 0x0339, + "ringhalfrightcentered", + 0x02d2, + "rinvertedbreve", + 0x0213, + "rittorusquare", + 0x3351, + "rlinebelow", + 0x1e5f, + "rlongleg", + 0x027c, + "rlonglegturned", + 0x027a, + "rmonospace", + 0xff52, + "rohiragana", + 0x308d, + "rokatakana", + 0x30ed, + "rokatakanahalfwidth", + 0xff9b, + "roruathai", + 0x0e23, + "rparen", + 0x24ad, + "rrabengali", + 0x09dc, + "rradeva", + 0x0931, + "rragurmukhi", + 0x0a5c, + "rreharabic", + 0x0691, + "rrehfinalarabic", + 0xfb8d, + "rrvocalicbengali", + 0x09e0, + "rrvocalicdeva", + 0x0960, + "rrvocalicgujarati", + 0x0ae0, + "rrvocalicvowelsignbengali", + 0x09c4, + "rrvocalicvowelsigndeva", + 0x0944, + "rrvocalicvowelsigngujarati", + 0x0ac4, + "rsuperior", + 0xf6f1, + "rtblock", + 0x2590, + "rturned", + 0x0279, + "rturnedsuperior", + 0x02b4, + "ruhiragana", + 0x308b, + "rukatakana", + 0x30eb, + "rukatakanahalfwidth", + 0xff99, + "rupeemarkbengali", + 0x09f2, + "rupeesignbengali", + 0x09f3, + "rupiah", + 0xf6dd, + "ruthai", + 0x0e24, + "rvocalicbengali", + 0x098b, + "rvocalicdeva", + 0x090b, + "rvocalicgujarati", + 0x0a8b, + "rvocalicvowelsignbengali", + 0x09c3, + "rvocalicvowelsigndeva", + 0x0943, + "rvocalicvowelsigngujarati", + 0x0ac3, + "s", + 0x0073, + "sabengali", + 0x09b8, + "sacute", + 0x015b, + "sacutedotaccent", + 0x1e65, + "sadarabic", + 0x0635, + "sadeva", + 0x0938, + "sadfinalarabic", + 0xfeba, + "sadinitialarabic", + 0xfebb, + "sadmedialarabic", + 0xfebc, + "sagujarati", + 0x0ab8, + "sagurmukhi", + 0x0a38, + "sahiragana", + 0x3055, + "sakatakana", + 0x30b5, + "sakatakanahalfwidth", + 0xff7b, + "sallallahoualayhewasallamarabic", + 0xfdfa, + "samekh", + 0x05e1, + "samekhdagesh", + 0xfb41, + "samekhdageshhebrew", + 0xfb41, + "samekhhebrew", + 0x05e1, + "saraaathai", + 0x0e32, + "saraaethai", + 0x0e41, + "saraaimaimalaithai", + 0x0e44, + "saraaimaimuanthai", + 0x0e43, + "saraamthai", + 0x0e33, + "saraathai", + 0x0e30, + "saraethai", + 0x0e40, + "saraiileftthai", + 0xf886, + "saraiithai", + 0x0e35, + "saraileftthai", + 0xf885, + "saraithai", + 0x0e34, + "saraothai", + 0x0e42, + "saraueeleftthai", + 0xf888, + "saraueethai", + 0x0e37, + "saraueleftthai", + 0xf887, + "sarauethai", + 0x0e36, + "sarauthai", + 0x0e38, + "sarauuthai", + 0x0e39, + "sbopomofo", + 0x3119, + "scaron", + 0x0161, + "scarondotaccent", + 0x1e67, + "scedilla", + 0x015f, + "schwa", + 0x0259, + "schwacyrillic", + 0x04d9, + "schwadieresiscyrillic", + 0x04db, + "schwahook", + 0x025a, + "scircle", + 0x24e2, + "scircumflex", + 0x015d, + "scommaaccent", + 0x0219, + "sdotaccent", + 0x1e61, + "sdotbelow", + 0x1e63, + "sdotbelowdotaccent", + 0x1e69, + "seagullbelowcmb", + 0x033c, + "second", + 0x2033, + "secondtonechinese", + 0x02ca, + "section", + 0x00a7, + "seenarabic", + 0x0633, + "seenfinalarabic", + 0xfeb2, + "seeninitialarabic", + 0xfeb3, + "seenmedialarabic", + 0xfeb4, + "segol", + 0x05b6, + "segol13", + 0x05b6, + "segol1f", + 0x05b6, + "segol2c", + 0x05b6, + "segolhebrew", + 0x05b6, + "segolnarrowhebrew", + 0x05b6, + "segolquarterhebrew", + 0x05b6, + "segoltahebrew", + 0x0592, + "segolwidehebrew", + 0x05b6, + "seharmenian", + 0x057d, + "sehiragana", + 0x305b, + "sekatakana", + 0x30bb, + "sekatakanahalfwidth", + 0xff7e, + "semicolon", + 0x003b, + "semicolonarabic", + 0x061b, + "semicolonmonospace", + 0xff1b, + "semicolonsmall", + 0xfe54, + "semivoicedmarkkana", + 0x309c, + "semivoicedmarkkanahalfwidth", + 0xff9f, + "sentisquare", + 0x3322, + "sentosquare", + 0x3323, + "seven", + 0x0037, + "sevenarabic", + 0x0667, + "sevenbengali", + 0x09ed, + "sevencircle", + 0x2466, + "sevencircleinversesansserif", + 0x2790, + "sevendeva", + 0x096d, + "seveneighths", + 0x215e, + "sevengujarati", + 0x0aed, + "sevengurmukhi", + 0x0a6d, + "sevenhackarabic", + 0x0667, + "sevenhangzhou", + 0x3027, + "sevenideographicparen", + 0x3226, + "seveninferior", + 0x2087, + "sevenmonospace", + 0xff17, + "sevenoldstyle", + 0xf737, + "sevenparen", + 0x247a, + "sevenperiod", + 0x248e, + "sevenpersian", + 0x06f7, + "sevenroman", + 0x2176, + "sevensuperior", + 0x2077, + "seventeencircle", + 0x2470, + "seventeenparen", + 0x2484, + "seventeenperiod", + 0x2498, + "seventhai", + 0x0e57, + "sfthyphen", + 0x00ad, + "shaarmenian", + 0x0577, + "shabengali", + 0x09b6, + "shacyrillic", + 0x0448, + "shaddaarabic", + 0x0651, + "shaddadammaarabic", + 0xfc61, + "shaddadammatanarabic", + 0xfc5e, + "shaddafathaarabic", + 0xfc60, + "shaddakasraarabic", + 0xfc62, + "shaddakasratanarabic", + 0xfc5f, + "shade", + 0x2592, + "shadedark", + 0x2593, + "shadelight", + 0x2591, + "shademedium", + 0x2592, + "shadeva", + 0x0936, + "shagujarati", + 0x0ab6, + "shagurmukhi", + 0x0a36, + "shalshelethebrew", + 0x0593, + "shbopomofo", + 0x3115, + "shchacyrillic", + 0x0449, + "sheenarabic", + 0x0634, + "sheenfinalarabic", + 0xfeb6, + "sheeninitialarabic", + 0xfeb7, + "sheenmedialarabic", + 0xfeb8, + "sheicoptic", + 0x03e3, + "sheqel", + 0x20aa, + "sheqelhebrew", + 0x20aa, + "sheva", + 0x05b0, + "sheva115", + 0x05b0, + "sheva15", + 0x05b0, + "sheva22", + 0x05b0, + "sheva2e", + 0x05b0, + "shevahebrew", + 0x05b0, + "shevanarrowhebrew", + 0x05b0, + "shevaquarterhebrew", + 0x05b0, + "shevawidehebrew", + 0x05b0, + "shhacyrillic", + 0x04bb, + "shimacoptic", + 0x03ed, + "shin", + 0x05e9, + "shindagesh", + 0xfb49, + "shindageshhebrew", + 0xfb49, + "shindageshshindot", + 0xfb2c, + "shindageshshindothebrew", + 0xfb2c, + "shindageshsindot", + 0xfb2d, + "shindageshsindothebrew", + 0xfb2d, + "shindothebrew", + 0x05c1, + "shinhebrew", + 0x05e9, + "shinshindot", + 0xfb2a, + "shinshindothebrew", + 0xfb2a, + "shinsindot", + 0xfb2b, + "shinsindothebrew", + 0xfb2b, + "shook", + 0x0282, + "sigma", + 0x03c3, + "sigma1", + 0x03c2, + "sigmafinal", + 0x03c2, + "sigmalunatesymbolgreek", + 0x03f2, + "sihiragana", + 0x3057, + "sikatakana", + 0x30b7, + "sikatakanahalfwidth", + 0xff7c, + "siluqhebrew", + 0x05bd, + "siluqlefthebrew", + 0x05bd, + "similar", + 0x223c, + "sindothebrew", + 0x05c2, + "siosacirclekorean", + 0x3274, + "siosaparenkorean", + 0x3214, + "sioscieuckorean", + 0x317e, + "sioscirclekorean", + 0x3266, + "sioskiyeokkorean", + 0x317a, + "sioskorean", + 0x3145, + "siosnieunkorean", + 0x317b, + "siosparenkorean", + 0x3206, + "siospieupkorean", + 0x317d, + "siostikeutkorean", + 0x317c, + "six", + 0x0036, + "sixarabic", + 0x0666, + "sixbengali", + 0x09ec, + "sixcircle", + 0x2465, + "sixcircleinversesansserif", + 0x278f, + "sixdeva", + 0x096c, + "sixgujarati", + 0x0aec, + "sixgurmukhi", + 0x0a6c, + "sixhackarabic", + 0x0666, + "sixhangzhou", + 0x3026, + "sixideographicparen", + 0x3225, + "sixinferior", + 0x2086, + "sixmonospace", + 0xff16, + "sixoldstyle", + 0xf736, + "sixparen", + 0x2479, + "sixperiod", + 0x248d, + "sixpersian", + 0x06f6, + "sixroman", + 0x2175, + "sixsuperior", + 0x2076, + "sixteencircle", + 0x246f, + "sixteencurrencydenominatorbengali", + 0x09f9, + "sixteenparen", + 0x2483, + "sixteenperiod", + 0x2497, + "sixthai", + 0x0e56, + "slash", + 0x002f, + "slashmonospace", + 0xff0f, + "slong", + 0x017f, + "slongdotaccent", + 0x1e9b, + "smileface", + 0x263a, + "smonospace", + 0xff53, + "sofpasuqhebrew", + 0x05c3, + "softhyphen", + 0x00ad, + "softsigncyrillic", + 0x044c, + "sohiragana", + 0x305d, + "sokatakana", + 0x30bd, + "sokatakanahalfwidth", + 0xff7f, + "soliduslongoverlaycmb", + 0x0338, + "solidusshortoverlaycmb", + 0x0337, + "sorusithai", + 0x0e29, + "sosalathai", + 0x0e28, + "sosothai", + 0x0e0b, + "sosuathai", + 0x0e2a, + "space", + 0x0020, + "spacehackarabic", + 0x0020, + "spade", + 0x2660, + "spadesuitblack", + 0x2660, + "spadesuitwhite", + 0x2664, + "sparen", + 0x24ae, + "squarebelowcmb", + 0x033b, + "squarecc", + 0x33c4, + "squarecm", + 0x339d, + "squarediagonalcrosshatchfill", + 0x25a9, + "squarehorizontalfill", + 0x25a4, + "squarekg", + 0x338f, + "squarekm", + 0x339e, + "squarekmcapital", + 0x33ce, + "squareln", + 0x33d1, + "squarelog", + 0x33d2, + "squaremg", + 0x338e, + "squaremil", + 0x33d5, + "squaremm", + 0x339c, + "squaremsquared", + 0x33a1, + "squareorthogonalcrosshatchfill", + 0x25a6, + "squareupperlefttolowerrightfill", + 0x25a7, + "squareupperrighttolowerleftfill", + 0x25a8, + "squareverticalfill", + 0x25a5, + "squarewhitewithsmallblack", + 0x25a3, + "srsquare", + 0x33db, + "ssabengali", + 0x09b7, + "ssadeva", + 0x0937, + "ssagujarati", + 0x0ab7, + "ssangcieuckorean", + 0x3149, + "ssanghieuhkorean", + 0x3185, + "ssangieungkorean", + 0x3180, + "ssangkiyeokkorean", + 0x3132, + "ssangnieunkorean", + 0x3165, + "ssangpieupkorean", + 0x3143, + "ssangsioskorean", + 0x3146, + "ssangtikeutkorean", + 0x3138, + "ssuperior", + 0xf6f2, + "sterling", + 0x00a3, + "sterlingmonospace", + 0xffe1, + "strokelongoverlaycmb", + 0x0336, + "strokeshortoverlaycmb", + 0x0335, + "subset", + 0x2282, + "subsetnotequal", + 0x228a, + "subsetorequal", + 0x2286, + "succeeds", + 0x227b, + "suchthat", + 0x220b, + "suhiragana", + 0x3059, + "sukatakana", + 0x30b9, + "sukatakanahalfwidth", + 0xff7d, + "sukunarabic", + 0x0652, + "summation", + 0x2211, + "sun", + 0x263c, + "superset", + 0x2283, + "supersetnotequal", + 0x228b, + "supersetorequal", + 0x2287, + "svsquare", + 0x33dc, + "syouwaerasquare", + 0x337c, + "t", + 0x0074, + "tabengali", + 0x09a4, + "tackdown", + 0x22a4, + "tackleft", + 0x22a3, + "tadeva", + 0x0924, + "tagujarati", + 0x0aa4, + "tagurmukhi", + 0x0a24, + "taharabic", + 0x0637, + "tahfinalarabic", + 0xfec2, + "tahinitialarabic", + 0xfec3, + "tahiragana", + 0x305f, + "tahmedialarabic", + 0xfec4, + "taisyouerasquare", + 0x337d, + "takatakana", + 0x30bf, + "takatakanahalfwidth", + 0xff80, + "tatweelarabic", + 0x0640, + "tau", + 0x03c4, + "tav", + 0x05ea, + "tavdages", + 0xfb4a, + "tavdagesh", + 0xfb4a, + "tavdageshhebrew", + 0xfb4a, + "tavhebrew", + 0x05ea, + "tbar", + 0x0167, + "tbopomofo", + 0x310a, + "tcaron", + 0x0165, + "tccurl", + 0x02a8, + "tcedilla", + 0x0163, + "tcheharabic", + 0x0686, + "tchehfinalarabic", + 0xfb7b, + "tchehinitialarabic", + 0xfb7c, + "tchehmedialarabic", + 0xfb7d, + "tcircle", + 0x24e3, + "tcircumflexbelow", + 0x1e71, + "tcommaaccent", + 0x0163, + "tdieresis", + 0x1e97, + "tdotaccent", + 0x1e6b, + "tdotbelow", + 0x1e6d, + "tecyrillic", + 0x0442, + "tedescendercyrillic", + 0x04ad, + "teharabic", + 0x062a, + "tehfinalarabic", + 0xfe96, + "tehhahinitialarabic", + 0xfca2, + "tehhahisolatedarabic", + 0xfc0c, + "tehinitialarabic", + 0xfe97, + "tehiragana", + 0x3066, + "tehjeeminitialarabic", + 0xfca1, + "tehjeemisolatedarabic", + 0xfc0b, + "tehmarbutaarabic", + 0x0629, + "tehmarbutafinalarabic", + 0xfe94, + "tehmedialarabic", + 0xfe98, + "tehmeeminitialarabic", + 0xfca4, + "tehmeemisolatedarabic", + 0xfc0e, + "tehnoonfinalarabic", + 0xfc73, + "tekatakana", + 0x30c6, + "tekatakanahalfwidth", + 0xff83, + "telephone", + 0x2121, + "telephoneblack", + 0x260e, + "telishagedolahebrew", + 0x05a0, + "telishaqetanahebrew", + 0x05a9, + "tencircle", + 0x2469, + "tenideographicparen", + 0x3229, + "tenparen", + 0x247d, + "tenperiod", + 0x2491, + "tenroman", + 0x2179, + "tesh", + 0x02a7, + "tet", + 0x05d8, + "tetdagesh", + 0xfb38, + "tetdageshhebrew", + 0xfb38, + "tethebrew", + 0x05d8, + "tetsecyrillic", + 0x04b5, + "tevirhebrew", + 0x059b, + "tevirlefthebrew", + 0x059b, + "thabengali", + 0x09a5, + "thadeva", + 0x0925, + "thagujarati", + 0x0aa5, + "thagurmukhi", + 0x0a25, + "thalarabic", + 0x0630, + "thalfinalarabic", + 0xfeac, + "thanthakhatlowleftthai", + 0xf898, + "thanthakhatlowrightthai", + 0xf897, + "thanthakhatthai", + 0x0e4c, + "thanthakhatupperleftthai", + 0xf896, + "theharabic", + 0x062b, + "thehfinalarabic", + 0xfe9a, + "thehinitialarabic", + 0xfe9b, + "thehmedialarabic", + 0xfe9c, + "thereexists", + 0x2203, + "therefore", + 0x2234, + "theta", + 0x03b8, + "theta1", + 0x03d1, + "thetasymbolgreek", + 0x03d1, + "thieuthacirclekorean", + 0x3279, + "thieuthaparenkorean", + 0x3219, + "thieuthcirclekorean", + 0x326b, + "thieuthkorean", + 0x314c, + "thieuthparenkorean", + 0x320b, + "thirteencircle", + 0x246c, + "thirteenparen", + 0x2480, + "thirteenperiod", + 0x2494, + "thonangmonthothai", + 0x0e11, + "thook", + 0x01ad, + "thophuthaothai", + 0x0e12, + "thorn", + 0x00fe, + "thothahanthai", + 0x0e17, + "thothanthai", + 0x0e10, + "thothongthai", + 0x0e18, + "thothungthai", + 0x0e16, + "thousandcyrillic", + 0x0482, + "thousandsseparatorarabic", + 0x066c, + "thousandsseparatorpersian", + 0x066c, + "three", + 0x0033, + "threearabic", + 0x0663, + "threebengali", + 0x09e9, + "threecircle", + 0x2462, + "threecircleinversesansserif", + 0x278c, + "threedeva", + 0x0969, + "threeeighths", + 0x215c, + "threegujarati", + 0x0ae9, + "threegurmukhi", + 0x0a69, + "threehackarabic", + 0x0663, + "threehangzhou", + 0x3023, + "threeideographicparen", + 0x3222, + "threeinferior", + 0x2083, + "threemonospace", + 0xff13, + "threenumeratorbengali", + 0x09f6, + "threeoldstyle", + 0xf733, + "threeparen", + 0x2476, + "threeperiod", + 0x248a, + "threepersian", + 0x06f3, + "threequarters", + 0x00be, + "threequartersemdash", + 0xf6de, + "threeroman", + 0x2172, + "threesuperior", + 0x00b3, + "threethai", + 0x0e53, + "thzsquare", + 0x3394, + "tihiragana", + 0x3061, + "tikatakana", + 0x30c1, + "tikatakanahalfwidth", + 0xff81, + "tikeutacirclekorean", + 0x3270, + "tikeutaparenkorean", + 0x3210, + "tikeutcirclekorean", + 0x3262, + "tikeutkorean", + 0x3137, + "tikeutparenkorean", + 0x3202, + "tilde", + 0x02dc, + "tildebelowcmb", + 0x0330, + "tildecmb", + 0x0303, + "tildecomb", + 0x0303, + "tildedoublecmb", + 0x0360, + "tildeoperator", + 0x223c, + "tildeoverlaycmb", + 0x0334, + "tildeverticalcmb", + 0x033e, + "timescircle", + 0x2297, + "tipehahebrew", + 0x0596, + "tipehalefthebrew", + 0x0596, + "tippigurmukhi", + 0x0a70, + "titlocyrilliccmb", + 0x0483, + "tiwnarmenian", + 0x057f, + "tlinebelow", + 0x1e6f, + "tmonospace", + 0xff54, + "toarmenian", + 0x0569, + "tohiragana", + 0x3068, + "tokatakana", + 0x30c8, + "tokatakanahalfwidth", + 0xff84, + "tonebarextrahighmod", + 0x02e5, + "tonebarextralowmod", + 0x02e9, + "tonebarhighmod", + 0x02e6, + "tonebarlowmod", + 0x02e8, + "tonebarmidmod", + 0x02e7, + "tonefive", + 0x01bd, + "tonesix", + 0x0185, + "tonetwo", + 0x01a8, + "tonos", + 0x0384, + "tonsquare", + 0x3327, + "topatakthai", + 0x0e0f, + "tortoiseshellbracketleft", + 0x3014, + "tortoiseshellbracketleftsmall", + 0xfe5d, + "tortoiseshellbracketleftvertical", + 0xfe39, + "tortoiseshellbracketright", + 0x3015, + "tortoiseshellbracketrightsmall", + 0xfe5e, + "tortoiseshellbracketrightvertical", + 0xfe3a, + "totaothai", + 0x0e15, + "tpalatalhook", + 0x01ab, + "tparen", + 0x24af, + "trademark", + 0x2122, + "trademarksans", + 0xf8ea, + "trademarkserif", + 0xf6db, + "tretroflexhook", + 0x0288, + "triagdn", + 0x25bc, + "triaglf", + 0x25c4, + "triagrt", + 0x25ba, + "triagup", + 0x25b2, + "ts", + 0x02a6, + "tsadi", + 0x05e6, + "tsadidagesh", + 0xfb46, + "tsadidageshhebrew", + 0xfb46, + "tsadihebrew", + 0x05e6, + "tsecyrillic", + 0x0446, + "tsere", + 0x05b5, + "tsere12", + 0x05b5, + "tsere1e", + 0x05b5, + "tsere2b", + 0x05b5, + "tserehebrew", + 0x05b5, + "tserenarrowhebrew", + 0x05b5, + "tserequarterhebrew", + 0x05b5, + "tserewidehebrew", + 0x05b5, + "tshecyrillic", + 0x045b, + "tsuperior", + 0xf6f3, + "ttabengali", + 0x099f, + "ttadeva", + 0x091f, + "ttagujarati", + 0x0a9f, + "ttagurmukhi", + 0x0a1f, + "tteharabic", + 0x0679, + "ttehfinalarabic", + 0xfb67, + "ttehinitialarabic", + 0xfb68, + "ttehmedialarabic", + 0xfb69, + "tthabengali", + 0x09a0, + "tthadeva", + 0x0920, + "tthagujarati", + 0x0aa0, + "tthagurmukhi", + 0x0a20, + "tturned", + 0x0287, + "tuhiragana", + 0x3064, + "tukatakana", + 0x30c4, + "tukatakanahalfwidth", + 0xff82, + "tusmallhiragana", + 0x3063, + "tusmallkatakana", + 0x30c3, + "tusmallkatakanahalfwidth", + 0xff6f, + "twelvecircle", + 0x246b, + "twelveparen", + 0x247f, + "twelveperiod", + 0x2493, + "twelveroman", + 0x217b, + "twentycircle", + 0x2473, + "twentyhangzhou", + 0x5344, + "twentyparen", + 0x2487, + "twentyperiod", + 0x249b, + "two", + 0x0032, + "twoarabic", + 0x0662, + "twobengali", + 0x09e8, + "twocircle", + 0x2461, + "twocircleinversesansserif", + 0x278b, + "twodeva", + 0x0968, + "twodotenleader", + 0x2025, + "twodotleader", + 0x2025, + "twodotleadervertical", + 0xfe30, + "twogujarati", + 0x0ae8, + "twogurmukhi", + 0x0a68, + "twohackarabic", + 0x0662, + "twohangzhou", + 0x3022, + "twoideographicparen", + 0x3221, + "twoinferior", + 0x2082, + "twomonospace", + 0xff12, + "twonumeratorbengali", + 0x09f5, + "twooldstyle", + 0xf732, + "twoparen", + 0x2475, + "twoperiod", + 0x2489, + "twopersian", + 0x06f2, + "tworoman", + 0x2171, + "twostroke", + 0x01bb, + "twosuperior", + 0x00b2, + "twothai", + 0x0e52, + "twothirds", + 0x2154, + "u", + 0x0075, + "uacute", + 0x00fa, + "ubar", + 0x0289, + "ubengali", + 0x0989, + "ubopomofo", + 0x3128, + "ubreve", + 0x016d, + "ucaron", + 0x01d4, + "ucircle", + 0x24e4, + "ucircumflex", + 0x00fb, + "ucircumflexbelow", + 0x1e77, + "ucyrillic", + 0x0443, + "udattadeva", + 0x0951, + "udblacute", + 0x0171, + "udblgrave", + 0x0215, + "udeva", + 0x0909, + "udieresis", + 0x00fc, + "udieresisacute", + 0x01d8, + "udieresisbelow", + 0x1e73, + "udieresiscaron", + 0x01da, + "udieresiscyrillic", + 0x04f1, + "udieresisgrave", + 0x01dc, + "udieresismacron", + 0x01d6, + "udotbelow", + 0x1ee5, + "ugrave", + 0x00f9, + "ugujarati", + 0x0a89, + "ugurmukhi", + 0x0a09, + "uhiragana", + 0x3046, + "uhookabove", + 0x1ee7, + "uhorn", + 0x01b0, + "uhornacute", + 0x1ee9, + "uhorndotbelow", + 0x1ef1, + "uhorngrave", + 0x1eeb, + "uhornhookabove", + 0x1eed, + "uhorntilde", + 0x1eef, + "uhungarumlaut", + 0x0171, + "uhungarumlautcyrillic", + 0x04f3, + "uinvertedbreve", + 0x0217, + "ukatakana", + 0x30a6, + "ukatakanahalfwidth", + 0xff73, + "ukcyrillic", + 0x0479, + "ukorean", + 0x315c, + "umacron", + 0x016b, + "umacroncyrillic", + 0x04ef, + "umacrondieresis", + 0x1e7b, + "umatragurmukhi", + 0x0a41, + "umonospace", + 0xff55, + "underscore", + 0x005f, + "underscoredbl", + 0x2017, + "underscoremonospace", + 0xff3f, + "underscorevertical", + 0xfe33, + "underscorewavy", + 0xfe4f, + "union", + 0x222a, + "universal", + 0x2200, + "uogonek", + 0x0173, + "uparen", + 0x24b0, + "upblock", + 0x2580, + "upperdothebrew", + 0x05c4, + "upsilon", + 0x03c5, + "upsilondieresis", + 0x03cb, + "upsilondieresistonos", + 0x03b0, + "upsilonlatin", + 0x028a, + "upsilontonos", + 0x03cd, + "uptackbelowcmb", + 0x031d, + "uptackmod", + 0x02d4, + "uragurmukhi", + 0x0a73, + "uring", + 0x016f, + "ushortcyrillic", + 0x045e, + "usmallhiragana", + 0x3045, + "usmallkatakana", + 0x30a5, + "usmallkatakanahalfwidth", + 0xff69, + "ustraightcyrillic", + 0x04af, + "ustraightstrokecyrillic", + 0x04b1, + "utilde", + 0x0169, + "utildeacute", + 0x1e79, + "utildebelow", + 0x1e75, + "uubengali", + 0x098a, + "uudeva", + 0x090a, + "uugujarati", + 0x0a8a, + "uugurmukhi", + 0x0a0a, + "uumatragurmukhi", + 0x0a42, + "uuvowelsignbengali", + 0x09c2, + "uuvowelsigndeva", + 0x0942, + "uuvowelsigngujarati", + 0x0ac2, + "uvowelsignbengali", + 0x09c1, + "uvowelsigndeva", + 0x0941, + "uvowelsigngujarati", + 0x0ac1, + "v", + 0x0076, + "vadeva", + 0x0935, + "vagujarati", + 0x0ab5, + "vagurmukhi", + 0x0a35, + "vakatakana", + 0x30f7, + "vav", + 0x05d5, + "vavdagesh", + 0xfb35, + "vavdagesh65", + 0xfb35, + "vavdageshhebrew", + 0xfb35, + "vavhebrew", + 0x05d5, + "vavholam", + 0xfb4b, + "vavholamhebrew", + 0xfb4b, + "vavvavhebrew", + 0x05f0, + "vavyodhebrew", + 0x05f1, + "vcircle", + 0x24e5, + "vdotbelow", + 0x1e7f, + "vecyrillic", + 0x0432, + "veharabic", + 0x06a4, + "vehfinalarabic", + 0xfb6b, + "vehinitialarabic", + 0xfb6c, + "vehmedialarabic", + 0xfb6d, + "vekatakana", + 0x30f9, + "venus", + 0x2640, + "verticalbar", + 0x007c, + "verticallineabovecmb", + 0x030d, + "verticallinebelowcmb", + 0x0329, + "verticallinelowmod", + 0x02cc, + "verticallinemod", + 0x02c8, + "vewarmenian", + 0x057e, + "vhook", + 0x028b, + "vikatakana", + 0x30f8, + "viramabengali", + 0x09cd, + "viramadeva", + 0x094d, + "viramagujarati", + 0x0acd, + "visargabengali", + 0x0983, + "visargadeva", + 0x0903, + "visargagujarati", + 0x0a83, + "vmonospace", + 0xff56, + "voarmenian", + 0x0578, + "voicediterationhiragana", + 0x309e, + "voicediterationkatakana", + 0x30fe, + "voicedmarkkana", + 0x309b, + "voicedmarkkanahalfwidth", + 0xff9e, + "vokatakana", + 0x30fa, + "vparen", + 0x24b1, + "vtilde", + 0x1e7d, + "vturned", + 0x028c, + "vuhiragana", + 0x3094, + "vukatakana", + 0x30f4, + "w", + 0x0077, + "wacute", + 0x1e83, + "waekorean", + 0x3159, + "wahiragana", + 0x308f, + "wakatakana", + 0x30ef, + "wakatakanahalfwidth", + 0xff9c, + "wakorean", + 0x3158, + "wasmallhiragana", + 0x308e, + "wasmallkatakana", + 0x30ee, + "wattosquare", + 0x3357, + "wavedash", + 0x301c, + "wavyunderscorevertical", + 0xfe34, + "wawarabic", + 0x0648, + "wawfinalarabic", + 0xfeee, + "wawhamzaabovearabic", + 0x0624, + "wawhamzaabovefinalarabic", + 0xfe86, + "wbsquare", + 0x33dd, + "wcircle", + 0x24e6, + "wcircumflex", + 0x0175, + "wdieresis", + 0x1e85, + "wdotaccent", + 0x1e87, + "wdotbelow", + 0x1e89, + "wehiragana", + 0x3091, + "weierstrass", + 0x2118, + "wekatakana", + 0x30f1, + "wekorean", + 0x315e, + "weokorean", + 0x315d, + "wgrave", + 0x1e81, + "whitebullet", + 0x25e6, + "whitecircle", + 0x25cb, + "whitecircleinverse", + 0x25d9, + "whitecornerbracketleft", + 0x300e, + "whitecornerbracketleftvertical", + 0xfe43, + "whitecornerbracketright", + 0x300f, + "whitecornerbracketrightvertical", + 0xfe44, + "whitediamond", + 0x25c7, + "whitediamondcontainingblacksmalldiamond", + 0x25c8, + "whitedownpointingsmalltriangle", + 0x25bf, + "whitedownpointingtriangle", + 0x25bd, + "whiteleftpointingsmalltriangle", + 0x25c3, + "whiteleftpointingtriangle", + 0x25c1, + "whitelenticularbracketleft", + 0x3016, + "whitelenticularbracketright", + 0x3017, + "whiterightpointingsmalltriangle", + 0x25b9, + "whiterightpointingtriangle", + 0x25b7, + "whitesmallsquare", + 0x25ab, + "whitesmilingface", + 0x263a, + "whitesquare", + 0x25a1, + "whitestar", + 0x2606, + "whitetelephone", + 0x260f, + "whitetortoiseshellbracketleft", + 0x3018, + "whitetortoiseshellbracketright", + 0x3019, + "whiteuppointingsmalltriangle", + 0x25b5, + "whiteuppointingtriangle", + 0x25b3, + "wihiragana", + 0x3090, + "wikatakana", + 0x30f0, + "wikorean", + 0x315f, + "wmonospace", + 0xff57, + "wohiragana", + 0x3092, + "wokatakana", + 0x30f2, + "wokatakanahalfwidth", + 0xff66, + "won", + 0x20a9, + "wonmonospace", + 0xffe6, + "wowaenthai", + 0x0e27, + "wparen", + 0x24b2, + "wring", + 0x1e98, + "wsuperior", + 0x02b7, + "wturned", + 0x028d, + "wynn", + 0x01bf, + "x", + 0x0078, + "xabovecmb", + 0x033d, + "xbopomofo", + 0x3112, + "xcircle", + 0x24e7, + "xdieresis", + 0x1e8d, + "xdotaccent", + 0x1e8b, + "xeharmenian", + 0x056d, + "xi", + 0x03be, + "xmonospace", + 0xff58, + "xparen", + 0x24b3, + "xsuperior", + 0x02e3, + "y", + 0x0079, + "yaadosquare", + 0x334e, + "yabengali", + 0x09af, + "yacute", + 0x00fd, + "yadeva", + 0x092f, + "yaekorean", + 0x3152, + "yagujarati", + 0x0aaf, + "yagurmukhi", + 0x0a2f, + "yahiragana", + 0x3084, + "yakatakana", + 0x30e4, + "yakatakanahalfwidth", + 0xff94, + "yakorean", + 0x3151, + "yamakkanthai", + 0x0e4e, + "yasmallhiragana", + 0x3083, + "yasmallkatakana", + 0x30e3, + "yasmallkatakanahalfwidth", + 0xff6c, + "yatcyrillic", + 0x0463, + "ycircle", + 0x24e8, + "ycircumflex", + 0x0177, + "ydieresis", + 0x00ff, + "ydotaccent", + 0x1e8f, + "ydotbelow", + 0x1ef5, + "yeharabic", + 0x064a, + "yehbarreearabic", + 0x06d2, + "yehbarreefinalarabic", + 0xfbaf, + "yehfinalarabic", + 0xfef2, + "yehhamzaabovearabic", + 0x0626, + "yehhamzaabovefinalarabic", + 0xfe8a, + "yehhamzaaboveinitialarabic", + 0xfe8b, + "yehhamzaabovemedialarabic", + 0xfe8c, + "yehinitialarabic", + 0xfef3, + "yehmedialarabic", + 0xfef4, + "yehmeeminitialarabic", + 0xfcdd, + "yehmeemisolatedarabic", + 0xfc58, + "yehnoonfinalarabic", + 0xfc94, + "yehthreedotsbelowarabic", + 0x06d1, + "yekorean", + 0x3156, + "yen", + 0x00a5, + "yenmonospace", + 0xffe5, + "yeokorean", + 0x3155, + "yeorinhieuhkorean", + 0x3186, + "yerahbenyomohebrew", + 0x05aa, + "yerahbenyomolefthebrew", + 0x05aa, + "yericyrillic", + 0x044b, + "yerudieresiscyrillic", + 0x04f9, + "yesieungkorean", + 0x3181, + "yesieungpansioskorean", + 0x3183, + "yesieungsioskorean", + 0x3182, + "yetivhebrew", + 0x059a, + "ygrave", + 0x1ef3, + "yhook", + 0x01b4, + "yhookabove", + 0x1ef7, + "yiarmenian", + 0x0575, + "yicyrillic", + 0x0457, + "yikorean", + 0x3162, + "yinyang", + 0x262f, + "yiwnarmenian", + 0x0582, + "ymonospace", + 0xff59, + "yod", + 0x05d9, + "yoddagesh", + 0xfb39, + "yoddageshhebrew", + 0xfb39, + "yodhebrew", + 0x05d9, + "yodyodhebrew", + 0x05f2, + "yodyodpatahhebrew", + 0xfb1f, + "yohiragana", + 0x3088, + "yoikorean", + 0x3189, + "yokatakana", + 0x30e8, + "yokatakanahalfwidth", + 0xff96, + "yokorean", + 0x315b, + "yosmallhiragana", + 0x3087, + "yosmallkatakana", + 0x30e7, + "yosmallkatakanahalfwidth", + 0xff6e, + "yotgreek", + 0x03f3, + "yoyaekorean", + 0x3188, + "yoyakorean", + 0x3187, + "yoyakthai", + 0x0e22, + "yoyingthai", + 0x0e0d, + "yparen", + 0x24b4, + "ypogegrammeni", + 0x037a, + "ypogegrammenigreekcmb", + 0x0345, + "yr", + 0x01a6, + "yring", + 0x1e99, + "ysuperior", + 0x02b8, + "ytilde", + 0x1ef9, + "yturned", + 0x028e, + "yuhiragana", + 0x3086, + "yuikorean", + 0x318c, + "yukatakana", + 0x30e6, + "yukatakanahalfwidth", + 0xff95, + "yukorean", + 0x3160, + "yusbigcyrillic", + 0x046b, + "yusbigiotifiedcyrillic", + 0x046d, + "yuslittlecyrillic", + 0x0467, + "yuslittleiotifiedcyrillic", + 0x0469, + "yusmallhiragana", + 0x3085, + "yusmallkatakana", + 0x30e5, + "yusmallkatakanahalfwidth", + 0xff6d, + "yuyekorean", + 0x318b, + "yuyeokorean", + 0x318a, + "yyabengali", + 0x09df, + "yyadeva", + 0x095f, + "z", + 0x007a, + "zaarmenian", + 0x0566, + "zacute", + 0x017a, + "zadeva", + 0x095b, + "zagurmukhi", + 0x0a5b, + "zaharabic", + 0x0638, + "zahfinalarabic", + 0xfec6, + "zahinitialarabic", + 0xfec7, + "zahiragana", + 0x3056, + "zahmedialarabic", + 0xfec8, + "zainarabic", + 0x0632, + "zainfinalarabic", + 0xfeb0, + "zakatakana", + 0x30b6, + "zaqefgadolhebrew", + 0x0595, + "zaqefqatanhebrew", + 0x0594, + "zarqahebrew", + 0x0598, + "zayin", + 0x05d6, + "zayindagesh", + 0xfb36, + "zayindageshhebrew", + 0xfb36, + "zayinhebrew", + 0x05d6, + "zbopomofo", + 0x3117, + "zcaron", + 0x017e, + "zcircle", + 0x24e9, + "zcircumflex", + 0x1e91, + "zcurl", + 0x0291, + "zdot", + 0x017c, + "zdotaccent", + 0x017c, + "zdotbelow", + 0x1e93, + "zecyrillic", + 0x0437, + "zedescendercyrillic", + 0x0499, + "zedieresiscyrillic", + 0x04df, + "zehiragana", + 0x305c, + "zekatakana", + 0x30bc, + "zero", + 0x0030, + "zeroarabic", + 0x0660, + "zerobengali", + 0x09e6, + "zerodeva", + 0x0966, + "zerogujarati", + 0x0ae6, + "zerogurmukhi", + 0x0a66, + "zerohackarabic", + 0x0660, + "zeroinferior", + 0x2080, + "zeromonospace", + 0xff10, + "zerooldstyle", + 0xf730, + "zeropersian", + 0x06f0, + "zerosuperior", + 0x2070, + "zerothai", + 0x0e50, + "zerowidthjoiner", + 0xfeff, + "zerowidthnonjoiner", + 0x200c, + "zerowidthspace", + 0x200b, + "zeta", + 0x03b6, + "zhbopomofo", + 0x3113, + "zhearmenian", + 0x056a, + "zhebrevecyrillic", + 0x04c2, + "zhecyrillic", + 0x0436, + "zhedescendercyrillic", + 0x0497, + "zhedieresiscyrillic", + 0x04dd, + "zihiragana", + 0x3058, + "zikatakana", + 0x30b8, + "zinorhebrew", + 0x05ae, + "zlinebelow", + 0x1e95, + "zmonospace", + 0xff5a, + "zohiragana", + 0x305e, + "zokatakana", + 0x30be, + "zparen", + 0x24b5, + "zretroflexhook", + 0x0290, + "zstroke", + 0x01b6, + "zuhiragana", + 0x305a, + "zukatakana", + 0x30ba, + ".notdef", + 0x0000, + "angbracketleftbig", + 0x2329, + "angbracketleftBig", + 0x2329, + "angbracketleftbigg", + 0x2329, + "angbracketleftBigg", + 0x2329, + "angbracketrightBig", + 0x232a, + "angbracketrightbig", + 0x232a, + "angbracketrightBigg", + 0x232a, + "angbracketrightbigg", + 0x232a, + "arrowhookleft", + 0x21aa, + "arrowhookright", + 0x21a9, + "arrowlefttophalf", + 0x21bc, + "arrowleftbothalf", + 0x21bd, + "arrownortheast", + 0x2197, + "arrownorthwest", + 0x2196, + "arrowrighttophalf", + 0x21c0, + "arrowrightbothalf", + 0x21c1, + "arrowsoutheast", + 0x2198, + "arrowsouthwest", + 0x2199, + "backslashbig", + 0x2216, + "backslashBig", + 0x2216, + "backslashBigg", + 0x2216, + "backslashbigg", + 0x2216, + "bardbl", + 0x2016, + "bracehtipdownleft", + 0xfe37, + "bracehtipdownright", + 0xfe37, + "bracehtipupleft", + 0xfe38, + "bracehtipupright", + 0xfe38, + "braceleftBig", + 0x007b, + "braceleftbig", + 0x007b, + "braceleftbigg", + 0x007b, + "braceleftBigg", + 0x007b, + "bracerightBig", + 0x007d, + "bracerightbig", + 0x007d, + "bracerightbigg", + 0x007d, + "bracerightBigg", + 0x007d, + "bracketleftbig", + 0x005b, + "bracketleftBig", + 0x005b, + "bracketleftbigg", + 0x005b, + "bracketleftBigg", + 0x005b, + "bracketrightBig", + 0x005d, + "bracketrightbig", + 0x005d, + "bracketrightbigg", + 0x005d, + "bracketrightBigg", + 0x005d, + "ceilingleftbig", + 0x2308, + "ceilingleftBig", + 0x2308, + "ceilingleftBigg", + 0x2308, + "ceilingleftbigg", + 0x2308, + "ceilingrightbig", + 0x2309, + "ceilingrightBig", + 0x2309, + "ceilingrightbigg", + 0x2309, + "ceilingrightBigg", + 0x2309, + "circledotdisplay", + 0x2299, + "circledottext", + 0x2299, + "circlemultiplydisplay", + 0x2297, + "circlemultiplytext", + 0x2297, + "circleplusdisplay", + 0x2295, + "circleplustext", + 0x2295, + "contintegraldisplay", + 0x222e, + "contintegraltext", + 0x222e, + "coproductdisplay", + 0x2210, + "coproducttext", + 0x2210, + "floorleftBig", + 0x230a, + "floorleftbig", + 0x230a, + "floorleftbigg", + 0x230a, + "floorleftBigg", + 0x230a, + "floorrightbig", + 0x230b, + "floorrightBig", + 0x230b, + "floorrightBigg", + 0x230b, + "floorrightbigg", + 0x230b, + "hatwide", + 0x0302, + "hatwider", + 0x0302, + "hatwidest", + 0x0302, + "intercal", + 0x1d40, + "integraldisplay", + 0x222b, + "integraltext", + 0x222b, + "intersectiondisplay", + 0x22c2, + "intersectiontext", + 0x22c2, + "logicalanddisplay", + 0x2227, + "logicalandtext", + 0x2227, + "logicalordisplay", + 0x2228, + "logicalortext", + 0x2228, + "parenleftBig", + 0x0028, + "parenleftbig", + 0x0028, + "parenleftBigg", + 0x0028, + "parenleftbigg", + 0x0028, + "parenrightBig", + 0x0029, + "parenrightbig", + 0x0029, + "parenrightBigg", + 0x0029, + "parenrightbigg", + 0x0029, + "prime", + 0x2032, + "productdisplay", + 0x220f, + "producttext", + 0x220f, + "radicalbig", + 0x221a, + "radicalBig", + 0x221a, + "radicalBigg", + 0x221a, + "radicalbigg", + 0x221a, + "radicalbt", + 0x221a, + "radicaltp", + 0x221a, + "radicalvertex", + 0x221a, + "slashbig", + 0x002f, + "slashBig", + 0x002f, + "slashBigg", + 0x002f, + "slashbigg", + 0x002f, + "summationdisplay", + 0x2211, + "summationtext", + 0x2211, + "tildewide", + 0x02dc, + "tildewider", + 0x02dc, + "tildewidest", + 0x02dc, + "uniondisplay", + 0x22c3, + "unionmultidisplay", + 0x228e, + "unionmultitext", + 0x228e, + "unionsqdisplay", + 0x2294, + "unionsqtext", + 0x2294, + "uniontext", + 0x22c3, + "vextenddouble", + 0x2225, + "vextendsingle", + 0x2223 + ]; +}); +const getDingbatsGlyphsUnicode = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () { + return [ + "space", + 0x0020, + "a1", + 0x2701, + "a2", + 0x2702, + "a202", + 0x2703, + "a3", + 0x2704, + "a4", + 0x260e, + "a5", + 0x2706, + "a119", + 0x2707, + "a118", + 0x2708, + "a117", + 0x2709, + "a11", + 0x261b, + "a12", + 0x261e, + "a13", + 0x270c, + "a14", + 0x270d, + "a15", + 0x270e, + "a16", + 0x270f, + "a105", + 0x2710, + "a17", + 0x2711, + "a18", + 0x2712, + "a19", + 0x2713, + "a20", + 0x2714, + "a21", + 0x2715, + "a22", + 0x2716, + "a23", + 0x2717, + "a24", + 0x2718, + "a25", + 0x2719, + "a26", + 0x271a, + "a27", + 0x271b, + "a28", + 0x271c, + "a6", + 0x271d, + "a7", + 0x271e, + "a8", + 0x271f, + "a9", + 0x2720, + "a10", + 0x2721, + "a29", + 0x2722, + "a30", + 0x2723, + "a31", + 0x2724, + "a32", + 0x2725, + "a33", + 0x2726, + "a34", + 0x2727, + "a35", + 0x2605, + "a36", + 0x2729, + "a37", + 0x272a, + "a38", + 0x272b, + "a39", + 0x272c, + "a40", + 0x272d, + "a41", + 0x272e, + "a42", + 0x272f, + "a43", + 0x2730, + "a44", + 0x2731, + "a45", + 0x2732, + "a46", + 0x2733, + "a47", + 0x2734, + "a48", + 0x2735, + "a49", + 0x2736, + "a50", + 0x2737, + "a51", + 0x2738, + "a52", + 0x2739, + "a53", + 0x273a, + "a54", + 0x273b, + "a55", + 0x273c, + "a56", + 0x273d, + "a57", + 0x273e, + "a58", + 0x273f, + "a59", + 0x2740, + "a60", + 0x2741, + "a61", + 0x2742, + "a62", + 0x2743, + "a63", + 0x2744, + "a64", + 0x2745, + "a65", + 0x2746, + "a66", + 0x2747, + "a67", + 0x2748, + "a68", + 0x2749, + "a69", + 0x274a, + "a70", + 0x274b, + "a71", + 0x25cf, + "a72", + 0x274d, + "a73", + 0x25a0, + "a74", + 0x274f, + "a203", + 0x2750, + "a75", + 0x2751, + "a204", + 0x2752, + "a76", + 0x25b2, + "a77", + 0x25bc, + "a78", + 0x25c6, + "a79", + 0x2756, + "a81", + 0x25d7, + "a82", + 0x2758, + "a83", + 0x2759, + "a84", + 0x275a, + "a97", + 0x275b, + "a98", + 0x275c, + "a99", + 0x275d, + "a100", + 0x275e, + "a101", + 0x2761, + "a102", + 0x2762, + "a103", + 0x2763, + "a104", + 0x2764, + "a106", + 0x2765, + "a107", + 0x2766, + "a108", + 0x2767, + "a112", + 0x2663, + "a111", + 0x2666, + "a110", + 0x2665, + "a109", + 0x2660, + "a120", + 0x2460, + "a121", + 0x2461, + "a122", + 0x2462, + "a123", + 0x2463, + "a124", + 0x2464, + "a125", + 0x2465, + "a126", + 0x2466, + "a127", + 0x2467, + "a128", + 0x2468, + "a129", + 0x2469, + "a130", + 0x2776, + "a131", + 0x2777, + "a132", + 0x2778, + "a133", + 0x2779, + "a134", + 0x277a, + "a135", + 0x277b, + "a136", + 0x277c, + "a137", + 0x277d, + "a138", + 0x277e, + "a139", + 0x277f, + "a140", + 0x2780, + "a141", + 0x2781, + "a142", + 0x2782, + "a143", + 0x2783, + "a144", + 0x2784, + "a145", + 0x2785, + "a146", + 0x2786, + "a147", + 0x2787, + "a148", + 0x2788, + "a149", + 0x2789, + "a150", + 0x278a, + "a151", + 0x278b, + "a152", + 0x278c, + "a153", + 0x278d, + "a154", + 0x278e, + "a155", + 0x278f, + "a156", + 0x2790, + "a157", + 0x2791, + "a158", + 0x2792, + "a159", + 0x2793, + "a160", + 0x2794, + "a161", + 0x2192, + "a163", + 0x2194, + "a164", + 0x2195, + "a196", + 0x2798, + "a165", + 0x2799, + "a192", + 0x279a, + "a166", + 0x279b, + "a167", + 0x279c, + "a168", + 0x279d, + "a169", + 0x279e, + "a170", + 0x279f, + "a171", + 0x27a0, + "a172", + 0x27a1, + "a173", + 0x27a2, + "a162", + 0x27a3, + "a174", + 0x27a4, + "a175", + 0x27a5, + "a176", + 0x27a6, + "a177", + 0x27a7, + "a178", + 0x27a8, + "a179", + 0x27a9, + "a193", + 0x27aa, + "a180", + 0x27ab, + "a199", + 0x27ac, + "a181", + 0x27ad, + "a200", + 0x27ae, + "a182", + 0x27af, + "a201", + 0x27b1, + "a183", + 0x27b2, + "a184", + 0x27b3, + "a197", + 0x27b4, + "a185", + 0x27b5, + "a194", + 0x27b6, + "a198", + 0x27b7, + "a186", + 0x27b8, + "a195", + 0x27b9, + "a187", + 0x27ba, + "a188", + 0x27bb, + "a189", + 0x27bc, + "a190", + 0x27bd, + "a191", + 0x27be, + "a89", + 0x2768, + "a90", + 0x2769, + "a93", + 0x276a, + "a94", + 0x276b, + "a91", + 0x276c, + "a92", + 0x276d, + "a205", + 0x276e, + "a85", + 0x276f, + "a206", + 0x2770, + "a86", + 0x2771, + "a87", + 0x2772, + "a88", + 0x2773, + "a95", + 0x2774, + "a96", + 0x2775, + ".notdef", + 0x0000 + ]; +}); + + +/***/ }), +/* 169 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => { + +"use strict"; +__w_pdfjs_require__.r(__webpack_exports__); +/* harmony export */ __w_pdfjs_require__.d(__webpack_exports__, { +/* harmony export */ "clearUnicodeCaches": () => (/* binding */ clearUnicodeCaches), +/* harmony export */ "getCharUnicodeCategory": () => (/* binding */ getCharUnicodeCategory), +/* harmony export */ "getNormalizedUnicodes": () => (/* binding */ getNormalizedUnicodes), +/* harmony export */ "getUnicodeForGlyph": () => (/* binding */ getUnicodeForGlyph), +/* harmony export */ "getUnicodeRangeFor": () => (/* binding */ getUnicodeRangeFor), +/* harmony export */ "mapSpecialUnicodeValues": () => (/* binding */ mapSpecialUnicodeValues), +/* harmony export */ "reverseIfRtl": () => (/* binding */ reverseIfRtl) +/* harmony export */ }); +/* harmony import */ var _core_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __w_pdfjs_require__(135); + +const getSpecialPUASymbols = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getLookupTableFactory)(function (t) { + t[63721] = 0x00a9; + t[63193] = 0x00a9; + t[63720] = 0x00ae; + t[63194] = 0x00ae; + t[63722] = 0x2122; + t[63195] = 0x2122; + t[63729] = 0x23a7; + t[63730] = 0x23a8; + t[63731] = 0x23a9; + t[63740] = 0x23ab; + t[63741] = 0x23ac; + t[63742] = 0x23ad; + t[63726] = 0x23a1; + t[63727] = 0x23a2; + t[63728] = 0x23a3; + t[63737] = 0x23a4; + t[63738] = 0x23a5; + t[63739] = 0x23a6; + t[63723] = 0x239b; + t[63724] = 0x239c; + t[63725] = 0x239d; + t[63734] = 0x239e; + t[63735] = 0x239f; + t[63736] = 0x23a0; +}); +function mapSpecialUnicodeValues(code) { + if (code >= 0xfff0 && code <= 0xffff) { + return 0; + } else if (code >= 0xf600 && code <= 0xf8ff) { + return getSpecialPUASymbols()[code] || code; + } else if (code === 0x00ad) { + return 0x002d; + } + return code; +} +function getUnicodeForGlyph(name, glyphsUnicodeMap) { + let unicode = glyphsUnicodeMap[name]; + if (unicode !== undefined) { + return unicode; + } + if (!name) { + return -1; + } + if (name[0] === "u") { + const nameLen = name.length; + let hexStr; + if (nameLen === 7 && name[1] === "n" && name[2] === "i") { + hexStr = name.substring(3); + } else if (nameLen >= 5 && nameLen <= 7) { + hexStr = name.substring(1); + } else { + return -1; + } + if (hexStr === hexStr.toUpperCase()) { + unicode = parseInt(hexStr, 16); + if (unicode >= 0) { + return unicode; + } + } + } + return -1; +} +const UnicodeRanges = [ + { + begin: 0x0000, + end: 0x007f + }, + { + begin: 0x0080, + end: 0x00ff + }, + { + begin: 0x0100, + end: 0x017f + }, + { + begin: 0x0180, + end: 0x024f + }, + { + begin: 0x0250, + end: 0x02af + }, + { + begin: 0x02b0, + end: 0x02ff + }, + { + begin: 0x0300, + end: 0x036f + }, + { + begin: 0x0370, + end: 0x03ff + }, + { + begin: 0x2c80, + end: 0x2cff + }, + { + begin: 0x0400, + end: 0x04ff + }, + { + begin: 0x0530, + end: 0x058f + }, + { + begin: 0x0590, + end: 0x05ff + }, + { + begin: 0xa500, + end: 0xa63f + }, + { + begin: 0x0600, + end: 0x06ff + }, + { + begin: 0x07c0, + end: 0x07ff + }, + { + begin: 0x0900, + end: 0x097f + }, + { + begin: 0x0980, + end: 0x09ff + }, + { + begin: 0x0a00, + end: 0x0a7f + }, + { + begin: 0x0a80, + end: 0x0aff + }, + { + begin: 0x0b00, + end: 0x0b7f + }, + { + begin: 0x0b80, + end: 0x0bff + }, + { + begin: 0x0c00, + end: 0x0c7f + }, + { + begin: 0x0c80, + end: 0x0cff + }, + { + begin: 0x0d00, + end: 0x0d7f + }, + { + begin: 0x0e00, + end: 0x0e7f + }, + { + begin: 0x0e80, + end: 0x0eff + }, + { + begin: 0x10a0, + end: 0x10ff + }, + { + begin: 0x1b00, + end: 0x1b7f + }, + { + begin: 0x1100, + end: 0x11ff + }, + { + begin: 0x1e00, + end: 0x1eff + }, + { + begin: 0x1f00, + end: 0x1fff + }, + { + begin: 0x2000, + end: 0x206f + }, + { + begin: 0x2070, + end: 0x209f + }, + { + begin: 0x20a0, + end: 0x20cf + }, + { + begin: 0x20d0, + end: 0x20ff + }, + { + begin: 0x2100, + end: 0x214f + }, + { + begin: 0x2150, + end: 0x218f + }, + { + begin: 0x2190, + end: 0x21ff + }, + { + begin: 0x2200, + end: 0x22ff + }, + { + begin: 0x2300, + end: 0x23ff + }, + { + begin: 0x2400, + end: 0x243f + }, + { + begin: 0x2440, + end: 0x245f + }, + { + begin: 0x2460, + end: 0x24ff + }, + { + begin: 0x2500, + end: 0x257f + }, + { + begin: 0x2580, + end: 0x259f + }, + { + begin: 0x25a0, + end: 0x25ff + }, + { + begin: 0x2600, + end: 0x26ff + }, + { + begin: 0x2700, + end: 0x27bf + }, + { + begin: 0x3000, + end: 0x303f + }, + { + begin: 0x3040, + end: 0x309f + }, + { + begin: 0x30a0, + end: 0x30ff + }, + { + begin: 0x3100, + end: 0x312f + }, + { + begin: 0x3130, + end: 0x318f + }, + { + begin: 0xa840, + end: 0xa87f + }, + { + begin: 0x3200, + end: 0x32ff + }, + { + begin: 0x3300, + end: 0x33ff + }, + { + begin: 0xac00, + end: 0xd7af + }, + { + begin: 0xd800, + end: 0xdfff + }, + { + begin: 0x10900, + end: 0x1091f + }, + { + begin: 0x4e00, + end: 0x9fff + }, + { + begin: 0xe000, + end: 0xf8ff + }, + { + begin: 0x31c0, + end: 0x31ef + }, + { + begin: 0xfb00, + end: 0xfb4f + }, + { + begin: 0xfb50, + end: 0xfdff + }, + { + begin: 0xfe20, + end: 0xfe2f + }, + { + begin: 0xfe10, + end: 0xfe1f + }, + { + begin: 0xfe50, + end: 0xfe6f + }, + { + begin: 0xfe70, + end: 0xfeff + }, + { + begin: 0xff00, + end: 0xffef + }, + { + begin: 0xfff0, + end: 0xffff + }, + { + begin: 0x0f00, + end: 0x0fff + }, + { + begin: 0x0700, + end: 0x074f + }, + { + begin: 0x0780, + end: 0x07bf + }, + { + begin: 0x0d80, + end: 0x0dff + }, + { + begin: 0x1000, + end: 0x109f + }, + { + begin: 0x1200, + end: 0x137f + }, + { + begin: 0x13a0, + end: 0x13ff + }, + { + begin: 0x1400, + end: 0x167f + }, + { + begin: 0x1680, + end: 0x169f + }, + { + begin: 0x16a0, + end: 0x16ff + }, + { + begin: 0x1780, + end: 0x17ff + }, + { + begin: 0x1800, + end: 0x18af + }, + { + begin: 0x2800, + end: 0x28ff + }, + { + begin: 0xa000, + end: 0xa48f + }, + { + begin: 0x1700, + end: 0x171f + }, + { + begin: 0x10300, + end: 0x1032f + }, + { + begin: 0x10330, + end: 0x1034f + }, + { + begin: 0x10400, + end: 0x1044f + }, + { + begin: 0x1d000, + end: 0x1d0ff + }, + { + begin: 0x1d400, + end: 0x1d7ff + }, + { + begin: 0xff000, + end: 0xffffd + }, + { + begin: 0xfe00, + end: 0xfe0f + }, + { + begin: 0xe0000, + end: 0xe007f + }, + { + begin: 0x1900, + end: 0x194f + }, + { + begin: 0x1950, + end: 0x197f + }, + { + begin: 0x1980, + end: 0x19df + }, + { + begin: 0x1a00, + end: 0x1a1f + }, + { + begin: 0x2c00, + end: 0x2c5f + }, + { + begin: 0x2d30, + end: 0x2d7f + }, + { + begin: 0x4dc0, + end: 0x4dff + }, + { + begin: 0xa800, + end: 0xa82f + }, + { + begin: 0x10000, + end: 0x1007f + }, + { + begin: 0x10140, + end: 0x1018f + }, + { + begin: 0x10380, + end: 0x1039f + }, + { + begin: 0x103a0, + end: 0x103df + }, + { + begin: 0x10450, + end: 0x1047f + }, + { + begin: 0x10480, + end: 0x104af + }, + { + begin: 0x10800, + end: 0x1083f + }, + { + begin: 0x10a00, + end: 0x10a5f + }, + { + begin: 0x1d300, + end: 0x1d35f + }, + { + begin: 0x12000, + end: 0x123ff + }, + { + begin: 0x1d360, + end: 0x1d37f + }, + { + begin: 0x1b80, + end: 0x1bbf + }, + { + begin: 0x1c00, + end: 0x1c4f + }, + { + begin: 0x1c50, + end: 0x1c7f + }, + { + begin: 0xa880, + end: 0xa8df + }, + { + begin: 0xa900, + end: 0xa92f + }, + { + begin: 0xa930, + end: 0xa95f + }, + { + begin: 0xaa00, + end: 0xaa5f + }, + { + begin: 0x10190, + end: 0x101cf + }, + { + begin: 0x101d0, + end: 0x101ff + }, + { + begin: 0x102a0, + end: 0x102df + }, + { + begin: 0x1f030, + end: 0x1f09f + } +]; +function getUnicodeRangeFor(value) { + for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) { + const range = UnicodeRanges[i]; + if (value >= range.begin && value < range.end) { + return i; + } + } + return -1; +} +function isRTLRangeFor(value) { + let range = UnicodeRanges[13]; + if (value >= range.begin && value < range.end) { + return true; + } + range = UnicodeRanges[11]; + if (value >= range.begin && value < range.end) { + return true; + } + return false; +} +const getNormalizedUnicodes = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () { + return [ + "\u00A8", + "\u0020\u0308", + "\u00AF", + "\u0020\u0304", + "\u00B4", + "\u0020\u0301", + "\u00B5", + "\u03BC", + "\u00B8", + "\u0020\u0327", + "\u0132", + "\u0049\u004A", + "\u0133", + "\u0069\u006A", + "\u013F", + "\u004C\u00B7", + "\u0140", + "\u006C\u00B7", + "\u0149", + "\u02BC\u006E", + "\u017F", + "\u0073", + "\u01C4", + "\u0044\u017D", + "\u01C5", + "\u0044\u017E", + "\u01C6", + "\u0064\u017E", + "\u01C7", + "\u004C\u004A", + "\u01C8", + "\u004C\u006A", + "\u01C9", + "\u006C\u006A", + "\u01CA", + "\u004E\u004A", + "\u01CB", + "\u004E\u006A", + "\u01CC", + "\u006E\u006A", + "\u01F1", + "\u0044\u005A", + "\u01F2", + "\u0044\u007A", + "\u01F3", + "\u0064\u007A", + "\u02D8", + "\u0020\u0306", + "\u02D9", + "\u0020\u0307", + "\u02DA", + "\u0020\u030A", + "\u02DB", + "\u0020\u0328", + "\u02DC", + "\u0020\u0303", + "\u02DD", + "\u0020\u030B", + "\u037A", + "\u0020\u0345", + "\u0384", + "\u0020\u0301", + "\u03D0", + "\u03B2", + "\u03D1", + "\u03B8", + "\u03D2", + "\u03A5", + "\u03D5", + "\u03C6", + "\u03D6", + "\u03C0", + "\u03F0", + "\u03BA", + "\u03F1", + "\u03C1", + "\u03F2", + "\u03C2", + "\u03F4", + "\u0398", + "\u03F5", + "\u03B5", + "\u03F9", + "\u03A3", + "\u0587", + "\u0565\u0582", + "\u0675", + "\u0627\u0674", + "\u0676", + "\u0648\u0674", + "\u0677", + "\u06C7\u0674", + "\u0678", + "\u064A\u0674", + "\u0E33", + "\u0E4D\u0E32", + "\u0EB3", + "\u0ECD\u0EB2", + "\u0EDC", + "\u0EAB\u0E99", + "\u0EDD", + "\u0EAB\u0EA1", + "\u0F77", + "\u0FB2\u0F81", + "\u0F79", + "\u0FB3\u0F81", + "\u1E9A", + "\u0061\u02BE", + "\u1FBD", + "\u0020\u0313", + "\u1FBF", + "\u0020\u0313", + "\u1FC0", + "\u0020\u0342", + "\u1FFE", + "\u0020\u0314", + "\u2002", + "\u0020", + "\u2003", + "\u0020", + "\u2004", + "\u0020", + "\u2005", + "\u0020", + "\u2006", + "\u0020", + "\u2008", + "\u0020", + "\u2009", + "\u0020", + "\u200A", + "\u0020", + "\u2017", + "\u0020\u0333", + "\u2024", + "\u002E", + "\u2025", + "\u002E\u002E", + "\u2026", + "\u002E\u002E\u002E", + "\u2033", + "\u2032\u2032", + "\u2034", + "\u2032\u2032\u2032", + "\u2036", + "\u2035\u2035", + "\u2037", + "\u2035\u2035\u2035", + "\u203C", + "\u0021\u0021", + "\u203E", + "\u0020\u0305", + "\u2047", + "\u003F\u003F", + "\u2048", + "\u003F\u0021", + "\u2049", + "\u0021\u003F", + "\u2057", + "\u2032\u2032\u2032\u2032", + "\u205F", + "\u0020", + "\u20A8", + "\u0052\u0073", + "\u2100", + "\u0061\u002F\u0063", + "\u2101", + "\u0061\u002F\u0073", + "\u2103", + "\u00B0\u0043", + "\u2105", + "\u0063\u002F\u006F", + "\u2106", + "\u0063\u002F\u0075", + "\u2107", + "\u0190", + "\u2109", + "\u00B0\u0046", + "\u2116", + "\u004E\u006F", + "\u2121", + "\u0054\u0045\u004C", + "\u2135", + "\u05D0", + "\u2136", + "\u05D1", + "\u2137", + "\u05D2", + "\u2138", + "\u05D3", + "\u213B", + "\u0046\u0041\u0058", + "\u2160", + "\u0049", + "\u2161", + "\u0049\u0049", + "\u2162", + "\u0049\u0049\u0049", + "\u2163", + "\u0049\u0056", + "\u2164", + "\u0056", + "\u2165", + "\u0056\u0049", + "\u2166", + "\u0056\u0049\u0049", + "\u2167", + "\u0056\u0049\u0049\u0049", + "\u2168", + "\u0049\u0058", + "\u2169", + "\u0058", + "\u216A", + "\u0058\u0049", + "\u216B", + "\u0058\u0049\u0049", + "\u216C", + "\u004C", + "\u216D", + "\u0043", + "\u216E", + "\u0044", + "\u216F", + "\u004D", + "\u2170", + "\u0069", + "\u2171", + "\u0069\u0069", + "\u2172", + "\u0069\u0069\u0069", + "\u2173", + "\u0069\u0076", + "\u2174", + "\u0076", + "\u2175", + "\u0076\u0069", + "\u2176", + "\u0076\u0069\u0069", + "\u2177", + "\u0076\u0069\u0069\u0069", + "\u2178", + "\u0069\u0078", + "\u2179", + "\u0078", + "\u217A", + "\u0078\u0069", + "\u217B", + "\u0078\u0069\u0069", + "\u217C", + "\u006C", + "\u217D", + "\u0063", + "\u217E", + "\u0064", + "\u217F", + "\u006D", + "\u222C", + "\u222B\u222B", + "\u222D", + "\u222B\u222B\u222B", + "\u222F", + "\u222E\u222E", + "\u2230", + "\u222E\u222E\u222E", + "\u2474", + "\u0028\u0031\u0029", + "\u2475", + "\u0028\u0032\u0029", + "\u2476", + "\u0028\u0033\u0029", + "\u2477", + "\u0028\u0034\u0029", + "\u2478", + "\u0028\u0035\u0029", + "\u2479", + "\u0028\u0036\u0029", + "\u247A", + "\u0028\u0037\u0029", + "\u247B", + "\u0028\u0038\u0029", + "\u247C", + "\u0028\u0039\u0029", + "\u247D", + "\u0028\u0031\u0030\u0029", + "\u247E", + "\u0028\u0031\u0031\u0029", + "\u247F", + "\u0028\u0031\u0032\u0029", + "\u2480", + "\u0028\u0031\u0033\u0029", + "\u2481", + "\u0028\u0031\u0034\u0029", + "\u2482", + "\u0028\u0031\u0035\u0029", + "\u2483", + "\u0028\u0031\u0036\u0029", + "\u2484", + "\u0028\u0031\u0037\u0029", + "\u2485", + "\u0028\u0031\u0038\u0029", + "\u2486", + "\u0028\u0031\u0039\u0029", + "\u2487", + "\u0028\u0032\u0030\u0029", + "\u2488", + "\u0031\u002E", + "\u2489", + "\u0032\u002E", + "\u248A", + "\u0033\u002E", + "\u248B", + "\u0034\u002E", + "\u248C", + "\u0035\u002E", + "\u248D", + "\u0036\u002E", + "\u248E", + "\u0037\u002E", + "\u248F", + "\u0038\u002E", + "\u2490", + "\u0039\u002E", + "\u2491", + "\u0031\u0030\u002E", + "\u2492", + "\u0031\u0031\u002E", + "\u2493", + "\u0031\u0032\u002E", + "\u2494", + "\u0031\u0033\u002E", + "\u2495", + "\u0031\u0034\u002E", + "\u2496", + "\u0031\u0035\u002E", + "\u2497", + "\u0031\u0036\u002E", + "\u2498", + "\u0031\u0037\u002E", + "\u2499", + "\u0031\u0038\u002E", + "\u249A", + "\u0031\u0039\u002E", + "\u249B", + "\u0032\u0030\u002E", + "\u249C", + "\u0028\u0061\u0029", + "\u249D", + "\u0028\u0062\u0029", + "\u249E", + "\u0028\u0063\u0029", + "\u249F", + "\u0028\u0064\u0029", + "\u24A0", + "\u0028\u0065\u0029", + "\u24A1", + "\u0028\u0066\u0029", + "\u24A2", + "\u0028\u0067\u0029", + "\u24A3", + "\u0028\u0068\u0029", + "\u24A4", + "\u0028\u0069\u0029", + "\u24A5", + "\u0028\u006A\u0029", + "\u24A6", + "\u0028\u006B\u0029", + "\u24A7", + "\u0028\u006C\u0029", + "\u24A8", + "\u0028\u006D\u0029", + "\u24A9", + "\u0028\u006E\u0029", + "\u24AA", + "\u0028\u006F\u0029", + "\u24AB", + "\u0028\u0070\u0029", + "\u24AC", + "\u0028\u0071\u0029", + "\u24AD", + "\u0028\u0072\u0029", + "\u24AE", + "\u0028\u0073\u0029", + "\u24AF", + "\u0028\u0074\u0029", + "\u24B0", + "\u0028\u0075\u0029", + "\u24B1", + "\u0028\u0076\u0029", + "\u24B2", + "\u0028\u0077\u0029", + "\u24B3", + "\u0028\u0078\u0029", + "\u24B4", + "\u0028\u0079\u0029", + "\u24B5", + "\u0028\u007A\u0029", + "\u2A0C", + "\u222B\u222B\u222B\u222B", + "\u2A74", + "\u003A\u003A\u003D", + "\u2A75", + "\u003D\u003D", + "\u2A76", + "\u003D\u003D\u003D", + "\u2E9F", + "\u6BCD", + "\u2EF3", + "\u9F9F", + "\u2F00", + "\u4E00", + "\u2F01", + "\u4E28", + "\u2F02", + "\u4E36", + "\u2F03", + "\u4E3F", + "\u2F04", + "\u4E59", + "\u2F05", + "\u4E85", + "\u2F06", + "\u4E8C", + "\u2F07", + "\u4EA0", + "\u2F08", + "\u4EBA", + "\u2F09", + "\u513F", + "\u2F0A", + "\u5165", + "\u2F0B", + "\u516B", + "\u2F0C", + "\u5182", + "\u2F0D", + "\u5196", + "\u2F0E", + "\u51AB", + "\u2F0F", + "\u51E0", + "\u2F10", + "\u51F5", + "\u2F11", + "\u5200", + "\u2F12", + "\u529B", + "\u2F13", + "\u52F9", + "\u2F14", + "\u5315", + "\u2F15", + "\u531A", + "\u2F16", + "\u5338", + "\u2F17", + "\u5341", + "\u2F18", + "\u535C", + "\u2F19", + "\u5369", + "\u2F1A", + "\u5382", + "\u2F1B", + "\u53B6", + "\u2F1C", + "\u53C8", + "\u2F1D", + "\u53E3", + "\u2F1E", + "\u56D7", + "\u2F1F", + "\u571F", + "\u2F20", + "\u58EB", + "\u2F21", + "\u5902", + "\u2F22", + "\u590A", + "\u2F23", + "\u5915", + "\u2F24", + "\u5927", + "\u2F25", + "\u5973", + "\u2F26", + "\u5B50", + "\u2F27", + "\u5B80", + "\u2F28", + "\u5BF8", + "\u2F29", + "\u5C0F", + "\u2F2A", + "\u5C22", + "\u2F2B", + "\u5C38", + "\u2F2C", + "\u5C6E", + "\u2F2D", + "\u5C71", + "\u2F2E", + "\u5DDB", + "\u2F2F", + "\u5DE5", + "\u2F30", + "\u5DF1", + "\u2F31", + "\u5DFE", + "\u2F32", + "\u5E72", + "\u2F33", + "\u5E7A", + "\u2F34", + "\u5E7F", + "\u2F35", + "\u5EF4", + "\u2F36", + "\u5EFE", + "\u2F37", + "\u5F0B", + "\u2F38", + "\u5F13", + "\u2F39", + "\u5F50", + "\u2F3A", + "\u5F61", + "\u2F3B", + "\u5F73", + "\u2F3C", + "\u5FC3", + "\u2F3D", + "\u6208", + "\u2F3E", + "\u6236", + "\u2F3F", + "\u624B", + "\u2F40", + "\u652F", + "\u2F41", + "\u6534", + "\u2F42", + "\u6587", + "\u2F43", + "\u6597", + "\u2F44", + "\u65A4", + "\u2F45", + "\u65B9", + "\u2F46", + "\u65E0", + "\u2F47", + "\u65E5", + "\u2F48", + "\u66F0", + "\u2F49", + "\u6708", + "\u2F4A", + "\u6728", + "\u2F4B", + "\u6B20", + "\u2F4C", + "\u6B62", + "\u2F4D", + "\u6B79", + "\u2F4E", + "\u6BB3", + "\u2F4F", + "\u6BCB", + "\u2F50", + "\u6BD4", + "\u2F51", + "\u6BDB", + "\u2F52", + "\u6C0F", + "\u2F53", + "\u6C14", + "\u2F54", + "\u6C34", + "\u2F55", + "\u706B", + "\u2F56", + "\u722A", + "\u2F57", + "\u7236", + "\u2F58", + "\u723B", + "\u2F59", + "\u723F", + "\u2F5A", + "\u7247", + "\u2F5B", + "\u7259", + "\u2F5C", + "\u725B", + "\u2F5D", + "\u72AC", + "\u2F5E", + "\u7384", + "\u2F5F", + "\u7389", + "\u2F60", + "\u74DC", + "\u2F61", + "\u74E6", + "\u2F62", + "\u7518", + "\u2F63", + "\u751F", + "\u2F64", + "\u7528", + "\u2F65", + "\u7530", + "\u2F66", + "\u758B", + "\u2F67", + "\u7592", + "\u2F68", + "\u7676", + "\u2F69", + "\u767D", + "\u2F6A", + "\u76AE", + "\u2F6B", + "\u76BF", + "\u2F6C", + "\u76EE", + "\u2F6D", + "\u77DB", + "\u2F6E", + "\u77E2", + "\u2F6F", + "\u77F3", + "\u2F70", + "\u793A", + "\u2F71", + "\u79B8", + "\u2F72", + "\u79BE", + "\u2F73", + "\u7A74", + "\u2F74", + "\u7ACB", + "\u2F75", + "\u7AF9", + "\u2F76", + "\u7C73", + "\u2F77", + "\u7CF8", + "\u2F78", + "\u7F36", + "\u2F79", + "\u7F51", + "\u2F7A", + "\u7F8A", + "\u2F7B", + "\u7FBD", + "\u2F7C", + "\u8001", + "\u2F7D", + "\u800C", + "\u2F7E", + "\u8012", + "\u2F7F", + "\u8033", + "\u2F80", + "\u807F", + "\u2F81", + "\u8089", + "\u2F82", + "\u81E3", + "\u2F83", + "\u81EA", + "\u2F84", + "\u81F3", + "\u2F85", + "\u81FC", + "\u2F86", + "\u820C", + "\u2F87", + "\u821B", + "\u2F88", + "\u821F", + "\u2F89", + "\u826E", + "\u2F8A", + "\u8272", + "\u2F8B", + "\u8278", + "\u2F8C", + "\u864D", + "\u2F8D", + "\u866B", + "\u2F8E", + "\u8840", + "\u2F8F", + "\u884C", + "\u2F90", + "\u8863", + "\u2F91", + "\u897E", + "\u2F92", + "\u898B", + "\u2F93", + "\u89D2", + "\u2F94", + "\u8A00", + "\u2F95", + "\u8C37", + "\u2F96", + "\u8C46", + "\u2F97", + "\u8C55", + "\u2F98", + "\u8C78", + "\u2F99", + "\u8C9D", + "\u2F9A", + "\u8D64", + "\u2F9B", + "\u8D70", + "\u2F9C", + "\u8DB3", + "\u2F9D", + "\u8EAB", + "\u2F9E", + "\u8ECA", + "\u2F9F", + "\u8F9B", + "\u2FA0", + "\u8FB0", + "\u2FA1", + "\u8FB5", + "\u2FA2", + "\u9091", + "\u2FA3", + "\u9149", + "\u2FA4", + "\u91C6", + "\u2FA5", + "\u91CC", + "\u2FA6", + "\u91D1", + "\u2FA7", + "\u9577", + "\u2FA8", + "\u9580", + "\u2FA9", + "\u961C", + "\u2FAA", + "\u96B6", + "\u2FAB", + "\u96B9", + "\u2FAC", + "\u96E8", + "\u2FAD", + "\u9751", + "\u2FAE", + "\u975E", + "\u2FAF", + "\u9762", + "\u2FB0", + "\u9769", + "\u2FB1", + "\u97CB", + "\u2FB2", + "\u97ED", + "\u2FB3", + "\u97F3", + "\u2FB4", + "\u9801", + "\u2FB5", + "\u98A8", + "\u2FB6", + "\u98DB", + "\u2FB7", + "\u98DF", + "\u2FB8", + "\u9996", + "\u2FB9", + "\u9999", + "\u2FBA", + "\u99AC", + "\u2FBB", + "\u9AA8", + "\u2FBC", + "\u9AD8", + "\u2FBD", + "\u9ADF", + "\u2FBE", + "\u9B25", + "\u2FBF", + "\u9B2F", + "\u2FC0", + "\u9B32", + "\u2FC1", + "\u9B3C", + "\u2FC2", + "\u9B5A", + "\u2FC3", + "\u9CE5", + "\u2FC4", + "\u9E75", + "\u2FC5", + "\u9E7F", + "\u2FC6", + "\u9EA5", + "\u2FC7", + "\u9EBB", + "\u2FC8", + "\u9EC3", + "\u2FC9", + "\u9ECD", + "\u2FCA", + "\u9ED1", + "\u2FCB", + "\u9EF9", + "\u2FCC", + "\u9EFD", + "\u2FCD", + "\u9F0E", + "\u2FCE", + "\u9F13", + "\u2FCF", + "\u9F20", + "\u2FD0", + "\u9F3B", + "\u2FD1", + "\u9F4A", + "\u2FD2", + "\u9F52", + "\u2FD3", + "\u9F8D", + "\u2FD4", + "\u9F9C", + "\u2FD5", + "\u9FA0", + "\u3036", + "\u3012", + "\u3038", + "\u5341", + "\u3039", + "\u5344", + "\u303A", + "\u5345", + "\u309B", + "\u0020\u3099", + "\u309C", + "\u0020\u309A", + "\u3131", + "\u1100", + "\u3132", + "\u1101", + "\u3133", + "\u11AA", + "\u3134", + "\u1102", + "\u3135", + "\u11AC", + "\u3136", + "\u11AD", + "\u3137", + "\u1103", + "\u3138", + "\u1104", + "\u3139", + "\u1105", + "\u313A", + "\u11B0", + "\u313B", + "\u11B1", + "\u313C", + "\u11B2", + "\u313D", + "\u11B3", + "\u313E", + "\u11B4", + "\u313F", + "\u11B5", + "\u3140", + "\u111A", + "\u3141", + "\u1106", + "\u3142", + "\u1107", + "\u3143", + "\u1108", + "\u3144", + "\u1121", + "\u3145", + "\u1109", + "\u3146", + "\u110A", + "\u3147", + "\u110B", + "\u3148", + "\u110C", + "\u3149", + "\u110D", + "\u314A", + "\u110E", + "\u314B", + "\u110F", + "\u314C", + "\u1110", + "\u314D", + "\u1111", + "\u314E", + "\u1112", + "\u314F", + "\u1161", + "\u3150", + "\u1162", + "\u3151", + "\u1163", + "\u3152", + "\u1164", + "\u3153", + "\u1165", + "\u3154", + "\u1166", + "\u3155", + "\u1167", + "\u3156", + "\u1168", + "\u3157", + "\u1169", + "\u3158", + "\u116A", + "\u3159", + "\u116B", + "\u315A", + "\u116C", + "\u315B", + "\u116D", + "\u315C", + "\u116E", + "\u315D", + "\u116F", + "\u315E", + "\u1170", + "\u315F", + "\u1171", + "\u3160", + "\u1172", + "\u3161", + "\u1173", + "\u3162", + "\u1174", + "\u3163", + "\u1175", + "\u3164", + "\u1160", + "\u3165", + "\u1114", + "\u3166", + "\u1115", + "\u3167", + "\u11C7", + "\u3168", + "\u11C8", + "\u3169", + "\u11CC", + "\u316A", + "\u11CE", + "\u316B", + "\u11D3", + "\u316C", + "\u11D7", + "\u316D", + "\u11D9", + "\u316E", + "\u111C", + "\u316F", + "\u11DD", + "\u3170", + "\u11DF", + "\u3171", + "\u111D", + "\u3172", + "\u111E", + "\u3173", + "\u1120", + "\u3174", + "\u1122", + "\u3175", + "\u1123", + "\u3176", + "\u1127", + "\u3177", + "\u1129", + "\u3178", + "\u112B", + "\u3179", + "\u112C", + "\u317A", + "\u112D", + "\u317B", + "\u112E", + "\u317C", + "\u112F", + "\u317D", + "\u1132", + "\u317E", + "\u1136", + "\u317F", + "\u1140", + "\u3180", + "\u1147", + "\u3181", + "\u114C", + "\u3182", + "\u11F1", + "\u3183", + "\u11F2", + "\u3184", + "\u1157", + "\u3185", + "\u1158", + "\u3186", + "\u1159", + "\u3187", + "\u1184", + "\u3188", + "\u1185", + "\u3189", + "\u1188", + "\u318A", + "\u1191", + "\u318B", + "\u1192", + "\u318C", + "\u1194", + "\u318D", + "\u119E", + "\u318E", + "\u11A1", + "\u3200", + "\u0028\u1100\u0029", + "\u3201", + "\u0028\u1102\u0029", + "\u3202", + "\u0028\u1103\u0029", + "\u3203", + "\u0028\u1105\u0029", + "\u3204", + "\u0028\u1106\u0029", + "\u3205", + "\u0028\u1107\u0029", + "\u3206", + "\u0028\u1109\u0029", + "\u3207", + "\u0028\u110B\u0029", + "\u3208", + "\u0028\u110C\u0029", + "\u3209", + "\u0028\u110E\u0029", + "\u320A", + "\u0028\u110F\u0029", + "\u320B", + "\u0028\u1110\u0029", + "\u320C", + "\u0028\u1111\u0029", + "\u320D", + "\u0028\u1112\u0029", + "\u320E", + "\u0028\u1100\u1161\u0029", + "\u320F", + "\u0028\u1102\u1161\u0029", + "\u3210", + "\u0028\u1103\u1161\u0029", + "\u3211", + "\u0028\u1105\u1161\u0029", + "\u3212", + "\u0028\u1106\u1161\u0029", + "\u3213", + "\u0028\u1107\u1161\u0029", + "\u3214", + "\u0028\u1109\u1161\u0029", + "\u3215", + "\u0028\u110B\u1161\u0029", + "\u3216", + "\u0028\u110C\u1161\u0029", + "\u3217", + "\u0028\u110E\u1161\u0029", + "\u3218", + "\u0028\u110F\u1161\u0029", + "\u3219", + "\u0028\u1110\u1161\u0029", + "\u321A", + "\u0028\u1111\u1161\u0029", + "\u321B", + "\u0028\u1112\u1161\u0029", + "\u321C", + "\u0028\u110C\u116E\u0029", + "\u321D", + "\u0028\u110B\u1169\u110C\u1165\u11AB\u0029", + "\u321E", + "\u0028\u110B\u1169\u1112\u116E\u0029", + "\u3220", + "\u0028\u4E00\u0029", + "\u3221", + "\u0028\u4E8C\u0029", + "\u3222", + "\u0028\u4E09\u0029", + "\u3223", + "\u0028\u56DB\u0029", + "\u3224", + "\u0028\u4E94\u0029", + "\u3225", + "\u0028\u516D\u0029", + "\u3226", + "\u0028\u4E03\u0029", + "\u3227", + "\u0028\u516B\u0029", + "\u3228", + "\u0028\u4E5D\u0029", + "\u3229", + "\u0028\u5341\u0029", + "\u322A", + "\u0028\u6708\u0029", + "\u322B", + "\u0028\u706B\u0029", + "\u322C", + "\u0028\u6C34\u0029", + "\u322D", + "\u0028\u6728\u0029", + "\u322E", + "\u0028\u91D1\u0029", + "\u322F", + "\u0028\u571F\u0029", + "\u3230", + "\u0028\u65E5\u0029", + "\u3231", + "\u0028\u682A\u0029", + "\u3232", + "\u0028\u6709\u0029", + "\u3233", + "\u0028\u793E\u0029", + "\u3234", + "\u0028\u540D\u0029", + "\u3235", + "\u0028\u7279\u0029", + "\u3236", + "\u0028\u8CA1\u0029", + "\u3237", + "\u0028\u795D\u0029", + "\u3238", + "\u0028\u52B4\u0029", + "\u3239", + "\u0028\u4EE3\u0029", + "\u323A", + "\u0028\u547C\u0029", + "\u323B", + "\u0028\u5B66\u0029", + "\u323C", + "\u0028\u76E3\u0029", + "\u323D", + "\u0028\u4F01\u0029", + "\u323E", + "\u0028\u8CC7\u0029", + "\u323F", + "\u0028\u5354\u0029", + "\u3240", + "\u0028\u796D\u0029", + "\u3241", + "\u0028\u4F11\u0029", + "\u3242", + "\u0028\u81EA\u0029", + "\u3243", + "\u0028\u81F3\u0029", + "\u32C0", + "\u0031\u6708", + "\u32C1", + "\u0032\u6708", + "\u32C2", + "\u0033\u6708", + "\u32C3", + "\u0034\u6708", + "\u32C4", + "\u0035\u6708", + "\u32C5", + "\u0036\u6708", + "\u32C6", + "\u0037\u6708", + "\u32C7", + "\u0038\u6708", + "\u32C8", + "\u0039\u6708", + "\u32C9", + "\u0031\u0030\u6708", + "\u32CA", + "\u0031\u0031\u6708", + "\u32CB", + "\u0031\u0032\u6708", + "\u3358", + "\u0030\u70B9", + "\u3359", + "\u0031\u70B9", + "\u335A", + "\u0032\u70B9", + "\u335B", + "\u0033\u70B9", + "\u335C", + "\u0034\u70B9", + "\u335D", + "\u0035\u70B9", + "\u335E", + "\u0036\u70B9", + "\u335F", + "\u0037\u70B9", + "\u3360", + "\u0038\u70B9", + "\u3361", + "\u0039\u70B9", + "\u3362", + "\u0031\u0030\u70B9", + "\u3363", + "\u0031\u0031\u70B9", + "\u3364", + "\u0031\u0032\u70B9", + "\u3365", + "\u0031\u0033\u70B9", + "\u3366", + "\u0031\u0034\u70B9", + "\u3367", + "\u0031\u0035\u70B9", + "\u3368", + "\u0031\u0036\u70B9", + "\u3369", + "\u0031\u0037\u70B9", + "\u336A", + "\u0031\u0038\u70B9", + "\u336B", + "\u0031\u0039\u70B9", + "\u336C", + "\u0032\u0030\u70B9", + "\u336D", + "\u0032\u0031\u70B9", + "\u336E", + "\u0032\u0032\u70B9", + "\u336F", + "\u0032\u0033\u70B9", + "\u3370", + "\u0032\u0034\u70B9", + "\u33E0", + "\u0031\u65E5", + "\u33E1", + "\u0032\u65E5", + "\u33E2", + "\u0033\u65E5", + "\u33E3", + "\u0034\u65E5", + "\u33E4", + "\u0035\u65E5", + "\u33E5", + "\u0036\u65E5", + "\u33E6", + "\u0037\u65E5", + "\u33E7", + "\u0038\u65E5", + "\u33E8", + "\u0039\u65E5", + "\u33E9", + "\u0031\u0030\u65E5", + "\u33EA", + "\u0031\u0031\u65E5", + "\u33EB", + "\u0031\u0032\u65E5", + "\u33EC", + "\u0031\u0033\u65E5", + "\u33ED", + "\u0031\u0034\u65E5", + "\u33EE", + "\u0031\u0035\u65E5", + "\u33EF", + "\u0031\u0036\u65E5", + "\u33F0", + "\u0031\u0037\u65E5", + "\u33F1", + "\u0031\u0038\u65E5", + "\u33F2", + "\u0031\u0039\u65E5", + "\u33F3", + "\u0032\u0030\u65E5", + "\u33F4", + "\u0032\u0031\u65E5", + "\u33F5", + "\u0032\u0032\u65E5", + "\u33F6", + "\u0032\u0033\u65E5", + "\u33F7", + "\u0032\u0034\u65E5", + "\u33F8", + "\u0032\u0035\u65E5", + "\u33F9", + "\u0032\u0036\u65E5", + "\u33FA", + "\u0032\u0037\u65E5", + "\u33FB", + "\u0032\u0038\u65E5", + "\u33FC", + "\u0032\u0039\u65E5", + "\u33FD", + "\u0033\u0030\u65E5", + "\u33FE", + "\u0033\u0031\u65E5", + "\uFB00", + "\u0066\u0066", + "\uFB01", + "\u0066\u0069", + "\uFB02", + "\u0066\u006C", + "\uFB03", + "\u0066\u0066\u0069", + "\uFB04", + "\u0066\u0066\u006C", + "\uFB05", + "\u017F\u0074", + "\uFB06", + "\u0073\u0074", + "\uFB13", + "\u0574\u0576", + "\uFB14", + "\u0574\u0565", + "\uFB15", + "\u0574\u056B", + "\uFB16", + "\u057E\u0576", + "\uFB17", + "\u0574\u056D", + "\uFB4F", + "\u05D0\u05DC", + "\uFB50", + "\u0671", + "\uFB51", + "\u0671", + "\uFB52", + "\u067B", + "\uFB53", + "\u067B", + "\uFB54", + "\u067B", + "\uFB55", + "\u067B", + "\uFB56", + "\u067E", + "\uFB57", + "\u067E", + "\uFB58", + "\u067E", + "\uFB59", + "\u067E", + "\uFB5A", + "\u0680", + "\uFB5B", + "\u0680", + "\uFB5C", + "\u0680", + "\uFB5D", + "\u0680", + "\uFB5E", + "\u067A", + "\uFB5F", + "\u067A", + "\uFB60", + "\u067A", + "\uFB61", + "\u067A", + "\uFB62", + "\u067F", + "\uFB63", + "\u067F", + "\uFB64", + "\u067F", + "\uFB65", + "\u067F", + "\uFB66", + "\u0679", + "\uFB67", + "\u0679", + "\uFB68", + "\u0679", + "\uFB69", + "\u0679", + "\uFB6A", + "\u06A4", + "\uFB6B", + "\u06A4", + "\uFB6C", + "\u06A4", + "\uFB6D", + "\u06A4", + "\uFB6E", + "\u06A6", + "\uFB6F", + "\u06A6", + "\uFB70", + "\u06A6", + "\uFB71", + "\u06A6", + "\uFB72", + "\u0684", + "\uFB73", + "\u0684", + "\uFB74", + "\u0684", + "\uFB75", + "\u0684", + "\uFB76", + "\u0683", + "\uFB77", + "\u0683", + "\uFB78", + "\u0683", + "\uFB79", + "\u0683", + "\uFB7A", + "\u0686", + "\uFB7B", + "\u0686", + "\uFB7C", + "\u0686", + "\uFB7D", + "\u0686", + "\uFB7E", + "\u0687", + "\uFB7F", + "\u0687", + "\uFB80", + "\u0687", + "\uFB81", + "\u0687", + "\uFB82", + "\u068D", + "\uFB83", + "\u068D", + "\uFB84", + "\u068C", + "\uFB85", + "\u068C", + "\uFB86", + "\u068E", + "\uFB87", + "\u068E", + "\uFB88", + "\u0688", + "\uFB89", + "\u0688", + "\uFB8A", + "\u0698", + "\uFB8B", + "\u0698", + "\uFB8C", + "\u0691", + "\uFB8D", + "\u0691", + "\uFB8E", + "\u06A9", + "\uFB8F", + "\u06A9", + "\uFB90", + "\u06A9", + "\uFB91", + "\u06A9", + "\uFB92", + "\u06AF", + "\uFB93", + "\u06AF", + "\uFB94", + "\u06AF", + "\uFB95", + "\u06AF", + "\uFB96", + "\u06B3", + "\uFB97", + "\u06B3", + "\uFB98", + "\u06B3", + "\uFB99", + "\u06B3", + "\uFB9A", + "\u06B1", + "\uFB9B", + "\u06B1", + "\uFB9C", + "\u06B1", + "\uFB9D", + "\u06B1", + "\uFB9E", + "\u06BA", + "\uFB9F", + "\u06BA", + "\uFBA0", + "\u06BB", + "\uFBA1", + "\u06BB", + "\uFBA2", + "\u06BB", + "\uFBA3", + "\u06BB", + "\uFBA4", + "\u06C0", + "\uFBA5", + "\u06C0", + "\uFBA6", + "\u06C1", + "\uFBA7", + "\u06C1", + "\uFBA8", + "\u06C1", + "\uFBA9", + "\u06C1", + "\uFBAA", + "\u06BE", + "\uFBAB", + "\u06BE", + "\uFBAC", + "\u06BE", + "\uFBAD", + "\u06BE", + "\uFBAE", + "\u06D2", + "\uFBAF", + "\u06D2", + "\uFBB0", + "\u06D3", + "\uFBB1", + "\u06D3", + "\uFBD3", + "\u06AD", + "\uFBD4", + "\u06AD", + "\uFBD5", + "\u06AD", + "\uFBD6", + "\u06AD", + "\uFBD7", + "\u06C7", + "\uFBD8", + "\u06C7", + "\uFBD9", + "\u06C6", + "\uFBDA", + "\u06C6", + "\uFBDB", + "\u06C8", + "\uFBDC", + "\u06C8", + "\uFBDD", + "\u0677", + "\uFBDE", + "\u06CB", + "\uFBDF", + "\u06CB", + "\uFBE0", + "\u06C5", + "\uFBE1", + "\u06C5", + "\uFBE2", + "\u06C9", + "\uFBE3", + "\u06C9", + "\uFBE4", + "\u06D0", + "\uFBE5", + "\u06D0", + "\uFBE6", + "\u06D0", + "\uFBE7", + "\u06D0", + "\uFBE8", + "\u0649", + "\uFBE9", + "\u0649", + "\uFBEA", + "\u0626\u0627", + "\uFBEB", + "\u0626\u0627", + "\uFBEC", + "\u0626\u06D5", + "\uFBED", + "\u0626\u06D5", + "\uFBEE", + "\u0626\u0648", + "\uFBEF", + "\u0626\u0648", + "\uFBF0", + "\u0626\u06C7", + "\uFBF1", + "\u0626\u06C7", + "\uFBF2", + "\u0626\u06C6", + "\uFBF3", + "\u0626\u06C6", + "\uFBF4", + "\u0626\u06C8", + "\uFBF5", + "\u0626\u06C8", + "\uFBF6", + "\u0626\u06D0", + "\uFBF7", + "\u0626\u06D0", + "\uFBF8", + "\u0626\u06D0", + "\uFBF9", + "\u0626\u0649", + "\uFBFA", + "\u0626\u0649", + "\uFBFB", + "\u0626\u0649", + "\uFBFC", + "\u06CC", + "\uFBFD", + "\u06CC", + "\uFBFE", + "\u06CC", + "\uFBFF", + "\u06CC", + "\uFC00", + "\u0626\u062C", + "\uFC01", + "\u0626\u062D", + "\uFC02", + "\u0626\u0645", + "\uFC03", + "\u0626\u0649", + "\uFC04", + "\u0626\u064A", + "\uFC05", + "\u0628\u062C", + "\uFC06", + "\u0628\u062D", + "\uFC07", + "\u0628\u062E", + "\uFC08", + "\u0628\u0645", + "\uFC09", + "\u0628\u0649", + "\uFC0A", + "\u0628\u064A", + "\uFC0B", + "\u062A\u062C", + "\uFC0C", + "\u062A\u062D", + "\uFC0D", + "\u062A\u062E", + "\uFC0E", + "\u062A\u0645", + "\uFC0F", + "\u062A\u0649", + "\uFC10", + "\u062A\u064A", + "\uFC11", + "\u062B\u062C", + "\uFC12", + "\u062B\u0645", + "\uFC13", + "\u062B\u0649", + "\uFC14", + "\u062B\u064A", + "\uFC15", + "\u062C\u062D", + "\uFC16", + "\u062C\u0645", + "\uFC17", + "\u062D\u062C", + "\uFC18", + "\u062D\u0645", + "\uFC19", + "\u062E\u062C", + "\uFC1A", + "\u062E\u062D", + "\uFC1B", + "\u062E\u0645", + "\uFC1C", + "\u0633\u062C", + "\uFC1D", + "\u0633\u062D", + "\uFC1E", + "\u0633\u062E", + "\uFC1F", + "\u0633\u0645", + "\uFC20", + "\u0635\u062D", + "\uFC21", + "\u0635\u0645", + "\uFC22", + "\u0636\u062C", + "\uFC23", + "\u0636\u062D", + "\uFC24", + "\u0636\u062E", + "\uFC25", + "\u0636\u0645", + "\uFC26", + "\u0637\u062D", + "\uFC27", + "\u0637\u0645", + "\uFC28", + "\u0638\u0645", + "\uFC29", + "\u0639\u062C", + "\uFC2A", + "\u0639\u0645", + "\uFC2B", + "\u063A\u062C", + "\uFC2C", + "\u063A\u0645", + "\uFC2D", + "\u0641\u062C", + "\uFC2E", + "\u0641\u062D", + "\uFC2F", + "\u0641\u062E", + "\uFC30", + "\u0641\u0645", + "\uFC31", + "\u0641\u0649", + "\uFC32", + "\u0641\u064A", + "\uFC33", + "\u0642\u062D", + "\uFC34", + "\u0642\u0645", + "\uFC35", + "\u0642\u0649", + "\uFC36", + "\u0642\u064A", + "\uFC37", + "\u0643\u0627", + "\uFC38", + "\u0643\u062C", + "\uFC39", + "\u0643\u062D", + "\uFC3A", + "\u0643\u062E", + "\uFC3B", + "\u0643\u0644", + "\uFC3C", + "\u0643\u0645", + "\uFC3D", + "\u0643\u0649", + "\uFC3E", + "\u0643\u064A", + "\uFC3F", + "\u0644\u062C", + "\uFC40", + "\u0644\u062D", + "\uFC41", + "\u0644\u062E", + "\uFC42", + "\u0644\u0645", + "\uFC43", + "\u0644\u0649", + "\uFC44", + "\u0644\u064A", + "\uFC45", + "\u0645\u062C", + "\uFC46", + "\u0645\u062D", + "\uFC47", + "\u0645\u062E", + "\uFC48", + "\u0645\u0645", + "\uFC49", + "\u0645\u0649", + "\uFC4A", + "\u0645\u064A", + "\uFC4B", + "\u0646\u062C", + "\uFC4C", + "\u0646\u062D", + "\uFC4D", + "\u0646\u062E", + "\uFC4E", + "\u0646\u0645", + "\uFC4F", + "\u0646\u0649", + "\uFC50", + "\u0646\u064A", + "\uFC51", + "\u0647\u062C", + "\uFC52", + "\u0647\u0645", + "\uFC53", + "\u0647\u0649", + "\uFC54", + "\u0647\u064A", + "\uFC55", + "\u064A\u062C", + "\uFC56", + "\u064A\u062D", + "\uFC57", + "\u064A\u062E", + "\uFC58", + "\u064A\u0645", + "\uFC59", + "\u064A\u0649", + "\uFC5A", + "\u064A\u064A", + "\uFC5B", + "\u0630\u0670", + "\uFC5C", + "\u0631\u0670", + "\uFC5D", + "\u0649\u0670", + "\uFC5E", + "\u0020\u064C\u0651", + "\uFC5F", + "\u0020\u064D\u0651", + "\uFC60", + "\u0020\u064E\u0651", + "\uFC61", + "\u0020\u064F\u0651", + "\uFC62", + "\u0020\u0650\u0651", + "\uFC63", + "\u0020\u0651\u0670", + "\uFC64", + "\u0626\u0631", + "\uFC65", + "\u0626\u0632", + "\uFC66", + "\u0626\u0645", + "\uFC67", + "\u0626\u0646", + "\uFC68", + "\u0626\u0649", + "\uFC69", + "\u0626\u064A", + "\uFC6A", + "\u0628\u0631", + "\uFC6B", + "\u0628\u0632", + "\uFC6C", + "\u0628\u0645", + "\uFC6D", + "\u0628\u0646", + "\uFC6E", + "\u0628\u0649", + "\uFC6F", + "\u0628\u064A", + "\uFC70", + "\u062A\u0631", + "\uFC71", + "\u062A\u0632", + "\uFC72", + "\u062A\u0645", + "\uFC73", + "\u062A\u0646", + "\uFC74", + "\u062A\u0649", + "\uFC75", + "\u062A\u064A", + "\uFC76", + "\u062B\u0631", + "\uFC77", + "\u062B\u0632", + "\uFC78", + "\u062B\u0645", + "\uFC79", + "\u062B\u0646", + "\uFC7A", + "\u062B\u0649", + "\uFC7B", + "\u062B\u064A", + "\uFC7C", + "\u0641\u0649", + "\uFC7D", + "\u0641\u064A", + "\uFC7E", + "\u0642\u0649", + "\uFC7F", + "\u0642\u064A", + "\uFC80", + "\u0643\u0627", + "\uFC81", + "\u0643\u0644", + "\uFC82", + "\u0643\u0645", + "\uFC83", + "\u0643\u0649", + "\uFC84", + "\u0643\u064A", + "\uFC85", + "\u0644\u0645", + "\uFC86", + "\u0644\u0649", + "\uFC87", + "\u0644\u064A", + "\uFC88", + "\u0645\u0627", + "\uFC89", + "\u0645\u0645", + "\uFC8A", + "\u0646\u0631", + "\uFC8B", + "\u0646\u0632", + "\uFC8C", + "\u0646\u0645", + "\uFC8D", + "\u0646\u0646", + "\uFC8E", + "\u0646\u0649", + "\uFC8F", + "\u0646\u064A", + "\uFC90", + "\u0649\u0670", + "\uFC91", + "\u064A\u0631", + "\uFC92", + "\u064A\u0632", + "\uFC93", + "\u064A\u0645", + "\uFC94", + "\u064A\u0646", + "\uFC95", + "\u064A\u0649", + "\uFC96", + "\u064A\u064A", + "\uFC97", + "\u0626\u062C", + "\uFC98", + "\u0626\u062D", + "\uFC99", + "\u0626\u062E", + "\uFC9A", + "\u0626\u0645", + "\uFC9B", + "\u0626\u0647", + "\uFC9C", + "\u0628\u062C", + "\uFC9D", + "\u0628\u062D", + "\uFC9E", + "\u0628\u062E", + "\uFC9F", + "\u0628\u0645", + "\uFCA0", + "\u0628\u0647", + "\uFCA1", + "\u062A\u062C", + "\uFCA2", + "\u062A\u062D", + "\uFCA3", + "\u062A\u062E", + "\uFCA4", + "\u062A\u0645", + "\uFCA5", + "\u062A\u0647", + "\uFCA6", + "\u062B\u0645", + "\uFCA7", + "\u062C\u062D", + "\uFCA8", + "\u062C\u0645", + "\uFCA9", + "\u062D\u062C", + "\uFCAA", + "\u062D\u0645", + "\uFCAB", + "\u062E\u062C", + "\uFCAC", + "\u062E\u0645", + "\uFCAD", + "\u0633\u062C", + "\uFCAE", + "\u0633\u062D", + "\uFCAF", + "\u0633\u062E", + "\uFCB0", + "\u0633\u0645", + "\uFCB1", + "\u0635\u062D", + "\uFCB2", + "\u0635\u062E", + "\uFCB3", + "\u0635\u0645", + "\uFCB4", + "\u0636\u062C", + "\uFCB5", + "\u0636\u062D", + "\uFCB6", + "\u0636\u062E", + "\uFCB7", + "\u0636\u0645", + "\uFCB8", + "\u0637\u062D", + "\uFCB9", + "\u0638\u0645", + "\uFCBA", + "\u0639\u062C", + "\uFCBB", + "\u0639\u0645", + "\uFCBC", + "\u063A\u062C", + "\uFCBD", + "\u063A\u0645", + "\uFCBE", + "\u0641\u062C", + "\uFCBF", + "\u0641\u062D", + "\uFCC0", + "\u0641\u062E", + "\uFCC1", + "\u0641\u0645", + "\uFCC2", + "\u0642\u062D", + "\uFCC3", + "\u0642\u0645", + "\uFCC4", + "\u0643\u062C", + "\uFCC5", + "\u0643\u062D", + "\uFCC6", + "\u0643\u062E", + "\uFCC7", + "\u0643\u0644", + "\uFCC8", + "\u0643\u0645", + "\uFCC9", + "\u0644\u062C", + "\uFCCA", + "\u0644\u062D", + "\uFCCB", + "\u0644\u062E", + "\uFCCC", + "\u0644\u0645", + "\uFCCD", + "\u0644\u0647", + "\uFCCE", + "\u0645\u062C", + "\uFCCF", + "\u0645\u062D", + "\uFCD0", + "\u0645\u062E", + "\uFCD1", + "\u0645\u0645", + "\uFCD2", + "\u0646\u062C", + "\uFCD3", + "\u0646\u062D", + "\uFCD4", + "\u0646\u062E", + "\uFCD5", + "\u0646\u0645", + "\uFCD6", + "\u0646\u0647", + "\uFCD7", + "\u0647\u062C", + "\uFCD8", + "\u0647\u0645", + "\uFCD9", + "\u0647\u0670", + "\uFCDA", + "\u064A\u062C", + "\uFCDB", + "\u064A\u062D", + "\uFCDC", + "\u064A\u062E", + "\uFCDD", + "\u064A\u0645", + "\uFCDE", + "\u064A\u0647", + "\uFCDF", + "\u0626\u0645", + "\uFCE0", + "\u0626\u0647", + "\uFCE1", + "\u0628\u0645", + "\uFCE2", + "\u0628\u0647", + "\uFCE3", + "\u062A\u0645", + "\uFCE4", + "\u062A\u0647", + "\uFCE5", + "\u062B\u0645", + "\uFCE6", + "\u062B\u0647", + "\uFCE7", + "\u0633\u0645", + "\uFCE8", + "\u0633\u0647", + "\uFCE9", + "\u0634\u0645", + "\uFCEA", + "\u0634\u0647", + "\uFCEB", + "\u0643\u0644", + "\uFCEC", + "\u0643\u0645", + "\uFCED", + "\u0644\u0645", + "\uFCEE", + "\u0646\u0645", + "\uFCEF", + "\u0646\u0647", + "\uFCF0", + "\u064A\u0645", + "\uFCF1", + "\u064A\u0647", + "\uFCF2", + "\u0640\u064E\u0651", + "\uFCF3", + "\u0640\u064F\u0651", + "\uFCF4", + "\u0640\u0650\u0651", + "\uFCF5", + "\u0637\u0649", + "\uFCF6", + "\u0637\u064A", + "\uFCF7", + "\u0639\u0649", + "\uFCF8", + "\u0639\u064A", + "\uFCF9", + "\u063A\u0649", + "\uFCFA", + "\u063A\u064A", + "\uFCFB", + "\u0633\u0649", + "\uFCFC", + "\u0633\u064A", + "\uFCFD", + "\u0634\u0649", + "\uFCFE", + "\u0634\u064A", + "\uFCFF", + "\u062D\u0649", + "\uFD00", + "\u062D\u064A", + "\uFD01", + "\u062C\u0649", + "\uFD02", + "\u062C\u064A", + "\uFD03", + "\u062E\u0649", + "\uFD04", + "\u062E\u064A", + "\uFD05", + "\u0635\u0649", + "\uFD06", + "\u0635\u064A", + "\uFD07", + "\u0636\u0649", + "\uFD08", + "\u0636\u064A", + "\uFD09", + "\u0634\u062C", + "\uFD0A", + "\u0634\u062D", + "\uFD0B", + "\u0634\u062E", + "\uFD0C", + "\u0634\u0645", + "\uFD0D", + "\u0634\u0631", + "\uFD0E", + "\u0633\u0631", + "\uFD0F", + "\u0635\u0631", + "\uFD10", + "\u0636\u0631", + "\uFD11", + "\u0637\u0649", + "\uFD12", + "\u0637\u064A", + "\uFD13", + "\u0639\u0649", + "\uFD14", + "\u0639\u064A", + "\uFD15", + "\u063A\u0649", + "\uFD16", + "\u063A\u064A", + "\uFD17", + "\u0633\u0649", + "\uFD18", + "\u0633\u064A", + "\uFD19", + "\u0634\u0649", + "\uFD1A", + "\u0634\u064A", + "\uFD1B", + "\u062D\u0649", + "\uFD1C", + "\u062D\u064A", + "\uFD1D", + "\u062C\u0649", + "\uFD1E", + "\u062C\u064A", + "\uFD1F", + "\u062E\u0649", + "\uFD20", + "\u062E\u064A", + "\uFD21", + "\u0635\u0649", + "\uFD22", + "\u0635\u064A", + "\uFD23", + "\u0636\u0649", + "\uFD24", + "\u0636\u064A", + "\uFD25", + "\u0634\u062C", + "\uFD26", + "\u0634\u062D", + "\uFD27", + "\u0634\u062E", + "\uFD28", + "\u0634\u0645", + "\uFD29", + "\u0634\u0631", + "\uFD2A", + "\u0633\u0631", + "\uFD2B", + "\u0635\u0631", + "\uFD2C", + "\u0636\u0631", + "\uFD2D", + "\u0634\u062C", + "\uFD2E", + "\u0634\u062D", + "\uFD2F", + "\u0634\u062E", + "\uFD30", + "\u0634\u0645", + "\uFD31", + "\u0633\u0647", + "\uFD32", + "\u0634\u0647", + "\uFD33", + "\u0637\u0645", + "\uFD34", + "\u0633\u062C", + "\uFD35", + "\u0633\u062D", + "\uFD36", + "\u0633\u062E", + "\uFD37", + "\u0634\u062C", + "\uFD38", + "\u0634\u062D", + "\uFD39", + "\u0634\u062E", + "\uFD3A", + "\u0637\u0645", + "\uFD3B", + "\u0638\u0645", + "\uFD3C", + "\u0627\u064B", + "\uFD3D", + "\u0627\u064B", + "\uFD50", + "\u062A\u062C\u0645", + "\uFD51", + "\u062A\u062D\u062C", + "\uFD52", + "\u062A\u062D\u062C", + "\uFD53", + "\u062A\u062D\u0645", + "\uFD54", + "\u062A\u062E\u0645", + "\uFD55", + "\u062A\u0645\u062C", + "\uFD56", + "\u062A\u0645\u062D", + "\uFD57", + "\u062A\u0645\u062E", + "\uFD58", + "\u062C\u0645\u062D", + "\uFD59", + "\u062C\u0645\u062D", + "\uFD5A", + "\u062D\u0645\u064A", + "\uFD5B", + "\u062D\u0645\u0649", + "\uFD5C", + "\u0633\u062D\u062C", + "\uFD5D", + "\u0633\u062C\u062D", + "\uFD5E", + "\u0633\u062C\u0649", + "\uFD5F", + "\u0633\u0645\u062D", + "\uFD60", + "\u0633\u0645\u062D", + "\uFD61", + "\u0633\u0645\u062C", + "\uFD62", + "\u0633\u0645\u0645", + "\uFD63", + "\u0633\u0645\u0645", + "\uFD64", + "\u0635\u062D\u062D", + "\uFD65", + "\u0635\u062D\u062D", + "\uFD66", + "\u0635\u0645\u0645", + "\uFD67", + "\u0634\u062D\u0645", + "\uFD68", + "\u0634\u062D\u0645", + "\uFD69", + "\u0634\u062C\u064A", + "\uFD6A", + "\u0634\u0645\u062E", + "\uFD6B", + "\u0634\u0645\u062E", + "\uFD6C", + "\u0634\u0645\u0645", + "\uFD6D", + "\u0634\u0645\u0645", + "\uFD6E", + "\u0636\u062D\u0649", + "\uFD6F", + "\u0636\u062E\u0645", + "\uFD70", + "\u0636\u062E\u0645", + "\uFD71", + "\u0637\u0645\u062D", + "\uFD72", + "\u0637\u0645\u062D", + "\uFD73", + "\u0637\u0645\u0645", + "\uFD74", + "\u0637\u0645\u064A", + "\uFD75", + "\u0639\u062C\u0645", + "\uFD76", + "\u0639\u0645\u0645", + "\uFD77", + "\u0639\u0645\u0645", + "\uFD78", + "\u0639\u0645\u0649", + "\uFD79", + "\u063A\u0645\u0645", + "\uFD7A", + "\u063A\u0645\u064A", + "\uFD7B", + "\u063A\u0645\u0649", + "\uFD7C", + "\u0641\u062E\u0645", + "\uFD7D", + "\u0641\u062E\u0645", + "\uFD7E", + "\u0642\u0645\u062D", + "\uFD7F", + "\u0642\u0645\u0645", + "\uFD80", + "\u0644\u062D\u0645", + "\uFD81", + "\u0644\u062D\u064A", + "\uFD82", + "\u0644\u062D\u0649", + "\uFD83", + "\u0644\u062C\u062C", + "\uFD84", + "\u0644\u062C\u062C", + "\uFD85", + "\u0644\u062E\u0645", + "\uFD86", + "\u0644\u062E\u0645", + "\uFD87", + "\u0644\u0645\u062D", + "\uFD88", + "\u0644\u0645\u062D", + "\uFD89", + "\u0645\u062D\u062C", + "\uFD8A", + "\u0645\u062D\u0645", + "\uFD8B", + "\u0645\u062D\u064A", + "\uFD8C", + "\u0645\u062C\u062D", + "\uFD8D", + "\u0645\u062C\u0645", + "\uFD8E", + "\u0645\u062E\u062C", + "\uFD8F", + "\u0645\u062E\u0645", + "\uFD92", + "\u0645\u062C\u062E", + "\uFD93", + "\u0647\u0645\u062C", + "\uFD94", + "\u0647\u0645\u0645", + "\uFD95", + "\u0646\u062D\u0645", + "\uFD96", + "\u0646\u062D\u0649", + "\uFD97", + "\u0646\u062C\u0645", + "\uFD98", + "\u0646\u062C\u0645", + "\uFD99", + "\u0646\u062C\u0649", + "\uFD9A", + "\u0646\u0645\u064A", + "\uFD9B", + "\u0646\u0645\u0649", + "\uFD9C", + "\u064A\u0645\u0645", + "\uFD9D", + "\u064A\u0645\u0645", + "\uFD9E", + "\u0628\u062E\u064A", + "\uFD9F", + "\u062A\u062C\u064A", + "\uFDA0", + "\u062A\u062C\u0649", + "\uFDA1", + "\u062A\u062E\u064A", + "\uFDA2", + "\u062A\u062E\u0649", + "\uFDA3", + "\u062A\u0645\u064A", + "\uFDA4", + "\u062A\u0645\u0649", + "\uFDA5", + "\u062C\u0645\u064A", + "\uFDA6", + "\u062C\u062D\u0649", + "\uFDA7", + "\u062C\u0645\u0649", + "\uFDA8", + "\u0633\u062E\u0649", + "\uFDA9", + "\u0635\u062D\u064A", + "\uFDAA", + "\u0634\u062D\u064A", + "\uFDAB", + "\u0636\u062D\u064A", + "\uFDAC", + "\u0644\u062C\u064A", + "\uFDAD", + "\u0644\u0645\u064A", + "\uFDAE", + "\u064A\u062D\u064A", + "\uFDAF", + "\u064A\u062C\u064A", + "\uFDB0", + "\u064A\u0645\u064A", + "\uFDB1", + "\u0645\u0645\u064A", + "\uFDB2", + "\u0642\u0645\u064A", + "\uFDB3", + "\u0646\u062D\u064A", + "\uFDB4", + "\u0642\u0645\u062D", + "\uFDB5", + "\u0644\u062D\u0645", + "\uFDB6", + "\u0639\u0645\u064A", + "\uFDB7", + "\u0643\u0645\u064A", + "\uFDB8", + "\u0646\u062C\u062D", + "\uFDB9", + "\u0645\u062E\u064A", + "\uFDBA", + "\u0644\u062C\u0645", + "\uFDBB", + "\u0643\u0645\u0645", + "\uFDBC", + "\u0644\u062C\u0645", + "\uFDBD", + "\u0646\u062C\u062D", + "\uFDBE", + "\u062C\u062D\u064A", + "\uFDBF", + "\u062D\u062C\u064A", + "\uFDC0", + "\u0645\u062C\u064A", + "\uFDC1", + "\u0641\u0645\u064A", + "\uFDC2", + "\u0628\u062D\u064A", + "\uFDC3", + "\u0643\u0645\u0645", + "\uFDC4", + "\u0639\u062C\u0645", + "\uFDC5", + "\u0635\u0645\u0645", + "\uFDC6", + "\u0633\u062E\u064A", + "\uFDC7", + "\u0646\u062C\u064A", + "\uFE49", + "\u203E", + "\uFE4A", + "\u203E", + "\uFE4B", + "\u203E", + "\uFE4C", + "\u203E", + "\uFE4D", + "\u005F", + "\uFE4E", + "\u005F", + "\uFE4F", + "\u005F", + "\uFE80", + "\u0621", + "\uFE81", + "\u0622", + "\uFE82", + "\u0622", + "\uFE83", + "\u0623", + "\uFE84", + "\u0623", + "\uFE85", + "\u0624", + "\uFE86", + "\u0624", + "\uFE87", + "\u0625", + "\uFE88", + "\u0625", + "\uFE89", + "\u0626", + "\uFE8A", + "\u0626", + "\uFE8B", + "\u0626", + "\uFE8C", + "\u0626", + "\uFE8D", + "\u0627", + "\uFE8E", + "\u0627", + "\uFE8F", + "\u0628", + "\uFE90", + "\u0628", + "\uFE91", + "\u0628", + "\uFE92", + "\u0628", + "\uFE93", + "\u0629", + "\uFE94", + "\u0629", + "\uFE95", + "\u062A", + "\uFE96", + "\u062A", + "\uFE97", + "\u062A", + "\uFE98", + "\u062A", + "\uFE99", + "\u062B", + "\uFE9A", + "\u062B", + "\uFE9B", + "\u062B", + "\uFE9C", + "\u062B", + "\uFE9D", + "\u062C", + "\uFE9E", + "\u062C", + "\uFE9F", + "\u062C", + "\uFEA0", + "\u062C", + "\uFEA1", + "\u062D", + "\uFEA2", + "\u062D", + "\uFEA3", + "\u062D", + "\uFEA4", + "\u062D", + "\uFEA5", + "\u062E", + "\uFEA6", + "\u062E", + "\uFEA7", + "\u062E", + "\uFEA8", + "\u062E", + "\uFEA9", + "\u062F", + "\uFEAA", + "\u062F", + "\uFEAB", + "\u0630", + "\uFEAC", + "\u0630", + "\uFEAD", + "\u0631", + "\uFEAE", + "\u0631", + "\uFEAF", + "\u0632", + "\uFEB0", + "\u0632", + "\uFEB1", + "\u0633", + "\uFEB2", + "\u0633", + "\uFEB3", + "\u0633", + "\uFEB4", + "\u0633", + "\uFEB5", + "\u0634", + "\uFEB6", + "\u0634", + "\uFEB7", + "\u0634", + "\uFEB8", + "\u0634", + "\uFEB9", + "\u0635", + "\uFEBA", + "\u0635", + "\uFEBB", + "\u0635", + "\uFEBC", + "\u0635", + "\uFEBD", + "\u0636", + "\uFEBE", + "\u0636", + "\uFEBF", + "\u0636", + "\uFEC0", + "\u0636", + "\uFEC1", + "\u0637", + "\uFEC2", + "\u0637", + "\uFEC3", + "\u0637", + "\uFEC4", + "\u0637", + "\uFEC5", + "\u0638", + "\uFEC6", + "\u0638", + "\uFEC7", + "\u0638", + "\uFEC8", + "\u0638", + "\uFEC9", + "\u0639", + "\uFECA", + "\u0639", + "\uFECB", + "\u0639", + "\uFECC", + "\u0639", + "\uFECD", + "\u063A", + "\uFECE", + "\u063A", + "\uFECF", + "\u063A", + "\uFED0", + "\u063A", + "\uFED1", + "\u0641", + "\uFED2", + "\u0641", + "\uFED3", + "\u0641", + "\uFED4", + "\u0641", + "\uFED5", + "\u0642", + "\uFED6", + "\u0642", + "\uFED7", + "\u0642", + "\uFED8", + "\u0642", + "\uFED9", + "\u0643", + "\uFEDA", + "\u0643", + "\uFEDB", + "\u0643", + "\uFEDC", + "\u0643", + "\uFEDD", + "\u0644", + "\uFEDE", + "\u0644", + "\uFEDF", + "\u0644", + "\uFEE0", + "\u0644", + "\uFEE1", + "\u0645", + "\uFEE2", + "\u0645", + "\uFEE3", + "\u0645", + "\uFEE4", + "\u0645", + "\uFEE5", + "\u0646", + "\uFEE6", + "\u0646", + "\uFEE7", + "\u0646", + "\uFEE8", + "\u0646", + "\uFEE9", + "\u0647", + "\uFEEA", + "\u0647", + "\uFEEB", + "\u0647", + "\uFEEC", + "\u0647", + "\uFEED", + "\u0648", + "\uFEEE", + "\u0648", + "\uFEEF", + "\u0649", + "\uFEF0", + "\u0649", + "\uFEF1", + "\u064A", + "\uFEF2", + "\u064A", + "\uFEF3", + "\u064A", + "\uFEF4", + "\u064A", + "\uFEF5", + "\u0644\u0622", + "\uFEF6", + "\u0644\u0622", + "\uFEF7", + "\u0644\u0623", + "\uFEF8", + "\u0644\u0623", + "\uFEF9", + "\u0644\u0625", + "\uFEFA", + "\u0644\u0625", + "\uFEFB", + "\u0644\u0627", + "\uFEFC", + "\u0644\u0627" + ]; +}); +function reverseIfRtl(chars) { + const charsLength = chars.length; + if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) { + return chars; + } + const buf = []; + for (let ii = charsLength - 1; ii >= 0; ii--) { + buf.push(chars[ii]); + } + return buf.join(""); +} +const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"); +const CategoryCache = new Map(); +function getCharUnicodeCategory(char) { + const cachedCategory = CategoryCache.get(char); + if (cachedCategory) { + return cachedCategory; + } + const groups = char.match(SpecialCharRegExp); + const category = { + isWhitespace: !!(groups && groups[1]), + isZeroWidthDiacritic: !!(groups && groups[2]), + isInvisibleFormatMark: !!(groups && groups[3]) + }; + CategoryCache.set(char, category); + return category; +} +function clearUnicodeCaches() { + CategoryCache.clear(); +} + + +/***/ }), +/* 170 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getSerifFonts = exports.getNonStdFontMap = exports.getGlyphMapForStandardFonts = exports.getFontNameToFileMap = void 0; +exports.getStandardFontName = getStandardFontName; +exports.getSymbolsFonts = exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getStdFontMap = void 0; +var _core_utils = __w_pdfjs_require__(135); +var _fonts_utils = __w_pdfjs_require__(167); +const getStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) { + t["Times-Roman"] = "Times-Roman"; + t.Helvetica = "Helvetica"; + t.Courier = "Courier"; + t.Symbol = "Symbol"; + t["Times-Bold"] = "Times-Bold"; + t["Helvetica-Bold"] = "Helvetica-Bold"; + t["Courier-Bold"] = "Courier-Bold"; + t.ZapfDingbats = "ZapfDingbats"; + t["Times-Italic"] = "Times-Italic"; + t["Helvetica-Oblique"] = "Helvetica-Oblique"; + t["Courier-Oblique"] = "Courier-Oblique"; + t["Times-BoldItalic"] = "Times-BoldItalic"; + t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique"; + t["Courier-BoldOblique"] = "Courier-BoldOblique"; + t.ArialNarrow = "Helvetica"; + t["ArialNarrow-Bold"] = "Helvetica-Bold"; + t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialNarrow-Italic"] = "Helvetica-Oblique"; + t.ArialBlack = "Helvetica"; + t["ArialBlack-Bold"] = "Helvetica-Bold"; + t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialBlack-Italic"] = "Helvetica-Oblique"; + t["Arial-Black"] = "Helvetica"; + t["Arial-Black-Bold"] = "Helvetica-Bold"; + t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-Black-Italic"] = "Helvetica-Oblique"; + t.Arial = "Helvetica"; + t["Arial-Bold"] = "Helvetica-Bold"; + t["Arial-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-Italic"] = "Helvetica-Oblique"; + t.ArialMT = "Helvetica"; + t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT"] = "Helvetica-Bold"; + t["Arial-ItalicMT"] = "Helvetica-Oblique"; + t.ArialUnicodeMS = "Helvetica"; + t["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; + t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique"; + t["Courier-BoldItalic"] = "Courier-BoldOblique"; + t["Courier-Italic"] = "Courier-Oblique"; + t.CourierNew = "Courier"; + t["CourierNew-Bold"] = "Courier-Bold"; + t["CourierNew-BoldItalic"] = "Courier-BoldOblique"; + t["CourierNew-Italic"] = "Courier-Oblique"; + t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique"; + t["CourierNewPS-BoldMT"] = "Courier-Bold"; + t["CourierNewPS-ItalicMT"] = "Courier-Oblique"; + t.CourierNewPSMT = "Courier"; + t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique"; + t["Helvetica-Italic"] = "Helvetica-Oblique"; + t["Symbol-Bold"] = "Symbol"; + t["Symbol-BoldItalic"] = "Symbol"; + t["Symbol-Italic"] = "Symbol"; + t.TimesNewRoman = "Times-Roman"; + t["TimesNewRoman-Bold"] = "Times-Bold"; + t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRoman-Italic"] = "Times-Italic"; + t.TimesNewRomanPS = "Times-Roman"; + t["TimesNewRomanPS-Bold"] = "Times-Bold"; + t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic"; + t["TimesNewRomanPS-BoldMT"] = "Times-Bold"; + t["TimesNewRomanPS-Italic"] = "Times-Italic"; + t["TimesNewRomanPS-ItalicMT"] = "Times-Italic"; + t.TimesNewRomanPSMT = "Times-Roman"; + t["TimesNewRomanPSMT-Bold"] = "Times-Bold"; + t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic"; + t["TimesNewRomanPSMT-Italic"] = "Times-Italic"; +}); +exports.getStdFontMap = getStdFontMap; +const getFontNameToFileMap = (0, _core_utils.getLookupTableFactory)(function (t) { + t.Courier = "FoxitFixed.pfb"; + t["Courier-Bold"] = "FoxitFixedBold.pfb"; + t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb"; + t["Courier-Oblique"] = "FoxitFixedItalic.pfb"; + t.Helvetica = "FoxitSans.pfb"; + t["Helvetica-Bold"] = "FoxitSansBold.pfb"; + t["Helvetica-BoldOblique"] = "FoxitSansBoldItalic.pfb"; + t["Helvetica-Oblique"] = "FoxitSansItalic.pfb"; + t["Times-Roman"] = "FoxitSerif.pfb"; + t["Times-Bold"] = "FoxitSerifBold.pfb"; + t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb"; + t["Times-Italic"] = "FoxitSerifItalic.pfb"; + t.Symbol = "FoxitSymbol.pfb"; + t.ZapfDingbats = "FoxitDingbats.pfb"; + t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf"; + t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf"; + t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf"; + t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf"; +}); +exports.getFontNameToFileMap = getFontNameToFileMap; +const getNonStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) { + t.Calibri = "Helvetica"; + t["Calibri-Bold"] = "Helvetica-Bold"; + t["Calibri-BoldItalic"] = "Helvetica-BoldOblique"; + t["Calibri-Italic"] = "Helvetica-Oblique"; + t.CenturyGothic = "Helvetica"; + t["CenturyGothic-Bold"] = "Helvetica-Bold"; + t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique"; + t["CenturyGothic-Italic"] = "Helvetica-Oblique"; + t.ComicSansMS = "Comic Sans MS"; + t["ComicSansMS-Bold"] = "Comic Sans MS-Bold"; + t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic"; + t["ComicSansMS-Italic"] = "Comic Sans MS-Italic"; + t["ItcSymbol-Bold"] = "Helvetica-Bold"; + t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; + t["ItcSymbol-Book"] = "Helvetica"; + t["ItcSymbol-BookItalic"] = "Helvetica-Oblique"; + t["ItcSymbol-Medium"] = "Helvetica"; + t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique"; + t.LucidaConsole = "Courier"; + t["LucidaConsole-Bold"] = "Courier-Bold"; + t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique"; + t["LucidaConsole-Italic"] = "Courier-Oblique"; + t["LucidaSans-Demi"] = "Helvetica-Bold"; + t["MS-Gothic"] = "MS Gothic"; + t["MS-Gothic-Bold"] = "MS Gothic-Bold"; + t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic"; + t["MS-Gothic-Italic"] = "MS Gothic-Italic"; + t["MS-Mincho"] = "MS Mincho"; + t["MS-Mincho-Bold"] = "MS Mincho-Bold"; + t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic"; + t["MS-Mincho-Italic"] = "MS Mincho-Italic"; + t["MS-PGothic"] = "MS PGothic"; + t["MS-PGothic-Bold"] = "MS PGothic-Bold"; + t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic"; + t["MS-PGothic-Italic"] = "MS PGothic-Italic"; + t["MS-PMincho"] = "MS PMincho"; + t["MS-PMincho-Bold"] = "MS PMincho-Bold"; + t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic"; + t["MS-PMincho-Italic"] = "MS PMincho-Italic"; + t.NuptialScript = "Times-Italic"; + t.SegoeUISymbol = "Helvetica"; + t.Wingdings = "ZapfDingbats"; + t["Wingdings-Regular"] = "ZapfDingbats"; +}); +exports.getNonStdFontMap = getNonStdFontMap; +const getSerifFonts = (0, _core_utils.getLookupTableFactory)(function (t) { + t["Adobe Jenson"] = true; + t["Adobe Text"] = true; + t.Albertus = true; + t.Aldus = true; + t.Alexandria = true; + t.Algerian = true; + t["American Typewriter"] = true; + t.Antiqua = true; + t.Apex = true; + t.Arno = true; + t.Aster = true; + t.Aurora = true; + t.Baskerville = true; + t.Bell = true; + t.Bembo = true; + t["Bembo Schoolbook"] = true; + t.Benguiat = true; + t["Berkeley Old Style"] = true; + t["Bernhard Modern"] = true; + t["Berthold City"] = true; + t.Bodoni = true; + t["Bauer Bodoni"] = true; + t["Book Antiqua"] = true; + t.Bookman = true; + t["Bordeaux Roman"] = true; + t["Californian FB"] = true; + t.Calisto = true; + t.Calvert = true; + t.Capitals = true; + t.Cambria = true; + t.Cartier = true; + t.Caslon = true; + t.Catull = true; + t.Centaur = true; + t["Century Old Style"] = true; + t["Century Schoolbook"] = true; + t.Chaparral = true; + t["Charis SIL"] = true; + t.Cheltenham = true; + t["Cholla Slab"] = true; + t.Clarendon = true; + t.Clearface = true; + t.Cochin = true; + t.Colonna = true; + t["Computer Modern"] = true; + t["Concrete Roman"] = true; + t.Constantia = true; + t["Cooper Black"] = true; + t.Corona = true; + t.Ecotype = true; + t.Egyptienne = true; + t.Elephant = true; + t.Excelsior = true; + t.Fairfield = true; + t["FF Scala"] = true; + t.Folkard = true; + t.Footlight = true; + t.FreeSerif = true; + t["Friz Quadrata"] = true; + t.Garamond = true; + t.Gentium = true; + t.Georgia = true; + t.Gloucester = true; + t["Goudy Old Style"] = true; + t["Goudy Schoolbook"] = true; + t["Goudy Pro Font"] = true; + t.Granjon = true; + t["Guardian Egyptian"] = true; + t.Heather = true; + t.Hercules = true; + t["High Tower Text"] = true; + t.Hiroshige = true; + t["Hoefler Text"] = true; + t["Humana Serif"] = true; + t.Imprint = true; + t["Ionic No. 5"] = true; + t.Janson = true; + t.Joanna = true; + t.Korinna = true; + t.Lexicon = true; + t.LiberationSerif = true; + t["Liberation Serif"] = true; + t["Linux Libertine"] = true; + t.Literaturnaya = true; + t.Lucida = true; + t["Lucida Bright"] = true; + t.Melior = true; + t.Memphis = true; + t.Miller = true; + t.Minion = true; + t.Modern = true; + t["Mona Lisa"] = true; + t["Mrs Eaves"] = true; + t["MS Serif"] = true; + t["Museo Slab"] = true; + t["New York"] = true; + t["Nimbus Roman"] = true; + t["NPS Rawlinson Roadway"] = true; + t.NuptialScript = true; + t.Palatino = true; + t.Perpetua = true; + t.Plantin = true; + t["Plantin Schoolbook"] = true; + t.Playbill = true; + t["Poor Richard"] = true; + t["Rawlinson Roadway"] = true; + t.Renault = true; + t.Requiem = true; + t.Rockwell = true; + t.Roman = true; + t["Rotis Serif"] = true; + t.Sabon = true; + t.Scala = true; + t.Seagull = true; + t.Sistina = true; + t.Souvenir = true; + t.STIX = true; + t["Stone Informal"] = true; + t["Stone Serif"] = true; + t.Sylfaen = true; + t.Times = true; + t.Trajan = true; + t["Trinité"] = true; + t["Trump Mediaeval"] = true; + t.Utopia = true; + t["Vale Type"] = true; + t["Bitstream Vera"] = true; + t["Vera Serif"] = true; + t.Versailles = true; + t.Wanted = true; + t.Weiss = true; + t["Wide Latin"] = true; + t.Windsor = true; + t.XITS = true; +}); +exports.getSerifFonts = getSerifFonts; +const getSymbolsFonts = (0, _core_utils.getLookupTableFactory)(function (t) { + t.Dingbats = true; + t.Symbol = true; + t.ZapfDingbats = true; +}); +exports.getSymbolsFonts = getSymbolsFonts; +const getGlyphMapForStandardFonts = (0, _core_utils.getLookupTableFactory)(function (t) { + t[2] = 10; + t[3] = 32; + t[4] = 33; + t[5] = 34; + t[6] = 35; + t[7] = 36; + t[8] = 37; + t[9] = 38; + t[10] = 39; + t[11] = 40; + t[12] = 41; + t[13] = 42; + t[14] = 43; + t[15] = 44; + t[16] = 45; + t[17] = 46; + t[18] = 47; + t[19] = 48; + t[20] = 49; + t[21] = 50; + t[22] = 51; + t[23] = 52; + t[24] = 53; + t[25] = 54; + t[26] = 55; + t[27] = 56; + t[28] = 57; + t[29] = 58; + t[30] = 894; + t[31] = 60; + t[32] = 61; + t[33] = 62; + t[34] = 63; + t[35] = 64; + t[36] = 65; + t[37] = 66; + t[38] = 67; + t[39] = 68; + t[40] = 69; + t[41] = 70; + t[42] = 71; + t[43] = 72; + t[44] = 73; + t[45] = 74; + t[46] = 75; + t[47] = 76; + t[48] = 77; + t[49] = 78; + t[50] = 79; + t[51] = 80; + t[52] = 81; + t[53] = 82; + t[54] = 83; + t[55] = 84; + t[56] = 85; + t[57] = 86; + t[58] = 87; + t[59] = 88; + t[60] = 89; + t[61] = 90; + t[62] = 91; + t[63] = 92; + t[64] = 93; + t[65] = 94; + t[66] = 95; + t[67] = 96; + t[68] = 97; + t[69] = 98; + t[70] = 99; + t[71] = 100; + t[72] = 101; + t[73] = 102; + t[74] = 103; + t[75] = 104; + t[76] = 105; + t[77] = 106; + t[78] = 107; + t[79] = 108; + t[80] = 109; + t[81] = 110; + t[82] = 111; + t[83] = 112; + t[84] = 113; + t[85] = 114; + t[86] = 115; + t[87] = 116; + t[88] = 117; + t[89] = 118; + t[90] = 119; + t[91] = 120; + t[92] = 121; + t[93] = 122; + t[94] = 123; + t[95] = 124; + t[96] = 125; + t[97] = 126; + t[98] = 196; + t[99] = 197; + t[100] = 199; + t[101] = 201; + t[102] = 209; + t[103] = 214; + t[104] = 220; + t[105] = 225; + t[106] = 224; + t[107] = 226; + t[108] = 228; + t[109] = 227; + t[110] = 229; + t[111] = 231; + t[112] = 233; + t[113] = 232; + t[114] = 234; + t[115] = 235; + t[116] = 237; + t[117] = 236; + t[118] = 238; + t[119] = 239; + t[120] = 241; + t[121] = 243; + t[122] = 242; + t[123] = 244; + t[124] = 246; + t[125] = 245; + t[126] = 250; + t[127] = 249; + t[128] = 251; + t[129] = 252; + t[130] = 8224; + t[131] = 176; + t[132] = 162; + t[133] = 163; + t[134] = 167; + t[135] = 8226; + t[136] = 182; + t[137] = 223; + t[138] = 174; + t[139] = 169; + t[140] = 8482; + t[141] = 180; + t[142] = 168; + t[143] = 8800; + t[144] = 198; + t[145] = 216; + t[146] = 8734; + t[147] = 177; + t[148] = 8804; + t[149] = 8805; + t[150] = 165; + t[151] = 181; + t[152] = 8706; + t[153] = 8721; + t[154] = 8719; + t[156] = 8747; + t[157] = 170; + t[158] = 186; + t[159] = 8486; + t[160] = 230; + t[161] = 248; + t[162] = 191; + t[163] = 161; + t[164] = 172; + t[165] = 8730; + t[166] = 402; + t[167] = 8776; + t[168] = 8710; + t[169] = 171; + t[170] = 187; + t[171] = 8230; + t[179] = 8220; + t[180] = 8221; + t[181] = 8216; + t[182] = 8217; + t[200] = 193; + t[203] = 205; + t[210] = 218; + t[223] = 711; + t[224] = 321; + t[225] = 322; + t[226] = 352; + t[227] = 353; + t[228] = 381; + t[229] = 382; + t[233] = 221; + t[234] = 253; + t[252] = 263; + t[253] = 268; + t[254] = 269; + t[258] = 258; + t[260] = 260; + t[261] = 261; + t[265] = 280; + t[266] = 281; + t[267] = 282; + t[268] = 283; + t[269] = 313; + t[275] = 323; + t[276] = 324; + t[278] = 328; + t[283] = 344; + t[284] = 345; + t[285] = 346; + t[286] = 347; + t[292] = 367; + t[295] = 377; + t[296] = 378; + t[298] = 380; + t[305] = 963; + t[306] = 964; + t[307] = 966; + t[308] = 8215; + t[309] = 8252; + t[310] = 8319; + t[311] = 8359; + t[312] = 8592; + t[313] = 8593; + t[337] = 9552; + t[493] = 1039; + t[494] = 1040; + t[672] = 1488; + t[673] = 1489; + t[674] = 1490; + t[675] = 1491; + t[676] = 1492; + t[677] = 1493; + t[678] = 1494; + t[679] = 1495; + t[680] = 1496; + t[681] = 1497; + t[682] = 1498; + t[683] = 1499; + t[684] = 1500; + t[685] = 1501; + t[686] = 1502; + t[687] = 1503; + t[688] = 1504; + t[689] = 1505; + t[690] = 1506; + t[691] = 1507; + t[692] = 1508; + t[693] = 1509; + t[694] = 1510; + t[695] = 1511; + t[696] = 1512; + t[697] = 1513; + t[698] = 1514; + t[705] = 1524; + t[706] = 8362; + t[710] = 64288; + t[711] = 64298; + t[759] = 1617; + t[761] = 1776; + t[763] = 1778; + t[775] = 1652; + t[777] = 1764; + t[778] = 1780; + t[779] = 1781; + t[780] = 1782; + t[782] = 771; + t[783] = 64726; + t[786] = 8363; + t[788] = 8532; + t[790] = 768; + t[791] = 769; + t[792] = 768; + t[795] = 803; + t[797] = 64336; + t[798] = 64337; + t[799] = 64342; + t[800] = 64343; + t[801] = 64344; + t[802] = 64345; + t[803] = 64362; + t[804] = 64363; + t[805] = 64364; + t[2424] = 7821; + t[2425] = 7822; + t[2426] = 7823; + t[2427] = 7824; + t[2428] = 7825; + t[2429] = 7826; + t[2430] = 7827; + t[2433] = 7682; + t[2678] = 8045; + t[2679] = 8046; + t[2830] = 1552; + t[2838] = 686; + t[2840] = 751; + t[2842] = 753; + t[2843] = 754; + t[2844] = 755; + t[2846] = 757; + t[2856] = 767; + t[2857] = 848; + t[2858] = 849; + t[2862] = 853; + t[2863] = 854; + t[2864] = 855; + t[2865] = 861; + t[2866] = 862; + t[2906] = 7460; + t[2908] = 7462; + t[2909] = 7463; + t[2910] = 7464; + t[2912] = 7466; + t[2913] = 7467; + t[2914] = 7468; + t[2916] = 7470; + t[2917] = 7471; + t[2918] = 7472; + t[2920] = 7474; + t[2921] = 7475; + t[2922] = 7476; + t[2924] = 7478; + t[2925] = 7479; + t[2926] = 7480; + t[2928] = 7482; + t[2929] = 7483; + t[2930] = 7484; + t[2932] = 7486; + t[2933] = 7487; + t[2934] = 7488; + t[2936] = 7490; + t[2937] = 7491; + t[2938] = 7492; + t[2940] = 7494; + t[2941] = 7495; + t[2942] = 7496; + t[2944] = 7498; + t[2946] = 7500; + t[2948] = 7502; + t[2950] = 7504; + t[2951] = 7505; + t[2952] = 7506; + t[2954] = 7508; + t[2955] = 7509; + t[2956] = 7510; + t[2958] = 7512; + t[2959] = 7513; + t[2960] = 7514; + t[2962] = 7516; + t[2963] = 7517; + t[2964] = 7518; + t[2966] = 7520; + t[2967] = 7521; + t[2968] = 7522; + t[2970] = 7524; + t[2971] = 7525; + t[2972] = 7526; + t[2974] = 7528; + t[2975] = 7529; + t[2976] = 7530; + t[2978] = 1537; + t[2979] = 1538; + t[2980] = 1539; + t[2982] = 1549; + t[2983] = 1551; + t[2984] = 1552; + t[2986] = 1554; + t[2987] = 1555; + t[2988] = 1556; + t[2990] = 1623; + t[2991] = 1624; + t[2995] = 1775; + t[2999] = 1791; + t[3002] = 64290; + t[3003] = 64291; + t[3004] = 64292; + t[3006] = 64294; + t[3007] = 64295; + t[3008] = 64296; + t[3011] = 1900; + t[3014] = 8223; + t[3015] = 8244; + t[3017] = 7532; + t[3018] = 7533; + t[3019] = 7534; + t[3075] = 7590; + t[3076] = 7591; + t[3079] = 7594; + t[3080] = 7595; + t[3083] = 7598; + t[3084] = 7599; + t[3087] = 7602; + t[3088] = 7603; + t[3091] = 7606; + t[3092] = 7607; + t[3095] = 7610; + t[3096] = 7611; + t[3099] = 7614; + t[3100] = 7615; + t[3103] = 7618; + t[3104] = 7619; + t[3107] = 8337; + t[3108] = 8338; + t[3116] = 1884; + t[3119] = 1885; + t[3120] = 1885; + t[3123] = 1886; + t[3124] = 1886; + t[3127] = 1887; + t[3128] = 1887; + t[3131] = 1888; + t[3132] = 1888; + t[3135] = 1889; + t[3136] = 1889; + t[3139] = 1890; + t[3140] = 1890; + t[3143] = 1891; + t[3144] = 1891; + t[3147] = 1892; + t[3148] = 1892; + t[3153] = 580; + t[3154] = 581; + t[3157] = 584; + t[3158] = 585; + t[3161] = 588; + t[3162] = 589; + t[3165] = 891; + t[3166] = 892; + t[3169] = 1274; + t[3170] = 1275; + t[3173] = 1278; + t[3174] = 1279; + t[3181] = 7622; + t[3182] = 7623; + t[3282] = 11799; + t[3316] = 578; + t[3379] = 42785; + t[3393] = 1159; + t[3416] = 8377; +}); +exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts; +const getSupplementalGlyphMapForArialBlack = (0, _core_utils.getLookupTableFactory)(function (t) { + t[227] = 322; + t[264] = 261; + t[291] = 346; +}); +exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack; +const getSupplementalGlyphMapForCalibri = (0, _core_utils.getLookupTableFactory)(function (t) { + t[1] = 32; + t[4] = 65; + t[5] = 192; + t[6] = 193; + t[9] = 196; + t[17] = 66; + t[18] = 67; + t[21] = 268; + t[24] = 68; + t[28] = 69; + t[29] = 200; + t[30] = 201; + t[32] = 282; + t[38] = 70; + t[39] = 71; + t[44] = 72; + t[47] = 73; + t[48] = 204; + t[49] = 205; + t[58] = 74; + t[60] = 75; + t[62] = 76; + t[68] = 77; + t[69] = 78; + t[75] = 79; + t[76] = 210; + t[80] = 214; + t[87] = 80; + t[89] = 81; + t[90] = 82; + t[92] = 344; + t[94] = 83; + t[97] = 352; + t[100] = 84; + t[104] = 85; + t[109] = 220; + t[115] = 86; + t[116] = 87; + t[121] = 88; + t[122] = 89; + t[124] = 221; + t[127] = 90; + t[129] = 381; + t[258] = 97; + t[259] = 224; + t[260] = 225; + t[263] = 228; + t[268] = 261; + t[271] = 98; + t[272] = 99; + t[273] = 263; + t[275] = 269; + t[282] = 100; + t[286] = 101; + t[287] = 232; + t[288] = 233; + t[290] = 283; + t[295] = 281; + t[296] = 102; + t[336] = 103; + t[346] = 104; + t[349] = 105; + t[350] = 236; + t[351] = 237; + t[361] = 106; + t[364] = 107; + t[367] = 108; + t[371] = 322; + t[373] = 109; + t[374] = 110; + t[381] = 111; + t[382] = 242; + t[383] = 243; + t[386] = 246; + t[393] = 112; + t[395] = 113; + t[396] = 114; + t[398] = 345; + t[400] = 115; + t[401] = 347; + t[403] = 353; + t[410] = 116; + t[437] = 117; + t[442] = 252; + t[448] = 118; + t[449] = 119; + t[454] = 120; + t[455] = 121; + t[457] = 253; + t[460] = 122; + t[462] = 382; + t[463] = 380; + t[853] = 44; + t[855] = 58; + t[856] = 46; + t[876] = 47; + t[878] = 45; + t[882] = 45; + t[894] = 40; + t[895] = 41; + t[896] = 91; + t[897] = 93; + t[923] = 64; + t[1004] = 48; + t[1005] = 49; + t[1006] = 50; + t[1007] = 51; + t[1008] = 52; + t[1009] = 53; + t[1010] = 54; + t[1011] = 55; + t[1012] = 56; + t[1013] = 57; + t[1081] = 37; + t[1085] = 43; + t[1086] = 45; +}); +exports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri; +function getStandardFontName(name) { + const fontName = (0, _fonts_utils.normalizeFontName)(name); + const stdFontMap = getStdFontMap(); + return stdFontMap[fontName]; +} + +/***/ }), +/* 171 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ToUnicodeMap = exports.IdentityToUnicodeMap = void 0; +var _util = __w_pdfjs_require__(2); +class ToUnicodeMap { + constructor() { + let cmap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + this._map = cmap; + } + get length() { + return this._map.length; + } + forEach(callback) { + for (const charCode in this._map) { + callback(charCode, this._map[charCode].charCodeAt(0)); + } + } + has(i) { + return this._map[i] !== undefined; + } + get(i) { + return this._map[i]; + } + charCodeOf(value) { + const map = this._map; + if (map.length <= 0x10000) { + return map.indexOf(value); + } + for (const charCode in map) { + if (map[charCode] === value) { + return charCode | 0; + } + } + return -1; + } + amend(map) { + for (const charCode in map) { + this._map[charCode] = map[charCode]; + } + } +} +exports.ToUnicodeMap = ToUnicodeMap; +class IdentityToUnicodeMap { + constructor(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; + } + get length() { + return this.lastChar + 1 - this.firstChar; + } + forEach(callback) { + for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } + } + has(i) { + return this.firstChar <= i && i <= this.lastChar; + } + get(i) { + if (this.firstChar <= i && i <= this.lastChar) { + return String.fromCharCode(i); + } + return undefined; + } + charCodeOf(v) { + return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1; + } + amend(map) { + (0, _util.unreachable)("Should not call amend()"); + } +} +exports.IdentityToUnicodeMap = IdentityToUnicodeMap; + +/***/ }), +/* 172 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.CFFFont = void 0; +var _cff_parser = __w_pdfjs_require__(164); +var _fonts_utils = __w_pdfjs_require__(167); +var _util = __w_pdfjs_require__(2); +class CFFFont { + constructor(file, properties) { + this.properties = properties; + const parser = new _cff_parser.CFFParser(file, properties, _fonts_utils.SEAC_ANALYSIS_ENABLED); + this.cff = parser.parse(); + this.cff.duplicateFirstGlyph(); + const compiler = new _cff_parser.CFFCompiler(this.cff); + this.seacs = this.cff.seacs; + try { + this.data = compiler.compile(); + } catch (e) { + (0, _util.warn)("Failed to compile font " + properties.loadedName); + this.data = file; + } + this._createBuiltInEncoding(); + } + get numGlyphs() { + return this.cff.charStrings.count; + } + getCharset() { + return this.cff.charset.charset; + } + getGlyphMapping() { + const cff = this.cff; + const properties = this.properties; + const { + cidToGidMap, + cMap + } = properties; + const charsets = cff.charset.charset; + let charCodeToGlyphId; + let glyphId; + if (properties.composite) { + let invCidToGidMap; + if (cidToGidMap && cidToGidMap.length > 0) { + invCidToGidMap = Object.create(null); + for (let i = 0, ii = cidToGidMap.length; i < ii; i++) { + const gid = cidToGidMap[i]; + if (gid !== undefined) { + invCidToGidMap[gid] = i; + } + } + } + charCodeToGlyphId = Object.create(null); + let charCode; + if (cff.isCIDFont) { + for (glyphId = 0; glyphId < charsets.length; glyphId++) { + const cid = charsets[glyphId]; + charCode = cMap.charCodeOf(cid); + if (invCidToGidMap && invCidToGidMap[charCode] !== undefined) { + charCode = invCidToGidMap[charCode]; + } + charCodeToGlyphId[charCode] = glyphId; + } + } else { + for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { + charCode = cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId; + } + } + return charCodeToGlyphId; + } + let encoding = cff.encoding ? cff.encoding.encoding : null; + if (properties.isInternalFont) { + encoding = properties.defaultEncoding; + } + charCodeToGlyphId = (0, _fonts_utils.type1FontGlyphMapping)(properties, encoding, charsets); + return charCodeToGlyphId; + } + hasGlyphId(id) { + return this.cff.hasGlyphId(id); + } + _createBuiltInEncoding() { + const { + charset, + encoding + } = this.cff; + if (!charset || !encoding) { + return; + } + const charsets = charset.charset, + encodings = encoding.encoding; + const map = []; + for (const charCode in encodings) { + const glyphId = encodings[charCode]; + if (glyphId >= 0) { + const glyphName = charsets[glyphId]; + if (glyphName) { + map[charCode] = glyphName; + } + } + } + if (map.length > 0) { + this.properties.builtInEncoding = map; + } + } +} +exports.CFFFont = CFFFont; + +/***/ }), +/* 173 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.FontRendererFactory = void 0; +var _util = __w_pdfjs_require__(2); +var _cff_parser = __w_pdfjs_require__(164); +var _glyphlist = __w_pdfjs_require__(168); +var _encodings = __w_pdfjs_require__(166); +var _stream = __w_pdfjs_require__(139); +function getUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; +} +function getUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; +} +function getInt16(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16) >> 16; +} +function getInt8(data, offset) { + return data[offset] << 24 >> 24; +} +function getFloat214(data, offset) { + return getInt16(data, offset) / 16384; +} +function getSubroutineBias(subrs) { + const numSubrs = subrs.length; + let bias = 32768; + if (numSubrs < 1240) { + bias = 107; + } else if (numSubrs < 33900) { + bias = 1131; + } + return bias; +} +function parseCmap(data, start, end) { + const offset = getUint16(data, start + 2) === 1 ? getUint32(data, start + 8) : getUint32(data, start + 16); + const format = getUint16(data, start + offset); + let ranges, p, i; + if (format === 4) { + getUint16(data, start + offset + 2); + const segCount = getUint16(data, start + offset + 6) >> 1; + p = start + offset + 14; + ranges = []; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i] = { + end: getUint16(data, p) + }; + } + p += 2; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].start = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].idDelta = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + let idOffset = getUint16(data, p); + if (idOffset === 0) { + continue; + } + ranges[i].ids = []; + for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { + ranges[i].ids[j] = getUint16(data, p + idOffset); + idOffset += 2; + } + } + return ranges; + } else if (format === 12) { + const groups = getUint32(data, start + offset + 12); + p = start + offset + 16; + ranges = []; + for (i = 0; i < groups; i++) { + start = getUint32(data, p); + ranges.push({ + start, + end: getUint32(data, p + 4), + idDelta: getUint32(data, p + 8) - start + }); + p += 12; + } + return ranges; + } + throw new _util.FormatError(`unsupported cmap: ${format}`); +} +function parseCff(data, start, end, seacAnalysisEnabled) { + const properties = {}; + const parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, seacAnalysisEnabled); + const cff = parser.parse(); + return { + glyphs: cff.charStrings.objects, + subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects, + gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects, + isCFFCIDFont: cff.isCIDFont, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray + }; +} +function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { + let itemSize, itemDecode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = getUint32; + } else { + itemSize = 2; + itemDecode = (data, offset) => 2 * getUint16(data, offset); + } + const glyphs = []; + let startOffset = itemDecode(loca, 0); + for (let j = itemSize; j < loca.length; j += itemSize) { + const endOffset = itemDecode(loca, j); + glyphs.push(glyf.subarray(startOffset, endOffset)); + startOffset = endOffset; + } + return glyphs; +} +function lookupCmap(ranges, unicode) { + const code = unicode.codePointAt(0); + let gid = 0, + l = 0, + r = ranges.length - 1; + while (l < r) { + const c = l + r + 1 >> 1; + if (code < ranges[c].start) { + r = c - 1; + } else { + l = c; + } + } + if (ranges[l].start <= code && code <= ranges[l].end) { + gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff; + } + return { + charCode: code, + glyphId: gid + }; +} +function compileGlyf(code, cmds, font) { + function moveTo(x, y) { + cmds.push({ + cmd: "moveTo", + args: [x, y] + }); + } + function lineTo(x, y) { + cmds.push({ + cmd: "lineTo", + args: [x, y] + }); + } + function quadraticCurveTo(xa, ya, x, y) { + cmds.push({ + cmd: "quadraticCurveTo", + args: [xa, ya, x, y] + }); + } + let i = 0; + const numberOfContours = getInt16(code, i); + let flags; + let x = 0, + y = 0; + i += 10; + if (numberOfContours < 0) { + do { + flags = getUint16(code, i); + const glyphIndex = getUint16(code, i + 2); + i += 4; + let arg1, arg2; + if (flags & 0x01) { + if (flags & 0x02) { + arg1 = getInt16(code, i); + arg2 = getInt16(code, i + 2); + } else { + arg1 = getUint16(code, i); + arg2 = getUint16(code, i + 2); + } + i += 4; + } else { + if (flags & 0x02) { + arg1 = getInt8(code, i++); + arg2 = getInt8(code, i++); + } else { + arg1 = code[i++]; + arg2 = code[i++]; + } + } + if (flags & 0x02) { + x = arg1; + y = arg2; + } else { + x = 0; + y = 0; + } + let scaleX = 1, + scaleY = 1, + scale01 = 0, + scale10 = 0; + if (flags & 0x08) { + scaleX = scaleY = getFloat214(code, i); + i += 2; + } else if (flags & 0x40) { + scaleX = getFloat214(code, i); + scaleY = getFloat214(code, i + 2); + i += 4; + } else if (flags & 0x80) { + scaleX = getFloat214(code, i); + scale01 = getFloat214(code, i + 2); + scale10 = getFloat214(code, i + 4); + scaleY = getFloat214(code, i + 6); + i += 8; + } + const subglyph = font.glyphs[glyphIndex]; + if (subglyph) { + cmds.push({ + cmd: "save" + }, { + cmd: "transform", + args: [scaleX, scale01, scale10, scaleY, x, y] + }); + if (!(flags & 0x02)) {} + compileGlyf(subglyph, cmds, font); + cmds.push({ + cmd: "restore" + }); + } + } while (flags & 0x20); + } else { + const endPtsOfContours = []; + let j, jj; + for (j = 0; j < numberOfContours; j++) { + endPtsOfContours.push(getUint16(code, i)); + i += 2; + } + const instructionLength = getUint16(code, i); + i += 2 + instructionLength; + const numberOfPoints = endPtsOfContours.at(-1) + 1; + const points = []; + while (points.length < numberOfPoints) { + flags = code[i++]; + let repeat = 1; + if (flags & 0x08) { + repeat += code[i++]; + } + while (repeat-- > 0) { + points.push({ + flags + }); + } + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x12) { + case 0x00: + x += getInt16(code, i); + i += 2; + break; + case 0x02: + x -= code[i++]; + break; + case 0x12: + x += code[i++]; + break; + } + points[j].x = x; + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x24) { + case 0x00: + y += getInt16(code, i); + i += 2; + break; + case 0x04: + y -= code[i++]; + break; + case 0x24: + y += code[i++]; + break; + } + points[j].y = y; + } + let startPoint = 0; + for (i = 0; i < numberOfContours; i++) { + const endPoint = endPtsOfContours[i]; + const contour = points.slice(startPoint, endPoint + 1); + if (contour[0].flags & 1) { + contour.push(contour[0]); + } else if (contour.at(-1).flags & 1) { + contour.unshift(contour.at(-1)); + } else { + const p = { + flags: 1, + x: (contour[0].x + contour.at(-1).x) / 2, + y: (contour[0].y + contour.at(-1).y) / 2 + }; + contour.unshift(p); + contour.push(p); + } + moveTo(contour[0].x, contour[0].y); + for (j = 1, jj = contour.length; j < jj; j++) { + if (contour[j].flags & 1) { + lineTo(contour[j].x, contour[j].y); + } else if (contour[j + 1].flags & 1) { + quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); + j++; + } else { + quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); + } + } + startPoint = endPoint + 1; + } + } +} +function compileCharString(charStringCode, cmds, font, glyphId) { + function moveTo(x, y) { + cmds.push({ + cmd: "moveTo", + args: [x, y] + }); + } + function lineTo(x, y) { + cmds.push({ + cmd: "lineTo", + args: [x, y] + }); + } + function bezierCurveTo(x1, y1, x2, y2, x, y) { + cmds.push({ + cmd: "bezierCurveTo", + args: [x1, y1, x2, y2, x, y] + }); + } + const stack = []; + let x = 0, + y = 0; + let stems = 0; + function parse(code) { + let i = 0; + while (i < code.length) { + let stackClean = false; + let v = code[i++]; + let xa, xb, ya, yb, y1, y2, y3, n, subrCode; + switch (v) { + case 1: + stems += stack.length >> 1; + stackClean = true; + break; + case 3: + stems += stack.length >> 1; + stackClean = true; + break; + case 4: + y += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 5: + while (stack.length > 0) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + break; + case 6: + while (stack.length > 0) { + x += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + y += stack.shift(); + lineTo(x, y); + } + break; + case 7: + while (stack.length > 0) { + y += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + x += stack.shift(); + lineTo(x, y); + } + break; + case 8: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 10: + n = stack.pop(); + subrCode = null; + if (font.isCFFCIDFont) { + const fdIndex = font.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < font.fdArray.length) { + const fontDict = font.fdArray[fdIndex]; + let subrs; + if (fontDict.privateDict && fontDict.privateDict.subrsIndex) { + subrs = fontDict.privateDict.subrsIndex.objects; + } + if (subrs) { + n += getSubroutineBias(subrs); + subrCode = subrs[n]; + } + } else { + (0, _util.warn)("Invalid fd index for glyph index."); + } + } else { + subrCode = font.subrs[n + font.subrsBias]; + } + if (subrCode) { + parse(subrCode); + } + break; + case 11: + return; + case 12: + v = code[i++]; + switch (v) { + case 34: + xa = x + stack.shift(); + xb = xa + stack.shift(); + y1 = y + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y, xb, y1, x, y1); + xa = x + stack.shift(); + xb = xa + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y, x, y); + break; + case 35: + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + stack.pop(); + break; + case 36: + xa = x + stack.shift(); + y1 = y + stack.shift(); + xb = xa + stack.shift(); + y2 = y1 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y2, x, y2); + xa = x + stack.shift(); + xb = xa + stack.shift(); + y3 = y2 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y2, xb, y3, x, y); + break; + case 37: + const x0 = x, + y0 = y; + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb; + if (Math.abs(x - x0) > Math.abs(y - y0)) { + x += stack.shift(); + } else { + y += stack.shift(); + } + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + default: + throw new _util.FormatError(`unknown operator: 12 ${v}`); + } + break; + case 14: + if (stack.length >= 4) { + const achar = stack.pop(); + const bchar = stack.pop(); + y = stack.pop(); + x = stack.pop(); + cmds.push({ + cmd: "save" + }, { + cmd: "translate", + args: [x, y] + }); + let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + cmds.push({ + cmd: "restore" + }); + cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); + } + return; + case 18: + stems += stack.length >> 1; + stackClean = true; + break; + case 19: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 20: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 21: + y += stack.pop(); + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 22: + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 23: + stems += stack.length >> 1; + stackClean = true; + break; + case 24: + while (stack.length > 2) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + break; + case 25: + while (stack.length > 6) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + case 26: + if (stack.length % 2) { + x += stack.shift(); + } + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 27: + if (stack.length % 2) { + y += stack.shift(); + } + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb; + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 28: + stack.push((code[i] << 24 | code[i + 1] << 16) >> 16); + i += 2; + break; + case 29: + n = stack.pop() + font.gsubrsBias; + subrCode = font.gsubrs[n]; + if (subrCode) { + parse(subrCode); + } + break; + case 30: + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 31: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + default: + if (v < 32) { + throw new _util.FormatError(`unknown operator: ${v}`); + } + if (v < 247) { + stack.push(v - 139); + } else if (v < 251) { + stack.push((v - 247) * 256 + code[i++] + 108); + } else if (v < 255) { + stack.push(-(v - 251) * 256 - code[i++] - 108); + } else { + stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536); + i += 4; + } + break; + } + if (stackClean) { + stack.length = 0; + } + } + } + parse(charStringCode); +} +const NOOP = []; +class CompiledFont { + constructor(fontMatrix) { + if (this.constructor === CompiledFont) { + (0, _util.unreachable)("Cannot initialize CompiledFont."); + } + this.fontMatrix = fontMatrix; + this.compiledGlyphs = Object.create(null); + this.compiledCharCodeToGlyphId = Object.create(null); + } + getPathJs(unicode) { + const { + charCode, + glyphId + } = lookupCmap(this.cmap, unicode); + let fn = this.compiledGlyphs[glyphId]; + if (!fn) { + try { + fn = this.compileGlyph(this.glyphs[glyphId], glyphId); + this.compiledGlyphs[glyphId] = fn; + } catch (ex) { + this.compiledGlyphs[glyphId] = NOOP; + if (this.compiledCharCodeToGlyphId[charCode] === undefined) { + this.compiledCharCodeToGlyphId[charCode] = glyphId; + } + throw ex; + } + } + if (this.compiledCharCodeToGlyphId[charCode] === undefined) { + this.compiledCharCodeToGlyphId[charCode] = glyphId; + } + return fn; + } + compileGlyph(code, glyphId) { + if (!code || code.length === 0 || code[0] === 14) { + return NOOP; + } + let fontMatrix = this.fontMatrix; + if (this.isCFFCIDFont) { + const fdIndex = this.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < this.fdArray.length) { + const fontDict = this.fdArray[fdIndex]; + fontMatrix = fontDict.getByName("FontMatrix") || _util.FONT_IDENTITY_MATRIX; + } else { + (0, _util.warn)("Invalid fd index for glyph index."); + } + } + const cmds = [{ + cmd: "save" + }, { + cmd: "transform", + args: fontMatrix.slice() + }, { + cmd: "scale", + args: ["size", "-size"] + }]; + this.compileGlyphImpl(code, cmds, glyphId); + cmds.push({ + cmd: "restore" + }); + return cmds; + } + compileGlyphImpl() { + (0, _util.unreachable)("Children classes should implement this."); + } + hasBuiltPath(unicode) { + const { + charCode, + glyphId + } = lookupCmap(this.cmap, unicode); + return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== undefined; + } +} +class TrueTypeCompiled extends CompiledFont { + constructor(glyphs, cmap, fontMatrix) { + super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]); + this.glyphs = glyphs; + this.cmap = cmap; + } + compileGlyphImpl(code, cmds) { + compileGlyf(code, cmds, this); + } +} +class Type2Compiled extends CompiledFont { + constructor(cffInfo, cmap, fontMatrix, glyphNameMap) { + super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]); + this.glyphs = cffInfo.glyphs; + this.gsubrs = cffInfo.gsubrs || []; + this.subrs = cffInfo.subrs || []; + this.cmap = cmap; + this.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)(); + this.gsubrsBias = getSubroutineBias(this.gsubrs); + this.subrsBias = getSubroutineBias(this.subrs); + this.isCFFCIDFont = cffInfo.isCFFCIDFont; + this.fdSelect = cffInfo.fdSelect; + this.fdArray = cffInfo.fdArray; + } + compileGlyphImpl(code, cmds, glyphId) { + compileCharString(code, cmds, this, glyphId); + } +} +class FontRendererFactory { + static create(font, seacAnalysisEnabled) { + const data = new Uint8Array(font.data); + let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; + const numTables = getUint16(data, 4); + for (let i = 0, p = 12; i < numTables; i++, p += 16) { + const tag = (0, _util.bytesToString)(data.subarray(p, p + 4)); + const offset = getUint32(data, p + 8); + const length = getUint32(data, p + 12); + switch (tag) { + case "cmap": + cmap = parseCmap(data, offset, offset + length); + break; + case "glyf": + glyf = data.subarray(offset, offset + length); + break; + case "loca": + loca = data.subarray(offset, offset + length); + break; + case "head": + unitsPerEm = getUint16(data, offset + 18); + indexToLocFormat = getUint16(data, offset + 50); + break; + case "CFF ": + cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); + break; + } + } + if (glyf) { + const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; + return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); + } + return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); + } +} +exports.FontRendererFactory = FontRendererFactory; + +/***/ }), +/* 174 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getMetrics = exports.getFontBasicMetrics = void 0; +var _core_utils = __w_pdfjs_require__(135); +const getMetrics = (0, _core_utils.getLookupTableFactory)(function (t) { + t.Courier = 600; + t["Courier-Bold"] = 600; + t["Courier-BoldOblique"] = 600; + t["Courier-Oblique"] = 600; + t.Helvetica = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-Bold"] = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-BoldOblique"] = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-Oblique"] = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t.Symbol = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 250; + t.exclam = 333; + t.universal = 713; + t.numbersign = 500; + t.existential = 549; + t.percent = 833; + t.ampersand = 778; + t.suchthat = 439; + t.parenleft = 333; + t.parenright = 333; + t.asteriskmath = 500; + t.plus = 549; + t.comma = 250; + t.minus = 549; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 549; + t.equal = 549; + t.greater = 549; + t.question = 444; + t.congruent = 549; + t.Alpha = 722; + t.Beta = 667; + t.Chi = 722; + t.Delta = 612; + t.Epsilon = 611; + t.Phi = 763; + t.Gamma = 603; + t.Eta = 722; + t.Iota = 333; + t.theta1 = 631; + t.Kappa = 722; + t.Lambda = 686; + t.Mu = 889; + t.Nu = 722; + t.Omicron = 722; + t.Pi = 768; + t.Theta = 741; + t.Rho = 556; + t.Sigma = 592; + t.Tau = 611; + t.Upsilon = 690; + t.sigma1 = 439; + t.Omega = 768; + t.Xi = 645; + t.Psi = 795; + t.Zeta = 611; + t.bracketleft = 333; + t.therefore = 863; + t.bracketright = 333; + t.perpendicular = 658; + t.underscore = 500; + t.radicalex = 500; + t.alpha = 631; + t.beta = 549; + t.chi = 549; + t.delta = 494; + t.epsilon = 439; + t.phi = 521; + t.gamma = 411; + t.eta = 603; + t.iota = 329; + t.phi1 = 603; + t.kappa = 549; + t.lambda = 549; + t.mu = 576; + t.nu = 521; + t.omicron = 549; + t.pi = 549; + t.theta = 521; + t.rho = 549; + t.sigma = 603; + t.tau = 439; + t.upsilon = 576; + t.omega1 = 713; + t.omega = 686; + t.xi = 493; + t.psi = 686; + t.zeta = 494; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.similar = 549; + t.Euro = 750; + t.Upsilon1 = 620; + t.minute = 247; + t.lessequal = 549; + t.fraction = 167; + t.infinity = 713; + t.florin = 500; + t.club = 753; + t.diamond = 753; + t.heart = 753; + t.spade = 753; + t.arrowboth = 1042; + t.arrowleft = 987; + t.arrowup = 603; + t.arrowright = 987; + t.arrowdown = 603; + t.degree = 400; + t.plusminus = 549; + t.second = 411; + t.greaterequal = 549; + t.multiply = 549; + t.proportional = 713; + t.partialdiff = 494; + t.bullet = 460; + t.divide = 549; + t.notequal = 549; + t.equivalence = 549; + t.approxequal = 549; + t.ellipsis = 1000; + t.arrowvertex = 603; + t.arrowhorizex = 1000; + t.carriagereturn = 658; + t.aleph = 823; + t.Ifraktur = 686; + t.Rfraktur = 795; + t.weierstrass = 987; + t.circlemultiply = 768; + t.circleplus = 768; + t.emptyset = 823; + t.intersection = 768; + t.union = 768; + t.propersuperset = 713; + t.reflexsuperset = 713; + t.notsubset = 713; + t.propersubset = 713; + t.reflexsubset = 713; + t.element = 713; + t.notelement = 713; + t.angle = 768; + t.gradient = 713; + t.registerserif = 790; + t.copyrightserif = 790; + t.trademarkserif = 890; + t.product = 823; + t.radical = 549; + t.dotmath = 250; + t.logicalnot = 713; + t.logicaland = 603; + t.logicalor = 603; + t.arrowdblboth = 1042; + t.arrowdblleft = 987; + t.arrowdblup = 603; + t.arrowdblright = 987; + t.arrowdbldown = 603; + t.lozenge = 494; + t.angleleft = 329; + t.registersans = 790; + t.copyrightsans = 790; + t.trademarksans = 786; + t.summation = 713; + t.parenlefttp = 384; + t.parenleftex = 384; + t.parenleftbt = 384; + t.bracketlefttp = 384; + t.bracketleftex = 384; + t.bracketleftbt = 384; + t.bracelefttp = 494; + t.braceleftmid = 494; + t.braceleftbt = 494; + t.braceex = 494; + t.angleright = 329; + t.integral = 274; + t.integraltp = 686; + t.integralex = 686; + t.integralbt = 686; + t.parenrighttp = 384; + t.parenrightex = 384; + t.parenrightbt = 384; + t.bracketrighttp = 384; + t.bracketrightex = 384; + t.bracketrightbt = 384; + t.bracerighttp = 494; + t.bracerightmid = 494; + t.bracerightbt = 494; + t.apple = 790; + }); + t["Times-Roman"] = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 408; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 564; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 564; + t.equal = 564; + t.greater = 564; + t.question = 444; + t.at = 921; + t.A = 722; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 556; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 389; + t.K = 722; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 556; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 722; + t.W = 944; + t.X = 722; + t.Y = 722; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 469; + t.underscore = 500; + t.quoteleft = 333; + t.a = 444; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 333; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.asciitilde = 541; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 180; + t.quotedblleft = 444; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 453; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 444; + t.quotedblright = 444; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 444; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 889; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 444; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 564; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 444; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 444; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 444; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 444; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 444; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 444; + t.Amacron = 722; + t.rcaron = 333; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 556; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 588; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 564; + t.uacute = 500; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 444; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 722; + t.Iacute = 333; + t.plusminus = 564; + t.brokenbar = 200; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 333; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 326; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 444; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 344; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 722; + t.zdotaccent = 444; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 500; + t.minus = 564; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 564; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Bold"] = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 1000; + t.ampersand = 833; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 930; + t.A = 722; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 778; + t.L = 667; + t.M = 944; + t.N = 722; + t.O = 778; + t.P = 611; + t.Q = 778; + t.R = 722; + t.S = 556; + t.T = 667; + t.U = 722; + t.V = 722; + t.W = 1000; + t.X = 722; + t.Y = 722; + t.Z = 667; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 581; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 556; + t.c = 444; + t.d = 556; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 333; + t.k = 556; + t.l = 278; + t.m = 833; + t.n = 556; + t.o = 500; + t.p = 556; + t.q = 556; + t.r = 444; + t.s = 389; + t.t = 333; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 394; + t.bar = 220; + t.braceright = 394; + t.asciitilde = 520; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 540; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 300; + t.Lslash = 667; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 330; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 556; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 570; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 667; + t.Cacute = 722; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 722; + t.rcaron = 444; + t.ccedilla = 444; + t.Zdotaccent = 667; + t.Thorn = 611; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 556; + t.dcaron = 672; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 667; + t.partialdiff = 494; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 778; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 444; + t.omacron = 500; + t.Zacute = 667; + t.Zcaron = 667; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 416; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 300; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 394; + t.Kcommaaccent = 778; + t.Lacute = 667; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 667; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 444; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 722; + t.Lcommaaccent = 667; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 444; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 556; + t.minus = 570; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 333; + t.logicalnot = 570; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-BoldItalic"] = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 250; + t.exclam = 389; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 832; + t.A = 667; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 667; + t.F = 667; + t.G = 722; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 667; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 889; + t.X = 667; + t.Y = 611; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 570; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 556; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 556; + t.v = 444; + t.w = 667; + t.x = 500; + t.y = 444; + t.z = 389; + t.braceleft = 348; + t.bar = 220; + t.braceright = 348; + t.asciitilde = 570; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 500; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 944; + t.ordfeminine = 266; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 300; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 611; + t.divide = 570; + t.Yacute = 611; + t.Acircumflex = 667; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 667; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 608; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 444; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 722; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 366; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 576; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 382; + t.Kcommaaccent = 667; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 500; + t.minus = 606; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 606; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Italic"] = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 420; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 675; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 675; + t.equal = 675; + t.greater = 675; + t.question = 500; + t.at = 920; + t.A = 611; + t.B = 611; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 611; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 444; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 667; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 611; + t.S = 500; + t.T = 556; + t.U = 722; + t.V = 611; + t.W = 833; + t.X = 611; + t.Y = 556; + t.Z = 556; + t.bracketleft = 389; + t.backslash = 278; + t.bracketright = 389; + t.asciicircum = 422; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 278; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 444; + t.l = 278; + t.m = 722; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 444; + t.w = 667; + t.x = 444; + t.y = 444; + t.z = 389; + t.braceleft = 400; + t.bar = 275; + t.braceright = 400; + t.asciitilde = 541; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 214; + t.quotedblleft = 556; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 523; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 556; + t.quotedblright = 556; + t.guillemotright = 500; + t.ellipsis = 889; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 889; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 556; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 667; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 556; + t.divide = 675; + t.Yacute = 556; + t.Acircumflex = 611; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 667; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 556; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 611; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 500; + t.Amacron = 611; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 556; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 611; + t.Sacute = 500; + t.dcaron = 544; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 611; + t.Abreve = 611; + t.multiply = 675; + t.uacute = 500; + t.Tcaron = 556; + t.partialdiff = 476; + t.ydieresis = 444; + t.Nacute = 667; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 667; + t.Iacute = 333; + t.plusminus = 675; + t.brokenbar = 275; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 389; + t.omacron = 500; + t.Zacute = 556; + t.Zcaron = 556; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 300; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 611; + t.Adieresis = 611; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 500; + t.lcaron = 300; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 500; + t.Scommaaccent = 500; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 667; + t.otilde = 500; + t.Rcommaaccent = 611; + t.Lcommaaccent = 556; + t.Atilde = 611; + t.Aogonek = 611; + t.Aring = 611; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 444; + t.minus = 675; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 675; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t.ZapfDingbats = (0, _core_utils.getLookupTableFactory)(function (t) { + t.space = 278; + t.a1 = 974; + t.a2 = 961; + t.a202 = 974; + t.a3 = 980; + t.a4 = 719; + t.a5 = 789; + t.a119 = 790; + t.a118 = 791; + t.a117 = 690; + t.a11 = 960; + t.a12 = 939; + t.a13 = 549; + t.a14 = 855; + t.a15 = 911; + t.a16 = 933; + t.a105 = 911; + t.a17 = 945; + t.a18 = 974; + t.a19 = 755; + t.a20 = 846; + t.a21 = 762; + t.a22 = 761; + t.a23 = 571; + t.a24 = 677; + t.a25 = 763; + t.a26 = 760; + t.a27 = 759; + t.a28 = 754; + t.a6 = 494; + t.a7 = 552; + t.a8 = 537; + t.a9 = 577; + t.a10 = 692; + t.a29 = 786; + t.a30 = 788; + t.a31 = 788; + t.a32 = 790; + t.a33 = 793; + t.a34 = 794; + t.a35 = 816; + t.a36 = 823; + t.a37 = 789; + t.a38 = 841; + t.a39 = 823; + t.a40 = 833; + t.a41 = 816; + t.a42 = 831; + t.a43 = 923; + t.a44 = 744; + t.a45 = 723; + t.a46 = 749; + t.a47 = 790; + t.a48 = 792; + t.a49 = 695; + t.a50 = 776; + t.a51 = 768; + t.a52 = 792; + t.a53 = 759; + t.a54 = 707; + t.a55 = 708; + t.a56 = 682; + t.a57 = 701; + t.a58 = 826; + t.a59 = 815; + t.a60 = 789; + t.a61 = 789; + t.a62 = 707; + t.a63 = 687; + t.a64 = 696; + t.a65 = 689; + t.a66 = 786; + t.a67 = 787; + t.a68 = 713; + t.a69 = 791; + t.a70 = 785; + t.a71 = 791; + t.a72 = 873; + t.a73 = 761; + t.a74 = 762; + t.a203 = 762; + t.a75 = 759; + t.a204 = 759; + t.a76 = 892; + t.a77 = 892; + t.a78 = 788; + t.a79 = 784; + t.a81 = 438; + t.a82 = 138; + t.a83 = 277; + t.a84 = 415; + t.a97 = 392; + t.a98 = 392; + t.a99 = 668; + t.a100 = 668; + t.a89 = 390; + t.a90 = 390; + t.a93 = 317; + t.a94 = 317; + t.a91 = 276; + t.a92 = 276; + t.a205 = 509; + t.a85 = 509; + t.a206 = 410; + t.a86 = 410; + t.a87 = 234; + t.a88 = 234; + t.a95 = 334; + t.a96 = 334; + t.a101 = 732; + t.a102 = 544; + t.a103 = 544; + t.a104 = 910; + t.a106 = 667; + t.a107 = 760; + t.a108 = 760; + t.a112 = 776; + t.a111 = 595; + t.a110 = 694; + t.a109 = 626; + t.a120 = 788; + t.a121 = 788; + t.a122 = 788; + t.a123 = 788; + t.a124 = 788; + t.a125 = 788; + t.a126 = 788; + t.a127 = 788; + t.a128 = 788; + t.a129 = 788; + t.a130 = 788; + t.a131 = 788; + t.a132 = 788; + t.a133 = 788; + t.a134 = 788; + t.a135 = 788; + t.a136 = 788; + t.a137 = 788; + t.a138 = 788; + t.a139 = 788; + t.a140 = 788; + t.a141 = 788; + t.a142 = 788; + t.a143 = 788; + t.a144 = 788; + t.a145 = 788; + t.a146 = 788; + t.a147 = 788; + t.a148 = 788; + t.a149 = 788; + t.a150 = 788; + t.a151 = 788; + t.a152 = 788; + t.a153 = 788; + t.a154 = 788; + t.a155 = 788; + t.a156 = 788; + t.a157 = 788; + t.a158 = 788; + t.a159 = 788; + t.a160 = 894; + t.a161 = 838; + t.a163 = 1016; + t.a164 = 458; + t.a196 = 748; + t.a165 = 924; + t.a192 = 748; + t.a166 = 918; + t.a167 = 927; + t.a168 = 928; + t.a169 = 928; + t.a170 = 834; + t.a171 = 873; + t.a172 = 828; + t.a173 = 924; + t.a162 = 924; + t.a174 = 917; + t.a175 = 930; + t.a176 = 931; + t.a177 = 463; + t.a178 = 883; + t.a179 = 836; + t.a193 = 836; + t.a180 = 867; + t.a199 = 867; + t.a181 = 696; + t.a200 = 696; + t.a182 = 874; + t.a201 = 874; + t.a183 = 760; + t.a184 = 946; + t.a197 = 771; + t.a185 = 865; + t.a194 = 771; + t.a198 = 888; + t.a186 = 967; + t.a195 = 888; + t.a187 = 831; + t.a188 = 873; + t.a189 = 927; + t.a190 = 970; + t.a191 = 918; + }); +}); +exports.getMetrics = getMetrics; +const getFontBasicMetrics = (0, _core_utils.getLookupTableFactory)(function (t) { + t.Courier = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: -426 + }; + t["Courier-Bold"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 439 + }; + t["Courier-Oblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426 + }; + t["Courier-BoldOblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426 + }; + t.Helvetica = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523 + }; + t["Helvetica-Bold"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532 + }; + t["Helvetica-Oblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523 + }; + t["Helvetica-BoldOblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532 + }; + t["Times-Roman"] = { + ascent: 683, + descent: -217, + capHeight: 662, + xHeight: 450 + }; + t["Times-Bold"] = { + ascent: 683, + descent: -217, + capHeight: 676, + xHeight: 461 + }; + t["Times-Italic"] = { + ascent: 683, + descent: -217, + capHeight: 653, + xHeight: 441 + }; + t["Times-BoldItalic"] = { + ascent: 683, + descent: -217, + capHeight: 669, + xHeight: 462 + }; + t.Symbol = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN + }; + t.ZapfDingbats = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN + }; +}); +exports.getFontBasicMetrics = getFontBasicMetrics; + +/***/ }), +/* 175 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.GlyfTable = void 0; +const ON_CURVE_POINT = 1 << 0; +const X_SHORT_VECTOR = 1 << 1; +const Y_SHORT_VECTOR = 1 << 2; +const REPEAT_FLAG = 1 << 3; +const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4; +const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5; +const OVERLAP_SIMPLE = 1 << 6; +const ARG_1_AND_2_ARE_WORDS = 1 << 0; +const ARGS_ARE_XY_VALUES = 1 << 1; +const WE_HAVE_A_SCALE = 1 << 3; +const MORE_COMPONENTS = 1 << 5; +const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; +const WE_HAVE_A_TWO_BY_TWO = 1 << 7; +const WE_HAVE_INSTRUCTIONS = 1 << 8; +class GlyfTable { + constructor(_ref) { + let { + glyfTable, + isGlyphLocationsLong, + locaTable, + numGlyphs + } = _ref; + this.glyphs = []; + const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); + const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); + const offsetSize = isGlyphLocationsLong ? 4 : 2; + let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); + let pos = 0; + for (let i = 0; i < numGlyphs; i++) { + pos += offsetSize; + const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); + if (next === prev) { + this.glyphs.push(new Glyph({})); + continue; + } + const glyph = Glyph.parse(prev, glyf); + this.glyphs.push(glyph); + prev = next; + } + } + getSize() { + return this.glyphs.reduce((a, g) => { + const size = g.getSize(); + return a + (size + 3 & ~3); + }, 0); + } + write() { + const totalSize = this.getSize(); + const glyfTable = new DataView(new ArrayBuffer(totalSize)); + const isLocationLong = totalSize > 0x1fffe; + const offsetSize = isLocationLong ? 4 : 2; + const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); + if (isLocationLong) { + locaTable.setUint32(0, 0); + } else { + locaTable.setUint16(0, 0); + } + let pos = 0; + let locaIndex = 0; + for (const glyph of this.glyphs) { + pos += glyph.write(pos, glyfTable); + pos = pos + 3 & ~3; + locaIndex += offsetSize; + if (isLocationLong) { + locaTable.setUint32(locaIndex, pos); + } else { + locaTable.setUint16(locaIndex, pos >> 1); + } + } + return { + isLocationLong, + loca: new Uint8Array(locaTable.buffer), + glyf: new Uint8Array(glyfTable.buffer) + }; + } + scale(factors) { + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + this.glyphs[i].scale(factors[i]); + } + } +} +exports.GlyfTable = GlyfTable; +class Glyph { + constructor(_ref2) { + let { + header = null, + simple = null, + composites = null + } = _ref2; + this.header = header; + this.simple = simple; + this.composites = composites; + } + static parse(pos, glyf) { + const [read, header] = GlyphHeader.parse(pos, glyf); + pos += read; + if (header.numberOfContours < 0) { + const composites = []; + while (true) { + const [n, composite] = CompositeGlyph.parse(pos, glyf); + pos += n; + composites.push(composite); + if (!(composite.flags & MORE_COMPONENTS)) { + break; + } + } + return new Glyph({ + header, + composites + }); + } + const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); + return new Glyph({ + header, + simple + }); + } + getSize() { + if (!this.header) { + return 0; + } + const size = this.simple ? this.simple.getSize() : this.composites.reduce((a, c) => a + c.getSize(), 0); + return this.header.getSize() + size; + } + write(pos, buf) { + if (!this.header) { + return 0; + } + const spos = pos; + pos += this.header.write(pos, buf); + if (this.simple) { + pos += this.simple.write(pos, buf); + } else { + for (const composite of this.composites) { + pos += composite.write(pos, buf); + } + } + return pos - spos; + } + scale(factor) { + if (!this.header) { + return; + } + const xMiddle = (this.header.xMin + this.header.xMax) / 2; + this.header.scale(xMiddle, factor); + if (this.simple) { + this.simple.scale(xMiddle, factor); + } else { + for (const composite of this.composites) { + composite.scale(xMiddle, factor); + } + } + } +} +class GlyphHeader { + constructor(_ref3) { + let { + numberOfContours, + xMin, + yMin, + xMax, + yMax + } = _ref3; + this.numberOfContours = numberOfContours; + this.xMin = xMin; + this.yMin = yMin; + this.xMax = xMax; + this.yMax = yMax; + } + static parse(pos, glyf) { + return [10, new GlyphHeader({ + numberOfContours: glyf.getInt16(pos), + xMin: glyf.getInt16(pos + 2), + yMin: glyf.getInt16(pos + 4), + xMax: glyf.getInt16(pos + 6), + yMax: glyf.getInt16(pos + 8) + })]; + } + getSize() { + return 10; + } + write(pos, buf) { + buf.setInt16(pos, this.numberOfContours); + buf.setInt16(pos + 2, this.xMin); + buf.setInt16(pos + 4, this.yMin); + buf.setInt16(pos + 6, this.xMax); + buf.setInt16(pos + 8, this.yMax); + return 10; + } + scale(x, factor) { + this.xMin = Math.round(x + (this.xMin - x) * factor); + this.xMax = Math.round(x + (this.xMax - x) * factor); + } +} +class Contour { + constructor(_ref4) { + let { + flags, + xCoordinates, + yCoordinates + } = _ref4; + this.xCoordinates = xCoordinates; + this.yCoordinates = yCoordinates; + this.flags = flags; + } +} +class SimpleGlyph { + constructor(_ref5) { + let { + contours, + instructions + } = _ref5; + this.contours = contours; + this.instructions = instructions; + } + static parse(pos, glyf, numberOfContours) { + const endPtsOfContours = []; + for (let i = 0; i < numberOfContours; i++) { + const endPt = glyf.getUint16(pos); + pos += 2; + endPtsOfContours.push(endPt); + } + const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1; + const instructionLength = glyf.getUint16(pos); + pos += 2; + const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + const flags = []; + for (let i = 0; i < numberOfPt; pos++, i++) { + let flag = glyf.getUint8(pos); + flags.push(flag); + if (flag & REPEAT_FLAG) { + const count = glyf.getUint8(++pos); + flag ^= REPEAT_FLAG; + for (let m = 0; m < count; m++) { + flags.push(flag); + } + i += count; + } + } + const allXCoordinates = []; + let xCoordinates = []; + let yCoordinates = []; + let pointFlags = []; + const contours = []; + let endPtsOfContoursIndex = 0; + let lastCoordinate = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + const x = glyf.getUint8(pos++); + lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; + xCoordinates.push(lastCoordinate); + } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { + xCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + xCoordinates.push(lastCoordinate); + } + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + endPtsOfContoursIndex++; + allXCoordinates.push(xCoordinates); + xCoordinates = []; + } + } + lastCoordinate = 0; + endPtsOfContoursIndex = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + const y = glyf.getUint8(pos++); + lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y; + yCoordinates.push(lastCoordinate); + } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) { + yCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + yCoordinates.push(lastCoordinate); + } + pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + xCoordinates = allXCoordinates[endPtsOfContoursIndex]; + endPtsOfContoursIndex++; + contours.push(new Contour({ + flags: pointFlags, + xCoordinates, + yCoordinates + })); + yCoordinates = []; + pointFlags = []; + } + } + return new SimpleGlyph({ + contours, + instructions + }); + } + getSize() { + let size = this.contours.length * 2 + 2 + this.instructions.length; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + size += contour.flags.length; + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + const x = contour.xCoordinates[i]; + const y = contour.yCoordinates[i]; + let abs = Math.abs(x - lastX); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastX = x; + abs = Math.abs(y - lastY); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastY = y; + } + } + return size; + } + write(pos, buf) { + const spos = pos; + const xCoordinates = []; + const yCoordinates = []; + const flags = []; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + let flag = contour.flags[i]; + const x = contour.xCoordinates[i]; + let delta = x - lastX; + if (delta === 0) { + flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; + xCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR; + xCoordinates.push(abs); + } else { + xCoordinates.push(delta); + } + } + lastX = x; + const y = contour.yCoordinates[i]; + delta = y - lastY; + if (delta === 0) { + flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; + yCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR; + yCoordinates.push(abs); + } else { + yCoordinates.push(delta); + } + } + lastY = y; + flags.push(flag); + } + buf.setUint16(pos, xCoordinates.length - 1); + pos += 2; + } + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + for (const flag of flags) { + buf.setUint8(pos++, flag); + } + for (let i = 0, ii = xCoordinates.length; i < ii; i++) { + const x = xCoordinates[i]; + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + buf.setUint8(pos++, x); + } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { + buf.setInt16(pos, x); + pos += 2; + } + } + for (let i = 0, ii = yCoordinates.length; i < ii; i++) { + const y = yCoordinates[i]; + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + buf.setUint8(pos++, y); + } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { + buf.setInt16(pos, y); + pos += 2; + } + } + return pos - spos; + } + scale(x, factor) { + for (const contour of this.contours) { + if (contour.xCoordinates.length === 0) { + continue; + } + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); + } + } + } +} +class CompositeGlyph { + constructor(_ref6) { + let { + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + } = _ref6; + this.flags = flags; + this.glyphIndex = glyphIndex; + this.argument1 = argument1; + this.argument2 = argument2; + this.transf = transf; + this.instructions = instructions; + } + static parse(pos, glyf) { + const spos = pos; + const transf = []; + let flags = glyf.getUint16(pos); + const glyphIndex = glyf.getUint16(pos + 2); + pos += 4; + let argument1, argument2; + if (flags & ARG_1_AND_2_ARE_WORDS) { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt16(pos); + argument2 = glyf.getInt16(pos + 2); + } else { + argument1 = glyf.getUint16(pos); + argument2 = glyf.getUint16(pos + 2); + } + pos += 4; + flags ^= ARG_1_AND_2_ARE_WORDS; + } else { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt8(pos); + argument2 = glyf.getInt8(pos + 1); + } else { + argument1 = glyf.getUint8(pos); + argument2 = glyf.getUint8(pos + 1); + } + pos += 2; + } + if (flags & WE_HAVE_A_SCALE) { + transf.push(glyf.getUint16(pos)); + pos += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); + pos += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); + pos += 8; + } + let instructions = null; + if (flags & WE_HAVE_INSTRUCTIONS) { + const instructionLength = glyf.getUint16(pos); + pos += 2; + instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + } + return [pos - spos, new CompositeGlyph({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + })]; + } + getSize() { + let size = 2 + 2 + this.transf.length * 2; + if (this.flags & WE_HAVE_INSTRUCTIONS) { + size += 2 + this.instructions.length; + } + size += 2; + if (this.flags & 2) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + size += 2; + } + } else { + if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + size += 2; + } + } + return size; + } + write(pos, buf) { + const spos = pos; + if (this.flags & ARGS_ARE_XY_VALUES) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + } else { + if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + } + buf.setUint16(pos, this.flags); + buf.setUint16(pos + 2, this.glyphIndex); + pos += 4; + if (this.flags & ARG_1_AND_2_ARE_WORDS) { + if (this.flags & ARGS_ARE_XY_VALUES) { + buf.setInt16(pos, this.argument1); + buf.setInt16(pos + 2, this.argument2); + } else { + buf.setUint16(pos, this.argument1); + buf.setUint16(pos + 2, this.argument2); + } + pos += 4; + } else { + buf.setUint8(pos, this.argument1); + buf.setUint8(pos + 1, this.argument2); + pos += 2; + } + if (this.flags & WE_HAVE_INSTRUCTIONS) { + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + } + return pos - spos; + } + scale(x, factor) {} +} + +/***/ }), +/* 176 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.OpenTypeFileBuilder = void 0; +var _core_utils = __w_pdfjs_require__(135); +var _util = __w_pdfjs_require__(2); +function writeInt16(dest, offset, num) { + dest[offset] = num >> 8 & 0xff; + dest[offset + 1] = num & 0xff; +} +function writeInt32(dest, offset, num) { + dest[offset] = num >> 24 & 0xff; + dest[offset + 1] = num >> 16 & 0xff; + dest[offset + 2] = num >> 8 & 0xff; + dest[offset + 3] = num & 0xff; +} +function writeData(dest, offset, data) { + if (data instanceof Uint8Array) { + dest.set(data, offset); + } else if (typeof data === "string") { + for (let i = 0, ii = data.length; i < ii; i++) { + dest[offset++] = data.charCodeAt(i) & 0xff; + } + } else { + for (const num of data) { + dest[offset++] = num & 0xff; + } + } +} +const OTF_HEADER_SIZE = 12; +const OTF_TABLE_ENTRY_SIZE = 16; +class OpenTypeFileBuilder { + constructor(sfnt) { + this.sfnt = sfnt; + this.tables = Object.create(null); + } + static getSearchParams(entriesCount, entrySize) { + let maxPower2 = 1, + log2 = 0; + while ((maxPower2 ^ entriesCount) > maxPower2) { + maxPower2 <<= 1; + log2++; + } + const searchRange = maxPower2 * entrySize; + return { + range: searchRange, + entry: log2, + rangeShift: entrySize * entriesCount - searchRange + }; + } + toArray() { + let sfnt = this.sfnt; + const tables = this.tables; + const tablesNames = Object.keys(tables); + tablesNames.sort(); + const numTables = tablesNames.length; + let i, j, jj, table, tableName; + let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; + const tableOffsets = [offset]; + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + const paddedLength = (table.length + 3 & ~3) >>> 0; + offset += paddedLength; + tableOffsets.push(offset); + } + const file = new Uint8Array(offset); + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + writeData(file, tableOffsets[i], table); + } + if (sfnt === "true") { + sfnt = (0, _util.string32)(0x00010000); + } + file[0] = sfnt.charCodeAt(0) & 0xff; + file[1] = sfnt.charCodeAt(1) & 0xff; + file[2] = sfnt.charCodeAt(2) & 0xff; + file[3] = sfnt.charCodeAt(3) & 0xff; + writeInt16(file, 4, numTables); + const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); + writeInt16(file, 6, searchParams.range); + writeInt16(file, 8, searchParams.entry); + writeInt16(file, 10, searchParams.rangeShift); + offset = OTF_HEADER_SIZE; + for (i = 0; i < numTables; i++) { + tableName = tablesNames[i]; + file[offset] = tableName.charCodeAt(0) & 0xff; + file[offset + 1] = tableName.charCodeAt(1) & 0xff; + file[offset + 2] = tableName.charCodeAt(2) & 0xff; + file[offset + 3] = tableName.charCodeAt(3) & 0xff; + let checksum = 0; + for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { + const quad = (0, _core_utils.readUint32)(file, j); + checksum = checksum + quad >>> 0; + } + writeInt32(file, offset + 4, checksum); + writeInt32(file, offset + 8, tableOffsets[i]); + writeInt32(file, offset + 12, tables[tableName].length); + offset += OTF_TABLE_ENTRY_SIZE; + } + return file; + } + addTable(tag, data) { + if (tag in this.tables) { + throw new Error("Table " + tag + " already exists"); + } + this.tables[tag] = data; + } +} +exports.OpenTypeFileBuilder = OpenTypeFileBuilder; + +/***/ }), +/* 177 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Type1Font = void 0; +var _cff_parser = __w_pdfjs_require__(164); +var _util = __w_pdfjs_require__(2); +var _fonts_utils = __w_pdfjs_require__(167); +var _core_utils = __w_pdfjs_require__(135); +var _stream = __w_pdfjs_require__(139); +var _type1_parser = __w_pdfjs_require__(178); +function findBlock(streamBytes, signature, startIndex) { + const streamBytesLength = streamBytes.length; + const signatureLength = signature.length; + const scanLength = streamBytesLength - signatureLength; + let i = startIndex, + found = false; + while (i < scanLength) { + let j = 0; + while (j < signatureLength && streamBytes[i + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + i += j; + while (i < streamBytesLength && (0, _core_utils.isWhiteSpace)(streamBytes[i])) { + i++; + } + found = true; + break; + } + i++; + } + return { + found, + length: i + }; +} +function getHeaderBlock(stream, suggestedLength) { + const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; + const streamStartPos = stream.pos; + let headerBytes, headerBytesLength, block; + try { + headerBytes = stream.getBytes(suggestedLength); + headerBytesLength = headerBytes.length; + } catch (ex) {} + if (headerBytesLength === suggestedLength) { + block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length); + if (block.found && block.length === suggestedLength) { + return { + stream: new _stream.Stream(headerBytes), + length: suggestedLength + }; + } + } + (0, _util.warn)('Invalid "Length1" property in Type1 font -- trying to recover.'); + stream.pos = streamStartPos; + const SCAN_BLOCK_LENGTH = 2048; + let actualLength; + while (true) { + const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); + if (block.length === 0) { + break; + } + stream.pos += block.length; + if (block.found) { + actualLength = stream.pos - streamStartPos; + break; + } + } + stream.pos = streamStartPos; + if (actualLength) { + return { + stream: new _stream.Stream(stream.getBytes(actualLength)), + length: actualLength + }; + } + (0, _util.warn)('Unable to recover "Length1" property in Type1 font -- using as is.'); + return { + stream: new _stream.Stream(stream.getBytes(suggestedLength)), + length: suggestedLength + }; +} +function getEexecBlock(stream, suggestedLength) { + const eexecBytes = stream.getBytes(); + if (eexecBytes.length === 0) { + throw new _util.FormatError("getEexecBlock - no font program found."); + } + return { + stream: new _stream.Stream(eexecBytes), + length: eexecBytes.length + }; +} +class Type1Font { + constructor(name, file, properties) { + const PFB_HEADER_SIZE = 6; + let headerBlockLength = properties.length1; + let eexecBlockLength = properties.length2; + let pfbHeader = file.peekBytes(PFB_HEADER_SIZE); + const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; + if (pfbHeaderPresent) { + file.skip(PFB_HEADER_SIZE); + headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + const headerBlock = getHeaderBlock(file, headerBlockLength); + const headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, _fonts_utils.SEAC_ANALYSIS_ENABLED); + headerBlockParser.extractFontHeader(properties); + if (pfbHeaderPresent) { + pfbHeader = file.getBytes(PFB_HEADER_SIZE); + eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + const eexecBlock = getEexecBlock(file, eexecBlockLength); + const eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, _fonts_utils.SEAC_ANALYSIS_ENABLED); + const data = eexecBlockParser.extractFontProgram(properties); + for (const key in data.properties) { + properties[key] = data.properties[key]; + } + const charstrings = data.charstrings; + const type2Charstrings = this.getType2Charstrings(charstrings); + const subrs = this.getType2Subrs(data.subrs); + this.charstrings = charstrings; + this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); + this.seacs = this.getSeacs(data.charstrings); + } + get numGlyphs() { + return this.charstrings.length + 1; + } + getCharset() { + const charset = [".notdef"]; + for (const { + glyphName + } of this.charstrings) { + charset.push(glyphName); + } + return charset; + } + getGlyphMapping(properties) { + const charstrings = this.charstrings; + if (properties.composite) { + const charCodeToGlyphId = Object.create(null); + for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) { + const charCode = properties.cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId + 1; + } + return charCodeToGlyphId; + } + const glyphNames = [".notdef"]; + let builtInEncoding, glyphId; + for (glyphId = 0; glyphId < charstrings.length; glyphId++) { + glyphNames.push(charstrings[glyphId].glyphName); + } + const encoding = properties.builtInEncoding; + if (encoding) { + builtInEncoding = Object.create(null); + for (const charCode in encoding) { + glyphId = glyphNames.indexOf(encoding[charCode]); + if (glyphId >= 0) { + builtInEncoding[charCode] = glyphId; + } + } + } + return (0, _fonts_utils.type1FontGlyphMapping)(properties, builtInEncoding, glyphNames); + } + hasGlyphId(id) { + if (id < 0 || id >= this.numGlyphs) { + return false; + } + if (id === 0) { + return true; + } + const glyph = this.charstrings[id - 1]; + return glyph.charstring.length > 0; + } + getSeacs(charstrings) { + const seacMap = []; + for (let i = 0, ii = charstrings.length; i < ii; i++) { + const charstring = charstrings[i]; + if (charstring.seac) { + seacMap[i + 1] = charstring.seac; + } + } + return seacMap; + } + getType2Charstrings(type1Charstrings) { + const type2Charstrings = []; + for (const type1Charstring of type1Charstrings) { + type2Charstrings.push(type1Charstring.charstring); + } + return type2Charstrings; + } + getType2Subrs(type1Subrs) { + let bias = 0; + const count = type1Subrs.length; + if (count < 1133) { + bias = 107; + } else if (count < 33769) { + bias = 1131; + } else { + bias = 32768; + } + const type2Subrs = []; + let i; + for (i = 0; i < bias; i++) { + type2Subrs.push([0x0b]); + } + for (i = 0; i < count; i++) { + type2Subrs.push(type1Subrs[i]); + } + return type2Subrs; + } + wrap(name, glyphs, charstrings, subrs, properties) { + const cff = new _cff_parser.CFF(); + cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4); + cff.names = [name]; + const topDict = new _cff_parser.CFFTopDict(); + topDict.setByName("version", 391); + topDict.setByName("Notice", 392); + topDict.setByName("FullName", 393); + topDict.setByName("FamilyName", 394); + topDict.setByName("Weight", 395); + topDict.setByName("Encoding", null); + topDict.setByName("FontMatrix", properties.fontMatrix); + topDict.setByName("FontBBox", properties.bbox); + topDict.setByName("charset", null); + topDict.setByName("CharStrings", null); + topDict.setByName("Private", null); + cff.topDict = topDict; + const strings = new _cff_parser.CFFStrings(); + strings.add("Version 0.11"); + strings.add("See original notice"); + strings.add(name); + strings.add(name); + strings.add("Medium"); + cff.strings = strings; + cff.globalSubrIndex = new _cff_parser.CFFIndex(); + const count = glyphs.length; + const charsetArray = [".notdef"]; + let i, ii; + for (i = 0; i < count; i++) { + const glyphName = charstrings[i].glyphName; + const index = _cff_parser.CFFStandardStrings.indexOf(glyphName); + if (index === -1) { + strings.add(glyphName); + } + charsetArray.push(glyphName); + } + cff.charset = new _cff_parser.CFFCharset(false, 0, charsetArray); + const charStringsIndex = new _cff_parser.CFFIndex(); + charStringsIndex.add([0x8b, 0x0e]); + for (i = 0; i < count; i++) { + charStringsIndex.add(glyphs[i]); + } + cff.charStrings = charStringsIndex; + const privateDict = new _cff_parser.CFFPrivateDict(); + privateDict.setByName("Subrs", null); + const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"]; + for (i = 0, ii = fields.length; i < ii; i++) { + const field = fields[i]; + if (!(field in properties.privateData)) { + continue; + } + const value = properties.privateData[field]; + if (Array.isArray(value)) { + for (let j = value.length - 1; j > 0; j--) { + value[j] -= value[j - 1]; + } + } + privateDict.setByName(field, value); + } + cff.topDict.privateDict = privateDict; + const subrIndex = new _cff_parser.CFFIndex(); + for (i = 0, ii = subrs.length; i < ii; i++) { + subrIndex.add(subrs[i]); + } + privateDict.subrsIndex = subrIndex; + const compiler = new _cff_parser.CFFCompiler(cff); + return compiler.compile(); + } +} +exports.Type1Font = Type1Font; + +/***/ }), +/* 178 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Type1Parser = void 0; +var _encodings = __w_pdfjs_require__(166); +var _core_utils = __w_pdfjs_require__(135); +var _stream = __w_pdfjs_require__(139); +var _util = __w_pdfjs_require__(2); +const HINTING_ENABLED = false; +const COMMAND_MAP = { + hstem: [1], + vstem: [3], + vmoveto: [4], + rlineto: [5], + hlineto: [6], + vlineto: [7], + rrcurveto: [8], + callsubr: [10], + flex: [12, 35], + drop: [12, 18], + endchar: [14], + rmoveto: [21], + hmoveto: [22], + vhcurveto: [30], + hvcurveto: [31] +}; +class Type1CharString { + constructor() { + this.width = 0; + this.lsb = 0; + this.flexing = false; + this.output = []; + this.stack = []; + } + convert(encoded, subrs, seacAnalysisEnabled) { + const count = encoded.length; + let error = false; + let wx, sbx, subrNumber; + for (let i = 0; i < count; i++) { + let value = encoded[i]; + if (value < 32) { + if (value === 12) { + value = (value << 8) + encoded[++i]; + } + switch (value) { + case 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case 3: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case 4: + if (this.flexing) { + if (this.stack.length < 1) { + error = true; + break; + } + const dy = this.stack.pop(); + this.stack.push(0, dy); + break; + } + error = this.executeCommand(1, COMMAND_MAP.vmoveto); + break; + case 5: + error = this.executeCommand(2, COMMAND_MAP.rlineto); + break; + case 6: + error = this.executeCommand(1, COMMAND_MAP.hlineto); + break; + case 7: + error = this.executeCommand(1, COMMAND_MAP.vlineto); + break; + case 8: + error = this.executeCommand(6, COMMAND_MAP.rrcurveto); + break; + case 9: + this.stack = []; + break; + case 10: + if (this.stack.length < 1) { + error = true; + break; + } + subrNumber = this.stack.pop(); + if (!subrs[subrNumber]) { + error = true; + break; + } + error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); + break; + case 11: + return error; + case 13: + if (this.stack.length < 2) { + error = true; + break; + } + wx = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx); + error = this.executeCommand(2, COMMAND_MAP.hmoveto); + break; + case 14: + this.output.push(COMMAND_MAP.endchar[0]); + break; + case 21: + if (this.flexing) { + break; + } + error = this.executeCommand(2, COMMAND_MAP.rmoveto); + break; + case 22: + if (this.flexing) { + this.stack.push(0); + break; + } + error = this.executeCommand(1, COMMAND_MAP.hmoveto); + break; + case 30: + error = this.executeCommand(4, COMMAND_MAP.vhcurveto); + break; + case 31: + error = this.executeCommand(4, COMMAND_MAP.hvcurveto); + break; + case (12 << 8) + 0: + this.stack = []; + break; + case (12 << 8) + 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case (12 << 8) + 2: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case (12 << 8) + 6: + if (seacAnalysisEnabled) { + const asb = this.stack.at(-5); + this.seac = this.stack.splice(-4, 4); + this.seac[0] += this.lsb - asb; + error = this.executeCommand(0, COMMAND_MAP.endchar); + } else { + error = this.executeCommand(4, COMMAND_MAP.endchar); + } + break; + case (12 << 8) + 7: + if (this.stack.length < 4) { + error = true; + break; + } + this.stack.pop(); + wx = this.stack.pop(); + const sby = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx, sby); + error = this.executeCommand(3, COMMAND_MAP.rmoveto); + break; + case (12 << 8) + 12: + if (this.stack.length < 2) { + error = true; + break; + } + const num2 = this.stack.pop(); + const num1 = this.stack.pop(); + this.stack.push(num1 / num2); + break; + case (12 << 8) + 16: + if (this.stack.length < 2) { + error = true; + break; + } + subrNumber = this.stack.pop(); + const numArgs = this.stack.pop(); + if (subrNumber === 0 && numArgs === 3) { + const flexArgs = this.stack.splice(this.stack.length - 17, 17); + this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]); + error = this.executeCommand(13, COMMAND_MAP.flex, true); + this.flexing = false; + this.stack.push(flexArgs[15], flexArgs[16]); + } else if (subrNumber === 1 && numArgs === 0) { + this.flexing = true; + } + break; + case (12 << 8) + 17: + break; + case (12 << 8) + 33: + this.stack = []; + break; + default: + (0, _util.warn)('Unknown type 1 charstring command of "' + value + '"'); + break; + } + if (error) { + break; + } + continue; + } else if (value <= 246) { + value -= 139; + } else if (value <= 250) { + value = (value - 247) * 256 + encoded[++i] + 108; + } else if (value <= 254) { + value = -((value - 251) * 256) - encoded[++i] - 108; + } else { + value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; + } + this.stack.push(value); + } + return error; + } + executeCommand(howManyArgs, command, keepStack) { + const stackLength = this.stack.length; + if (howManyArgs > stackLength) { + return true; + } + const start = stackLength - howManyArgs; + for (let i = start; i < stackLength; i++) { + let value = this.stack[i]; + if (Number.isInteger(value)) { + this.output.push(28, value >> 8 & 0xff, value & 0xff); + } else { + value = 65536 * value | 0; + this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + } + this.output.push(...command); + if (keepStack) { + this.stack.splice(start, howManyArgs); + } else { + this.stack.length = 0; + } + return false; + } +} +const EEXEC_ENCRYPT_KEY = 55665; +const CHAR_STRS_ENCRYPT_KEY = 4330; +function isHexDigit(code) { + return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102; +} +function decrypt(data, key, discardNumber) { + if (discardNumber >= data.length) { + return new Uint8Array(0); + } + const c1 = 52845, + c2 = 22719; + let r = key | 0, + i, + j; + for (i = 0; i < discardNumber; i++) { + r = (data[i] + r) * c1 + c2 & (1 << 16) - 1; + } + const count = data.length - discardNumber; + const decrypted = new Uint8Array(count); + for (i = discardNumber, j = 0; j < count; i++, j++) { + const value = data[i]; + decrypted[j] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + return decrypted; +} +function decryptAscii(data, key, discardNumber) { + const c1 = 52845, + c2 = 22719; + let r = key | 0; + const count = data.length, + maybeLength = count >>> 1; + const decrypted = new Uint8Array(maybeLength); + let i, j; + for (i = 0, j = 0; i < count; i++) { + const digit1 = data[i]; + if (!isHexDigit(digit1)) { + continue; + } + i++; + let digit2; + while (i < count && !isHexDigit(digit2 = data[i])) { + i++; + } + if (i < count) { + const value = parseInt(String.fromCharCode(digit1, digit2), 16); + decrypted[j++] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + } + return decrypted.slice(discardNumber, j); +} +function isSpecial(c) { + return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29; +} +class Type1Parser { + constructor(stream, encrypted, seacAnalysisEnabled) { + if (encrypted) { + const data = stream.getBytes(); + const isBinary = !((isHexDigit(data[0]) || (0, _core_utils.isWhiteSpace)(data[0])) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7])); + stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); + } + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + this.stream = stream; + this.nextChar(); + } + readNumberArray() { + this.getToken(); + const array = []; + while (true) { + const token = this.getToken(); + if (token === null || token === "]" || token === "}") { + break; + } + array.push(parseFloat(token || 0)); + } + return array; + } + readNumber() { + const token = this.getToken(); + return parseFloat(token || 0); + } + readInt() { + const token = this.getToken(); + return parseInt(token || 0, 10) | 0; + } + readBoolean() { + const token = this.getToken(); + return token === "true" ? 1 : 0; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + prevChar() { + this.stream.skip(-2); + return this.currentChar = this.stream.getByte(); + } + getToken() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch === -1) { + return null; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!(0, _core_utils.isWhiteSpace)(ch)) { + break; + } + ch = this.nextChar(); + } + if (isSpecial(ch)) { + this.nextChar(); + return String.fromCharCode(ch); + } + let token = ""; + do { + token += String.fromCharCode(ch); + ch = this.nextChar(); + } while (ch >= 0 && !(0, _core_utils.isWhiteSpace)(ch) && !isSpecial(ch)); + return token; + } + readCharStrings(bytes, lenIV) { + if (lenIV === -1) { + return bytes; + } + return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV); + } + extractFontProgram(properties) { + const stream = this.stream; + const subrs = [], + charstrings = []; + const privateData = Object.create(null); + privateData.lenIV = 4; + const program = { + subrs: [], + charstrings: [], + properties: { + privateData + } + }; + let token, length, data, lenIV; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "CharStrings": + this.getToken(); + this.getToken(); + this.getToken(); + this.getToken(); + while (true) { + token = this.getToken(); + if (token === null || token === "end") { + break; + } + if (token !== "/") { + continue; + } + const glyph = this.getToken(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } else if (token === "/") { + this.prevChar(); + } + charstrings.push({ + glyph, + encoded + }); + } + break; + case "Subrs": + this.readInt(); + this.getToken(); + while (this.getToken() === "dup") { + const index = this.readInt(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } + subrs[index] = encoded; + } + break; + case "BlueValues": + case "OtherBlues": + case "FamilyBlues": + case "FamilyOtherBlues": + const blueArray = this.readNumberArray(); + if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) { + program.properties.privateData[token] = blueArray; + } + break; + case "StemSnapH": + case "StemSnapV": + program.properties.privateData[token] = this.readNumberArray(); + break; + case "StdHW": + case "StdVW": + program.properties.privateData[token] = this.readNumberArray()[0]; + break; + case "BlueShift": + case "lenIV": + case "BlueFuzz": + case "BlueScale": + case "LanguageGroup": + case "ExpansionFactor": + program.properties.privateData[token] = this.readNumber(); + break; + case "ForceBold": + program.properties.privateData[token] = this.readBoolean(); + break; + } + } + for (const { + encoded, + glyph + } of charstrings) { + const charString = new Type1CharString(); + const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); + let output = charString.output; + if (error) { + output = [14]; + } + const charStringObject = { + glyphName: glyph, + charstring: output, + width: charString.width, + lsb: charString.lsb, + seac: charString.seac + }; + if (glyph === ".notdef") { + program.charstrings.unshift(charStringObject); + } else { + program.charstrings.push(charStringObject); + } + if (properties.builtInEncoding) { + const index = properties.builtInEncoding.indexOf(glyph); + if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) { + properties.widths[index] = charString.width; + } + } + } + return program; + } + extractFontHeader(properties) { + let token; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "FontMatrix": + const matrix = this.readNumberArray(); + properties.fontMatrix = matrix; + break; + case "Encoding": + const encodingArg = this.getToken(); + let encoding; + if (!/^\d+$/.test(encodingArg)) { + encoding = (0, _encodings.getEncoding)(encodingArg); + } else { + encoding = []; + const size = parseInt(encodingArg, 10) | 0; + this.getToken(); + for (let j = 0; j < size; j++) { + token = this.getToken(); + while (token !== "dup" && token !== "def") { + token = this.getToken(); + if (token === null) { + return; + } + } + if (token === "def") { + break; + } + const index = this.readInt(); + this.getToken(); + const glyph = this.getToken(); + encoding[index] = glyph; + this.getToken(); + } + } + properties.builtInEncoding = encoding; + break; + case "FontBBox": + const fontBBox = this.readNumberArray(); + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + break; + } + } + } +} +exports.Type1Parser = Type1Parser; + +/***/ }), +/* 179 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Pattern = void 0; +exports.getTilingPatternIR = getTilingPatternIR; +var _util = __w_pdfjs_require__(2); +var _base_stream = __w_pdfjs_require__(136); +var _colorspace = __w_pdfjs_require__(143); +var _core_utils = __w_pdfjs_require__(135); +const ShadingType = { + FUNCTION_BASED: 1, + AXIAL: 2, + RADIAL: 3, + FREE_FORM_MESH: 4, + LATTICE_FORM_MESH: 5, + COONS_PATCH_MESH: 6, + TENSOR_PATCH_MESH: 7 +}; +class Pattern { + constructor() { + (0, _util.unreachable)("Cannot initialize Pattern."); + } + static parseShading(shading, xref, res, handler, pdfFunctionFactory, localColorSpaceCache) { + const dict = shading instanceof _base_stream.BaseStream ? shading.dict : shading; + const type = dict.get("ShadingType"); + try { + switch (type) { + case ShadingType.AXIAL: + case ShadingType.RADIAL: + return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, localColorSpaceCache); + case ShadingType.FREE_FORM_MESH: + case ShadingType.LATTICE_FORM_MESH: + case ShadingType.COONS_PATCH_MESH: + case ShadingType.TENSOR_PATCH_MESH: + return new MeshShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache); + default: + throw new _util.FormatError("Unsupported ShadingType: " + type); + } + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + handler.send("UnsupportedFeature", { + featureId: _util.UNSUPPORTED_FEATURES.shadingPattern + }); + (0, _util.warn)(ex); + return new DummyShading(); + } + } +} +exports.Pattern = Pattern; +class BaseShading { + static get SMALL_NUMBER() { + return (0, _util.shadow)(this, "SMALL_NUMBER", 1e-6); + } + constructor() { + if (this.constructor === BaseShading) { + (0, _util.unreachable)("Cannot initialize BaseShading."); + } + } + getIR() { + (0, _util.unreachable)("Abstract method `getIR` called."); + } +} +class RadialAxialShading extends BaseShading { + constructor(dict, xref, resources, pdfFunctionFactory, localColorSpaceCache) { + super(); + this.coordsArr = dict.getArray("Coords"); + this.shadingType = dict.get("ShadingType"); + const cs = _colorspace.ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache + }); + const bbox = dict.getArray("BBox"); + if (Array.isArray(bbox) && bbox.length === 4) { + this.bbox = _util.Util.normalizeRect(bbox); + } else { + this.bbox = null; + } + let t0 = 0.0, + t1 = 1.0; + if (dict.has("Domain")) { + const domainArr = dict.getArray("Domain"); + t0 = domainArr[0]; + t1 = domainArr[1]; + } + let extendStart = false, + extendEnd = false; + if (dict.has("Extend")) { + const extendArr = dict.getArray("Extend"); + extendStart = extendArr[0]; + extendEnd = extendArr[1]; + } + if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { + const [x1, y1, r1, x2, y2, r2] = this.coordsArr; + const distance = Math.hypot(x1 - x2, y1 - y2); + if (r1 <= r2 + distance && r2 <= r1 + distance) { + (0, _util.warn)("Unsupported radial gradient."); + } + } + this.extendStart = extendStart; + this.extendEnd = extendEnd; + const fnObj = dict.getRaw("Function"); + const fn = pdfFunctionFactory.createFromArray(fnObj); + const NUMBER_OF_SAMPLES = 10; + const step = (t1 - t0) / NUMBER_OF_SAMPLES; + const colorStops = this.colorStops = []; + if (t0 >= t1 || step <= 0) { + (0, _util.info)("Bad shading domain."); + return; + } + const color = new Float32Array(cs.numComps), + ratio = new Float32Array(1); + let rgbColor; + for (let i = 0; i <= NUMBER_OF_SAMPLES; i++) { + ratio[0] = t0 + i * step; + fn(ratio, 0, color, 0); + rgbColor = cs.getRgb(color, 0); + const cssColor = _util.Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]); + colorStops.push([i / NUMBER_OF_SAMPLES, cssColor]); + } + let background = "transparent"; + if (dict.has("Background")) { + rgbColor = cs.getRgb(dict.get("Background"), 0); + background = _util.Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]); + } + if (!extendStart) { + colorStops.unshift([0, background]); + colorStops[1][0] += BaseShading.SMALL_NUMBER; + } + if (!extendEnd) { + colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; + colorStops.push([1, background]); + } + this.colorStops = colorStops; + } + getIR() { + const coordsArr = this.coordsArr; + const shadingType = this.shadingType; + let type, p0, p1, r0, r1; + if (shadingType === ShadingType.AXIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[2], coordsArr[3]]; + r0 = null; + r1 = null; + type = "axial"; + } else if (shadingType === ShadingType.RADIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[3], coordsArr[4]]; + r0 = coordsArr[2]; + r1 = coordsArr[5]; + type = "radial"; + } else { + (0, _util.unreachable)(`getPattern type unknown: ${shadingType}`); + } + return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; + } +} +class MeshStreamReader { + constructor(stream, context) { + this.stream = stream; + this.context = context; + this.buffer = 0; + this.bufferLength = 0; + const numComps = context.numComps; + this.tmpCompsBuf = new Float32Array(numComps); + const csNumComps = context.colorSpace.numComps; + this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; + } + get hasData() { + if (this.stream.end) { + return this.stream.pos < this.stream.end; + } + if (this.bufferLength > 0) { + return true; + } + const nextByte = this.stream.getByte(); + if (nextByte < 0) { + return false; + } + this.buffer = nextByte; + this.bufferLength = 8; + return true; + } + readBits(n) { + let buffer = this.buffer; + let bufferLength = this.bufferLength; + if (n === 32) { + if (bufferLength === 0) { + return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0; + } + buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte(); + const nextByte = this.stream.getByte(); + this.buffer = nextByte & (1 << bufferLength) - 1; + return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; + } + if (n === 8 && bufferLength === 0) { + return this.stream.getByte(); + } + while (bufferLength < n) { + buffer = buffer << 8 | this.stream.getByte(); + bufferLength += 8; + } + bufferLength -= n; + this.bufferLength = bufferLength; + this.buffer = buffer & (1 << bufferLength) - 1; + return buffer >> bufferLength; + } + align() { + this.buffer = 0; + this.bufferLength = 0; + } + readFlag() { + return this.readBits(this.context.bitsPerFlag); + } + readCoordinate() { + const bitsPerCoordinate = this.context.bitsPerCoordinate; + const xi = this.readBits(bitsPerCoordinate); + const yi = this.readBits(bitsPerCoordinate); + const decode = this.context.decode; + const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; + return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]]; + } + readComponents() { + const numComps = this.context.numComps; + const bitsPerComponent = this.context.bitsPerComponent; + const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; + const decode = this.context.decode; + const components = this.tmpCompsBuf; + for (let i = 0, j = 4; i < numComps; i++, j += 2) { + const ci = this.readBits(bitsPerComponent); + components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; + } + const color = this.tmpCsCompsBuf; + if (this.context.colorFn) { + this.context.colorFn(components, 0, color, 0); + } + return this.context.colorSpace.getRgb(color, 0); + } +} +const getB = function getBClosure() { + function buildB(count) { + const lut = []; + for (let i = 0; i <= count; i++) { + const t = i / count, + t_ = 1 - t; + lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t])); + } + return lut; + } + const cache = []; + return function (count) { + if (!cache[count]) { + cache[count] = buildB(count); + } + return cache[count]; + }; +}(); +class MeshShading extends BaseShading { + static get MIN_SPLIT_PATCH_CHUNKS_AMOUNT() { + return (0, _util.shadow)(this, "MIN_SPLIT_PATCH_CHUNKS_AMOUNT", 3); + } + static get MAX_SPLIT_PATCH_CHUNKS_AMOUNT() { + return (0, _util.shadow)(this, "MAX_SPLIT_PATCH_CHUNKS_AMOUNT", 20); + } + static get TRIANGLE_DENSITY() { + return (0, _util.shadow)(this, "TRIANGLE_DENSITY", 20); + } + constructor(stream, xref, resources, pdfFunctionFactory, localColorSpaceCache) { + super(); + if (!(stream instanceof _base_stream.BaseStream)) { + throw new _util.FormatError("Mesh data is not a stream"); + } + const dict = stream.dict; + this.shadingType = dict.get("ShadingType"); + const bbox = dict.getArray("BBox"); + if (Array.isArray(bbox) && bbox.length === 4) { + this.bbox = _util.Util.normalizeRect(bbox); + } else { + this.bbox = null; + } + const cs = _colorspace.ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache + }); + this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; + const fnObj = dict.getRaw("Function"); + const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null; + this.coords = []; + this.colors = []; + this.figures = []; + const decodeContext = { + bitsPerCoordinate: dict.get("BitsPerCoordinate"), + bitsPerComponent: dict.get("BitsPerComponent"), + bitsPerFlag: dict.get("BitsPerFlag"), + decode: dict.getArray("Decode"), + colorFn: fn, + colorSpace: cs, + numComps: fn ? 1 : cs.numComps + }; + const reader = new MeshStreamReader(stream, decodeContext); + let patchMesh = false; + switch (this.shadingType) { + case ShadingType.FREE_FORM_MESH: + this._decodeType4Shading(reader); + break; + case ShadingType.LATTICE_FORM_MESH: + const verticesPerRow = dict.get("VerticesPerRow") | 0; + if (verticesPerRow < 2) { + throw new _util.FormatError("Invalid VerticesPerRow"); + } + this._decodeType5Shading(reader, verticesPerRow); + break; + case ShadingType.COONS_PATCH_MESH: + this._decodeType6Shading(reader); + patchMesh = true; + break; + case ShadingType.TENSOR_PATCH_MESH: + this._decodeType7Shading(reader); + patchMesh = true; + break; + default: + (0, _util.unreachable)("Unsupported mesh type."); + break; + } + if (patchMesh) { + this._updateBounds(); + for (let i = 0, ii = this.figures.length; i < ii; i++) { + this._buildFigureFromPatch(i); + } + } + this._updateBounds(); + this._packData(); + } + _decodeType4Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const operators = []; + const ps = []; + let verticesLeft = 0; + while (reader.hasData) { + const f = reader.readFlag(); + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + if (verticesLeft === 0) { + if (!(0 <= f && f <= 2)) { + throw new _util.FormatError("Unknown type4 flag"); + } + switch (f) { + case 0: + verticesLeft = 3; + break; + case 1: + ps.push(ps.at(-2), ps.at(-1)); + verticesLeft = 1; + break; + case 2: + ps.push(ps.at(-3), ps.at(-1)); + verticesLeft = 1; + break; + } + operators.push(f); + } + ps.push(coords.length); + coords.push(coord); + colors.push(color); + verticesLeft--; + reader.align(); + } + this.figures.push({ + type: "triangles", + coords: new Int32Array(ps), + colors: new Int32Array(ps) + }); + } + _decodeType5Shading(reader, verticesPerRow) { + const coords = this.coords; + const colors = this.colors; + const ps = []; + while (reader.hasData) { + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + ps.push(coords.length); + coords.push(coord); + colors.push(color); + } + this.figures.push({ + type: "lattice", + coords: new Int32Array(ps), + colors: new Int32Array(ps), + verticesPerRow + }); + } + _decodeType6Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new _util.FormatError("Unknown type6 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + ps[5] = coords.length; + coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]); + ps[6] = coords.length; + coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]); + ps[9] = coords.length; + coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]); + ps[10] = coords.length; + coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]); + this.figures.push({ + type: "patch", + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _decodeType7Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new _util.FormatError("Unknown type7 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[9] = pi + 13; + ps[10] = pi + 14; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[5] = pi + 12; + ps[6] = pi + 15; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + this.figures.push({ + type: "patch", + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _buildFigureFromPatch(index) { + const figure = this.figures[index]; + (0, _util.assert)(figure.type === "patch", "Unexpected patch mesh figure"); + const coords = this.coords, + colors = this.colors; + const pi = figure.coords; + const ci = figure.colors; + const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); + splitXBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); + let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); + splitYBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); + const verticesPerRow = splitXBy + 1; + const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); + const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); + let k = 0; + const cl = new Uint8Array(3), + cr = new Uint8Array(3); + const c0 = colors[ci[0]], + c1 = colors[ci[1]], + c2 = colors[ci[2]], + c3 = colors[ci[3]]; + const bRow = getB(splitYBy), + bCol = getB(splitXBy); + for (let row = 0; row <= splitYBy; row++) { + cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; + cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; + cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; + cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; + cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; + cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; + for (let col = 0; col <= splitXBy; col++, k++) { + if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { + continue; + } + let x = 0, + y = 0; + let q = 0; + for (let i = 0; i <= 3; i++) { + for (let j = 0; j <= 3; j++, q++) { + const m = bRow[row][i] * bCol[col][j]; + x += coords[pi[q]][0] * m; + y += coords[pi[q]][1] * m; + } + } + figureCoords[k] = coords.length; + coords.push([x, y]); + figureColors[k] = colors.length; + const newColor = new Uint8Array(3); + newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; + newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; + newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; + colors.push(newColor); + } + } + figureCoords[0] = pi[0]; + figureColors[0] = ci[0]; + figureCoords[splitXBy] = pi[3]; + figureColors[splitXBy] = ci[1]; + figureCoords[verticesPerRow * splitYBy] = pi[12]; + figureColors[verticesPerRow * splitYBy] = ci[2]; + figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; + figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; + this.figures[index] = { + type: "lattice", + coords: figureCoords, + colors: figureColors, + verticesPerRow + }; + } + _updateBounds() { + let minX = this.coords[0][0], + minY = this.coords[0][1], + maxX = minX, + maxY = minY; + for (let i = 1, ii = this.coords.length; i < ii; i++) { + const x = this.coords[i][0], + y = this.coords[i][1]; + minX = minX > x ? x : minX; + minY = minY > y ? y : minY; + maxX = maxX < x ? x : maxX; + maxY = maxY < y ? y : maxY; + } + this.bounds = [minX, minY, maxX, maxY]; + } + _packData() { + let i, ii, j, jj; + const coords = this.coords; + const coordsPacked = new Float32Array(coords.length * 2); + for (i = 0, j = 0, ii = coords.length; i < ii; i++) { + const xy = coords[i]; + coordsPacked[j++] = xy[0]; + coordsPacked[j++] = xy[1]; + } + this.coords = coordsPacked; + const colors = this.colors; + const colorsPacked = new Uint8Array(colors.length * 3); + for (i = 0, j = 0, ii = colors.length; i < ii; i++) { + const c = colors[i]; + colorsPacked[j++] = c[0]; + colorsPacked[j++] = c[1]; + colorsPacked[j++] = c[2]; + } + this.colors = colorsPacked; + const figures = this.figures; + for (i = 0, ii = figures.length; i < ii; i++) { + const figure = figures[i], + ps = figure.coords, + cs = figure.colors; + for (j = 0, jj = ps.length; j < jj; j++) { + ps[j] *= 2; + cs[j] *= 3; + } + } + } + getIR() { + return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.bbox, this.background]; + } +} +class DummyShading extends BaseShading { + getIR() { + return ["Dummy"]; + } +} +function getTilingPatternIR(operatorList, dict, color) { + const matrix = dict.getArray("Matrix"); + const bbox = _util.Util.normalizeRect(dict.getArray("BBox")); + const xstep = dict.get("XStep"); + const ystep = dict.get("YStep"); + const paintType = dict.get("PaintType"); + const tilingType = dict.get("TilingType"); + if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { + throw new _util.FormatError(`Invalid getTilingPatternIR /BBox array: [${bbox}].`); + } + return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType]; +} + +/***/ }), +/* 180 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getXfaFontDict = getXfaFontDict; +exports.getXfaFontName = getXfaFontName; +var _calibri_factors = __w_pdfjs_require__(181); +var _primitives = __w_pdfjs_require__(134); +var _helvetica_factors = __w_pdfjs_require__(182); +var _liberationsans_widths = __w_pdfjs_require__(183); +var _myriadpro_factors = __w_pdfjs_require__(184); +var _segoeui_factors = __w_pdfjs_require__(185); +var _core_utils = __w_pdfjs_require__(135); +var _fonts_utils = __w_pdfjs_require__(167); +const getXFAFontMap = (0, _core_utils.getLookupTableFactory)(function (t) { + t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { + name: "LiberationSans-Regular", + factors: _myriadpro_factors.MyriadProRegularFactors, + baseWidths: _liberationsans_widths.LiberationSansRegularWidths, + baseMapping: _liberationsans_widths.LiberationSansRegularMapping, + metrics: _myriadpro_factors.MyriadProRegularMetrics + }; + t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = { + name: "LiberationSans-Bold", + factors: _myriadpro_factors.MyriadProBoldFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldMapping, + metrics: _myriadpro_factors.MyriadProBoldMetrics + }; + t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = { + name: "LiberationSans-Italic", + factors: _myriadpro_factors.MyriadProItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansItalicMapping, + metrics: _myriadpro_factors.MyriadProItalicMetrics + }; + t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: _myriadpro_factors.MyriadProBoldItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldItalicMapping, + metrics: _myriadpro_factors.MyriadProBoldItalicMetrics + }; + t.ArialMT = t.Arial = t["Arial-Regular"] = { + name: "LiberationSans-Regular", + baseWidths: _liberationsans_widths.LiberationSansRegularWidths, + baseMapping: _liberationsans_widths.LiberationSansRegularMapping + }; + t["Arial-BoldMT"] = t["Arial-Bold"] = { + name: "LiberationSans-Bold", + baseWidths: _liberationsans_widths.LiberationSansBoldWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldMapping + }; + t["Arial-ItalicMT"] = t["Arial-Italic"] = { + name: "LiberationSans-Italic", + baseWidths: _liberationsans_widths.LiberationSansItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansItalicMapping + }; + t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldItalicMapping + }; + t["Calibri-Regular"] = { + name: "LiberationSans-Regular", + factors: _calibri_factors.CalibriRegularFactors, + baseWidths: _liberationsans_widths.LiberationSansRegularWidths, + baseMapping: _liberationsans_widths.LiberationSansRegularMapping, + metrics: _calibri_factors.CalibriRegularMetrics + }; + t["Calibri-Bold"] = { + name: "LiberationSans-Bold", + factors: _calibri_factors.CalibriBoldFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldMapping, + metrics: _calibri_factors.CalibriBoldMetrics + }; + t["Calibri-Italic"] = { + name: "LiberationSans-Italic", + factors: _calibri_factors.CalibriItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansItalicMapping, + metrics: _calibri_factors.CalibriItalicMetrics + }; + t["Calibri-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: _calibri_factors.CalibriBoldItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldItalicMapping, + metrics: _calibri_factors.CalibriBoldItalicMetrics + }; + t["Segoeui-Regular"] = { + name: "LiberationSans-Regular", + factors: _segoeui_factors.SegoeuiRegularFactors, + baseWidths: _liberationsans_widths.LiberationSansRegularWidths, + baseMapping: _liberationsans_widths.LiberationSansRegularMapping, + metrics: _segoeui_factors.SegoeuiRegularMetrics + }; + t["Segoeui-Bold"] = { + name: "LiberationSans-Bold", + factors: _segoeui_factors.SegoeuiBoldFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldMapping, + metrics: _segoeui_factors.SegoeuiBoldMetrics + }; + t["Segoeui-Italic"] = { + name: "LiberationSans-Italic", + factors: _segoeui_factors.SegoeuiItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansItalicMapping, + metrics: _segoeui_factors.SegoeuiItalicMetrics + }; + t["Segoeui-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: _segoeui_factors.SegoeuiBoldItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldItalicMapping, + metrics: _segoeui_factors.SegoeuiBoldItalicMetrics + }; + t["Helvetica-Regular"] = t.Helvetica = { + name: "LiberationSans-Regular", + factors: _helvetica_factors.HelveticaRegularFactors, + baseWidths: _liberationsans_widths.LiberationSansRegularWidths, + baseMapping: _liberationsans_widths.LiberationSansRegularMapping, + metrics: _helvetica_factors.HelveticaRegularMetrics + }; + t["Helvetica-Bold"] = { + name: "LiberationSans-Bold", + factors: _helvetica_factors.HelveticaBoldFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldMapping, + metrics: _helvetica_factors.HelveticaBoldMetrics + }; + t["Helvetica-Italic"] = { + name: "LiberationSans-Italic", + factors: _helvetica_factors.HelveticaItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansItalicMapping, + metrics: _helvetica_factors.HelveticaItalicMetrics + }; + t["Helvetica-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: _helvetica_factors.HelveticaBoldItalicFactors, + baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths, + baseMapping: _liberationsans_widths.LiberationSansBoldItalicMapping, + metrics: _helvetica_factors.HelveticaBoldItalicMetrics + }; +}); +function getXfaFontName(name) { + const fontName = (0, _fonts_utils.normalizeFontName)(name); + const fontMap = getXFAFontMap(); + return fontMap[fontName]; +} +function getXfaFontWidths(name) { + const info = getXfaFontName(name); + if (!info) { + return null; + } + const { + baseWidths, + baseMapping, + factors + } = info; + let rescaledBaseWidths; + if (!factors) { + rescaledBaseWidths = baseWidths; + } else { + rescaledBaseWidths = baseWidths.map((w, i) => w * factors[i]); + } + let currentCode = -2; + let currentArray; + const newWidths = []; + for (const [unicode, glyphIndex] of baseMapping.map((charUnicode, index) => [charUnicode, index]).sort((_ref, _ref2) => { + let [unicode1] = _ref; + let [unicode2] = _ref2; + return unicode1 - unicode2; + })) { + if (unicode === -1) { + continue; + } + if (unicode === currentCode + 1) { + currentArray.push(rescaledBaseWidths[glyphIndex]); + currentCode += 1; + } else { + currentCode = unicode; + currentArray = [rescaledBaseWidths[glyphIndex]]; + newWidths.push(unicode, currentArray); + } + } + return newWidths; +} +function getXfaFontDict(name) { + const widths = getXfaFontWidths(name); + const dict = new _primitives.Dict(null); + dict.set("BaseFont", _primitives.Name.get(name)); + dict.set("Type", _primitives.Name.get("Font")); + dict.set("Subtype", _primitives.Name.get("CIDFontType2")); + dict.set("Encoding", _primitives.Name.get("Identity-H")); + dict.set("CIDToGIDMap", _primitives.Name.get("Identity")); + dict.set("W", widths); + dict.set("FirstChar", widths[0]); + dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1); + const descriptor = new _primitives.Dict(null); + dict.set("FontDescriptor", descriptor); + const systemInfo = new _primitives.Dict(null); + systemInfo.set("Ordering", "Identity"); + systemInfo.set("Registry", "Adobe"); + systemInfo.set("Supplement", 0); + dict.set("CIDSystemInfo", systemInfo); + return dict; +} + +/***/ }), +/* 181 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.CalibriRegularMetrics = exports.CalibriRegularFactors = exports.CalibriItalicMetrics = exports.CalibriItalicFactors = exports.CalibriBoldMetrics = exports.CalibriBoldItalicMetrics = exports.CalibriBoldItalicFactors = exports.CalibriBoldFactors = void 0; +const CalibriBoldFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.CalibriBoldFactors = CalibriBoldFactors; +const CalibriBoldMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +exports.CalibriBoldMetrics = CalibriBoldMetrics; +const CalibriBoldItalicFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795, 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577, 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908, 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401, 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411, 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887, 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411, 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289, 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921, 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331, 1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, 0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, 0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988, 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581, 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015, 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88323, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794, 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527, 1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.CalibriBoldItalicFactors = CalibriBoldItalicFactors; +const CalibriBoldItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +exports.CalibriBoldItalicMetrics = CalibriBoldItalicMetrics; +const CalibriItalicFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374, 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306, 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245, 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918, 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562, 0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, 0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, 0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, 0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, 0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, 0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, 0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776, 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306, 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824, 0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, 0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, 0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, 0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, 0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, 1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, 0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, 0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85865, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, 0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.CalibriItalicFactors = CalibriItalicFactors; +const CalibriItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +exports.CalibriItalicMetrics = CalibriItalicMetrics; +const CalibriRegularFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503, 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306, 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128, 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297, 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469, 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284, 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464, 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469, 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675, 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, 0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, 0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, 0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, 0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, 1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128, 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254, 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275, 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122, 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772, 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018, 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516, 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442, 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181, 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, 0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, 0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.CalibriRegularFactors = CalibriRegularFactors; +const CalibriRegularMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207 +}; +exports.CalibriRegularMetrics = CalibriRegularMetrics; + +/***/ }), +/* 182 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.HelveticaRegularMetrics = exports.HelveticaRegularFactors = exports.HelveticaItalicMetrics = exports.HelveticaItalicFactors = exports.HelveticaBoldMetrics = exports.HelveticaBoldItalicMetrics = exports.HelveticaBoldItalicFactors = exports.HelveticaBoldFactors = void 0; +const HelveticaBoldFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973, 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.HelveticaBoldFactors = HelveticaBoldFactors; +const HelveticaBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +exports.HelveticaBoldMetrics = HelveticaBoldMetrics; +const HelveticaBoldItalicFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, 1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, 1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, 1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, 0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, 0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, 1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, 1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, 0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, 0.99973, 1.00066, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977, 1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 0.99964, 1.00031, 1.00001, 0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999, 0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99955, 0.9995, 1.00026, 1.00026, 1.00032, 0.99989, 1.00034, 0.99999, 1.00026, 1.00026, 1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 0.99999, 0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 0.99973, 0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.HelveticaBoldItalicFactors = HelveticaBoldItalicFactors; +const HelveticaBoldItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2 +}; +exports.HelveticaBoldItalicMetrics = HelveticaBoldItalicMetrics; +const HelveticaItalicFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, 0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, 1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, 1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, 0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, 1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, 0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, 1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, 1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 1.00001, 1.00038, 0.99954, 0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001, 0.99977, 1.00026, 0.99975, 1.0001, 1.00001, 0.99993, 0.9995, 0.99955, 1.00016, 0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99973, 1.00089, 1.00005, 0.99967, 1.00048, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973, 0.99964, 1.00006, 1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1, 0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 0.99985, 1.00022, 1.00023, 1.00061, 1.00006, 0.99966, 0.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1, 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1, 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.HelveticaItalicFactors = HelveticaItalicFactors; +const HelveticaItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2 +}; +exports.HelveticaItalicMetrics = HelveticaItalicMetrics; +const HelveticaRegularFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, 0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, 0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, 1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, 0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, 0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, 0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, 1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, 1.00001, 1.00092, 0.99964, 1.00001, 0.99963, 0.99999, 1.00035, 1.00035, 1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.9996, 0.99967, 1.00001, 1.00034, 1.00074, 1.00054, 1.00053, 1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 0.99973, 1.00043, 0.99953, 1.0007, 0.99915, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073, 1.00114, 0.99915, 1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1, 1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 1.00035, 1.00001, 0.9995, 1, 1.00092, 0.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1, 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.HelveticaRegularFactors = HelveticaRegularFactors; +const HelveticaRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +exports.HelveticaRegularMetrics = HelveticaRegularMetrics; + +/***/ }), +/* 183 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.LiberationSansRegularWidths = exports.LiberationSansRegularMapping = exports.LiberationSansItalicWidths = exports.LiberationSansItalicMapping = exports.LiberationSansBoldWidths = exports.LiberationSansBoldMapping = exports.LiberationSansBoldItalicWidths = exports.LiberationSansBoldItalicMapping = void 0; +const LiberationSansBoldWidths = [365, 0, 333, 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, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 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, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906, 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722, 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278, 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278, 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753, 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556, 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 904, 626, 719, 719, 610, 702, 833, 722, 778, 719, 667, 722, 611, 622, 854, 667, 730, 703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 556, 618, 615, 417, 635, 556, 709, 497, 615, 615, 500, 635, 740, 604, 611, 604, 611, 556, 490, 556, 875, 556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 556, 556, 611, 417, 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487, 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; +exports.LiberationSansBoldWidths = LiberationSansBoldWidths; +const LiberationSansBoldMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +exports.LiberationSansBoldMapping = LiberationSansBoldMapping; +const LiberationSansBoldItalicWidths = [365, 0, 333, 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, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 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, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906, 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722, 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278, 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278, 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773, 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556, 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, 643, 719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, 729, 708, 979, 989, 854, 1000, 708, 719, 1042, 729, 556, 619, 604, 534, 618, 556, 736, 510, 611, 611, 507, 622, 740, 604, 611, 611, 611, 556, 889, 556, 885, 556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 556, 556, 611, 469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575, 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; +exports.LiberationSansBoldItalicWidths = LiberationSansBoldItalicWidths; +const LiberationSansBoldItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +exports.LiberationSansBoldItalicMapping = LiberationSansBoldItalicMapping; +const LiberationSansItalicWidths = [365, 0, 333, 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, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 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, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, 556, 400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, 846, 389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, 667, 667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, 278, 667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, 222, 500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, 728, 779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, 500, 1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 667, 917, 614, 715, 715, 589, 686, 833, 722, 778, 725, 667, 722, 611, 639, 795, 667, 727, 673, 920, 923, 805, 886, 651, 694, 1022, 682, 556, 562, 522, 493, 553, 556, 688, 465, 556, 556, 472, 564, 686, 550, 556, 556, 556, 500, 833, 500, 835, 500, 572, 518, 830, 851, 621, 736, 526, 492, 752, 534, 556, 556, 556, 378, 496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, 492, 339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 998, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; +exports.LiberationSansItalicWidths = LiberationSansItalicWidths; +const LiberationSansItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +exports.LiberationSansItalicMapping = LiberationSansItalicMapping; +const LiberationSansRegularWidths = [365, 0, 333, 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, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 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, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556, 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838, 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667, 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278, 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222, 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713, 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500, 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 667, 923, 604, 719, 719, 583, 656, 833, 722, 778, 719, 667, 722, 611, 635, 760, 667, 740, 667, 917, 938, 792, 885, 656, 719, 1010, 722, 556, 573, 531, 365, 583, 556, 669, 458, 559, 559, 438, 583, 688, 552, 556, 542, 556, 500, 458, 500, 823, 500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 556, 556, 556, 365, 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489, 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; +exports.LiberationSansRegularWidths = LiberationSansRegularWidths; +const LiberationSansRegularMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; +exports.LiberationSansRegularMapping = LiberationSansRegularMapping; + +/***/ }), +/* 184 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.MyriadProRegularMetrics = exports.MyriadProRegularFactors = exports.MyriadProItalicMetrics = exports.MyriadProItalicFactors = exports.MyriadProBoldMetrics = exports.MyriadProBoldItalicMetrics = exports.MyriadProBoldItalicFactors = exports.MyriadProBoldFactors = void 0; +const MyriadProBoldFactors = [1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169, 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.MyriadProBoldFactors = MyriadProBoldFactors; +const MyriadProBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +exports.MyriadProBoldMetrics = MyriadProBoldMetrics; +const MyriadProBoldItalicFactors = [1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222, 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582, 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655, 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222, 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605, 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058, 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796, 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168, 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236, 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276, 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074, 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1, 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043, 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729, 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621, 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058, 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216, 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381, 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364, 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783, 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523, 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036, 0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, 0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, 0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513, 0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, 0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, 0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, 0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, 0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275, 1.04502, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.00899, 1.30628, 0.85576, 0.80178, 0.66862, 0.7927, 0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, 0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, 0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, 0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, 0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, 0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, 0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, 0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, 0.85923, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, 1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, 0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, 1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.20006, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.MyriadProBoldItalicFactors = MyriadProBoldItalicFactors; +const MyriadProBoldItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +exports.MyriadProBoldItalicMetrics = MyriadProBoldItalicMetrics; +const MyriadProItalicFactors = [1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307, 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945, 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058, 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125, 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588, 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832, 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012, 0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075, 1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, 0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, 0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, 0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, 0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, 0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, 0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, 0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, 0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1, 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728, 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475, 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865, 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867, 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866, 0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512, 0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, 0.8075, 0.85751, 0.8562, 1, 1, 0.77598, 1.12658, 1.15012, 1.15012, 1.15012, 1.15012, 1.15012, 1.15313, 1.15012, 1.15012, 1.15012, 1.08106, 1.03901, 0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, 1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, 0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, 0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, 0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, 0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, 0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, 0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, 0.91123, 0.86799, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, 1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1, 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, 1.06233, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.MyriadProItalicFactors = MyriadProItalicFactors; +const MyriadProItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +exports.MyriadProItalicMetrics = MyriadProItalicMetrics; +const MyriadProRegularFactors = [1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706, 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002, 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051, 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761, 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111, 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231, 0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938, 1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, 0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, 1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, 0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, 1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, 0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, 0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, 0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284, 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377, 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441, 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991, 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434, 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1, 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856, 0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936, 0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, 0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, 0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, 0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, 0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, 0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89633, 1.01915, 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1, 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903, 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241, 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1, 0.74705, 0.71119, 1.02058, 1.024, 1.02119, 1, 1, 1.1536, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05638, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.MyriadProRegularFactors = MyriadProRegularFactors; +const MyriadProRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2 +}; +exports.MyriadProRegularMetrics = MyriadProRegularMetrics; + +/***/ }), +/* 185 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.SegoeuiRegularMetrics = exports.SegoeuiRegularFactors = exports.SegoeuiItalicMetrics = exports.SegoeuiItalicFactors = exports.SegoeuiBoldMetrics = exports.SegoeuiBoldItalicMetrics = exports.SegoeuiBoldItalicFactors = exports.SegoeuiBoldFactors = void 0; +const SegoeuiBoldFactors = [1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.97278, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511, 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.SegoeuiBoldFactors = SegoeuiBoldFactors; +const SegoeuiBoldMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +exports.SegoeuiBoldMetrics = SegoeuiBoldMetrics; +const SegoeuiBoldItalicFactors = [1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378, 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723, 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128, 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527, 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293, 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042, 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236, 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922, 0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107, 1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754, 1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, 1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, 1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, 1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, 1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, 0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, 0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, 1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, 0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, 1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922, 1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168, 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385, 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126, 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205, 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815, 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552, 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945, 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961, 0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518, 0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377, 1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514, 0.94165, 1.07514, 1.00351, 0.79429, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09097, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.93503, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, 1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1, 0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633, 0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, 0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, 0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, 1.13904, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21339, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18775, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.SegoeuiBoldItalicFactors = SegoeuiBoldItalicFactors; +const SegoeuiBoldItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +exports.SegoeuiBoldItalicMetrics = SegoeuiBoldItalicMetrics; +const SegoeuiItalicFactors = [1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373, 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383, 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308, 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016, 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989, 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143, 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627, 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454, 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225, 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973, 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748, 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781, 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971, 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836, 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782, 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402, 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146, 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225, 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351, 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729, 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454, 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484, 0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, 1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, 1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, 0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, 0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043, 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498, 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965, 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2, 0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924, 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642, 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284, 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205, 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119, 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679, 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675, 1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03754, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973, 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945, 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621, 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836, 1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.97622, 1.96791, 1.24822, 1.24822, 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10742, 1.10742, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.SegoeuiItalicFactors = SegoeuiItalicFactors; +const SegoeuiItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +exports.SegoeuiItalicMetrics = SegoeuiItalicMetrics; +const SegoeuiRegularFactors = [1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985, 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084, 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831, 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968, 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433, 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484, 1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011, 1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, 0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, 0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, 0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, 0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, 0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, 0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, 0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, 0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, 0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, 1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, 1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, 0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, 1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, 0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, 1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, 0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, 1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, 0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771, 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287, 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571, 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771, 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572, 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366, 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, 0.96491, 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796, 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287, 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424, 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424, 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087, 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205, 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03719, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9403, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965, 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196, 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714, 1.18416, 1.14589, 0.69825, 0.97622, 1.9697, 1.24822, 1.24822, 1.17238, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10938, 1.10938, 1, 1, 1, 1.05425, 1.09971, 1.09971, 1.09971, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; +exports.SegoeuiRegularFactors = SegoeuiRegularFactors; +const SegoeuiRegularMetrics = { + lineHeight: 1.33008, + lineGap: 0 +}; +exports.SegoeuiRegularMetrics = SegoeuiRegularMetrics; + +/***/ }), +/* 186 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PostScriptEvaluator = exports.PostScriptCompiler = exports.PDFFunctionFactory = void 0; +exports.isPDFFunction = isPDFFunction; +var _primitives = __w_pdfjs_require__(134); +var _util = __w_pdfjs_require__(2); +var _ps_parser = __w_pdfjs_require__(187); +var _base_stream = __w_pdfjs_require__(136); +var _image_utils = __w_pdfjs_require__(188); +class PDFFunctionFactory { + constructor(_ref) { + let { + xref, + isEvalSupported = true + } = _ref; + this.xref = xref; + this.isEvalSupported = isEvalSupported !== false; + } + create(fn) { + const cachedFunction = this.getCached(fn); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parse({ + xref: this.xref, + isEvalSupported: this.isEvalSupported, + fn: fn instanceof _primitives.Ref ? this.xref.fetch(fn) : fn + }); + this._cache(fn, parsedFunction); + return parsedFunction; + } + createFromArray(fnObj) { + const cachedFunction = this.getCached(fnObj); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parseArray({ + xref: this.xref, + isEvalSupported: this.isEvalSupported, + fnObj: fnObj instanceof _primitives.Ref ? this.xref.fetch(fnObj) : fnObj + }); + this._cache(fnObj, parsedFunction); + return parsedFunction; + } + getCached(cacheKey) { + let fnRef; + if (cacheKey instanceof _primitives.Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof _primitives.Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof _base_stream.BaseStream) { + fnRef = cacheKey.dict && cacheKey.dict.objId; + } + if (fnRef) { + const localFunction = this._localFunctionCache.getByRef(fnRef); + if (localFunction) { + return localFunction; + } + } + return null; + } + _cache(cacheKey, parsedFunction) { + if (!parsedFunction) { + throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.'); + } + let fnRef; + if (cacheKey instanceof _primitives.Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof _primitives.Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof _base_stream.BaseStream) { + fnRef = cacheKey.dict && cacheKey.dict.objId; + } + if (fnRef) { + this._localFunctionCache.set(null, fnRef, parsedFunction); + } + } + get _localFunctionCache() { + return (0, _util.shadow)(this, "_localFunctionCache", new _image_utils.LocalFunctionCache()); + } +} +exports.PDFFunctionFactory = PDFFunctionFactory; +function toNumberArray(arr) { + if (!Array.isArray(arr)) { + return null; + } + const length = arr.length; + for (let i = 0; i < length; i++) { + if (typeof arr[i] !== "number") { + const result = new Array(length); + for (let j = 0; j < length; j++) { + result[j] = +arr[j]; + } + return result; + } + } + return arr; +} +class PDFFunction { + static getSampleArray(size, outputSize, bps, stream) { + let i, ii; + let length = 1; + for (i = 0, ii = size.length; i < ii; i++) { + length *= size[i]; + } + length *= outputSize; + const array = new Array(length); + let codeSize = 0; + let codeBuf = 0; + const sampleMul = 1.0 / (2.0 ** bps - 1); + const strBytes = stream.getBytes((length * bps + 7) / 8); + let strIdx = 0; + for (i = 0; i < length; i++) { + while (codeSize < bps) { + codeBuf <<= 8; + codeBuf |= strBytes[strIdx++]; + codeSize += 8; + } + codeSize -= bps; + array[i] = (codeBuf >> codeSize) * sampleMul; + codeBuf &= (1 << codeSize) - 1; + } + return array; + } + static parse(_ref2) { + let { + xref, + isEvalSupported, + fn + } = _ref2; + const dict = fn.dict || fn; + const typeNum = dict.get("FunctionType"); + switch (typeNum) { + case 0: + return this.constructSampled({ + xref, + isEvalSupported, + fn, + dict + }); + case 1: + break; + case 2: + return this.constructInterpolated({ + xref, + isEvalSupported, + dict + }); + case 3: + return this.constructStiched({ + xref, + isEvalSupported, + dict + }); + case 4: + return this.constructPostScript({ + xref, + isEvalSupported, + fn, + dict + }); + } + throw new _util.FormatError("Unknown type of function"); + } + static parseArray(_ref3) { + let { + xref, + isEvalSupported, + fnObj + } = _ref3; + if (!Array.isArray(fnObj)) { + return this.parse({ + xref, + isEvalSupported, + fn: fnObj + }); + } + const fnArray = []; + for (const fn of fnObj) { + fnArray.push(this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn) + })); + } + return function (src, srcOffset, dest, destOffset) { + for (let i = 0, ii = fnArray.length; i < ii; i++) { + fnArray[i](src, srcOffset, dest, destOffset + i); + } + }; + } + static constructSampled(_ref4) { + let { + xref, + isEvalSupported, + fn, + dict + } = _ref4; + function toMultiArray(arr) { + const inputLength = arr.length; + const out = []; + let index = 0; + for (let i = 0; i < inputLength; i += 2) { + out[index++] = [arr[i], arr[i + 1]]; + } + return out; + } + function interpolate(x, xmin, xmax, ymin, ymax) { + return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); + } + let domain = toNumberArray(dict.getArray("Domain")); + let range = toNumberArray(dict.getArray("Range")); + if (!domain || !range) { + throw new _util.FormatError("No domain or range"); + } + const inputSize = domain.length / 2; + const outputSize = range.length / 2; + domain = toMultiArray(domain); + range = toMultiArray(range); + const size = toNumberArray(dict.getArray("Size")); + const bps = dict.get("BitsPerSample"); + const order = dict.get("Order") || 1; + if (order !== 1) { + (0, _util.info)("No support for cubic spline interpolation: " + order); + } + let encode = toNumberArray(dict.getArray("Encode")); + if (!encode) { + encode = []; + for (let i = 0; i < inputSize; ++i) { + encode.push([0, size[i] - 1]); + } + } else { + encode = toMultiArray(encode); + } + let decode = toNumberArray(dict.getArray("Decode")); + if (!decode) { + decode = range; + } else { + decode = toMultiArray(decode); + } + const samples = this.getSampleArray(size, outputSize, bps, fn); + return function constructSampledFn(src, srcOffset, dest, destOffset) { + const cubeVertices = 1 << inputSize; + const cubeN = new Float64Array(cubeVertices); + const cubeVertex = new Uint32Array(cubeVertices); + let i, j; + for (j = 0; j < cubeVertices; j++) { + cubeN[j] = 1; + } + let k = outputSize, + pos = 1; + for (i = 0; i < inputSize; ++i) { + const domain_2i = domain[i][0]; + const domain_2i_1 = domain[i][1]; + const xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1); + let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); + const size_i = size[i]; + e = Math.min(Math.max(e, 0), size_i - 1); + const e0 = e < size_i - 1 ? Math.floor(e) : e - 1; + const n0 = e0 + 1 - e; + const n1 = e - e0; + const offset0 = e0 * k; + const offset1 = offset0 + k; + for (j = 0; j < cubeVertices; j++) { + if (j & pos) { + cubeN[j] *= n1; + cubeVertex[j] += offset1; + } else { + cubeN[j] *= n0; + cubeVertex[j] += offset0; + } + } + k *= size_i; + pos <<= 1; + } + for (j = 0; j < outputSize; ++j) { + let rj = 0; + for (i = 0; i < cubeVertices; i++) { + rj += samples[cubeVertex[i] + j] * cubeN[i]; + } + rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); + dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); + } + }; + } + static constructInterpolated(_ref5) { + let { + xref, + isEvalSupported, + dict + } = _ref5; + const c0 = toNumberArray(dict.getArray("C0")) || [0]; + const c1 = toNumberArray(dict.getArray("C1")) || [1]; + const n = dict.get("N"); + const diff = []; + for (let i = 0, ii = c0.length; i < ii; ++i) { + diff.push(c1[i] - c0[i]); + } + const length = diff.length; + return function constructInterpolatedFn(src, srcOffset, dest, destOffset) { + const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n; + for (let j = 0; j < length; ++j) { + dest[destOffset + j] = c0[j] + x * diff[j]; + } + }; + } + static constructStiched(_ref6) { + let { + xref, + isEvalSupported, + dict + } = _ref6; + const domain = toNumberArray(dict.getArray("Domain")); + if (!domain) { + throw new _util.FormatError("No domain"); + } + const inputSize = domain.length / 2; + if (inputSize !== 1) { + throw new _util.FormatError("Bad domain for stiched function"); + } + const fns = []; + for (const fn of dict.get("Functions")) { + fns.push(this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn) + })); + } + const bounds = toNumberArray(dict.getArray("Bounds")); + const encode = toNumberArray(dict.getArray("Encode")); + const tmpBuf = new Float32Array(1); + return function constructStichedFn(src, srcOffset, dest, destOffset) { + const clip = function constructStichedFromIRClip(v, min, max) { + if (v > max) { + v = max; + } else if (v < min) { + v = min; + } + return v; + }; + const v = clip(src[srcOffset], domain[0], domain[1]); + const length = bounds.length; + let i; + for (i = 0; i < length; ++i) { + if (v < bounds[i]) { + break; + } + } + let dmin = domain[0]; + if (i > 0) { + dmin = bounds[i - 1]; + } + let dmax = domain[1]; + if (i < bounds.length) { + dmax = bounds[i]; + } + const rmin = encode[2 * i]; + const rmax = encode[2 * i + 1]; + tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); + fns[i](tmpBuf, 0, dest, destOffset); + }; + } + static constructPostScript(_ref7) { + let { + xref, + isEvalSupported, + fn, + dict + } = _ref7; + const domain = toNumberArray(dict.getArray("Domain")); + const range = toNumberArray(dict.getArray("Range")); + if (!domain) { + throw new _util.FormatError("No domain."); + } + if (!range) { + throw new _util.FormatError("No range."); + } + const lexer = new _ps_parser.PostScriptLexer(fn); + const parser = new _ps_parser.PostScriptParser(lexer); + const code = parser.parse(); + if (isEvalSupported && _util.FeatureTest.isEvalSupported) { + const compiled = new PostScriptCompiler().compile(code, domain, range); + if (compiled) { + return new Function("src", "srcOffset", "dest", "destOffset", compiled); + } + } + (0, _util.info)("Unable to compile PS function"); + const numOutputs = range.length >> 1; + const numInputs = domain.length >> 1; + const evaluator = new PostScriptEvaluator(code); + const cache = Object.create(null); + const MAX_CACHE_SIZE = 2048 * 4; + let cache_available = MAX_CACHE_SIZE; + const tmpBuf = new Float32Array(numInputs); + return function constructPostScriptFn(src, srcOffset, dest, destOffset) { + let i, value; + let key = ""; + const input = tmpBuf; + for (i = 0; i < numInputs; i++) { + value = src[srcOffset + i]; + input[i] = value; + key += value + "_"; + } + const cachedValue = cache[key]; + if (cachedValue !== undefined) { + dest.set(cachedValue, destOffset); + return; + } + const output = new Float32Array(numOutputs); + const stack = evaluator.execute(input); + const stackIndex = stack.length - numOutputs; + for (i = 0; i < numOutputs; i++) { + value = stack[stackIndex + i]; + let bound = range[i * 2]; + if (value < bound) { + value = bound; + } else { + bound = range[i * 2 + 1]; + if (value > bound) { + value = bound; + } + } + output[i] = value; + } + if (cache_available > 0) { + cache_available--; + cache[key] = output; + } + dest.set(output, destOffset); + }; + } +} +function isPDFFunction(v) { + let fnDict; + if (typeof v !== "object") { + return false; + } else if (v instanceof _primitives.Dict) { + fnDict = v; + } else if (v instanceof _base_stream.BaseStream) { + fnDict = v.dict; + } else { + return false; + } + return fnDict.has("FunctionType"); +} +class PostScriptStack { + static get MAX_STACK_SIZE() { + return (0, _util.shadow)(this, "MAX_STACK_SIZE", 100); + } + constructor(initialStack) { + this.stack = initialStack ? Array.from(initialStack) : []; + } + push(value) { + if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) { + throw new Error("PostScript function stack overflow."); + } + this.stack.push(value); + } + pop() { + if (this.stack.length <= 0) { + throw new Error("PostScript function stack underflow."); + } + return this.stack.pop(); + } + copy(n) { + if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) { + throw new Error("PostScript function stack overflow."); + } + const stack = this.stack; + for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) { + stack.push(stack[i]); + } + } + index(n) { + this.push(this.stack[this.stack.length - n - 1]); + } + roll(n, p) { + const stack = this.stack; + const l = stack.length - n; + const r = stack.length - 1; + const c = l + (p - Math.floor(p / n) * n); + for (let i = l, j = r; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + for (let i = l, j = c - 1; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + for (let i = c, j = r; i < j; i++, j--) { + const t = stack[i]; + stack[i] = stack[j]; + stack[j] = t; + } + } +} +class PostScriptEvaluator { + constructor(operators) { + this.operators = operators; + } + execute(initialStack) { + const stack = new PostScriptStack(initialStack); + let counter = 0; + const operators = this.operators; + const length = operators.length; + let operator, a, b; + while (counter < length) { + operator = operators[counter++]; + if (typeof operator === "number") { + stack.push(operator); + continue; + } + switch (operator) { + case "jz": + b = stack.pop(); + a = stack.pop(); + if (!a) { + counter = b; + } + break; + case "j": + a = stack.pop(); + counter = a; + break; + case "abs": + a = stack.pop(); + stack.push(Math.abs(a)); + break; + case "add": + b = stack.pop(); + a = stack.pop(); + stack.push(a + b); + break; + case "and": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a && b); + } else { + stack.push(a & b); + } + break; + case "atan": + a = stack.pop(); + stack.push(Math.atan(a)); + break; + case "bitshift": + b = stack.pop(); + a = stack.pop(); + if (a > 0) { + stack.push(a << b); + } else { + stack.push(a >> b); + } + break; + case "ceiling": + a = stack.pop(); + stack.push(Math.ceil(a)); + break; + case "copy": + a = stack.pop(); + stack.copy(a); + break; + case "cos": + a = stack.pop(); + stack.push(Math.cos(a)); + break; + case "cvi": + a = stack.pop() | 0; + stack.push(a); + break; + case "cvr": + break; + case "div": + b = stack.pop(); + a = stack.pop(); + stack.push(a / b); + break; + case "dup": + stack.copy(1); + break; + case "eq": + b = stack.pop(); + a = stack.pop(); + stack.push(a === b); + break; + case "exch": + stack.roll(2, 1); + break; + case "exp": + b = stack.pop(); + a = stack.pop(); + stack.push(a ** b); + break; + case "false": + stack.push(false); + break; + case "floor": + a = stack.pop(); + stack.push(Math.floor(a)); + break; + case "ge": + b = stack.pop(); + a = stack.pop(); + stack.push(a >= b); + break; + case "gt": + b = stack.pop(); + a = stack.pop(); + stack.push(a > b); + break; + case "idiv": + b = stack.pop(); + a = stack.pop(); + stack.push(a / b | 0); + break; + case "index": + a = stack.pop(); + stack.index(a); + break; + case "le": + b = stack.pop(); + a = stack.pop(); + stack.push(a <= b); + break; + case "ln": + a = stack.pop(); + stack.push(Math.log(a)); + break; + case "log": + a = stack.pop(); + stack.push(Math.log(a) / Math.LN10); + break; + case "lt": + b = stack.pop(); + a = stack.pop(); + stack.push(a < b); + break; + case "mod": + b = stack.pop(); + a = stack.pop(); + stack.push(a % b); + break; + case "mul": + b = stack.pop(); + a = stack.pop(); + stack.push(a * b); + break; + case "ne": + b = stack.pop(); + a = stack.pop(); + stack.push(a !== b); + break; + case "neg": + a = stack.pop(); + stack.push(-a); + break; + case "not": + a = stack.pop(); + if (typeof a === "boolean") { + stack.push(!a); + } else { + stack.push(~a); + } + break; + case "or": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a || b); + } else { + stack.push(a | b); + } + break; + case "pop": + stack.pop(); + break; + case "roll": + b = stack.pop(); + a = stack.pop(); + stack.roll(a, b); + break; + case "round": + a = stack.pop(); + stack.push(Math.round(a)); + break; + case "sin": + a = stack.pop(); + stack.push(Math.sin(a)); + break; + case "sqrt": + a = stack.pop(); + stack.push(Math.sqrt(a)); + break; + case "sub": + b = stack.pop(); + a = stack.pop(); + stack.push(a - b); + break; + case "true": + stack.push(true); + break; + case "truncate": + a = stack.pop(); + a = a < 0 ? Math.ceil(a) : Math.floor(a); + stack.push(a); + break; + case "xor": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a !== b); + } else { + stack.push(a ^ b); + } + break; + default: + throw new _util.FormatError(`Unknown operator ${operator}`); + } + } + return stack.stack; + } +} +exports.PostScriptEvaluator = PostScriptEvaluator; +class AstNode { + constructor(type) { + this.type = type; + } + visit(visitor) { + (0, _util.unreachable)("abstract method"); + } +} +class AstArgument extends AstNode { + constructor(index, min, max) { + super("args"); + this.index = index; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitArgument(this); + } +} +class AstLiteral extends AstNode { + constructor(number) { + super("literal"); + this.number = number; + this.min = number; + this.max = number; + } + visit(visitor) { + visitor.visitLiteral(this); + } +} +class AstBinaryOperation extends AstNode { + constructor(op, arg1, arg2, min, max) { + super("binary"); + this.op = op; + this.arg1 = arg1; + this.arg2 = arg2; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitBinaryOperation(this); + } +} +class AstMin extends AstNode { + constructor(arg, max) { + super("max"); + this.arg = arg; + this.min = arg.min; + this.max = max; + } + visit(visitor) { + visitor.visitMin(this); + } +} +class AstVariable extends AstNode { + constructor(index, min, max) { + super("var"); + this.index = index; + this.min = min; + this.max = max; + } + visit(visitor) { + visitor.visitVariable(this); + } +} +class AstVariableDefinition extends AstNode { + constructor(variable, arg) { + super("definition"); + this.variable = variable; + this.arg = arg; + } + visit(visitor) { + visitor.visitVariableDefinition(this); + } +} +class ExpressionBuilderVisitor { + constructor() { + this.parts = []; + } + visitArgument(arg) { + this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))"); + } + visitVariable(variable) { + this.parts.push("v", variable.index); + } + visitLiteral(literal) { + this.parts.push(literal.number); + } + visitBinaryOperation(operation) { + this.parts.push("("); + operation.arg1.visit(this); + this.parts.push(" ", operation.op, " "); + operation.arg2.visit(this); + this.parts.push(")"); + } + visitVariableDefinition(definition) { + this.parts.push("var "); + definition.variable.visit(this); + this.parts.push(" = "); + definition.arg.visit(this); + this.parts.push(";"); + } + visitMin(max) { + this.parts.push("Math.min("); + max.arg.visit(this); + this.parts.push(", ", max.max, ")"); + } + toString() { + return this.parts.join(""); + } +} +function buildAddOperation(num1, num2) { + if (num2.type === "literal" && num2.number === 0) { + return num1; + } + if (num1.type === "literal" && num1.number === 0) { + return num2; + } + if (num2.type === "literal" && num1.type === "literal") { + return new AstLiteral(num1.number + num2.number); + } + return new AstBinaryOperation("+", num1, num2, num1.min + num2.min, num1.max + num2.max); +} +function buildMulOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return new AstLiteral(0); + } else if (num2.number === 1) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number * num2.number); + } + } + if (num1.type === "literal") { + if (num1.number === 0) { + return new AstLiteral(0); + } else if (num1.number === 1) { + return num2; + } + } + const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + return new AstBinaryOperation("*", num1, num2, min, max); +} +function buildSubOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number - num2.number); + } + } + if (num2.type === "binary" && num2.op === "-" && num1.type === "literal" && num1.number === 1 && num2.arg1.type === "literal" && num2.arg1.number === 1) { + return num2.arg2; + } + return new AstBinaryOperation("-", num1, num2, num1.min - num2.max, num1.max - num2.min); +} +function buildMinOperation(num1, max) { + if (num1.min >= max) { + return new AstLiteral(max); + } else if (num1.max <= max) { + return num1; + } + return new AstMin(num1, max); +} +class PostScriptCompiler { + compile(code, domain, range) { + const stack = []; + const instructions = []; + const inputSize = domain.length >> 1, + outputSize = range.length >> 1; + let lastRegister = 0; + let n, j; + let num1, num2, ast1, ast2, tmpVar, item; + for (let i = 0; i < inputSize; i++) { + stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); + } + for (let i = 0, ii = code.length; i < ii; i++) { + item = code[i]; + if (typeof item === "number") { + stack.push(new AstLiteral(item)); + continue; + } + switch (item) { + case "add": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildAddOperation(num1, num2)); + break; + case "cvr": + if (stack.length < 1) { + return null; + } + break; + case "mul": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildMulOperation(num1, num2)); + break; + case "sub": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildSubOperation(num1, num2)); + break; + case "exch": + if (stack.length < 2) { + return null; + } + ast1 = stack.pop(); + ast2 = stack.pop(); + stack.push(ast1, ast2); + break; + case "pop": + if (stack.length < 1) { + return null; + } + stack.pop(); + break; + case "index": + if (stack.length < 1) { + return null; + } + num1 = stack.pop(); + if (num1.type !== "literal") { + return null; + } + n = num1.number; + if (n < 0 || !Number.isInteger(n) || stack.length < n) { + return null; + } + ast1 = stack[stack.length - n - 1]; + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - n - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "dup": + if (stack.length < 1) { + return null; + } + if (typeof code[i + 1] === "number" && code[i + 2] === "gt" && code[i + 3] === i + 7 && code[i + 4] === "jz" && code[i + 5] === "pop" && code[i + 6] === code[i + 1]) { + num1 = stack.pop(); + stack.push(buildMinOperation(num1, code[i + 1])); + i += 6; + break; + } + ast1 = stack.at(-1); + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "roll": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + if (num2.type !== "literal" || num1.type !== "literal") { + return null; + } + j = num2.number; + n = num1.number; + if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) { + return null; + } + j = (j % n + n) % n; + if (j === 0) { + break; + } + stack.push(...stack.splice(stack.length - n, n - j)); + break; + default: + return null; + } + } + if (stack.length !== outputSize) { + return null; + } + const result = []; + for (const instruction of instructions) { + const statementBuilder = new ExpressionBuilderVisitor(); + instruction.visit(statementBuilder); + result.push(statementBuilder.toString()); + } + for (let i = 0, ii = stack.length; i < ii; i++) { + const expr = stack[i], + statementBuilder = new ExpressionBuilderVisitor(); + expr.visit(statementBuilder); + const min = range[i * 2], + max = range[i * 2 + 1]; + const out = [statementBuilder.toString()]; + if (min > expr.min) { + out.unshift("Math.max(", min, ", "); + out.push(")"); + } + if (max < expr.max) { + out.unshift("Math.min(", max, ", "); + out.push(")"); + } + out.unshift("dest[destOffset + ", i, "] = "); + out.push(";"); + result.push(out.join("")); + } + return result.join("\n"); + } +} +exports.PostScriptCompiler = PostScriptCompiler; + +/***/ }), +/* 187 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PostScriptParser = exports.PostScriptLexer = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _core_utils = __w_pdfjs_require__(135); +class PostScriptParser { + constructor(lexer) { + this.lexer = lexer; + this.operators = []; + this.token = null; + this.prev = null; + } + nextToken() { + this.prev = this.token; + this.token = this.lexer.getToken(); + } + accept(type) { + if (this.token.type === type) { + this.nextToken(); + return true; + } + return false; + } + expect(type) { + if (this.accept(type)) { + return true; + } + throw new _util.FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`); + } + parse() { + this.nextToken(); + this.expect(PostScriptTokenTypes.LBRACE); + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + return this.operators; + } + parseBlock() { + while (true) { + if (this.accept(PostScriptTokenTypes.NUMBER)) { + this.operators.push(this.prev.value); + } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { + this.operators.push(this.prev.value); + } else if (this.accept(PostScriptTokenTypes.LBRACE)) { + this.parseCondition(); + } else { + return; + } + } + } + parseCondition() { + const conditionLocation = this.operators.length; + this.operators.push(null, null); + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + if (this.accept(PostScriptTokenTypes.IF)) { + this.operators[conditionLocation] = this.operators.length; + this.operators[conditionLocation + 1] = "jz"; + } else if (this.accept(PostScriptTokenTypes.LBRACE)) { + const jumpLocation = this.operators.length; + this.operators.push(null, null); + const endOfTrue = this.operators.length; + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + this.expect(PostScriptTokenTypes.IFELSE); + this.operators[jumpLocation] = this.operators.length; + this.operators[jumpLocation + 1] = "j"; + this.operators[conditionLocation] = endOfTrue; + this.operators[conditionLocation + 1] = "jz"; + } else { + throw new _util.FormatError("PS Function: error parsing conditional."); + } + } +} +exports.PostScriptParser = PostScriptParser; +const PostScriptTokenTypes = { + LBRACE: 0, + RBRACE: 1, + NUMBER: 2, + OPERATOR: 3, + IF: 4, + IFELSE: 5 +}; +class PostScriptToken { + static get opCache() { + return (0, _util.shadow)(this, "opCache", Object.create(null)); + } + constructor(type, value) { + this.type = type; + this.value = value; + } + static getOperator(op) { + const opValue = PostScriptToken.opCache[op]; + if (opValue) { + return opValue; + } + return PostScriptToken.opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); + } + static get LBRACE() { + return (0, _util.shadow)(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{")); + } + static get RBRACE() { + return (0, _util.shadow)(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}")); + } + static get IF() { + return (0, _util.shadow)(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF")); + } + static get IFELSE() { + return (0, _util.shadow)(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE")); + } +} +class PostScriptLexer { + constructor(stream) { + this.stream = stream; + this.nextChar(); + this.strBuf = []; + } + nextChar() { + return this.currentChar = this.stream.getByte(); + } + getToken() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return _primitives.EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!(0, _core_utils.isWhiteSpace)(ch)) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2b: + case 0x2d: + case 0x2e: + return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber()); + case 0x7b: + this.nextChar(); + return PostScriptToken.LBRACE; + case 0x7d: + this.nextChar(); + return PostScriptToken.RBRACE; + } + const strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) { + strBuf.push(String.fromCharCode(ch)); + } + const str = strBuf.join(""); + switch (str.toLowerCase()) { + case "if": + return PostScriptToken.IF; + case "ifelse": + return PostScriptToken.IFELSE; + default: + return PostScriptToken.getOperator(str); + } + } + getNumber() { + let ch = this.currentChar; + const strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) { + strBuf.push(String.fromCharCode(ch)); + } else { + break; + } + } + const value = parseFloat(strBuf.join("")); + if (isNaN(value)) { + throw new _util.FormatError(`Invalid floating point number: ${value}`); + } + return value; + } +} +exports.PostScriptLexer = PostScriptLexer; + +/***/ }), +/* 188 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.LocalTilingPatternCache = exports.LocalImageCache = exports.LocalGStateCache = exports.LocalFunctionCache = exports.LocalColorSpaceCache = exports.GlobalImageCache = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +class BaseLocalCache { + constructor(options) { + if (this.constructor === BaseLocalCache) { + (0, _util.unreachable)("Cannot initialize BaseLocalCache."); + } + this._onlyRefs = (options && options.onlyRefs) === true; + if (!this._onlyRefs) { + this._nameRefMap = new Map(); + this._imageMap = new Map(); + } + this._imageCache = new _primitives.RefSetCache(); + } + getByName(name) { + if (this._onlyRefs) { + (0, _util.unreachable)("Should not call `getByName` method."); + } + const ref = this._nameRefMap.get(name); + if (ref) { + return this.getByRef(ref); + } + return this._imageMap.get(name) || null; + } + getByRef(ref) { + return this._imageCache.get(ref) || null; + } + set(name, ref, data) { + (0, _util.unreachable)("Abstract method `set` called."); + } +} +class LocalImageCache extends BaseLocalCache { + set(name) { + let ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let data = arguments.length > 2 ? arguments[2] : undefined; + if (typeof name !== "string") { + throw new Error('LocalImageCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +exports.LocalImageCache = LocalImageCache; +class LocalColorSpaceCache extends BaseLocalCache { + set() { + let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let data = arguments.length > 2 ? arguments[2] : undefined; + if (typeof name !== "string" && !ref) { + throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + if (name !== null) { + this._nameRefMap.set(name, ref); + } + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +exports.LocalColorSpaceCache = LocalColorSpaceCache; +class LocalFunctionCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set() { + let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let ref = arguments.length > 1 ? arguments[1] : undefined; + let data = arguments.length > 2 ? arguments[2] : undefined; + if (!ref) { + throw new Error('LocalFunctionCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +exports.LocalFunctionCache = LocalFunctionCache; +class LocalGStateCache extends BaseLocalCache { + set(name) { + let ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + let data = arguments.length > 2 ? arguments[2] : undefined; + if (typeof name !== "string") { + throw new Error('LocalGStateCache.set - expected "name" argument.'); + } + if (ref) { + if (this._imageCache.has(ref)) { + return; + } + this._nameRefMap.set(name, ref); + this._imageCache.put(ref, data); + return; + } + if (this._imageMap.has(name)) { + return; + } + this._imageMap.set(name, data); + } +} +exports.LocalGStateCache = LocalGStateCache; +class LocalTilingPatternCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set() { + let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let ref = arguments.length > 1 ? arguments[1] : undefined; + let data = arguments.length > 2 ? arguments[2] : undefined; + if (!ref) { + throw new Error('LocalTilingPatternCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} +exports.LocalTilingPatternCache = LocalTilingPatternCache; +class GlobalImageCache { + static get NUM_PAGES_THRESHOLD() { + return (0, _util.shadow)(this, "NUM_PAGES_THRESHOLD", 2); + } + static get MIN_IMAGES_TO_CACHE() { + return (0, _util.shadow)(this, "MIN_IMAGES_TO_CACHE", 10); + } + static get MAX_BYTE_SIZE() { + return (0, _util.shadow)(this, "MAX_BYTE_SIZE", 40e6); + } + constructor() { + this._refCache = new _primitives.RefSetCache(); + this._imageCache = new _primitives.RefSetCache(); + } + get _byteSize() { + let byteSize = 0; + for (const imageData of this._imageCache) { + byteSize += imageData.byteSize; + } + return byteSize; + } + get _cacheLimitReached() { + if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) { + return false; + } + if (this._byteSize < GlobalImageCache.MAX_BYTE_SIZE) { + return false; + } + return true; + } + shouldCache(ref, pageIndex) { + const pageIndexSet = this._refCache.get(ref); + const numPages = pageIndexSet ? pageIndexSet.size + (pageIndexSet.has(pageIndex) ? 0 : 1) : 1; + if (numPages < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return false; + } + if (!this._imageCache.has(ref) && this._cacheLimitReached) { + return false; + } + return true; + } + addPageIndex(ref, pageIndex) { + let pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + pageIndexSet = new Set(); + this._refCache.put(ref, pageIndexSet); + } + pageIndexSet.add(pageIndex); + } + addByteSize(ref, byteSize) { + const imageData = this._imageCache.get(ref); + if (!imageData) { + return; + } + if (imageData.byteSize) { + return; + } + imageData.byteSize = byteSize; + } + getData(ref, pageIndex) { + const pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + return null; + } + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return null; + } + const imageData = this._imageCache.get(ref); + if (!imageData) { + return null; + } + pageIndexSet.add(pageIndex); + return imageData; + } + setData(ref, data) { + if (!this._refCache.has(ref)) { + throw new Error('GlobalImageCache.setData - expected "addPageIndex" to have been called.'); + } + if (this._imageCache.has(ref)) { + return; + } + if (this._cacheLimitReached) { + (0, _util.warn)("GlobalImageCache.setData - cache limit reached."); + return; + } + this._imageCache.put(ref, data); + } + clear() { + let onlyData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (!onlyData) { + this._refCache.clear(); + } + this._imageCache.clear(); + } +} +exports.GlobalImageCache = GlobalImageCache; + +/***/ }), +/* 189 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.bidi = bidi; +var _util = __w_pdfjs_require__(2); +const baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", "ON", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "L", "ON", "ON", "BN", "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L"]; +const arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", "ON", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"]; +function isOdd(i) { + return (i & 1) !== 0; +} +function isEven(i) { + return (i & 1) === 0; +} +function findUnequal(arr, start, value) { + let j, jj; + for (j = start, jj = arr.length; j < jj; ++j) { + if (arr[j] !== value) { + return j; + } + } + return j; +} +function setValues(arr, start, end, value) { + for (let j = start; j < end; ++j) { + arr[j] = value; + } +} +function reverseValues(arr, start, end) { + for (let i = start, j = end - 1; i < j; ++i, --j) { + const temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } +} +function createBidiText(str, isLTR) { + let vertical = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let dir = "ltr"; + if (vertical) { + dir = "ttb"; + } else if (!isLTR) { + dir = "rtl"; + } + return { + str, + dir + }; +} +const chars = []; +const types = []; +function bidi(str) { + let startLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1; + let vertical = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + let isLTR = true; + const strLength = str.length; + if (strLength === 0 || vertical) { + return createBidiText(str, isLTR, vertical); + } + chars.length = strLength; + types.length = strLength; + let numBidi = 0; + let i, ii; + for (i = 0; i < strLength; ++i) { + chars[i] = str.charAt(i); + const charCode = str.charCodeAt(i); + let charType = "L"; + if (charCode <= 0x00ff) { + charType = baseTypes[charCode]; + } else if (0x0590 <= charCode && charCode <= 0x05f4) { + charType = "R"; + } else if (0x0600 <= charCode && charCode <= 0x06ff) { + charType = arabicTypes[charCode & 0xff]; + if (!charType) { + (0, _util.warn)("Bidi: invalid Unicode character " + charCode.toString(16)); + } + } else if (0x0700 <= charCode && charCode <= 0x08ac) { + charType = "AL"; + } + if (charType === "R" || charType === "AL" || charType === "AN") { + numBidi++; + } + types[i] = charType; + } + if (numBidi === 0) { + isLTR = true; + return createBidiText(str, isLTR); + } + if (startLevel === -1) { + if (numBidi / strLength < 0.3 && strLength > 4) { + isLTR = true; + startLevel = 0; + } else { + isLTR = false; + startLevel = 1; + } + } + const levels = []; + for (i = 0; i < strLength; ++i) { + levels[i] = startLevel; + } + const e = isOdd(startLevel) ? "R" : "L"; + const sor = e; + const eor = sor; + let lastType = sor; + for (i = 0; i < strLength; ++i) { + if (types[i] === "NSM") { + types[i] = lastType; + } else { + lastType = types[i]; + } + } + lastType = sor; + let t; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "AL" ? "AN" : "EN"; + } else if (t === "R" || t === "L" || t === "AL") { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "AL") { + types[i] = "R"; + } + } + for (i = 1; i < strLength - 1; ++i) { + if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") { + types[i] = "EN"; + } + if (types[i] === "CS" && (types[i - 1] === "EN" || types[i - 1] === "AN") && types[i + 1] === types[i - 1]) { + types[i] = types[i - 1]; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "EN") { + for (let j = i - 1; j >= 0; --j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + for (let j = i + 1; j < strLength; ++j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "WS" || t === "ES" || t === "ET" || t === "CS") { + types[i] = "ON"; + } + } + lastType = sor; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "L" ? "L" : "EN"; + } else if (t === "R" || t === "L") { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + const end = findUnequal(types, i + 1, "ON"); + let before = sor; + if (i > 0) { + before = types[i - 1]; + } + let after = eor; + if (end + 1 < strLength) { + after = types[end + 1]; + } + if (before !== "L") { + before = "R"; + } + if (after !== "L") { + after = "R"; + } + if (before === after) { + setValues(types, i, end, before); + } + i = end - 1; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + types[i] = e; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (isEven(levels[i])) { + if (t === "R") { + levels[i] += 1; + } else if (t === "AN" || t === "EN") { + levels[i] += 2; + } + } else { + if (t === "L" || t === "AN" || t === "EN") { + levels[i] += 1; + } + } + } + let highestLevel = -1; + let lowestOddLevel = 99; + let level; + for (i = 0, ii = levels.length; i < ii; ++i) { + level = levels[i]; + if (highestLevel < level) { + highestLevel = level; + } + if (lowestOddLevel > level && isOdd(level)) { + lowestOddLevel = level; + } + } + for (level = highestLevel; level >= lowestOddLevel; --level) { + let start = -1; + for (i = 0, ii = levels.length; i < ii; ++i) { + if (levels[i] < level) { + if (start >= 0) { + reverseValues(chars, start, i); + start = -1; + } + } else if (start < 0) { + start = i; + } + } + if (start >= 0) { + reverseValues(chars, start, levels.length); + } + } + for (i = 0, ii = chars.length; i < ii; ++i) { + const ch = chars[i]; + if (ch === "<" || ch === ">") { + chars[i] = ""; + } + } + return createBidiText(chars.join(""), isLTR); +} + +/***/ }), +/* 190 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.MurmurHash3_64 = void 0; +var _util = __w_pdfjs_require__(2); +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if ((0, _util.isArrayBuffer)(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Wrong data format in MurmurHash3_64_update. " + "Input must be a string or array."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} +exports.MurmurHash3_64 = MurmurHash3_64; + +/***/ }), +/* 191 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.OperatorList = void 0; +var _util = __w_pdfjs_require__(2); +function addState(parentState, pattern, checkFn, iterateFn, processFn) { + let state = parentState; + for (let i = 0, ii = pattern.length - 1; i < ii; i++) { + const item = pattern[i]; + state = state[item] || (state[item] = []); + } + state[pattern.at(-1)] = { + checkFn, + iterateFn, + processFn + }; +} +const InitialState = []; +addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, _util.OPS.restore], null, function iterateInlineImageGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === _util.OPS.save; + case 1: + return fnArray[i] === _util.OPS.transform; + case 2: + return fnArray[i] === _util.OPS.paintInlineImageXObject; + case 3: + return fnArray[i] === _util.OPS.restore; + } + throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); +}, function foundInlineImageGroup(context, i) { + const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; + const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; + const MAX_WIDTH = 1000; + const IMAGE_PADDING = 1; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIIXO = curr - 1; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); + if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let maxX = 0; + const map = []; + let maxLineHeight = 0; + let currentX = IMAGE_PADDING, + currentY = IMAGE_PADDING; + for (let q = 0; q < count; q++) { + const transform = argsArray[iFirstTransform + (q << 2)]; + const img = argsArray[iFirstPIIXO + (q << 2)][0]; + if (currentX + img.width > MAX_WIDTH) { + maxX = Math.max(maxX, currentX); + currentY += maxLineHeight + 2 * IMAGE_PADDING; + currentX = 0; + maxLineHeight = 0; + } + map.push({ + transform, + x: currentX, + y: currentY, + w: img.width, + h: img.height + }); + currentX += img.width + 2 * IMAGE_PADDING; + maxLineHeight = Math.max(maxLineHeight, img.height); + } + const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; + const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; + const imgData = new Uint8Array(imgWidth * imgHeight * 4); + const imgRowSize = imgWidth << 2; + for (let q = 0; q < count; q++) { + const data = argsArray[iFirstPIIXO + (q << 2)][0].data; + const rowSize = map[q].w << 2; + let dataOffset = 0; + let offset = map[q].x + map[q].y * imgWidth << 2; + imgData.set(data.subarray(0, rowSize), offset - imgRowSize); + for (let k = 0, kk = map[q].h; k < kk; k++) { + imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); + dataOffset += rowSize; + offset += imgRowSize; + } + imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); + while (offset >= 0) { + data[offset - 4] = data[offset]; + data[offset - 3] = data[offset + 1]; + data[offset - 2] = data[offset + 2]; + data[offset - 1] = data[offset + 3]; + data[offset + rowSize] = data[offset + rowSize - 4]; + data[offset + rowSize + 1] = data[offset + rowSize - 3]; + data[offset + rowSize + 2] = data[offset + rowSize - 2]; + data[offset + rowSize + 3] = data[offset + rowSize - 1]; + offset -= imgRowSize; + } + } + fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [{ + width: imgWidth, + height: imgHeight, + kind: _util.ImageKind.RGBA_32BPP, + data: imgData + }, map]); + return iFirstSave + 1; +}); +addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, _util.OPS.restore], null, function iterateImageMaskGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === _util.OPS.save; + case 1: + return fnArray[i] === _util.OPS.transform; + case 2: + return fnArray[i] === _util.OPS.paintImageMaskXObject; + case 3: + return fnArray[i] === _util.OPS.restore; + } + throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); +}, function foundImageMaskGroup(context, i) { + const MIN_IMAGES_IN_MASKS_BLOCK = 10; + const MAX_IMAGES_IN_MASKS_BLOCK = 100; + const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIMXO = curr - 1; + let count = Math.floor((i - iFirstSave) / 4); + if (count < MIN_IMAGES_IN_MASKS_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let isSameImage = false; + let iTransform, transformArgs; + const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0], + firstTransformArg1 = argsArray[iFirstTransform][1], + firstTransformArg2 = argsArray[iFirstTransform][2], + firstTransformArg3 = argsArray[iFirstTransform][3]; + if (firstTransformArg1 === firstTransformArg2) { + isSameImage = true; + iTransform = iFirstTransform + 4; + let iPIMXO = iFirstPIMXO + 4; + for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { + transformArgs = argsArray[iTransform]; + if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { + if (q < MIN_IMAGES_IN_MASKS_BLOCK) { + isSameImage = false; + } else { + count = q; + } + break; + } + } + } + if (isSameImage) { + count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); + const positions = new Float32Array(count * 2); + iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); + } else { + count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); + const images = []; + for (let q = 0; q < count; q++) { + transformArgs = argsArray[iFirstTransform + (q << 2)]; + const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; + images.push({ + data: maskParams.data, + width: maskParams.width, + height: maskParams.height, + interpolate: maskParams.interpolate, + count: maskParams.count, + transform: transformArgs + }); + } + fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [images]); + } + return iFirstSave + 1; +}); +addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, _util.OPS.restore], function (context) { + const argsArray = context.argsArray; + const iFirstTransform = context.iCurr - 2; + return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; +}, function iterateImageGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === _util.OPS.save; + case 1: + if (fnArray[i] !== _util.OPS.transform) { + return false; + } + const iFirstTransform = context.iCurr - 2; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) { + return false; + } + return true; + case 2: + if (fnArray[i] !== _util.OPS.paintImageXObject) { + return false; + } + const iFirstPIXO = context.iCurr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + if (argsArray[i][0] !== firstPIXOArg0) { + return false; + } + return true; + case 3: + return fnArray[i] === _util.OPS.restore; + } + throw new Error(`iterateImageGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_IMAGES_IN_BLOCK = 3; + const MAX_IMAGES_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIXO = curr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); + if (count < MIN_IMAGES_IN_BLOCK) { + return i - (i - iFirstSave) % 4; + } + const positions = new Float32Array(count * 2); + let iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + const transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; + fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, args); + return iFirstSave + 1; +}); +addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], null, function iterateShowTextGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 4; + const pos = (i - iFirstSave) % 5; + switch (pos) { + case 0: + return fnArray[i] === _util.OPS.beginText; + case 1: + return fnArray[i] === _util.OPS.setFont; + case 2: + return fnArray[i] === _util.OPS.setTextMatrix; + case 3: + if (fnArray[i] !== _util.OPS.showText) { + return false; + } + const iFirstSetFont = context.iCurr - 3; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) { + return false; + } + return true; + case 4: + return fnArray[i] === _util.OPS.endText; + } + throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_CHARS_IN_BLOCK = 3; + const MAX_CHARS_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstBeginText = curr - 4; + const iFirstSetFont = curr - 3; + const iFirstSetTextMatrix = curr - 2; + const iFirstShowText = curr - 1; + const iFirstEndText = curr; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); + if (count < MIN_CHARS_IN_BLOCK) { + return i - (i - iFirstBeginText) % 5; + } + let iFirst = iFirstBeginText; + if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { + count++; + iFirst -= 5; + } + let iEndText = iFirst + 4; + for (let q = 1; q < count; q++) { + fnArray.splice(iEndText, 3); + argsArray.splice(iEndText, 3); + iEndText += 2; + } + return iEndText + 1; +}); +class NullOptimizer { + constructor(queue) { + this.queue = queue; + } + _optimize() {} + push(fn, args) { + this.queue.fnArray.push(fn); + this.queue.argsArray.push(args); + this._optimize(); + } + flush() {} + reset() {} +} +class QueueOptimizer extends NullOptimizer { + constructor(queue) { + super(queue); + this.state = null; + this.context = { + iCurr: 0, + fnArray: queue.fnArray, + argsArray: queue.argsArray + }; + this.match = null; + this.lastProcessed = 0; + } + _optimize() { + const fnArray = this.queue.fnArray; + let i = this.lastProcessed, + ii = fnArray.length; + let state = this.state; + let match = this.match; + if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { + this.lastProcessed = ii; + return; + } + const context = this.context; + while (i < ii) { + if (match) { + const iterate = (0, match.iterateFn)(context, i); + if (iterate) { + i++; + continue; + } + i = (0, match.processFn)(context, i + 1); + ii = fnArray.length; + match = null; + state = null; + if (i >= ii) { + break; + } + } + state = (state || InitialState)[fnArray[i]]; + if (!state || Array.isArray(state)) { + i++; + continue; + } + context.iCurr = i; + i++; + if (state.checkFn && !(0, state.checkFn)(context)) { + state = null; + continue; + } + match = state; + state = null; + } + this.state = state; + this.match = match; + this.lastProcessed = i; + } + flush() { + while (this.match) { + const length = this.queue.fnArray.length; + this.lastProcessed = (0, this.match.processFn)(this.context, length); + this.match = null; + this.state = null; + this._optimize(); + } + } + reset() { + this.state = null; + this.match = null; + this.lastProcessed = 0; + } +} +class OperatorList { + static get CHUNK_SIZE() { + return (0, _util.shadow)(this, "CHUNK_SIZE", 1000); + } + static get CHUNK_SIZE_ABOUT() { + return (0, _util.shadow)(this, "CHUNK_SIZE_ABOUT", this.CHUNK_SIZE - 5); + } + constructor() { + let intent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + let streamSink = arguments.length > 1 ? arguments[1] : undefined; + this._streamSink = streamSink; + this.fnArray = []; + this.argsArray = []; + if (streamSink && !(intent & _util.RenderingIntentFlag.OPLIST)) { + this.optimizer = new QueueOptimizer(this); + } else { + this.optimizer = new NullOptimizer(this); + } + this.dependencies = new Set(); + this._totalLength = 0; + this.weight = 0; + this._resolved = streamSink ? null : Promise.resolve(); + } + get length() { + return this.argsArray.length; + } + get ready() { + return this._resolved || this._streamSink.ready; + } + get totalLength() { + return this._totalLength + this.length; + } + addOp(fn, args) { + this.optimizer.push(fn, args); + this.weight++; + if (this._streamSink) { + if (this.weight >= OperatorList.CHUNK_SIZE) { + this.flush(); + } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === _util.OPS.endText)) { + this.flush(); + } + } + } + addImageOps(fn, args, optionalContent) { + if (optionalContent !== undefined) { + this.addOp(_util.OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + this.addOp(fn, args); + if (optionalContent !== undefined) { + this.addOp(_util.OPS.endMarkedContent, []); + } + } + addDependency(dependency) { + if (this.dependencies.has(dependency)) { + return; + } + this.dependencies.add(dependency); + this.addOp(_util.OPS.dependency, [dependency]); + } + addDependencies(dependencies) { + for (const dependency of dependencies) { + this.addDependency(dependency); + } + } + addOpList(opList) { + if (!(opList instanceof OperatorList)) { + (0, _util.warn)('addOpList - ignoring invalid "opList" parameter.'); + return; + } + for (const dependency of opList.dependencies) { + this.dependencies.add(dependency); + } + for (let i = 0, ii = opList.length; i < ii; i++) { + this.addOp(opList.fnArray[i], opList.argsArray[i]); + } + } + getIR() { + return { + fnArray: this.fnArray, + argsArray: this.argsArray, + length: this.length + }; + } + get _transfers() { + const transfers = []; + const { + fnArray, + argsArray, + length + } = this; + for (let i = 0; i < length; i++) { + switch (fnArray[i]) { + case _util.OPS.paintInlineImageXObject: + case _util.OPS.paintInlineImageXObjectGroup: + case _util.OPS.paintImageMaskXObject: + const arg = argsArray[i][0]; + if (!arg.cached && arg.data && arg.data.buffer instanceof ArrayBuffer) { + transfers.push(arg.data.buffer); + } + break; + } + } + return transfers; + } + flush() { + let lastChunk = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + let separateAnnots = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + this.optimizer.flush(); + const length = this.length; + this._totalLength += length; + this._streamSink.enqueue({ + fnArray: this.fnArray, + argsArray: this.argsArray, + lastChunk, + separateAnnots, + length + }, 1, this._transfers); + this.dependencies.clear(); + this.fnArray.length = 0; + this.argsArray.length = 0; + this.weight = 0; + this.optimizer.reset(); + } +} +exports.OperatorList = OperatorList; + +/***/ }), +/* 192 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PDFImage = void 0; +var _util = __w_pdfjs_require__(2); +var _image_utils = __w_pdfjs_require__(193); +var _base_stream = __w_pdfjs_require__(136); +var _colorspace = __w_pdfjs_require__(143); +var _decode_stream = __w_pdfjs_require__(148); +var _jpeg_stream = __w_pdfjs_require__(156); +var _jpx = __w_pdfjs_require__(159); +var _primitives = __w_pdfjs_require__(134); +function decodeAndClamp(value, addend, coefficient, max) { + value = addend + value * coefficient; + if (value < 0) { + value = 0; + } else if (value > max) { + value = max; + } + return value; +} +function resizeImageMask(src, bpc, w1, h1, w2, h2) { + const length = w2 * h2; + let dest; + if (bpc <= 8) { + dest = new Uint8Array(length); + } else if (bpc <= 16) { + dest = new Uint16Array(length); + } else { + dest = new Uint32Array(length); + } + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let i, + j, + py, + newIndex = 0, + oldIndex; + const xScaled = new Uint16Array(w2); + const w1Scanline = w1; + for (i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + for (i = 0; i < h2; i++) { + py = Math.floor(i * yRatio) * w1Scanline; + for (j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex]; + } + } + return dest; +} +class PDFImage { + constructor(_ref) { + let { + xref, + res, + image, + isInline = false, + smask = null, + mask = null, + isMask = false, + pdfFunctionFactory, + localColorSpaceCache + } = _ref; + this.image = image; + // console.log('this.image数据',this.image); + const dict = image.dict; + const filter = dict.get("F", "Filter"); + let filterName; + if (filter instanceof _primitives.Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = xref.fetchIfRef(filter[0]); + if (filterZero instanceof _primitives.Name) { + filterName = filterZero.name; + } + } + switch (filterName) { + case "JPXDecode": + const jpxImage = new _jpx.JpxImage(); + jpxImage.parseImageProperties(image.stream); + image.stream.reset(); + image.width = jpxImage.width; + image.height = jpxImage.height; + image.bitsPerComponent = jpxImage.bitsPerComponent; + image.numComps = jpxImage.componentsCount; + break; + case "JBIG2Decode": + image.bitsPerComponent = 1; + image.numComps = 1; + break; + } + let width = dict.get("W", "Width"); + let height = dict.get("H", "Height"); + if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) { + (0, _util.warn)("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary."); + width = image.width; + height = image.height; + } + if (width < 1 || height < 1) { + throw new _util.FormatError(`Invalid image width: ${width} or height: ${height}`); + } + this.width = width; + this.height = height; + this.interpolate = dict.get("I", "Interpolate"); + this.imageMask = dict.get("IM", "ImageMask") || false; + this.matte = dict.get("Matte") || false; + let bitsPerComponent = image.bitsPerComponent; + if (!bitsPerComponent) { + bitsPerComponent = dict.get("BPC", "BitsPerComponent"); + if (!bitsPerComponent) { + if (this.imageMask) { + bitsPerComponent = 1; + } else { + throw new _util.FormatError(`Bits per component missing in image: ${this.imageMask}`); + } + } + } + this.bpc = bitsPerComponent; + if (!this.imageMask) { + let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); + if (!colorSpace) { + (0, _util.info)("JPX images (which do not require color spaces)"); + switch (image.numComps) { + case 1: + colorSpace = _primitives.Name.get("DeviceGray"); + break; + case 3: + colorSpace = _primitives.Name.get("DeviceRGB"); + break; + case 4: + colorSpace = _primitives.Name.get("DeviceCMYK"); + break; + default: + throw new Error(`JPX images with ${image.numComps} color components not supported.`); + } + } + this.colorSpace = _colorspace.ColorSpace.parse({ + cs: colorSpace, + xref, + resources: isInline ? res : null, + pdfFunctionFactory, + localColorSpaceCache + }); + this.numComps = this.colorSpace.numComps; + } + this.decode = dict.getArray("D", "Decode"); + this.needsDecode = false; + if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) { + this.needsDecode = true; + const max = (1 << bitsPerComponent) - 1; + this.decodeCoefficients = []; + this.decodeAddends = []; + const isIndexed = this.colorSpace && this.colorSpace.name === "Indexed"; + for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) { + const dmin = this.decode[i]; + const dmax = this.decode[i + 1]; + this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin; + this.decodeAddends[j] = isIndexed ? dmin : max * dmin; + } + } + if (smask) { + this.smask = new PDFImage({ + xref, + res, + image: smask, + isInline, + pdfFunctionFactory, + localColorSpaceCache + }); + } else if (mask) { + if (mask instanceof _base_stream.BaseStream) { + const maskDict = mask.dict, + imageMask = maskDict.get("IM", "ImageMask"); + if (!imageMask) { + (0, _util.warn)("Ignoring /Mask in image without /ImageMask."); + } else { + this.mask = new PDFImage({ + xref, + res, + image: mask, + isInline, + isMask: true, + pdfFunctionFactory, + localColorSpaceCache + }); + } + } else { + this.mask = mask; + } + } + } + static async buildImage(_ref2) { + let { + xref, + res, + image, + isInline = false, + pdfFunctionFactory, + localColorSpaceCache + } = _ref2; + const imageData = image; + let smaskData = null; + let maskData = null; + const smask = image.dict.get("SMask"); + const mask = image.dict.get("Mask"); + if (smask) { + if (smask instanceof _base_stream.BaseStream) { + smaskData = smask; + } else { + (0, _util.warn)("Unsupported /SMask format."); + } + } else if (mask) { + if (mask instanceof _base_stream.BaseStream || Array.isArray(mask)) { + maskData = mask; + } else { + (0, _util.warn)("Unsupported /Mask format."); + } + } + return new PDFImage({ + xref, + res, + image: imageData, + isInline, + smask: smaskData, + mask: maskData, + pdfFunctionFactory, + localColorSpaceCache + }); + } + static createRawMask(_ref3) { + let { + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate + } = _ref3; + const computedLength = (width + 7 >> 3) * height; + const actualLength = imgArray.byteLength; + const haveFullData = computedLength === actualLength; + let data, i; + if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { + data = imgArray; + } else if (!inverseDecode) { + data = new Uint8Array(imgArray); + } else { + data = new Uint8Array(computedLength); + data.set(imgArray); + data.fill(0xff, actualLength); + } + if (inverseDecode) { + for (i = 0; i < actualLength; i++) { + data[i] ^= 0xff; + } + } + return { + data, + width, + height, + interpolate + }; + } + static createMask(_ref4) { + let { + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate, + isOffscreenCanvasSupported = true + } = _ref4; + const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); + if (isSingleOpaquePixel) { + return { + isSingleOpaquePixel + }; + } + if (isOffscreenCanvasSupported && _util.FeatureTest.isOffscreenCanvasSupported) { + console.log('创造图片'); + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + const imgData = ctx.createImageData(width, height); + (0, _image_utils.applyMaskImageData)({ + src: imgArray, + dest: imgData.data, + width, + height, + inverseDecode + }); + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + interpolate, + bitmap + }; + } + return this.createRawMask({ + imgArray, + width, + height, + inverseDecode, + imageIsFromDecodeStream, + interpolate + }); + } + get drawWidth() { + return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0); + } + get drawHeight() { + return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0); + } + decodeBuffer(buffer) { + const bpc = this.bpc; + const numComps = this.numComps; + const decodeAddends = this.decodeAddends; + const decodeCoefficients = this.decodeCoefficients; + const max = (1 << bpc) - 1; + let i, ii; + if (bpc === 1) { + for (i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] = +!buffer[i]; + } + return; + } + let index = 0; + for (i = 0, ii = this.width * this.height; i < ii; i++) { + for (let j = 0; j < numComps; j++) { + buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max); + index++; + } + } + } + getComponents(buffer) { + const bpc = this.bpc; + if (bpc === 8) { + return buffer; + } + const width = this.width; + const height = this.height; + const numComps = this.numComps; + const length = width * height * numComps; + let bufferPos = 0; + let output; + if (bpc <= 8) { + output = new Uint8Array(length); + } else if (bpc <= 16) { + output = new Uint16Array(length); + } else { + output = new Uint32Array(length); + } + const rowComps = width * numComps; + const max = (1 << bpc) - 1; + let i = 0, + ii, + buf; + if (bpc === 1) { + let mask, loop1End, loop2End; + for (let j = 0; j < height; j++) { + loop1End = i + (rowComps & ~7); + loop2End = i + rowComps; + while (i < loop1End) { + buf = buffer[bufferPos++]; + output[i] = buf >> 7 & 1; + output[i + 1] = buf >> 6 & 1; + output[i + 2] = buf >> 5 & 1; + output[i + 3] = buf >> 4 & 1; + output[i + 4] = buf >> 3 & 1; + output[i + 5] = buf >> 2 & 1; + output[i + 6] = buf >> 1 & 1; + output[i + 7] = buf & 1; + i += 8; + } + if (i < loop2End) { + buf = buffer[bufferPos++]; + mask = 128; + while (i < loop2End) { + output[i++] = +!!(buf & mask); + mask >>= 1; + } + } + } + } else { + let bits = 0; + buf = 0; + for (i = 0, ii = length; i < ii; ++i) { + if (i % rowComps === 0) { + buf = 0; + bits = 0; + } + while (bits < bpc) { + buf = buf << 8 | buffer[bufferPos++]; + bits += 8; + } + const remainingBits = bits - bpc; + let value = buf >> remainingBits; + if (value < 0) { + value = 0; + } else if (value > max) { + value = max; + } + output[i] = value; + buf &= (1 << remainingBits) - 1; + bits = remainingBits; + } + } + return output; + } + fillOpacity(rgbaBuf, width, height, actualHeight, image) { + const smask = this.smask; + const mask = this.mask; + let alphaBuf, sw, sh, i, ii, j; + if (smask) { + sw = smask.width; + sh = smask.height; + alphaBuf = new Uint8ClampedArray(sw * sh); + smask.fillGrayBuffer(alphaBuf); + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); + } + } else if (mask) { + if (mask instanceof PDFImage) { + sw = mask.width; + sh = mask.height; + alphaBuf = new Uint8ClampedArray(sw * sh); + mask.numComps = 1; + mask.fillGrayBuffer(alphaBuf); + for (i = 0, ii = sw * sh; i < ii; ++i) { + alphaBuf[i] = 255 - alphaBuf[i]; + } + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height); + } + } else if (Array.isArray(mask)) { + alphaBuf = new Uint8ClampedArray(width * height); + const numComps = this.numComps; + for (i = 0, ii = width * height; i < ii; ++i) { + let opacity = 0; + const imageOffset = i * numComps; + for (j = 0; j < numComps; ++j) { + const color = image[imageOffset + j]; + const maskOffset = j * 2; + if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { + opacity = 255; + break; + } + } + alphaBuf[i] = opacity; + } + } else { + throw new _util.FormatError("Unknown mask format."); + } + } + if (alphaBuf) { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = alphaBuf[i]; + } + } else { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = 255; + } + } + } + undoPreblend(buffer, width, height) { + const matte = this.smask && this.smask.matte; + if (!matte) { + return; + } + const matteRgb = this.colorSpace.getRgb(matte, 0); + const matteR = matteRgb[0]; + const matteG = matteRgb[1]; + const matteB = matteRgb[2]; + const length = width * height * 4; + for (let i = 0; i < length; i += 4) { + const alpha = buffer[i + 3]; + if (alpha === 0) { + buffer[i] = 255; + buffer[i + 1] = 255; + buffer[i + 2] = 255; + continue; + } + const k = 255 / alpha; + buffer[i] = (buffer[i] - matteR) * k + matteR; + buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG; + buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB; + } + } + createImageData() { + // console.log('创造图片'); + let forceRGBA = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const drawWidth = this.drawWidth; + const drawHeight = this.drawHeight; + const imgData = { + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate, + kind: 0, + data: null + }; + // console.log('图片数据imgData',imgData); + const numComps = this.numComps; + const originalWidth = this.width; + const originalHeight = this.height; + const bpc = this.bpc; + const rowBytes = originalWidth * numComps * bpc + 7 >> 3; + if (!forceRGBA) { + let kind; + if (this.colorSpace.name === "DeviceGray" && bpc === 1) { + kind = _util.ImageKind.GRAYSCALE_1BPP; + } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) { + kind = _util.ImageKind.RGB_24BPP; + } + if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { + imgData.kind = kind; + // console.log('图片大小',originalHeight * rowBytes); + imgData.data = this.getImageBytes(originalHeight * rowBytes, {}); + // console.log('没有到这一步'); + if (this.needsDecode) { + (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale."); + const buffer = imgData.data; + for (let i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] ^= 0xff; + } + } + return imgData; + } + if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) { + let imageLength = originalHeight * rowBytes; + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 3; + case "DeviceRGB": + case "DeviceCMYK": + imgData.kind = _util.ImageKind.RGB_24BPP; + imgData.data = this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGB: true + }); + return imgData; + } + } + } + const imgArray = this.getImageBytes(originalHeight * rowBytes, { + internal: true + }); + const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; + const comps = this.getComponents(imgArray); + let alpha01, maybeUndoPreblend; + if (!forceRGBA && !this.smask && !this.mask) { + imgData.kind = _util.ImageKind.RGB_24BPP; + imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3); + alpha01 = 0; + maybeUndoPreblend = false; + } else { + imgData.kind = _util.ImageKind.RGBA_32BPP; + imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4); + alpha01 = 1; + maybeUndoPreblend = true; + this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps); + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); + if (maybeUndoPreblend) { + this.undoPreblend(imgData.data, drawWidth, actualHeight); + } + return imgData; + } + fillGrayBuffer(buffer) { + const numComps = this.numComps; + if (numComps !== 1) { + throw new _util.FormatError(`Reading gray scale from a color image: ${numComps}`); + } + const width = this.width; + const height = this.height; + const bpc = this.bpc; + const rowBytes = width * numComps * bpc + 7 >> 3; + const imgArray = this.getImageBytes(height * rowBytes, { + internal: true + }); + const comps = this.getComponents(imgArray); + let i, length; + if (bpc === 1) { + length = width * height; + if (this.needsDecode) { + for (i = 0; i < length; ++i) { + buffer[i] = comps[i] - 1 & 255; + } + } else { + for (i = 0; i < length; ++i) { + buffer[i] = -comps[i] & 255; + } + } + return; + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + length = width * height; + const scale = 255 / ((1 << bpc) - 1); + for (i = 0; i < length; ++i) { + buffer[i] = scale * comps[i]; + } + } + getImageBytes(length, _ref5) { + let { + drawWidth, + drawHeight, + forceRGB = false, + internal = false + } = _ref5; + this.image.reset(); + this.image.drawWidth = drawWidth || this.width; + this.image.drawHeight = drawHeight || this.height; + this.image.forceRGB = !!forceRGB; + // console.log('获取image数据报错位置',length); + const imageBytes = this.image.getBytes(length); + // const imageBytes = this.image.bytes; + // console.log('获取到数据',imageBytes); + if (internal || this.image instanceof _decode_stream.DecodeStream) { + return imageBytes; + } + (0, _util.assert)(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.'); + return new Uint8Array(imageBytes); + } +} +exports.PDFImage = PDFImage; + +/***/ }), +/* 193 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.applyMaskImageData = applyMaskImageData; +var _util = __w_pdfjs_require__(2); +function applyMaskImageData(_ref) { + let { + src, + srcPos = 0, + dest, + destPos = 0, + width, + height, + inverseDecode = false + } = _ref; + const opaque = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = !inverseDecode ? [opaque, 0] : [0, opaque]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} + +/***/ }), +/* 194 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.incrementalUpdate = incrementalUpdate; +exports.writeDict = writeDict; +exports.writeObject = writeObject; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _core_utils = __w_pdfjs_require__(135); +var _xml_parser = __w_pdfjs_require__(195); +var _base_stream = __w_pdfjs_require__(136); +var _crypto = __w_pdfjs_require__(196); +function writeObject(ref, obj, buffer, transform) { + buffer.push(`${ref.num} ${ref.gen} obj\n`); + if (obj instanceof _primitives.Dict) { + writeDict(obj, buffer, transform); + } else if (obj instanceof _base_stream.BaseStream) { + writeStream(obj, buffer, transform); + } + buffer.push("\nendobj\n"); +} +function writeDict(dict, buffer, transform) { + buffer.push("<<"); + for (const key of dict.getKeys()) { + buffer.push(` /${(0, _core_utils.escapePDFName)(key)} `); + writeValue(dict.getRaw(key), buffer, transform); + } + buffer.push(">>"); +} +function writeStream(stream, buffer, transform) { + writeDict(stream.dict, buffer, transform); + buffer.push(" stream\n"); + let string = stream.getString(); + if (transform !== null) { + string = transform.encryptString(string); + } + buffer.push(string, "\nendstream"); +} +function writeArray(array, buffer, transform) { + buffer.push("["); + let first = true; + for (const val of array) { + if (!first) { + buffer.push(" "); + } else { + first = false; + } + writeValue(val, buffer, transform); + } + buffer.push("]"); +} +function writeValue(value, buffer, transform) { + if (value instanceof _primitives.Name) { + buffer.push(`/${(0, _core_utils.escapePDFName)(value.name)}`); + } else if (value instanceof _primitives.Ref) { + buffer.push(`${value.num} ${value.gen} R`); + } else if (Array.isArray(value)) { + writeArray(value, buffer, transform); + } else if (typeof value === "string") { + if (transform !== null) { + value = transform.encryptString(value); + } + buffer.push(`(${(0, _core_utils.escapeString)(value)})`); + } else if (typeof value === "number") { + buffer.push((0, _core_utils.numberToString)(value)); + } else if (typeof value === "boolean") { + buffer.push(value.toString()); + } else if (value instanceof _primitives.Dict) { + writeDict(value, buffer, transform); + } else if (value instanceof _base_stream.BaseStream) { + writeStream(value, buffer, transform); + } else if (value === null) { + buffer.push("null"); + } else { + (0, _util.warn)(`Unhandled value in writer: ${typeof value}, please file a bug.`); + } +} +function writeInt(number, size, offset, buffer) { + for (let i = size + offset - 1; i > offset - 1; i--) { + buffer[i] = number & 0xff; + number >>= 8; + } + return offset + size; +} +function writeString(string, offset, buffer) { + for (let i = 0, len = string.length; i < len; i++) { + buffer[offset + i] = string.charCodeAt(i) & 0xff; + } +} +function computeMD5(filesize, xrefInfo) { + const time = Math.floor(Date.now() / 1000); + const filename = xrefInfo.filename || ""; + const md5Buffer = [time.toString(), filename, filesize.toString()]; + let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0); + for (const value of Object.values(xrefInfo.info)) { + md5Buffer.push(value); + md5BufferLen += value.length; + } + const array = new Uint8Array(md5BufferLen); + let offset = 0; + for (const str of md5Buffer) { + writeString(str, offset, array); + offset += str.length; + } + return (0, _util.bytesToString)((0, _crypto.calculateMD5)(array)); +} +function writeXFADataForAcroform(str, newRefs) { + const xml = new _xml_parser.SimpleXMLParser({ + hasAttributes: true + }).parseFromString(str); + for (const { + xfa + } of newRefs) { + if (!xfa) { + continue; + } + const { + path, + value + } = xfa; + if (!path) { + continue; + } + const node = xml.documentElement.searchNode((0, _core_utils.parseXFAPath)(path), 0); + if (node) { + if (Array.isArray(value)) { + node.childNodes = value.map(val => new _xml_parser.SimpleDOMNode("value", val)); + } else { + node.childNodes = [new _xml_parser.SimpleDOMNode("#text", value)]; + } + } else { + (0, _util.warn)(`Node not found for path: ${path}`); + } + } + const buffer = []; + xml.documentElement.dump(buffer); + return buffer.join(""); +} +function updateAcroform(_ref) { + let { + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + newRefs + } = _ref; + if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { + (0, _util.warn)("XFA - Cannot save it"); + } + if (!needAppearances && (!hasXfa || !xfaDatasetsRef)) { + return; + } + const dict = new _primitives.Dict(xref); + for (const key of acroForm.getKeys()) { + dict.set(key, acroForm.getRaw(key)); + } + if (hasXfa && !hasXfaDatasetsEntry) { + const newXfa = acroForm.get("XFA").slice(); + newXfa.splice(2, 0, "datasets"); + newXfa.splice(3, 0, xfaDatasetsRef); + dict.set("XFA", newXfa); + } + if (needAppearances) { + dict.set("NeedAppearances", true); + } + const encrypt = xref.encrypt; + let transform = null; + if (encrypt) { + transform = encrypt.createCipherTransform(acroFormRef.num, acroFormRef.gen); + } + const buffer = []; + writeObject(acroFormRef, dict, buffer, transform); + newRefs.push({ + ref: acroFormRef, + data: buffer.join("") + }); +} +function updateXFA(_ref2) { + let { + xfaData, + xfaDatasetsRef, + newRefs, + xref + } = _ref2; + if (xfaData === null) { + const datasets = xref.fetchIfRef(xfaDatasetsRef); + xfaData = writeXFADataForAcroform(datasets.getString(), newRefs); + } + const encrypt = xref.encrypt; + if (encrypt) { + const transform = encrypt.createCipherTransform(xfaDatasetsRef.num, xfaDatasetsRef.gen); + xfaData = transform.encryptString(xfaData); + } + const data = `${xfaDatasetsRef.num} ${xfaDatasetsRef.gen} obj\n` + `<< /Type /EmbeddedFile /Length ${xfaData.length}>>\nstream\n` + xfaData + "\nendstream\nendobj\n"; + newRefs.push({ + ref: xfaDatasetsRef, + data + }); +} +function incrementalUpdate(_ref3) { + let { + originalData, + xrefInfo, + newRefs, + xref = null, + hasXfa = false, + xfaDatasetsRef = null, + hasXfaDatasetsEntry = false, + needAppearances, + acroFormRef = null, + acroForm = null, + xfaData = null + } = _ref3; + updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + newRefs + }); + if (hasXfa) { + updateXFA({ + xfaData, + xfaDatasetsRef, + newRefs, + xref + }); + } + const newXref = new _primitives.Dict(null); + const refForXrefTable = xrefInfo.newRef; + let buffer, baseOffset; + const lastByte = originalData.at(-1); + if (lastByte === 0x0a || lastByte === 0x0d) { + buffer = []; + baseOffset = originalData.length; + } else { + buffer = ["\n"]; + baseOffset = originalData.length + 1; + } + newXref.set("Size", refForXrefTable.num + 1); + newXref.set("Prev", xrefInfo.startXRef); + newXref.set("Type", _primitives.Name.get("XRef")); + if (xrefInfo.rootRef !== null) { + newXref.set("Root", xrefInfo.rootRef); + } + if (xrefInfo.infoRef !== null) { + newXref.set("Info", xrefInfo.infoRef); + } + if (xrefInfo.encryptRef !== null) { + newXref.set("Encrypt", xrefInfo.encryptRef); + } + newRefs.push({ + ref: refForXrefTable, + data: "" + }); + newRefs = newRefs.sort((a, b) => { + return a.ref.num - b.ref.num; + }); + const xrefTableData = [[0, 1, 0xffff]]; + const indexes = [0, 1]; + let maxOffset = 0; + for (const { + ref, + data + } of newRefs) { + maxOffset = Math.max(maxOffset, baseOffset); + xrefTableData.push([1, baseOffset, Math.min(ref.gen, 0xffff)]); + baseOffset += data.length; + indexes.push(ref.num, 1); + buffer.push(data); + } + newXref.set("Index", indexes); + if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { + const md5 = computeMD5(baseOffset, xrefInfo); + newXref.set("ID", [xrefInfo.fileIds[0], md5]); + } + const offsetSize = Math.ceil(Math.log2(maxOffset) / 8); + const sizes = [1, offsetSize, 2]; + const structSize = sizes[0] + sizes[1] + sizes[2]; + const tableLength = structSize * xrefTableData.length; + newXref.set("W", sizes); + newXref.set("Length", tableLength); + buffer.push(`${refForXrefTable.num} ${refForXrefTable.gen} obj\n`); + writeDict(newXref, buffer, null); + buffer.push(" stream\n"); + const bufferLen = buffer.reduce((a, str) => a + str.length, 0); + const footer = `\nendstream\nendobj\nstartxref\n${baseOffset}\n%%EOF\n`; + const array = new Uint8Array(originalData.length + bufferLen + tableLength + footer.length); + array.set(originalData); + let offset = originalData.length; + for (const str of buffer) { + writeString(str, offset, array); + offset += str.length; + } + for (const [type, objOffset, gen] of xrefTableData) { + offset = writeInt(type, sizes[0], offset, array); + offset = writeInt(objOffset, sizes[1], offset, array); + offset = writeInt(gen, sizes[2], offset, array); + } + writeString(footer, offset, array); + return array; +} + +/***/ }), +/* 195 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XMLParserErrorCode = exports.XMLParserBase = exports.SimpleXMLParser = exports.SimpleDOMNode = void 0; +var _core_utils = __w_pdfjs_require__(135); +const XMLParserErrorCode = { + NoError: 0, + EndOfDocument: -1, + UnterminatedCdat: -2, + UnterminatedXmlDeclaration: -3, + UnterminatedDoctypeDeclaration: -4, + UnterminatedComment: -5, + MalformedElement: -6, + OutOfMemory: -7, + UnterminatedAttributeValue: -8, + UnterminatedElement: -9, + ElementNeverBegun: -10 +}; +exports.XMLParserErrorCode = XMLParserErrorCode; +function isWhitespace(s, index) { + const ch = s[index]; + return ch === " " || ch === "\n" || ch === "\r" || ch === "\t"; +} +function isWhitespaceString(s) { + for (let i = 0, ii = s.length; i < ii; i++) { + if (!isWhitespace(s, i)) { + return false; + } + } + return true; +} +class XMLParserBase { + _resolveEntities(s) { + return s.replace(/&([^;]+);/g, (all, entity) => { + if (entity.substring(0, 2) === "#x") { + return String.fromCodePoint(parseInt(entity.substring(2), 16)); + } else if (entity.substring(0, 1) === "#") { + return String.fromCodePoint(parseInt(entity.substring(1), 10)); + } + switch (entity) { + case "lt": + return "<"; + case "gt": + return ">"; + case "amp": + return "&"; + case "quot": + return '"'; + case "apos": + return "'"; + } + return this.onResolveEntity(entity); + }); + } + _parseContent(s, start) { + const attributes = []; + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") { + skipWs(); + let attrName = "", + attrValue = ""; + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") { + attrName += s[pos]; + ++pos; + } + skipWs(); + if (s[pos] !== "=") { + return null; + } + ++pos; + skipWs(); + const attrEndChar = s[pos]; + if (attrEndChar !== '"' && attrEndChar !== "'") { + return null; + } + const attrEndIndex = s.indexOf(attrEndChar, ++pos); + if (attrEndIndex < 0) { + return null; + } + attrValue = s.substring(pos, attrEndIndex); + attributes.push({ + name: attrName, + value: this._resolveEntities(attrValue) + }); + pos = attrEndIndex + 1; + skipWs(); + } + return { + name, + attributes, + parsed: pos - start + }; + } + _parseProcessingInstruction(s, start) { + let pos = start; + function skipWs() { + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } + } + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") { + ++pos; + } + const name = s.substring(start, pos); + skipWs(); + const attrStart = pos; + while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) { + ++pos; + } + const value = s.substring(attrStart, pos); + return { + name, + value, + parsed: pos - start + }; + } + parseXml(s) { + let i = 0; + while (i < s.length) { + const ch = s[i]; + let j = i; + if (ch === "<") { + ++j; + const ch2 = s[j]; + let q; + switch (ch2) { + case "/": + ++j; + q = s.indexOf(">", j); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onEndElement(s.substring(j, q)); + j = q + 1; + break; + case "?": + ++j; + const pi = this._parseProcessingInstruction(s, j); + if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") { + this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration); + return; + } + this.onPi(pi.name, pi.value); + j += pi.parsed + 2; + break; + case "!": + if (s.substring(j + 1, j + 3) === "--") { + q = s.indexOf("-->", j + 3); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedComment); + return; + } + this.onComment(s.substring(j + 3, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "[CDATA[") { + q = s.indexOf("]]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedCdat); + return; + } + this.onCdata(s.substring(j + 8, q)); + j = q + 3; + } else if (s.substring(j + 1, j + 8) === "DOCTYPE") { + const q2 = s.indexOf("[", j + 8); + let complexDoctype = false; + q = s.indexOf(">", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + if (q2 > 0 && q > q2) { + q = s.indexOf("]>", j + 8); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); + return; + } + complexDoctype = true; + } + const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); + this.onDoctype(doctypeContent); + j = q + (complexDoctype ? 2 : 1); + } else { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + break; + default: + const content = this._parseContent(s, j); + if (content === null) { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + let isClosed = false; + if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { + isClosed = true; + } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onBeginElement(content.name, content.attributes, isClosed); + j += content.parsed + (isClosed ? 2 : 1); + break; + } + } else { + while (j < s.length && s[j] !== "<") { + j++; + } + const text = s.substring(i, j); + this.onText(this._resolveEntities(text)); + } + i = j; + } + } + onResolveEntity(name) { + return `&${name};`; + } + onPi(name, value) {} + onComment(text) {} + onCdata(text) {} + onDoctype(doctypeContent) {} + onText(text) {} + onBeginElement(name, attributes, isEmpty) {} + onEndElement(name) {} + onError(code) {} +} +exports.XMLParserBase = XMLParserBase; +class SimpleDOMNode { + constructor(nodeName, nodeValue) { + this.nodeName = nodeName; + this.nodeValue = nodeValue; + Object.defineProperty(this, "parentNode", { + value: null, + writable: true + }); + } + get firstChild() { + return this.childNodes && this.childNodes[0]; + } + get nextSibling() { + const childNodes = this.parentNode.childNodes; + if (!childNodes) { + return undefined; + } + const index = childNodes.indexOf(this); + if (index === -1) { + return undefined; + } + return childNodes[index + 1]; + } + get textContent() { + if (!this.childNodes) { + return this.nodeValue || ""; + } + return this.childNodes.map(function (child) { + return child.textContent; + }).join(""); + } + get children() { + return this.childNodes || []; + } + hasChildNodes() { + return this.childNodes && this.childNodes.length > 0; + } + searchNode(paths, pos) { + if (pos >= paths.length) { + return this; + } + const component = paths[pos]; + const stack = []; + let node = this; + while (true) { + if (component.name === node.nodeName) { + if (component.pos === 0) { + const res = node.searchNode(paths, pos + 1); + if (res !== null) { + return res; + } + } else if (stack.length === 0) { + return null; + } else { + const [parent] = stack.pop(); + let siblingPos = 0; + for (const child of parent.childNodes) { + if (component.name === child.nodeName) { + if (siblingPos === component.pos) { + return child.searchNode(paths, pos + 1); + } + siblingPos++; + } + } + return node.searchNode(paths, pos + 1); + } + } + if (node.childNodes && node.childNodes.length !== 0) { + stack.push([node, 0]); + node = node.childNodes[0]; + } else if (stack.length === 0) { + return null; + } else { + while (stack.length !== 0) { + const [parent, currentPos] = stack.pop(); + const newPos = currentPos + 1; + if (newPos < parent.childNodes.length) { + stack.push([parent, newPos]); + node = parent.childNodes[newPos]; + break; + } + } + if (stack.length === 0) { + return null; + } + } + } + } + dump(buffer) { + if (this.nodeName === "#text") { + buffer.push((0, _core_utils.encodeToXmlString)(this.nodeValue)); + return; + } + buffer.push(`<${this.nodeName}`); + if (this.attributes) { + for (const attribute of this.attributes) { + buffer.push(` ${attribute.name}="${(0, _core_utils.encodeToXmlString)(attribute.value)}"`); + } + } + if (this.hasChildNodes()) { + buffer.push(">"); + for (const child of this.childNodes) { + child.dump(buffer); + } + buffer.push(``); + } else if (this.nodeValue) { + buffer.push(`>${(0, _core_utils.encodeToXmlString)(this.nodeValue)}`); + } else { + buffer.push("/>"); + } + } +} +exports.SimpleDOMNode = SimpleDOMNode; +class SimpleXMLParser extends XMLParserBase { + constructor(_ref) { + let { + hasAttributes = false, + lowerCaseName = false + } = _ref; + super(); + this._currentFragment = null; + this._stack = null; + this._errorCode = XMLParserErrorCode.NoError; + this._hasAttributes = hasAttributes; + this._lowerCaseName = lowerCaseName; + } + parseFromString(data) { + this._currentFragment = []; + this._stack = []; + this._errorCode = XMLParserErrorCode.NoError; + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; + } + const [documentElement] = this._currentFragment; + if (!documentElement) { + return undefined; + } + return { + documentElement + }; + } + onText(text) { + if (isWhitespaceString(text)) { + return; + } + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onCdata(text) { + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onBeginElement(name, attributes, isEmpty) { + if (this._lowerCaseName) { + name = name.toLowerCase(); + } + const node = new SimpleDOMNode(name); + node.childNodes = []; + if (this._hasAttributes) { + node.attributes = attributes; + } + this._currentFragment.push(node); + if (isEmpty) { + return; + } + this._stack.push(this._currentFragment); + this._currentFragment = node.childNodes; + } + onEndElement(name) { + this._currentFragment = this._stack.pop() || []; + const lastElement = this._currentFragment.at(-1); + if (!lastElement) { + return null; + } + for (const childNode of lastElement.childNodes) { + childNode.parentNode = lastElement; + } + return lastElement; + } + onError(code) { + this._errorCode = code; + } +} +exports.SimpleXMLParser = SimpleXMLParser; + +/***/ }), +/* 196 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = void 0; +exports.calculateSHA384 = calculateSHA384; +exports.calculateSHA512 = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _decrypt_stream = __w_pdfjs_require__(197); +class ARCFourCipher { + constructor(key) { + this.a = 0; + this.b = 0; + const s = new Uint8Array(256); + const keyLength = key.length; + for (let i = 0; i < 256; ++i) { + s[i] = i; + } + for (let i = 0, j = 0; i < 256; ++i) { + const tmp = s[i]; + j = j + tmp + key[i % keyLength] & 0xff; + s[i] = s[j]; + s[j] = tmp; + } + this.s = s; + } + encryptBlock(data) { + let a = this.a, + b = this.b; + const s = this.s; + const n = data.length; + const output = new Uint8Array(n); + for (let i = 0; i < n; ++i) { + a = a + 1 & 0xff; + const tmp = s[a]; + b = b + tmp & 0xff; + const tmp2 = s[b]; + s[a] = tmp2; + s[b] = tmp; + output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; + } + this.a = a; + this.b = b; + return output; + } + decryptBlock(data) { + return this.encryptBlock(data); + } + encrypt(data) { + return this.encryptBlock(data); + } +} +exports.ARCFourCipher = ARCFourCipher; +const calculateMD5 = function calculateMD5Closure() { + const r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); + const k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]); + function hash(data, offset, length) { + let h0 = 1732584193, + h1 = -271733879, + h2 = -1732584194, + h3 = 271733878; + const paddedLength = length + 72 & ~63; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = length << 3 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + const w = new Int32Array(16); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j, i += 4) { + w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; + } + let a = h0, + b = h1, + c = h2, + d = h3, + f, + g; + for (j = 0; j < 64; ++j) { + if (j < 16) { + f = b & c | ~b & d; + g = j; + } else if (j < 32) { + f = d & b | ~d & c; + g = 5 * j + 1 & 15; + } else if (j < 48) { + f = b ^ c ^ d; + g = 3 * j + 5 & 15; + } else { + f = c ^ (b | ~d); + g = 7 * j & 15; + } + const tmp = d, + rotateArg = a + f + k[j] + w[g] | 0, + rotate = r[j]; + d = c; + c = b; + b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; + a = tmp; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + } + return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]); + } + return hash; +}(); +exports.calculateMD5 = calculateMD5; +class Word64 { + constructor(highInteger, lowInteger) { + this.high = highInteger | 0; + this.low = lowInteger | 0; + } + and(word) { + this.high &= word.high; + this.low &= word.low; + } + xor(word) { + this.high ^= word.high; + this.low ^= word.low; + } + or(word) { + this.high |= word.high; + this.low |= word.low; + } + shiftRight(places) { + if (places >= 32) { + this.low = this.high >>> places - 32 | 0; + this.high = 0; + } else { + this.low = this.low >>> places | this.high << 32 - places; + this.high = this.high >>> places | 0; + } + } + shiftLeft(places) { + if (places >= 32) { + this.high = this.low << places - 32; + this.low = 0; + } else { + this.high = this.high << places | this.low >>> 32 - places; + this.low <<= places; + } + } + rotateRight(places) { + let low, high; + if (places & 32) { + high = this.low; + low = this.high; + } else { + low = this.low; + high = this.high; + } + places &= 31; + this.low = low >>> places | high << 32 - places; + this.high = high >>> places | low << 32 - places; + } + not() { + this.high = ~this.high; + this.low = ~this.low; + } + add(word) { + const lowAdd = (this.low >>> 0) + (word.low >>> 0); + let highAdd = (this.high >>> 0) + (word.high >>> 0); + if (lowAdd > 0xffffffff) { + highAdd += 1; + } + this.low = lowAdd | 0; + this.high = highAdd | 0; + } + copyTo(bytes, offset) { + bytes[offset] = this.high >>> 24 & 0xff; + bytes[offset + 1] = this.high >> 16 & 0xff; + bytes[offset + 2] = this.high >> 8 & 0xff; + bytes[offset + 3] = this.high & 0xff; + bytes[offset + 4] = this.low >>> 24 & 0xff; + bytes[offset + 5] = this.low >> 16 & 0xff; + bytes[offset + 6] = this.low >> 8 & 0xff; + bytes[offset + 7] = this.low & 0xff; + } + assign(word) { + this.high = word.high; + this.low = word.low; + } +} +const calculateSHA256 = function calculateSHA256Closure() { + function rotr(x, n) { + return x >>> n | x << 32 - n; + } + function ch(x, y, z) { + return x & y ^ ~x & z; + } + function maj(x, y, z) { + return x & y ^ x & z ^ y & z; + } + function sigma(x) { + return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); + } + function sigmaPrime(x) { + return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); + } + function littleSigma(x) { + return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; + } + function littleSigmaPrime(x) { + return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; + } + const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; + function hash(data, offset, length) { + let h0 = 0x6a09e667, + h1 = 0xbb67ae85, + h2 = 0x3c6ef372, + h3 = 0xa54ff53a, + h4 = 0x510e527f, + h5 = 0x9b05688c, + h6 = 0x1f83d9ab, + h7 = 0x5be0cd19; + const paddedLength = Math.ceil((length + 9) / 64) * 64; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Uint32Array(64); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + i += 4; + } + for (j = 16; j < 64; ++j) { + w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0; + } + let a = h0, + b = h1, + c = h2, + d = h3, + e = h4, + f = h5, + g = h6, + h = h7, + t1, + t2; + for (j = 0; j < 64; ++j) { + t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; + t2 = sigma(a) + maj(a, b, c); + h = g; + g = f; + f = e; + e = d + t1 | 0; + d = c; + c = b; + b = a; + a = t1 + t2 | 0; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + h4 = h4 + e | 0; + h5 = h5 + f | 0; + h6 = h6 + g | 0; + h7 = h7 + h | 0; + } + return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]); + } + return hash; +}(); +exports.calculateSHA256 = calculateSHA256; +const calculateSHA512 = function calculateSHA512Closure() { + function ch(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.not(); + tmp.and(z); + result.xor(tmp); + } + function maj(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.and(z); + result.xor(tmp); + tmp.assign(y); + tmp.and(z); + result.xor(tmp); + } + function sigma(result, x, tmp) { + result.assign(x); + result.rotateRight(28); + tmp.assign(x); + tmp.rotateRight(34); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(39); + result.xor(tmp); + } + function sigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(14); + tmp.assign(x); + tmp.rotateRight(18); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(41); + result.xor(tmp); + } + function littleSigma(result, x, tmp) { + result.assign(x); + result.rotateRight(1); + tmp.assign(x); + tmp.rotateRight(8); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(7); + result.xor(tmp); + } + function littleSigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(19); + tmp.assign(x); + tmp.rotateRight(61); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(6); + result.xor(tmp); + } + const k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; + function hash(data, offset, length) { + let mode384 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + let h0, h1, h2, h3, h4, h5, h6, h7; + if (!mode384) { + h0 = new Word64(0x6a09e667, 0xf3bcc908); + h1 = new Word64(0xbb67ae85, 0x84caa73b); + h2 = new Word64(0x3c6ef372, 0xfe94f82b); + h3 = new Word64(0xa54ff53a, 0x5f1d36f1); + h4 = new Word64(0x510e527f, 0xade682d1); + h5 = new Word64(0x9b05688c, 0x2b3e6c1f); + h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); + h7 = new Word64(0x5be0cd19, 0x137e2179); + } else { + h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); + h1 = new Word64(0x629a292a, 0x367cd507); + h2 = new Word64(0x9159015a, 0x3070dd17); + h3 = new Word64(0x152fecd8, 0xf70e5939); + h4 = new Word64(0x67332667, 0xffc00b31); + h5 = new Word64(0x8eb44a87, 0x68581511); + h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); + h7 = new Word64(0x47b5481d, 0xbefa4fa4); + } + const paddedLength = Math.ceil((length + 17) / 128) * 128; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 16; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Array(80); + for (i = 0; i < 80; i++) { + w[i] = new Word64(0, 0); + } + let a = new Word64(0, 0), + b = new Word64(0, 0), + c = new Word64(0, 0); + let d = new Word64(0, 0), + e = new Word64(0, 0), + f = new Word64(0, 0); + let g = new Word64(0, 0), + h = new Word64(0, 0); + const t1 = new Word64(0, 0), + t2 = new Word64(0, 0); + const tmp1 = new Word64(0, 0), + tmp2 = new Word64(0, 0); + let tmp3; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; + i += 8; + } + for (j = 16; j < 80; ++j) { + tmp3 = w[j]; + littleSigmaPrime(tmp3, w[j - 2], tmp2); + tmp3.add(w[j - 7]); + littleSigma(tmp1, w[j - 15], tmp2); + tmp3.add(tmp1); + tmp3.add(w[j - 16]); + } + a.assign(h0); + b.assign(h1); + c.assign(h2); + d.assign(h3); + e.assign(h4); + f.assign(h5); + g.assign(h6); + h.assign(h7); + for (j = 0; j < 80; ++j) { + t1.assign(h); + sigmaPrime(tmp1, e, tmp2); + t1.add(tmp1); + ch(tmp1, e, f, g, tmp2); + t1.add(tmp1); + t1.add(k[j]); + t1.add(w[j]); + sigma(t2, a, tmp2); + maj(tmp1, a, b, c, tmp2); + t2.add(tmp1); + tmp3 = h; + h = g; + g = f; + f = e; + d.add(t1); + e = d; + d = c; + c = b; + b = a; + tmp3.assign(t1); + tmp3.add(t2); + a = tmp3; + } + h0.add(a); + h1.add(b); + h2.add(c); + h3.add(d); + h4.add(e); + h5.add(f); + h6.add(g); + h7.add(h); + } + let result; + if (!mode384) { + result = new Uint8Array(64); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + h6.copyTo(result, 48); + h7.copyTo(result, 56); + } else { + result = new Uint8Array(48); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + } + return result; + } + return hash; +}(); +exports.calculateSHA512 = calculateSHA512; +function calculateSHA384(data, offset, length) { + return calculateSHA512(data, offset, length, true); +} +class NullCipher { + decryptBlock(data) { + return data; + } + encrypt(data) { + return data; + } +} +class AESBaseCipher { + constructor() { + if (this.constructor === AESBaseCipher) { + (0, _util.unreachable)("Cannot initialize AESBaseCipher."); + } + this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); + this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); + this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); + this._mixCol = new Uint8Array(256); + for (let i = 0; i < 256; i++) { + if (i < 128) { + this._mixCol[i] = i << 1; + } else { + this._mixCol[i] = i << 1 ^ 0x1b; + } + } + this.buffer = new Uint8Array(16); + this.bufferPosition = 0; + } + _expandKey(cipherKey) { + (0, _util.unreachable)("Cannot call `_expandKey` on the base class"); + } + _decrypt(input, key) { + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let j = 0; j < 16; j += 4) { + const s0 = this._mix[state[j]]; + const s1 = this._mix[state[j + 1]]; + const s2 = this._mix[state[j + 2]]; + const s3 = this._mix[state[j + 3]]; + t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; + state[j] = t >>> 24 & 0xff; + state[j + 1] = t >> 16 & 0xff; + state[j + 2] = t >> 8 & 0xff; + state[j + 3] = t & 0xff; + } + } + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + state[j] ^= key[j]; + } + return state; + } + _encrypt(input, key) { + const s = this._s; + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0; j < 16; ++j) { + state[j] ^= key[j]; + } + for (let i = 1; i < this._cyclesOfRepetition; i++) { + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0; j < 16; j += 4) { + const s0 = state[j + 0]; + const s1 = state[j + 1]; + const s2 = state[j + 2]; + const s3 = state[j + 3]; + t = s0 ^ s1 ^ s2 ^ s3; + state[j + 0] ^= t ^ this._mixCol[s0 ^ s1]; + state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; + state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; + state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + } + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + return state; + } + _decryptBlock2(data, finalize) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + let iv = this.iv; + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + const plain = this._decrypt(buffer, this._key); + for (let j = 0; j < 16; ++j) { + plain[j] ^= iv[j]; + } + iv = buffer; + result.push(plain); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + let outputLength = 16 * result.length; + if (finalize) { + const lastBlock = result.at(-1); + let psLen = lastBlock[15]; + if (psLen <= 16) { + for (let i = 15, ii = 16 - psLen; i >= ii; --i) { + if (lastBlock[i] !== psLen) { + psLen = 0; + break; + } + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); + } + } + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + decryptBlock(data, finalize) { + let iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + const sourceLength = data.length; + const buffer = this.buffer; + let bufferLength = this.bufferPosition; + if (iv) { + this.iv = iv; + } else { + for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { + buffer[bufferLength] = data[i]; + } + if (bufferLength < 16) { + this.bufferLength = bufferLength; + return new Uint8Array(0); + } + this.iv = buffer; + data = data.subarray(16); + } + this.buffer = new Uint8Array(16); + this.bufferLength = 0; + this.decryptBlock = this._decryptBlock2; + return this.decryptBlock(data, finalize); + } + encrypt(data, iv) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + if (!iv) { + iv = new Uint8Array(16); + } + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + for (let j = 0; j < 16; ++j) { + buffer[j] ^= iv[j]; + } + const cipher = this._encrypt(buffer, this._key); + iv = cipher; + result.push(cipher); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + const outputLength = 16 * result.length; + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } +} +class AES128Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 10; + this._keySize = 160; + this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 176; + const s = this._s; + const rcon = this._rcon; + const result = new Uint8Array(b); + result.set(cipherKey); + for (let j = 16, i = 1; j < b; ++i) { + let t1 = result[j - 3]; + let t2 = result[j - 2]; + let t3 = result[j - 1]; + let t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= rcon[i]; + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 16]; + j++; + result[j] = t2 ^= result[j - 16]; + j++; + result[j] = t3 ^= result[j - 16]; + j++; + result[j] = t4 ^= result[j - 16]; + j++; + } + } + return result; + } +} +exports.AES128Cipher = AES128Cipher; +class AES256Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 14; + this._keySize = 224; + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 240; + const s = this._s; + const result = new Uint8Array(b); + result.set(cipherKey); + let r = 1; + let t1, t2, t3, t4; + for (let j = 32, i = 1; j < b; ++i) { + if (j % 32 === 16) { + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + } else if (j % 32 === 0) { + t1 = result[j - 3]; + t2 = result[j - 2]; + t3 = result[j - 1]; + t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= r; + if ((r <<= 1) >= 256) { + r = (r ^ 0x1b) & 0xff; + } + } + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 32]; + j++; + result[j] = t2 ^= result[j - 32]; + j++; + result[j] = t3 ^= result[j - 32]; + j++; + result[j] = t4 ^= result[j - 32]; + j++; + } + } + return result; + } +} +exports.AES256Cipher = AES256Cipher; +class PDF17 { + checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + const result = calculateSHA256(hashData, 0, hashData.length); + return (0, _util.isArrayEqual)(result, ownerPassword); + } + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = calculateSHA256(hashData, 0, hashData.length); + return (0, _util.isArrayEqual)(result, userPassword); + } + getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + const key = calculateSHA256(hashData, 0, hashData.length); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + } + getUserKey(password, userKeySalt, userEncryption) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + const key = calculateSHA256(hashData, 0, hashData.length); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } +} +exports.PDF17 = PDF17; +const PDF20 = function PDF20Closure() { + function calculatePDF20Hash(password, input, userBytes) { + let k = calculateSHA256(input, 0, input.length).subarray(0, 32); + let e = [0]; + let i = 0; + while (i < 64 || e.at(-1) > i - 32) { + const combinedLength = password.length + k.length + userBytes.length, + combinedArray = new Uint8Array(combinedLength); + let writeOffset = 0; + combinedArray.set(password, writeOffset); + writeOffset += password.length; + combinedArray.set(k, writeOffset); + writeOffset += k.length; + combinedArray.set(userBytes, writeOffset); + const k1 = new Uint8Array(combinedLength * 64); + for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) { + k1.set(combinedArray, pos); + } + const cipher = new AES128Cipher(k.subarray(0, 16)); + e = cipher.encrypt(k1, k.subarray(16, 32)); + const remainder = e.slice(0, 16).reduce((a, b) => a + b, 0) % 3; + if (remainder === 0) { + k = calculateSHA256(e, 0, e.length); + } else if (remainder === 1) { + k = calculateSHA384(e, 0, e.length); + } else if (remainder === 2) { + k = calculateSHA512(e, 0, e.length); + } + i++; + } + return k.subarray(0, 32); + } + class PDF20 { + hash(password, concatBytes, userBytes) { + return calculatePDF20Hash(password, concatBytes, userBytes); + } + checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + const result = calculatePDF20Hash(password, hashData, userBytes); + return (0, _util.isArrayEqual)(result, ownerPassword); + } + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = calculatePDF20Hash(password, hashData, []); + return (0, _util.isArrayEqual)(result, userPassword); + } + getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + const key = calculatePDF20Hash(password, hashData, userBytes); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + } + getUserKey(password, userKeySalt, userEncryption) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + const key = calculatePDF20Hash(password, hashData, []); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } + } + return PDF20; +}(); +exports.PDF20 = PDF20; +class CipherTransform { + constructor(stringCipherConstructor, streamCipherConstructor) { + this.StringCipherConstructor = stringCipherConstructor; + this.StreamCipherConstructor = streamCipherConstructor; + } + createStream(stream, length) { + const cipher = new this.StreamCipherConstructor(); + return new _decrypt_stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { + return cipher.decryptBlock(data, finalize); + }); + } + decryptString(s) { + const cipher = new this.StringCipherConstructor(); + let data = (0, _util.stringToBytes)(s); + data = cipher.decryptBlock(data, true); + return (0, _util.bytesToString)(data); + } + encryptString(s) { + const cipher = new this.StringCipherConstructor(); + if (cipher instanceof AESBaseCipher) { + const strLen = s.length; + const pad = 16 - strLen % 16; + s += String.fromCharCode(pad).repeat(pad); + const iv = new Uint8Array(16); + if (typeof crypto !== "undefined") { + crypto.getRandomValues(iv); + } else { + for (let i = 0; i < 16; i++) { + iv[i] = Math.floor(256 * Math.random()); + } + } + let data = (0, _util.stringToBytes)(s); + data = cipher.encrypt(data, iv); + const buf = new Uint8Array(16 + data.length); + buf.set(iv); + buf.set(data, 16); + return (0, _util.bytesToString)(buf); + } + let data = (0, _util.stringToBytes)(s); + data = cipher.encrypt(data); + return (0, _util.bytesToString)(data); + } +} +const CipherTransformFactory = function CipherTransformFactoryClosure() { + const defaultPasswordBytes = new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]); + function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { + if (password) { + const passwordLength = Math.min(127, password.length); + password = password.subarray(0, passwordLength); + } else { + password = []; + } + let pdfAlgorithm; + if (revision === 6) { + pdfAlgorithm = new PDF20(); + } else { + pdfAlgorithm = new PDF17(); + } + if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { + return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); + } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { + return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); + } + return null; + } + function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { + const hashDataSize = 40 + ownerPassword.length + fileId.length; + const hashData = new Uint8Array(hashDataSize); + let i = 0, + j, + n; + if (password) { + n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + } + j = 0; + while (i < 32) { + hashData[i++] = defaultPasswordBytes[j++]; + } + for (j = 0, n = ownerPassword.length; j < n; ++j) { + hashData[i++] = ownerPassword[j]; + } + hashData[i++] = flags & 0xff; + hashData[i++] = flags >> 8 & 0xff; + hashData[i++] = flags >> 16 & 0xff; + hashData[i++] = flags >>> 24 & 0xff; + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + if (revision >= 4 && !encryptMetadata) { + hashData[i++] = 0xff; + hashData[i++] = 0xff; + hashData[i++] = 0xff; + hashData[i++] = 0xff; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, keyLengthInBytes); + } + } + const encryptionKey = hash.subarray(0, keyLengthInBytes); + let cipher, checkData; + if (revision >= 3) { + for (i = 0; i < 32; ++i) { + hashData[i] = defaultPasswordBytes[i]; + } + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); + n = encryptionKey.length; + const derivedKey = new Uint8Array(n); + for (j = 1; j <= 19; ++j) { + for (let k = 0; k < n; ++k) { + derivedKey[k] = encryptionKey[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + checkData = cipher.encryptBlock(checkData); + } + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } else { + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(defaultPasswordBytes); + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } + return encryptionKey; + } + function decodeUserPassword(password, ownerPassword, revision, keyLength) { + const hashData = new Uint8Array(32); + let i = 0; + const n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + let j = 0; + while (i < 32) { + hashData[i++] = defaultPasswordBytes[j++]; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, hash.length); + } + } + let cipher, userPassword; + if (revision >= 3) { + userPassword = ownerPassword; + const derivedKey = new Uint8Array(keyLengthInBytes); + for (j = 19; j >= 0; j--) { + for (let k = 0; k < keyLengthInBytes; ++k) { + derivedKey[k] = hash[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + userPassword = cipher.encryptBlock(userPassword); + } + } else { + cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); + userPassword = cipher.encryptBlock(ownerPassword); + } + return userPassword; + } + const identityName = _primitives.Name.get("Identity"); + function buildObjectKey(num, gen, encryptionKey) { + let isAes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + const key = new Uint8Array(encryptionKey.length + 9); + const n = encryptionKey.length; + let i; + for (i = 0; i < n; ++i) { + key[i] = encryptionKey[i]; + } + key[i++] = num & 0xff; + key[i++] = num >> 8 & 0xff; + key[i++] = num >> 16 & 0xff; + key[i++] = gen & 0xff; + key[i++] = gen >> 8 & 0xff; + if (isAes) { + key[i++] = 0x73; + key[i++] = 0x41; + key[i++] = 0x6c; + key[i++] = 0x54; + } + const hash = calculateMD5(key, 0, i); + return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); + } + function buildCipherConstructor(cf, name, num, gen, key) { + if (!(name instanceof _primitives.Name)) { + throw new _util.FormatError("Invalid crypt filter name."); + } + const cryptFilter = cf.get(name.name); + let cfm; + if (cryptFilter !== null && cryptFilter !== undefined) { + cfm = cryptFilter.get("CFM"); + } + if (!cfm || cfm.name === "None") { + return function cipherTransformFactoryBuildCipherConstructorNone() { + return new NullCipher(); + }; + } + if (cfm.name === "V2") { + return function cipherTransformFactoryBuildCipherConstructorV2() { + return new ARCFourCipher(buildObjectKey(num, gen, key, false)); + }; + } + if (cfm.name === "AESV2") { + return function cipherTransformFactoryBuildCipherConstructorAESV2() { + return new AES128Cipher(buildObjectKey(num, gen, key, true)); + }; + } + if (cfm.name === "AESV3") { + return function cipherTransformFactoryBuildCipherConstructorAESV3() { + return new AES256Cipher(key); + }; + } + throw new _util.FormatError("Unknown crypto method"); + } + class CipherTransformFactory { + constructor(dict, fileId, password) { + const filter = dict.get("Filter"); + if (!(0, _primitives.isName)(filter, "Standard")) { + throw new _util.FormatError("unknown encryption method"); + } + this.filterName = filter.name; + this.dict = dict; + const algorithm = dict.get("V"); + if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { + throw new _util.FormatError("unsupported encryption algorithm"); + } + this.algorithm = algorithm; + let keyLength = dict.get("Length"); + if (!keyLength) { + if (algorithm <= 3) { + keyLength = 40; + } else { + const cfDict = dict.get("CF"); + const streamCryptoName = dict.get("StmF"); + if (cfDict instanceof _primitives.Dict && streamCryptoName instanceof _primitives.Name) { + cfDict.suppressEncryption = true; + const handlerDict = cfDict.get(streamCryptoName.name); + keyLength = handlerDict && handlerDict.get("Length") || 128; + if (keyLength < 40) { + keyLength <<= 3; + } + } + } + } + if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { + throw new _util.FormatError("invalid key length"); + } + const ownerPassword = (0, _util.stringToBytes)(dict.get("O")).subarray(0, 32); + const userPassword = (0, _util.stringToBytes)(dict.get("U")).subarray(0, 32); + const flags = dict.get("P"); + const revision = dict.get("R"); + const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false; + this.encryptMetadata = encryptMetadata; + const fileIdBytes = (0, _util.stringToBytes)(fileId); + let passwordBytes; + if (password) { + if (revision === 6) { + try { + password = (0, _util.utf8StringToString)(password); + } catch (ex) { + (0, _util.warn)("CipherTransformFactory: " + "Unable to convert UTF8 encoded password."); + } + } + passwordBytes = (0, _util.stringToBytes)(password); + } + let encryptionKey; + if (algorithm !== 5) { + encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } else { + const ownerValidationSalt = (0, _util.stringToBytes)(dict.get("O")).subarray(32, 40); + const ownerKeySalt = (0, _util.stringToBytes)(dict.get("O")).subarray(40, 48); + const uBytes = (0, _util.stringToBytes)(dict.get("U")).subarray(0, 48); + const userValidationSalt = (0, _util.stringToBytes)(dict.get("U")).subarray(32, 40); + const userKeySalt = (0, _util.stringToBytes)(dict.get("U")).subarray(40, 48); + const ownerEncryption = (0, _util.stringToBytes)(dict.get("OE")); + const userEncryption = (0, _util.stringToBytes)(dict.get("UE")); + const perms = (0, _util.stringToBytes)(dict.get("Perms")); + encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); + } + if (!encryptionKey && !password) { + throw new _util.PasswordException("No password given", _util.PasswordResponses.NEED_PASSWORD); + } else if (!encryptionKey && password) { + const decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); + encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } + if (!encryptionKey) { + throw new _util.PasswordException("Incorrect Password", _util.PasswordResponses.INCORRECT_PASSWORD); + } + this.encryptionKey = encryptionKey; + if (algorithm >= 4) { + const cf = dict.get("CF"); + if (cf instanceof _primitives.Dict) { + cf.suppressEncryption = true; + } + this.cf = cf; + this.stmf = dict.get("StmF") || identityName; + this.strf = dict.get("StrF") || identityName; + this.eff = dict.get("EFF") || this.stmf; + } + } + createCipherTransform(num, gen) { + if (this.algorithm === 4 || this.algorithm === 5) { + return new CipherTransform(buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey)); + } + const key = buildObjectKey(num, gen, this.encryptionKey, false); + const cipherConstructor = function buildCipherCipherConstructor() { + return new ARCFourCipher(key); + }; + return new CipherTransform(cipherConstructor, cipherConstructor); + } + } + return CipherTransformFactory; +}(); +exports.CipherTransformFactory = CipherTransformFactory; + +/***/ }), +/* 197 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.DecryptStream = void 0; +var _decode_stream = __w_pdfjs_require__(148); +const chunkSize = 512; +class DecryptStream extends _decode_stream.DecodeStream { + constructor(str, maybeLength, decrypt) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + this.decrypt = decrypt; + this.nextChunk = null; + this.initialized = false; + } + readBlock() { + let chunk; + if (this.initialized) { + chunk = this.nextChunk; + } else { + chunk = this.str.getBytes(chunkSize); + this.initialized = true; + } + if (!chunk || chunk.length === 0) { + this.eof = true; + return; + } + this.nextChunk = this.str.getBytes(chunkSize); + const hasMoreData = this.nextChunk && this.nextChunk.length > 0; + const decrypt = this.decrypt; + chunk = decrypt(chunk, !hasMoreData); + const bufferLength = this.bufferLength, + newLength = bufferLength + chunk.length, + buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } +} +exports.DecryptStream = DecryptStream; + +/***/ }), +/* 198 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Catalog = void 0; +var _core_utils = __w_pdfjs_require__(135); +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _name_number_tree = __w_pdfjs_require__(199); +var _base_stream = __w_pdfjs_require__(136); +var _cleanup_helper = __w_pdfjs_require__(200); +var _colorspace = __w_pdfjs_require__(143); +var _file_spec = __w_pdfjs_require__(201); +var _image_utils = __w_pdfjs_require__(188); +var _metadata_parser = __w_pdfjs_require__(202); +var _struct_tree = __w_pdfjs_require__(203); +function fetchDestination(dest) { + if (dest instanceof _primitives.Dict) { + dest = dest.get("D"); + } + return Array.isArray(dest) ? dest : null; +} +class Catalog { + constructor(pdfManager, xref) { + this.pdfManager = pdfManager; + this.xref = xref; + this._catDict = xref.getCatalogObj(); + if (!(this._catDict instanceof _primitives.Dict)) { + throw new _util.FormatError("Catalog object is not a dictionary."); + } + this.toplevelPagesDict; + this._actualNumPages = null; + this.fontCache = new _primitives.RefSetCache(); + this.builtInCMapCache = new Map(); + this.standardFontDataCache = new Map(); + this.globalImageCache = new _image_utils.GlobalImageCache(); + this.pageKidsCountCache = new _primitives.RefSetCache(); + this.pageIndexCache = new _primitives.RefSetCache(); + this.nonBlendModesSet = new _primitives.RefSet(); + } + get version() { + const version = this._catDict.get("Version"); + if (version instanceof _primitives.Name) { + if (_core_utils.PDF_VERSION_REGEXP.test(version.name)) { + return (0, _util.shadow)(this, "version", version.name); + } + (0, _util.warn)(`Invalid PDF catalog version: ${version.name}`); + } + return (0, _util.shadow)(this, "version", null); + } + get lang() { + const lang = this._catDict.get("Lang"); + return (0, _util.shadow)(this, "lang", typeof lang === "string" ? (0, _util.stringToPDFString)(lang) : null); + } + get needsRendering() { + const needsRendering = this._catDict.get("NeedsRendering"); + return (0, _util.shadow)(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false); + } + get collection() { + let collection = null; + try { + const obj = this._catDict.get("Collection"); + if (obj instanceof _primitives.Dict && obj.size > 0) { + collection = obj; + } + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.info)("Cannot fetch Collection entry; assuming no collection is present."); + } + return (0, _util.shadow)(this, "collection", collection); + } + get acroForm() { + let acroForm = null; + try { + const obj = this._catDict.get("AcroForm"); + if (obj instanceof _primitives.Dict && obj.size > 0) { + acroForm = obj; + } + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.info)("Cannot fetch AcroForm entry; assuming no forms are present."); + } + return (0, _util.shadow)(this, "acroForm", acroForm); + } + get acroFormRef() { + const value = this._catDict.getRaw("AcroForm"); + return (0, _util.shadow)(this, "acroFormRef", value instanceof _primitives.Ref ? value : null); + } + get metadata() { + const streamRef = this._catDict.getRaw("Metadata"); + if (!(streamRef instanceof _primitives.Ref)) { + return (0, _util.shadow)(this, "metadata", null); + } + let metadata = null; + try { + const suppressEncryption = !(this.xref.encrypt && this.xref.encrypt.encryptMetadata); + const stream = this.xref.fetch(streamRef, suppressEncryption); + if (stream instanceof _base_stream.BaseStream && stream.dict instanceof _primitives.Dict) { + const type = stream.dict.get("Type"); + const subtype = stream.dict.get("Subtype"); + if ((0, _primitives.isName)(type, "Metadata") && (0, _primitives.isName)(subtype, "XML")) { + const data = (0, _util.stringToUTF8String)(stream.getString()); + if (data) { + metadata = new _metadata_parser.MetadataParser(data).serializable; + } + } + } + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.info)(`Skipping invalid Metadata: "${ex}".`); + } + return (0, _util.shadow)(this, "metadata", metadata); + } + get markInfo() { + let markInfo = null; + try { + markInfo = this._readMarkInfo(); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)("Unable to read mark info."); + } + return (0, _util.shadow)(this, "markInfo", markInfo); + } + _readMarkInfo() { + const obj = this._catDict.get("MarkInfo"); + if (!(obj instanceof _primitives.Dict)) { + return null; + } + const markInfo = { + Marked: false, + UserProperties: false, + Suspects: false + }; + for (const key in markInfo) { + const value = obj.get(key); + if (typeof value === "boolean") { + markInfo[key] = value; + } + } + return markInfo; + } + get structTreeRoot() { + let structTree = null; + try { + structTree = this._readStructTreeRoot(); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)("Unable read to structTreeRoot info."); + } + return (0, _util.shadow)(this, "structTreeRoot", structTree); + } + _readStructTreeRoot() { + const obj = this._catDict.get("StructTreeRoot"); + if (!(obj instanceof _primitives.Dict)) { + return null; + } + const root = new _struct_tree.StructTreeRoot(obj); + root.init(); + return root; + } + get toplevelPagesDict() { + const pagesObj = this._catDict.get("Pages"); + if (!(pagesObj instanceof _primitives.Dict)) { + throw new _util.FormatError("Invalid top-level pages dictionary."); + } + return (0, _util.shadow)(this, "toplevelPagesDict", pagesObj); + } + get documentOutline() { + let obj = null; + try { + obj = this._readDocumentOutline(); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)("Unable to read document outline."); + } + return (0, _util.shadow)(this, "documentOutline", obj); + } + _readDocumentOutline() { + let obj = this._catDict.get("Outlines"); + if (!(obj instanceof _primitives.Dict)) { + return null; + } + obj = obj.getRaw("First"); + if (!(obj instanceof _primitives.Ref)) { + return null; + } + const root = { + items: [] + }; + const queue = [{ + obj, + parent: root + }]; + const processed = new _primitives.RefSet(); + processed.put(obj); + const xref = this.xref, + blackColor = new Uint8ClampedArray(3); + while (queue.length > 0) { + const i = queue.shift(); + const outlineDict = xref.fetchIfRef(i.obj); + if (outlineDict === null) { + continue; + } + if (!outlineDict.has("Title")) { + throw new _util.FormatError("Invalid outline item encountered."); + } + const data = { + url: null, + dest: null, + action: null + }; + Catalog.parseDestDictionary({ + destDict: outlineDict, + resultObj: data, + docBaseUrl: this.pdfManager.docBaseUrl, + docAttachments: this.attachments + }); + const title = outlineDict.get("Title"); + const flags = outlineDict.get("F") || 0; + const color = outlineDict.getArray("C"); + const count = outlineDict.get("Count"); + let rgbColor = blackColor; + if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { + rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0); + } + const outlineItem = { + action: data.action, + attachment: data.attachment, + dest: data.dest, + url: data.url, + unsafeUrl: data.unsafeUrl, + newWindow: data.newWindow, + setOCGState: data.setOCGState, + title: (0, _util.stringToPDFString)(title), + color: rgbColor, + count: Number.isInteger(count) ? count : undefined, + bold: !!(flags & 2), + italic: !!(flags & 1), + items: [] + }; + i.parent.items.push(outlineItem); + obj = outlineDict.getRaw("First"); + if (obj instanceof _primitives.Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: outlineItem + }); + processed.put(obj); + } + obj = outlineDict.getRaw("Next"); + if (obj instanceof _primitives.Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: i.parent + }); + processed.put(obj); + } + } + return root.items.length > 0 ? root.items : null; + } + get permissions() { + let permissions = null; + try { + permissions = this._readPermissions(); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)("Unable to read permissions."); + } + return (0, _util.shadow)(this, "permissions", permissions); + } + _readPermissions() { + const encrypt = this.xref.trailer.get("Encrypt"); + if (!(encrypt instanceof _primitives.Dict)) { + return null; + } + let flags = encrypt.get("P"); + if (typeof flags !== "number") { + return null; + } + flags += 2 ** 32; + const permissions = []; + for (const key in _util.PermissionFlag) { + const value = _util.PermissionFlag[key]; + if (flags & value) { + permissions.push(value); + } + } + return permissions; + } + get optionalContentConfig() { + let config = null; + try { + const properties = this._catDict.get("OCProperties"); + if (!properties) { + return (0, _util.shadow)(this, "optionalContentConfig", null); + } + const defaultConfig = properties.get("D"); + if (!defaultConfig) { + return (0, _util.shadow)(this, "optionalContentConfig", null); + } + const groupsData = properties.get("OCGs"); + if (!Array.isArray(groupsData)) { + return (0, _util.shadow)(this, "optionalContentConfig", null); + } + const groups = []; + const groupRefs = []; + for (const groupRef of groupsData) { + if (!(groupRef instanceof _primitives.Ref)) { + continue; + } + groupRefs.push(groupRef); + const group = this.xref.fetchIfRef(groupRef); + groups.push({ + id: groupRef.toString(), + name: typeof group.get("Name") === "string" ? (0, _util.stringToPDFString)(group.get("Name")) : null, + intent: typeof group.get("Intent") === "string" ? (0, _util.stringToPDFString)(group.get("Intent")) : null + }); + } + config = this._readOptionalContentConfig(defaultConfig, groupRefs); + config.groups = groups; + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)(`Unable to read optional content config: ${ex}`); + } + return (0, _util.shadow)(this, "optionalContentConfig", config); + } + _readOptionalContentConfig(config, contentGroupRefs) { + function parseOnOff(refs) { + const onParsed = []; + if (Array.isArray(refs)) { + for (const value of refs) { + if (!(value instanceof _primitives.Ref)) { + continue; + } + if (contentGroupRefs.includes(value)) { + onParsed.push(value.toString()); + } + } + } + return onParsed; + } + function parseOrder(refs) { + let nestedLevels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + if (!Array.isArray(refs)) { + return null; + } + const order = []; + for (const value of refs) { + if (value instanceof _primitives.Ref && contentGroupRefs.includes(value)) { + parsedOrderRefs.put(value); + order.push(value.toString()); + continue; + } + const nestedOrder = parseNestedOrder(value, nestedLevels); + if (nestedOrder) { + order.push(nestedOrder); + } + } + if (nestedLevels > 0) { + return order; + } + const hiddenGroups = []; + for (const groupRef of contentGroupRefs) { + if (parsedOrderRefs.has(groupRef)) { + continue; + } + hiddenGroups.push(groupRef.toString()); + } + if (hiddenGroups.length) { + order.push({ + name: null, + order: hiddenGroups + }); + } + return order; + } + function parseNestedOrder(ref, nestedLevels) { + if (++nestedLevels > MAX_NESTED_LEVELS) { + (0, _util.warn)("parseNestedOrder - reached MAX_NESTED_LEVELS."); + return null; + } + const value = xref.fetchIfRef(ref); + if (!Array.isArray(value)) { + return null; + } + const nestedName = xref.fetchIfRef(value[0]); + if (typeof nestedName !== "string") { + return null; + } + const nestedOrder = parseOrder(value.slice(1), nestedLevels); + if (!nestedOrder || !nestedOrder.length) { + return null; + } + return { + name: (0, _util.stringToPDFString)(nestedName), + order: nestedOrder + }; + } + const xref = this.xref, + parsedOrderRefs = new _primitives.RefSet(), + MAX_NESTED_LEVELS = 10; + return { + name: typeof config.get("Name") === "string" ? (0, _util.stringToPDFString)(config.get("Name")) : null, + creator: typeof config.get("Creator") === "string" ? (0, _util.stringToPDFString)(config.get("Creator")) : null, + baseState: config.get("BaseState") instanceof _primitives.Name ? config.get("BaseState").name : null, + on: parseOnOff(config.get("ON")), + off: parseOnOff(config.get("OFF")), + order: parseOrder(config.get("Order")), + groups: null + }; + } + setActualNumPages() { + let num = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + this._actualNumPages = num; + } + get hasActualNumPages() { + return this._actualNumPages !== null; + } + get _pagesCount() { + const obj = this.toplevelPagesDict.get("Count"); + if (!Number.isInteger(obj)) { + throw new _util.FormatError("Page count in top-level pages dictionary is not an integer."); + } + return (0, _util.shadow)(this, "_pagesCount", obj); + } + get numPages() { + return this.hasActualNumPages ? this._actualNumPages : this._pagesCount; + } + get destinations() { + const obj = this._readDests(), + dests = Object.create(null); + if (obj instanceof _name_number_tree.NameTree) { + for (const [key, value] of obj.getAll()) { + const dest = fetchDestination(value); + if (dest) { + dests[(0, _util.stringToPDFString)(key)] = dest; + } + } + } else if (obj instanceof _primitives.Dict) { + obj.forEach(function (key, value) { + const dest = fetchDestination(value); + if (dest) { + dests[key] = dest; + } + }); + } + return (0, _util.shadow)(this, "destinations", dests); + } + getDestination(id) { + const obj = this._readDests(); + if (obj instanceof _name_number_tree.NameTree) { + const dest = fetchDestination(obj.get(id)); + if (dest) { + return dest; + } + const allDest = this.destinations[id]; + if (allDest) { + (0, _util.warn)(`Found "${id}" at an incorrect position in the NameTree.`); + return allDest; + } + } else if (obj instanceof _primitives.Dict) { + const dest = fetchDestination(obj.get(id)); + if (dest) { + return dest; + } + } + return null; + } + _readDests() { + const obj = this._catDict.get("Names"); + if (obj && obj.has("Dests")) { + return new _name_number_tree.NameTree(obj.getRaw("Dests"), this.xref); + } else if (this._catDict.has("Dests")) { + return this._catDict.get("Dests"); + } + return undefined; + } + get pageLabels() { + let obj = null; + try { + obj = this._readPageLabels(); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)("Unable to read page labels."); + } + return (0, _util.shadow)(this, "pageLabels", obj); + } + _readPageLabels() { + const obj = this._catDict.getRaw("PageLabels"); + if (!obj) { + return null; + } + const pageLabels = new Array(this.numPages); + let style = null, + prefix = ""; + const numberTree = new _name_number_tree.NumberTree(obj, this.xref); + const nums = numberTree.getAll(); + let currentLabel = "", + currentIndex = 1; + for (let i = 0, ii = this.numPages; i < ii; i++) { + const labelDict = nums.get(i); + if (labelDict !== undefined) { + if (!(labelDict instanceof _primitives.Dict)) { + throw new _util.FormatError("PageLabel is not a dictionary."); + } + if (labelDict.has("Type") && !(0, _primitives.isName)(labelDict.get("Type"), "PageLabel")) { + throw new _util.FormatError("Invalid type in PageLabel dictionary."); + } + if (labelDict.has("S")) { + const s = labelDict.get("S"); + if (!(s instanceof _primitives.Name)) { + throw new _util.FormatError("Invalid style in PageLabel dictionary."); + } + style = s.name; + } else { + style = null; + } + if (labelDict.has("P")) { + const p = labelDict.get("P"); + if (typeof p !== "string") { + throw new _util.FormatError("Invalid prefix in PageLabel dictionary."); + } + prefix = (0, _util.stringToPDFString)(p); + } else { + prefix = ""; + } + if (labelDict.has("St")) { + const st = labelDict.get("St"); + if (!(Number.isInteger(st) && st >= 1)) { + throw new _util.FormatError("Invalid start in PageLabel dictionary."); + } + currentIndex = st; + } else { + currentIndex = 1; + } + } + switch (style) { + case "D": + currentLabel = currentIndex; + break; + case "R": + case "r": + currentLabel = (0, _core_utils.toRomanNumerals)(currentIndex, style === "r"); + break; + case "A": + case "a": + const LIMIT = 26; + const A_UPPER_CASE = 0x41, + A_LOWER_CASE = 0x61; + const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE; + const letterIndex = currentIndex - 1; + const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT); + currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1); + break; + default: + if (style) { + throw new _util.FormatError(`Invalid style "${style}" in PageLabel dictionary.`); + } + currentLabel = ""; + } + pageLabels[i] = prefix + currentLabel; + currentIndex++; + } + return pageLabels; + } + get pageLayout() { + const obj = this._catDict.get("PageLayout"); + let pageLayout = ""; + if (obj instanceof _primitives.Name) { + switch (obj.name) { + case "SinglePage": + case "OneColumn": + case "TwoColumnLeft": + case "TwoColumnRight": + case "TwoPageLeft": + case "TwoPageRight": + pageLayout = obj.name; + } + } + return (0, _util.shadow)(this, "pageLayout", pageLayout); + } + get pageMode() { + const obj = this._catDict.get("PageMode"); + let pageMode = "UseNone"; + if (obj instanceof _primitives.Name) { + switch (obj.name) { + case "UseNone": + case "UseOutlines": + case "UseThumbs": + case "FullScreen": + case "UseOC": + case "UseAttachments": + pageMode = obj.name; + } + } + return (0, _util.shadow)(this, "pageMode", pageMode); + } + get viewerPreferences() { + const obj = this._catDict.get("ViewerPreferences"); + if (!(obj instanceof _primitives.Dict)) { + return (0, _util.shadow)(this, "viewerPreferences", null); + } + let prefs = null; + for (const key of obj.getKeys()) { + const value = obj.get(key); + let prefValue; + switch (key) { + case "HideToolbar": + case "HideMenubar": + case "HideWindowUI": + case "FitWindow": + case "CenterWindow": + case "DisplayDocTitle": + case "PickTrayByPDFSize": + if (typeof value === "boolean") { + prefValue = value; + } + break; + case "NonFullScreenPageMode": + if (value instanceof _primitives.Name) { + switch (value.name) { + case "UseNone": + case "UseOutlines": + case "UseThumbs": + case "UseOC": + prefValue = value.name; + break; + default: + prefValue = "UseNone"; + } + } + break; + case "Direction": + if (value instanceof _primitives.Name) { + switch (value.name) { + case "L2R": + case "R2L": + prefValue = value.name; + break; + default: + prefValue = "L2R"; + } + } + break; + case "ViewArea": + case "ViewClip": + case "PrintArea": + case "PrintClip": + if (value instanceof _primitives.Name) { + switch (value.name) { + case "MediaBox": + case "CropBox": + case "BleedBox": + case "TrimBox": + case "ArtBox": + prefValue = value.name; + break; + default: + prefValue = "CropBox"; + } + } + break; + case "PrintScaling": + if (value instanceof _primitives.Name) { + switch (value.name) { + case "None": + case "AppDefault": + prefValue = value.name; + break; + default: + prefValue = "AppDefault"; + } + } + break; + case "Duplex": + if (value instanceof _primitives.Name) { + switch (value.name) { + case "Simplex": + case "DuplexFlipShortEdge": + case "DuplexFlipLongEdge": + prefValue = value.name; + break; + default: + prefValue = "None"; + } + } + break; + case "PrintPageRange": + if (Array.isArray(value) && value.length % 2 === 0) { + const isValid = value.every((page, i, arr) => { + return Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages; + }); + if (isValid) { + prefValue = value; + } + } + break; + case "NumCopies": + if (Number.isInteger(value) && value > 0) { + prefValue = value; + } + break; + default: + (0, _util.warn)(`Ignoring non-standard key in ViewerPreferences: ${key}.`); + continue; + } + if (prefValue === undefined) { + (0, _util.warn)(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); + continue; + } + if (!prefs) { + prefs = Object.create(null); + } + prefs[key] = prefValue; + } + return (0, _util.shadow)(this, "viewerPreferences", prefs); + } + get openAction() { + const obj = this._catDict.get("OpenAction"); + const openAction = Object.create(null); + if (obj instanceof _primitives.Dict) { + const destDict = new _primitives.Dict(this.xref); + destDict.set("A", obj); + const resultObj = { + url: null, + dest: null, + action: null + }; + Catalog.parseDestDictionary({ + destDict, + resultObj + }); + if (Array.isArray(resultObj.dest)) { + openAction.dest = resultObj.dest; + } else if (resultObj.action) { + openAction.action = resultObj.action; + } + } else if (Array.isArray(obj)) { + openAction.dest = obj; + } + return (0, _util.shadow)(this, "openAction", (0, _util.objectSize)(openAction) > 0 ? openAction : null); + } + get attachments() { + const obj = this._catDict.get("Names"); + let attachments = null; + if (obj instanceof _primitives.Dict && obj.has("EmbeddedFiles")) { + const nameTree = new _name_number_tree.NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + for (const [key, value] of nameTree.getAll()) { + const fs = new _file_spec.FileSpec(value, this.xref); + if (!attachments) { + attachments = Object.create(null); + } + attachments[(0, _util.stringToPDFString)(key)] = fs.serializable; + } + } + return (0, _util.shadow)(this, "attachments", attachments); + } + get xfaImages() { + const obj = this._catDict.get("Names"); + let xfaImages = null; + if (obj instanceof _primitives.Dict && obj.has("XFAImages")) { + const nameTree = new _name_number_tree.NameTree(obj.getRaw("XFAImages"), this.xref); + for (const [key, value] of nameTree.getAll()) { + if (!xfaImages) { + xfaImages = new _primitives.Dict(this.xref); + } + xfaImages.set((0, _util.stringToPDFString)(key), value); + } + } + return (0, _util.shadow)(this, "xfaImages", xfaImages); + } + _collectJavaScript() { + const obj = this._catDict.get("Names"); + let javaScript = null; + function appendIfJavaScriptDict(name, jsDict) { + if (!(jsDict instanceof _primitives.Dict)) { + return; + } + if (!(0, _primitives.isName)(jsDict.get("S"), "JavaScript")) { + return; + } + let js = jsDict.get("JS"); + if (js instanceof _base_stream.BaseStream) { + js = js.getString(); + } else if (typeof js !== "string") { + return; + } + if (javaScript === null) { + javaScript = new Map(); + } + js = (0, _util.stringToPDFString)(js).replace(/\u0000/g, ""); + javaScript.set(name, js); + } + if (obj instanceof _primitives.Dict && obj.has("JavaScript")) { + const nameTree = new _name_number_tree.NameTree(obj.getRaw("JavaScript"), this.xref); + for (const [key, value] of nameTree.getAll()) { + appendIfJavaScriptDict((0, _util.stringToPDFString)(key), value); + } + } + const openAction = this._catDict.get("OpenAction"); + if (openAction) { + appendIfJavaScriptDict("OpenAction", openAction); + } + return javaScript; + } + get javaScript() { + const javaScript = this._collectJavaScript(); + return (0, _util.shadow)(this, "javaScript", javaScript ? [...javaScript.values()] : null); + } + get jsActions() { + const javaScript = this._collectJavaScript(); + let actions = (0, _core_utils.collectActions)(this.xref, this._catDict, _util.DocumentActionEventType); + if (javaScript) { + if (!actions) { + actions = Object.create(null); + } + for (const [key, val] of javaScript) { + if (key in actions) { + actions[key].push(val); + } else { + actions[key] = [val]; + } + } + } + return (0, _util.shadow)(this, "jsActions", actions); + } + async fontFallback(id, handler) { + const translatedFonts = await Promise.all(this.fontCache); + for (const translatedFont of translatedFonts) { + if (translatedFont.loadedName === id) { + translatedFont.fallback(handler); + return; + } + } + } + async cleanup() { + let manuallyTriggered = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + (0, _cleanup_helper.clearGlobalCaches)(); + this.globalImageCache.clear(manuallyTriggered); + this.pageKidsCountCache.clear(); + this.pageIndexCache.clear(); + this.nonBlendModesSet.clear(); + const translatedFonts = await Promise.all(this.fontCache); + for (const { + dict + } of translatedFonts) { + delete dict.cacheKey; + } + this.fontCache.clear(); + this.builtInCMapCache.clear(); + this.standardFontDataCache.clear(); + } + async getPageDict(pageIndex) { + const nodesToVisit = [this.toplevelPagesDict]; + const visitedNodes = new _primitives.RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof _primitives.Ref) { + visitedNodes.put(pagesRef); + } + const xref = this.xref, + pageKidsCountCache = this.pageKidsCountCache, + pageIndexCache = this.pageIndexCache; + let currentPageIndex = 0; + while (nodesToVisit.length) { + const currentNode = nodesToVisit.pop(); + if (currentNode instanceof _primitives.Ref) { + const count = pageKidsCountCache.get(currentNode); + if (count >= 0 && currentPageIndex + count <= pageIndex) { + currentPageIndex += count; + continue; + } + if (visitedNodes.has(currentNode)) { + throw new _util.FormatError("Pages tree contains circular reference."); + } + visitedNodes.put(currentNode); + const obj = await xref.fetchAsync(currentNode); + if (obj instanceof _primitives.Dict) { + let type = obj.getRaw("Type"); + if (type instanceof _primitives.Ref) { + type = await xref.fetchAsync(type); + } + if ((0, _primitives.isName)(type, "Page") || !obj.has("Kids")) { + if (!pageKidsCountCache.has(currentNode)) { + pageKidsCountCache.put(currentNode, 1); + } + if (!pageIndexCache.has(currentNode)) { + pageIndexCache.put(currentNode, currentPageIndex); + } + if (currentPageIndex === pageIndex) { + return [obj, currentNode]; + } + currentPageIndex++; + continue; + } + } + nodesToVisit.push(obj); + continue; + } + if (!(currentNode instanceof _primitives.Dict)) { + throw new _util.FormatError("Page dictionary kid reference points to wrong type of object."); + } + const { + objId + } = currentNode; + let count = currentNode.getRaw("Count"); + if (count instanceof _primitives.Ref) { + count = await xref.fetchAsync(count); + } + if (Number.isInteger(count) && count >= 0) { + if (objId && !pageKidsCountCache.has(objId)) { + pageKidsCountCache.put(objId, count); + } + if (currentPageIndex + count <= pageIndex) { + currentPageIndex += count; + continue; + } + } + let kids = currentNode.getRaw("Kids"); + if (kids instanceof _primitives.Ref) { + kids = await xref.fetchAsync(kids); + } + if (!Array.isArray(kids)) { + let type = currentNode.getRaw("Type"); + if (type instanceof _primitives.Ref) { + type = await xref.fetchAsync(type); + } + if ((0, _primitives.isName)(type, "Page") || !currentNode.has("Kids")) { + if (currentPageIndex === pageIndex) { + return [currentNode, null]; + } + currentPageIndex++; + continue; + } + throw new _util.FormatError("Page dictionary kids object is not an array."); + } + for (let last = kids.length - 1; last >= 0; last--) { + nodesToVisit.push(kids[last]); + } + } + throw new Error(`Page index ${pageIndex} not found.`); + } + async getAllPageDicts() { + let recoveryMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const { + ignoreErrors + } = this.pdfManager.evaluatorOptions; + const queue = [{ + currentNode: this.toplevelPagesDict, + posInKids: 0 + }]; + const visitedNodes = new _primitives.RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof _primitives.Ref) { + visitedNodes.put(pagesRef); + } + const map = new Map(), + xref = this.xref, + pageIndexCache = this.pageIndexCache; + let pageIndex = 0; + function addPageDict(pageDict, pageRef) { + if (pageRef && !pageIndexCache.has(pageRef)) { + pageIndexCache.put(pageRef, pageIndex); + } + map.set(pageIndex++, [pageDict, pageRef]); + } + function addPageError(error) { + if (error instanceof _core_utils.XRefEntryException && !recoveryMode) { + throw error; + } + if (recoveryMode && ignoreErrors && pageIndex === 0) { + (0, _util.warn)(`getAllPageDicts - Skipping invalid first page: "${error}".`); + error = _primitives.Dict.empty; + } + map.set(pageIndex++, [error, null]); + } + while (queue.length > 0) { + const queueItem = queue.at(-1); + const { + currentNode, + posInKids + } = queueItem; + let kids = currentNode.getRaw("Kids"); + if (kids instanceof _primitives.Ref) { + try { + kids = await xref.fetchAsync(kids); + } catch (ex) { + addPageError(ex); + break; + } + } + if (!Array.isArray(kids)) { + addPageError(new _util.FormatError("Page dictionary kids object is not an array.")); + break; + } + if (posInKids >= kids.length) { + queue.pop(); + continue; + } + const kidObj = kids[posInKids]; + let obj; + if (kidObj instanceof _primitives.Ref) { + if (visitedNodes.has(kidObj)) { + addPageError(new _util.FormatError("Pages tree contains circular reference.")); + break; + } + visitedNodes.put(kidObj); + try { + obj = await xref.fetchAsync(kidObj); + } catch (ex) { + addPageError(ex); + break; + } + } else { + obj = kidObj; + } + if (!(obj instanceof _primitives.Dict)) { + addPageError(new _util.FormatError("Page dictionary kid reference points to wrong type of object.")); + break; + } + let type = obj.getRaw("Type"); + if (type instanceof _primitives.Ref) { + try { + type = await xref.fetchAsync(type); + } catch (ex) { + addPageError(ex); + break; + } + } + if ((0, _primitives.isName)(type, "Page") || !obj.has("Kids")) { + addPageDict(obj, kidObj instanceof _primitives.Ref ? kidObj : null); + } else { + queue.push({ + currentNode: obj, + posInKids: 0 + }); + } + queueItem.posInKids++; + } + return map; + } + getPageIndex(pageRef) { + const cachedPageIndex = this.pageIndexCache.get(pageRef); + if (cachedPageIndex !== undefined) { + return Promise.resolve(cachedPageIndex); + } + const xref = this.xref; + function pagesBeforeRef(kidRef) { + let total = 0, + parentRef; + return xref.fetchAsync(kidRef).then(function (node) { + if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, "Page") && !(node instanceof _primitives.Dict && !node.has("Type") && node.has("Contents"))) { + throw new _util.FormatError("The reference does not point to a /Page dictionary."); + } + if (!node) { + return null; + } + if (!(node instanceof _primitives.Dict)) { + throw new _util.FormatError("Node must be a dictionary."); + } + parentRef = node.getRaw("Parent"); + return node.getAsync("Parent"); + }).then(function (parent) { + if (!parent) { + return null; + } + if (!(parent instanceof _primitives.Dict)) { + throw new _util.FormatError("Parent must be a dictionary."); + } + return parent.getAsync("Kids"); + }).then(function (kids) { + if (!kids) { + return null; + } + const kidPromises = []; + let found = false; + for (const kid of kids) { + if (!(kid instanceof _primitives.Ref)) { + throw new _util.FormatError("Kid must be a reference."); + } + if ((0, _primitives.isRefsEqual)(kid, kidRef)) { + found = true; + break; + } + kidPromises.push(xref.fetchAsync(kid).then(function (obj) { + if (!(obj instanceof _primitives.Dict)) { + throw new _util.FormatError("Kid node must be a dictionary."); + } + if (obj.has("Count")) { + total += obj.get("Count"); + } else { + total++; + } + })); + } + if (!found) { + throw new _util.FormatError("Kid reference not found in parent's kids."); + } + return Promise.all(kidPromises).then(function () { + return [total, parentRef]; + }); + }); + } + let total = 0; + const next = ref => pagesBeforeRef(ref).then(args => { + if (!args) { + this.pageIndexCache.put(pageRef, total); + return total; + } + const [count, parentRef] = args; + total += count; + return next(parentRef); + }); + return next(pageRef); + } + get baseUrl() { + const uri = this._catDict.get("URI"); + if (uri instanceof _primitives.Dict) { + const base = uri.get("Base"); + if (typeof base === "string") { + const absoluteUrl = (0, _util.createValidAbsoluteUrl)(base, null, { + tryConvertEncoding: true + }); + if (absoluteUrl) { + return (0, _util.shadow)(this, "baseUrl", absoluteUrl.href); + } + } + } + return (0, _util.shadow)(this, "baseUrl", null); + } + static parseDestDictionary(params) { + const destDict = params.destDict; + if (!(destDict instanceof _primitives.Dict)) { + (0, _util.warn)("parseDestDictionary: `destDict` must be a dictionary."); + return; + } + const resultObj = params.resultObj; + if (typeof resultObj !== "object") { + (0, _util.warn)("parseDestDictionary: `resultObj` must be an object."); + return; + } + const docBaseUrl = params.docBaseUrl || null; + const docAttachments = params.docAttachments || null; + let action = destDict.get("A"), + url, + dest; + if (!(action instanceof _primitives.Dict)) { + if (destDict.has("Dest")) { + action = destDict.get("Dest"); + } else { + action = destDict.get("AA"); + if (action instanceof _primitives.Dict) { + if (action.has("D")) { + action = action.get("D"); + } else if (action.has("U")) { + action = action.get("U"); + } + } + } + } + if (action instanceof _primitives.Dict) { + const actionType = action.get("S"); + if (!(actionType instanceof _primitives.Name)) { + (0, _util.warn)("parseDestDictionary: Invalid type in Action dictionary."); + return; + } + const actionName = actionType.name; + switch (actionName) { + case "ResetForm": + const flags = action.get("Flags"); + const include = ((typeof flags === "number" ? flags : 0) & 1) === 0; + const fields = []; + const refs = []; + for (const obj of action.get("Fields") || []) { + if (obj instanceof _primitives.Ref) { + refs.push(obj.toString()); + } else if (typeof obj === "string") { + fields.push((0, _util.stringToPDFString)(obj)); + } + } + resultObj.resetForm = { + fields, + refs, + include + }; + break; + case "URI": + url = action.get("URI"); + if (url instanceof _primitives.Name) { + url = "/" + url.name; + } + break; + case "GoTo": + dest = action.get("D"); + break; + case "Launch": + case "GoToR": + const urlDict = action.get("F"); + if (urlDict instanceof _primitives.Dict) { + url = urlDict.get("F") || null; + } else if (typeof urlDict === "string") { + url = urlDict; + } + let remoteDest = action.get("D"); + if (remoteDest) { + if (remoteDest instanceof _primitives.Name) { + remoteDest = remoteDest.name; + } + if (typeof url === "string") { + const baseUrl = url.split("#")[0]; + if (typeof remoteDest === "string") { + url = baseUrl + "#" + remoteDest; + } else if (Array.isArray(remoteDest)) { + url = baseUrl + "#" + JSON.stringify(remoteDest); + } + } + } + const newWindow = action.get("NewWindow"); + if (typeof newWindow === "boolean") { + resultObj.newWindow = newWindow; + } + break; + case "GoToE": + const target = action.get("T"); + let attachment; + if (docAttachments && target instanceof _primitives.Dict) { + const relationship = target.get("R"); + const name = target.get("N"); + if ((0, _primitives.isName)(relationship, "C") && typeof name === "string") { + attachment = docAttachments[(0, _util.stringToPDFString)(name)]; + } + } + if (attachment) { + resultObj.attachment = attachment; + } else { + (0, _util.warn)(`parseDestDictionary - unimplemented "GoToE" action.`); + } + break; + case "Named": + const namedAction = action.get("N"); + if (namedAction instanceof _primitives.Name) { + resultObj.action = namedAction.name; + } + break; + case "SetOCGState": + const state = action.get("State"); + const preserveRB = action.get("PreserveRB"); + if (!Array.isArray(state) || state.length === 0) { + break; + } + const stateArr = []; + for (const elem of state) { + if (elem instanceof _primitives.Name) { + switch (elem.name) { + case "ON": + case "OFF": + case "Toggle": + stateArr.push(elem.name); + break; + } + } else if (elem instanceof _primitives.Ref) { + stateArr.push(elem.toString()); + } + } + if (stateArr.length !== state.length) { + break; + } + resultObj.setOCGState = { + state: stateArr, + preserveRB: typeof preserveRB === "boolean" ? preserveRB : true + }; + break; + case "JavaScript": + const jsAction = action.get("JS"); + let js; + if (jsAction instanceof _base_stream.BaseStream) { + js = jsAction.getString(); + } else if (typeof jsAction === "string") { + js = jsAction; + } + const jsURL = js && (0, _core_utils.recoverJsURL)((0, _util.stringToPDFString)(js)); + if (jsURL) { + url = jsURL.url; + resultObj.newWindow = jsURL.newWindow; + break; + } + default: + if (actionName === "JavaScript" || actionName === "SubmitForm") { + break; + } + (0, _util.warn)(`parseDestDictionary - unsupported action: "${actionName}".`); + break; + } + } else if (destDict.has("Dest")) { + dest = destDict.get("Dest"); + } + if (typeof url === "string") { + const absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl, { + addDefaultProtocol: true, + tryConvertEncoding: true + }); + if (absoluteUrl) { + resultObj.url = absoluteUrl.href; + } + resultObj.unsafeUrl = url; + } + if (dest) { + if (dest instanceof _primitives.Name) { + dest = dest.name; + } + if (typeof dest === "string") { + resultObj.dest = (0, _util.stringToPDFString)(dest); + } else if (Array.isArray(dest)) { + resultObj.dest = dest; + } + } + } +} +exports.Catalog = Catalog; + +/***/ }), +/* 199 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.NumberTree = exports.NameTree = void 0; +var _primitives = __w_pdfjs_require__(134); +var _util = __w_pdfjs_require__(2); +class NameOrNumberTree { + constructor(root, xref, type) { + if (this.constructor === NameOrNumberTree) { + (0, _util.unreachable)("Cannot initialize NameOrNumberTree."); + } + this.root = root; + this.xref = xref; + this._type = type; + } + getAll() { + const map = new Map(); + if (!this.root) { + return map; + } + const xref = this.xref; + const processed = new _primitives.RefSet(); + processed.put(this.root); + const queue = [this.root]; + while (queue.length > 0) { + const obj = xref.fetchIfRef(queue.shift()); + if (!(obj instanceof _primitives.Dict)) { + continue; + } + if (obj.has("Kids")) { + const kids = obj.get("Kids"); + if (!Array.isArray(kids)) { + continue; + } + for (const kid of kids) { + if (processed.has(kid)) { + throw new _util.FormatError(`Duplicate entry in "${this._type}" tree.`); + } + queue.push(kid); + processed.put(kid); + } + continue; + } + const entries = obj.get(this._type); + if (!Array.isArray(entries)) { + continue; + } + for (let i = 0, ii = entries.length; i < ii; i += 2) { + map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); + } + } + return map; + } + get(key) { + if (!this.root) { + return null; + } + const xref = this.xref; + let kidsOrEntries = xref.fetchIfRef(this.root); + let loopCount = 0; + const MAX_LEVELS = 10; + while (kidsOrEntries.has("Kids")) { + if (++loopCount > MAX_LEVELS) { + (0, _util.warn)(`Search depth limit reached for "${this._type}" tree.`); + return null; + } + const kids = kidsOrEntries.get("Kids"); + if (!Array.isArray(kids)) { + return null; + } + let l = 0, + r = kids.length - 1; + while (l <= r) { + const m = l + r >> 1; + const kid = xref.fetchIfRef(kids[m]); + const limits = kid.get("Limits"); + if (key < xref.fetchIfRef(limits[0])) { + r = m - 1; + } else if (key > xref.fetchIfRef(limits[1])) { + l = m + 1; + } else { + kidsOrEntries = kid; + break; + } + } + if (l > r) { + return null; + } + } + const entries = kidsOrEntries.get(this._type); + if (Array.isArray(entries)) { + let l = 0, + r = entries.length - 2; + while (l <= r) { + const tmp = l + r >> 1, + m = tmp + (tmp & 1); + const currentKey = xref.fetchIfRef(entries[m]); + if (key < currentKey) { + r = m - 2; + } else if (key > currentKey) { + l = m + 2; + } else { + return xref.fetchIfRef(entries[m + 1]); + } + } + } + return null; + } +} +class NameTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Names"); + } +} +exports.NameTree = NameTree; +class NumberTree extends NameOrNumberTree { + constructor(root, xref) { + super(root, xref, "Nums"); + } +} +exports.NumberTree = NumberTree; + +/***/ }), +/* 200 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.clearGlobalCaches = clearGlobalCaches; +var _primitives = __w_pdfjs_require__(134); +var _unicode = __w_pdfjs_require__(169); +function clearGlobalCaches() { + (0, _primitives.clearPrimitiveCaches)(); + (0, _unicode.clearUnicodeCaches)(); +} + +/***/ }), +/* 201 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.FileSpec = void 0; +var _util = __w_pdfjs_require__(2); +var _base_stream = __w_pdfjs_require__(136); +var _primitives = __w_pdfjs_require__(134); +function pickPlatformItem(dict) { + if (dict.has("UF")) { + return dict.get("UF"); + } else if (dict.has("F")) { + return dict.get("F"); + } else if (dict.has("Unix")) { + return dict.get("Unix"); + } else if (dict.has("Mac")) { + return dict.get("Mac"); + } else if (dict.has("DOS")) { + return dict.get("DOS"); + } + return null; +} +class FileSpec { + constructor(root, xref) { + if (!(root instanceof _primitives.Dict)) { + return; + } + this.xref = xref; + this.root = root; + if (root.has("FS")) { + this.fs = root.get("FS"); + } + this.description = root.has("Desc") ? (0, _util.stringToPDFString)(root.get("Desc")) : ""; + if (root.has("RF")) { + (0, _util.warn)("Related file specifications are not supported"); + } + this.contentAvailable = true; + if (!root.has("EF")) { + this.contentAvailable = false; + (0, _util.warn)("Non-embedded file specifications are not supported"); + } + } + get filename() { + if (!this._filename && this.root) { + const filename = pickPlatformItem(this.root) || "unnamed"; + this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\/g, "\\").replace(/\\\//g, "/").replace(/\\/g, "/"); + } + return this._filename; + } + get content() { + if (!this.contentAvailable) { + return null; + } + if (!this.contentRef && this.root) { + this.contentRef = pickPlatformItem(this.root.get("EF")); + } + let content = null; + if (this.contentRef) { + const fileObj = this.xref.fetchIfRef(this.contentRef); + if (fileObj instanceof _base_stream.BaseStream) { + content = fileObj.getBytes(); + } else { + (0, _util.warn)("Embedded file specification points to non-existing/invalid content"); + } + } else { + (0, _util.warn)("Embedded file specification does not have a content"); + } + return content; + } + get serializable() { + return { + filename: this.filename, + content: this.content + }; + } +} +exports.FileSpec = FileSpec; + +/***/ }), +/* 202 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.MetadataParser = void 0; +var _xml_parser = __w_pdfjs_require__(195); +class MetadataParser { + constructor(data) { + data = this._repair(data); + const parser = new _xml_parser.SimpleXMLParser({ + lowerCaseName: true + }); + const xmlDocument = parser.parseFromString(data); + this._metadataMap = new Map(); + this._data = data; + if (xmlDocument) { + this._parse(xmlDocument); + } + } + _repair(data) { + return data.replace(/^[^<]+/, "").replace(/>\\376\\377([^<]+)/g, function (all, codes) { + const bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { + return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); + }).replace(/&(amp|apos|gt|lt|quot);/g, function (str, name) { + switch (name) { + case "amp": + return "&"; + case "apos": + return "'"; + case "gt": + return ">"; + case "lt": + return "<"; + case "quot": + return '"'; + } + throw new Error(`_repair: ${name} isn't defined.`); + }); + const charBuf = []; + for (let i = 0, ii = bytes.length; i < ii; i += 2) { + const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); + if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) { + charBuf.push(String.fromCharCode(code)); + } else { + charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";"); + } + } + return ">" + charBuf.join(""); + }); + } + _getSequence(entry) { + const name = entry.nodeName; + if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { + return null; + } + return entry.childNodes.filter(node => node.nodeName === "rdf:li"); + } + _parseArray(entry) { + if (!entry.hasChildNodes()) { + return; + } + const [seqNode] = entry.childNodes; + const sequence = this._getSequence(seqNode) || []; + this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); + } + _parse(xmlDocument) { + let rdf = xmlDocument.documentElement; + if (rdf.nodeName !== "rdf:rdf") { + rdf = rdf.firstChild; + while (rdf && rdf.nodeName !== "rdf:rdf") { + rdf = rdf.nextSibling; + } + } + if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { + return; + } + for (const desc of rdf.childNodes) { + if (desc.nodeName !== "rdf:description") { + continue; + } + for (const entry of desc.childNodes) { + const name = entry.nodeName; + switch (name) { + case "#text": + continue; + case "dc:creator": + case "dc:subject": + this._parseArray(entry); + continue; + } + this._metadataMap.set(name, entry.textContent.trim()); + } + } + } + get serializable() { + return { + parsedData: this._metadataMap, + rawData: this._data + }; + } +} +exports.MetadataParser = MetadataParser; + +/***/ }), +/* 203 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.StructTreeRoot = exports.StructTreePage = void 0; +var _primitives = __w_pdfjs_require__(134); +var _util = __w_pdfjs_require__(2); +var _name_number_tree = __w_pdfjs_require__(199); +const MAX_DEPTH = 40; +const StructElementType = { + PAGE_CONTENT: "PAGE_CONTENT", + STREAM_CONTENT: "STREAM_CONTENT", + OBJECT: "OBJECT", + ELEMENT: "ELEMENT" +}; +class StructTreeRoot { + constructor(rootDict) { + this.dict = rootDict; + this.roleMap = new Map(); + } + init() { + this.readRoleMap(); + } + readRoleMap() { + const roleMapDict = this.dict.get("RoleMap"); + if (!(roleMapDict instanceof _primitives.Dict)) { + return; + } + roleMapDict.forEach((key, value) => { + if (!(value instanceof _primitives.Name)) { + return; + } + this.roleMap.set(key, value.name); + }); + } +} +exports.StructTreeRoot = StructTreeRoot; +class StructElementNode { + constructor(tree, dict) { + this.tree = tree; + this.dict = dict; + this.kids = []; + this.parseKids(); + } + get role() { + const nameObj = this.dict.get("S"); + const name = nameObj instanceof _primitives.Name ? nameObj.name : ""; + const { + root + } = this.tree; + if (root.roleMap.has(name)) { + return root.roleMap.get(name); + } + return name; + } + parseKids() { + let pageObjId = null; + const objRef = this.dict.getRaw("Pg"); + if (objRef instanceof _primitives.Ref) { + pageObjId = objRef.toString(); + } + const kids = this.dict.get("K"); + if (Array.isArray(kids)) { + for (const kid of kids) { + const element = this.parseKid(pageObjId, kid); + if (element) { + this.kids.push(element); + } + } + } else { + const element = this.parseKid(pageObjId, kids); + if (element) { + this.kids.push(element); + } + } + } + parseKid(pageObjId, kid) { + if (Number.isInteger(kid)) { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + return new StructElement({ + type: StructElementType.PAGE_CONTENT, + mcid: kid, + pageObjId + }); + } + let kidDict = null; + if (kid instanceof _primitives.Ref) { + kidDict = this.dict.xref.fetch(kid); + } else if (kid instanceof _primitives.Dict) { + kidDict = kid; + } + if (!kidDict) { + return null; + } + const pageRef = kidDict.getRaw("Pg"); + if (pageRef instanceof _primitives.Ref) { + pageObjId = pageRef.toString(); + } + const type = kidDict.get("Type") instanceof _primitives.Name ? kidDict.get("Type").name : null; + if (type === "MCR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + return new StructElement({ + type: StructElementType.STREAM_CONTENT, + refObjId: kidDict.getRaw("Stm") instanceof _primitives.Ref ? kidDict.getRaw("Stm").toString() : null, + pageObjId, + mcid: kidDict.get("MCID") + }); + } + if (type === "OBJR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + return new StructElement({ + type: StructElementType.OBJECT, + refObjId: kidDict.getRaw("Obj") instanceof _primitives.Ref ? kidDict.getRaw("Obj").toString() : null, + pageObjId + }); + } + return new StructElement({ + type: StructElementType.ELEMENT, + dict: kidDict + }); + } +} +class StructElement { + constructor(_ref) { + let { + type, + dict = null, + mcid = null, + pageObjId = null, + refObjId = null + } = _ref; + this.type = type; + this.dict = dict; + this.mcid = mcid; + this.pageObjId = pageObjId; + this.refObjId = refObjId; + this.parentNode = null; + } +} +class StructTreePage { + constructor(structTreeRoot, pageDict) { + this.root = structTreeRoot; + this.rootDict = structTreeRoot ? structTreeRoot.dict : null; + this.pageDict = pageDict; + this.nodes = []; + } + parse() { + if (!this.root || !this.rootDict) { + return; + } + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return; + } + const id = this.pageDict.get("StructParents"); + if (!Number.isInteger(id)) { + return; + } + const numberTree = new _name_number_tree.NumberTree(parentTree, this.rootDict.xref); + const parentArray = numberTree.get(id); + if (!Array.isArray(parentArray)) { + return; + } + const map = new Map(); + for (const ref of parentArray) { + if (ref instanceof _primitives.Ref) { + this.addNode(this.rootDict.xref.fetch(ref), map); + } + } + } + addNode(dict, map) { + let level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + if (level > MAX_DEPTH) { + (0, _util.warn)("StructTree MAX_DEPTH reached."); + return null; + } + if (map.has(dict)) { + return map.get(dict); + } + const element = new StructElementNode(this, dict); + map.set(dict, element); + const parent = dict.get("P"); + if (!parent || (0, _primitives.isName)(parent.get("Type"), "StructTreeRoot")) { + if (!this.addTopLevelNode(dict, element)) { + map.delete(dict); + } + return element; + } + const parentNode = this.addNode(parent, map, level + 1); + if (!parentNode) { + return element; + } + let save = false; + for (const kid of parentNode.kids) { + if (kid.type === StructElementType.ELEMENT && kid.dict === dict) { + kid.parentNode = element; + save = true; + } + } + if (!save) { + map.delete(dict); + } + return element; + } + addTopLevelNode(dict, element) { + const obj = this.rootDict.get("K"); + if (!obj) { + return false; + } + if (obj instanceof _primitives.Dict) { + if (obj.objId !== dict.objId) { + return false; + } + this.nodes[0] = element; + return true; + } + if (!Array.isArray(obj)) { + return true; + } + let save = false; + for (let i = 0; i < obj.length; i++) { + const kidRef = obj[i]; + if (kidRef && kidRef.toString() === dict.objId) { + this.nodes[i] = element; + save = true; + } + } + return save; + } + get serializable() { + function nodeToSerializable(node, parent) { + let level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + if (level > MAX_DEPTH) { + (0, _util.warn)("StructTree too deep to be fully serialized."); + return; + } + const obj = Object.create(null); + obj.role = node.role; + obj.children = []; + parent.children.push(obj); + const alt = node.dict.get("Alt"); + if (typeof alt === "string") { + obj.alt = (0, _util.stringToPDFString)(alt); + } + const lang = node.dict.get("Lang"); + if (typeof lang === "string") { + obj.lang = (0, _util.stringToPDFString)(lang); + } + for (const kid of node.kids) { + const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null; + if (kidElement) { + nodeToSerializable(kidElement, obj, level + 1); + continue; + } else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === StructElementType.STREAM_CONTENT) { + obj.children.push({ + type: "content", + id: `page${kid.pageObjId}_mcid${kid.mcid}` + }); + } else if (kid.type === StructElementType.OBJECT) { + obj.children.push({ + type: "object", + id: kid.refObjId + }); + } + } + } + const root = Object.create(null); + root.children = []; + root.role = "Root"; + for (const child of this.nodes) { + if (!child) { + continue; + } + nodeToSerializable(child, root); + } + return root; + } +} +exports.StructTreePage = StructTreePage; + +/***/ }), +/* 204 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ObjectLoader = void 0; +var _primitives = __w_pdfjs_require__(134); +var _base_stream = __w_pdfjs_require__(136); +var _core_utils = __w_pdfjs_require__(135); +var _util = __w_pdfjs_require__(2); +function mayHaveChildren(value) { + return value instanceof _primitives.Ref || value instanceof _primitives.Dict || value instanceof _base_stream.BaseStream || Array.isArray(value); +} +function addChildren(node, nodesToVisit) { + if (node instanceof _primitives.Dict) { + node = node.getRawValues(); + } else if (node instanceof _base_stream.BaseStream) { + node = node.dict.getRawValues(); + } else if (!Array.isArray(node)) { + return; + } + for (const rawValue of node) { + if (mayHaveChildren(rawValue)) { + nodesToVisit.push(rawValue); + } + } +} +class ObjectLoader { + constructor(dict, keys, xref) { + this.dict = dict; + this.keys = keys; + this.xref = xref; + this.refSet = null; + } + async load() { + if (this.xref.stream.isDataLoaded) { + return undefined; + } + const { + keys, + dict + } = this; + this.refSet = new _primitives.RefSet(); + const nodesToVisit = []; + for (const key of keys) { + const rawValue = dict.getRaw(key); + if (rawValue !== undefined) { + nodesToVisit.push(rawValue); + } + } + return this._walk(nodesToVisit); + } + async _walk(nodesToVisit) { + const nodesToRevisit = []; + const pendingRequests = []; + while (nodesToVisit.length) { + let currentNode = nodesToVisit.pop(); + if (currentNode instanceof _primitives.Ref) { + if (this.refSet.has(currentNode)) { + continue; + } + try { + this.refSet.put(currentNode); + currentNode = this.xref.fetch(currentNode); + } catch (ex) { + if (!(ex instanceof _core_utils.MissingDataException)) { + (0, _util.warn)(`ObjectLoader._walk - requesting all data: "${ex}".`); + this.refSet = null; + const { + manager + } = this.xref.stream; + return manager.requestAllChunks(); + } + nodesToRevisit.push(currentNode); + pendingRequests.push({ + begin: ex.begin, + end: ex.end + }); + } + } + if (currentNode instanceof _base_stream.BaseStream) { + const baseStreams = currentNode.getBaseStreams(); + if (baseStreams) { + let foundMissingData = false; + for (const stream of baseStreams) { + if (stream.isDataLoaded) { + continue; + } + foundMissingData = true; + pendingRequests.push({ + begin: stream.start, + end: stream.end + }); + } + if (foundMissingData) { + nodesToRevisit.push(currentNode); + } + } + } + addChildren(currentNode, nodesToVisit); + } + if (pendingRequests.length) { + await this.xref.stream.manager.requestRanges(pendingRequests); + for (const node of nodesToRevisit) { + if (node instanceof _primitives.Ref) { + this.refSet.remove(node); + } + } + return this._walk(nodesToRevisit); + } + this.refSet = null; + return undefined; + } +} +exports.ObjectLoader = ObjectLoader; + +/***/ }), +/* 205 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XFAFactory = void 0; +var _xfa_object = __w_pdfjs_require__(206); +var _bind = __w_pdfjs_require__(210); +var _data = __w_pdfjs_require__(216); +var _fonts = __w_pdfjs_require__(214); +var _utils = __w_pdfjs_require__(207); +var _util = __w_pdfjs_require__(2); +var _parser = __w_pdfjs_require__(217); +var _xhtml = __w_pdfjs_require__(227); +class XFAFactory { + constructor(data) { + try { + this.root = new _parser.XFAParser().parse(XFAFactory._createDocument(data)); + const binder = new _bind.Binder(this.root); + this.form = binder.bind(); + this.dataHandler = new _data.DataHandler(this.root, binder.getData()); + this.form[_xfa_object.$globalData].template = this.form; + } catch (e) { + (0, _util.warn)(`XFA - an error occurred during parsing and binding: ${e}`); + } + } + isValid() { + return this.root && this.form; + } + _createPagesHelper() { + const iterator = this.form[_xfa_object.$toPages](); + return new Promise((resolve, reject) => { + const nextIteration = () => { + try { + const value = iterator.next(); + if (value.done) { + resolve(value.value); + } else { + setTimeout(nextIteration, 0); + } + } catch (e) { + reject(e); + } + }; + setTimeout(nextIteration, 0); + }); + } + async _createPages() { + try { + this.pages = await this._createPagesHelper(); + this.dims = this.pages.children.map(c => { + const { + width, + height + } = c.attributes.style; + return [0, 0, parseInt(width), parseInt(height)]; + }); + } catch (e) { + (0, _util.warn)(`XFA - an error occurred during layout: ${e}`); + } + } + getBoundingBox(pageIndex) { + return this.dims[pageIndex]; + } + async getNumPages() { + if (!this.pages) { + await this._createPages(); + } + return this.dims.length; + } + setImages(images) { + this.form[_xfa_object.$globalData].images = images; + } + setFonts(fonts) { + this.form[_xfa_object.$globalData].fontFinder = new _fonts.FontFinder(fonts); + const missingFonts = []; + for (let typeface of this.form[_xfa_object.$globalData].usedTypefaces) { + typeface = (0, _utils.stripQuotes)(typeface); + const font = this.form[_xfa_object.$globalData].fontFinder.find(typeface); + if (!font) { + missingFonts.push(typeface); + } + } + if (missingFonts.length > 0) { + return missingFonts; + } + return null; + } + appendFonts(fonts, reallyMissingFonts) { + this.form[_xfa_object.$globalData].fontFinder.add(fonts, reallyMissingFonts); + } + async getPages() { + if (!this.pages) { + await this._createPages(); + } + const pages = this.pages; + this.pages = null; + return pages; + } + serializeData(storage) { + return this.dataHandler.serialize(storage); + } + static _createDocument(data) { + if (!data["/xdp:xdp"]) { + return data["xdp:xdp"]; + } + return Object.values(data).join(""); + } + static getRichTextAsHtml(rc) { + if (!rc || typeof rc !== "string") { + return null; + } + try { + let root = new _parser.XFAParser(_xhtml.XhtmlNamespace, true).parse(rc); + if (!["body", "xhtml"].includes(root[_xfa_object.$nodeName])) { + const newRoot = _xhtml.XhtmlNamespace.body({}); + newRoot[_xfa_object.$appendChild](root); + root = newRoot; + } + const result = root[_xfa_object.$toHTML](); + if (!result.success) { + return null; + } + const { + html + } = result; + const { + attributes + } = html; + if (attributes) { + if (attributes.class) { + attributes.class = attributes.class.filter(attr => !attr.startsWith("xfa")); + } + attributes.dir = "auto"; + } + return { + html, + str: root[_xfa_object.$text]() + }; + } catch (e) { + (0, _util.warn)(`XFA - an error occurred during parsing of rich text: ${e}`); + } + return null; + } +} +exports.XFAFactory = XFAFactory; + +/***/ }), +/* 206 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XmlObject = exports.XFAObjectArray = exports.XFAObject = exports.XFAAttribute = exports.StringObject = exports.OptionObject = exports.Option10 = exports.Option01 = exports.IntegerObject = exports.ContentObject = exports.$uid = exports.$toStyle = exports.$toString = exports.$toPages = exports.$toHTML = exports.$text = exports.$tabIndex = exports.$setValue = exports.$setSetAttributes = exports.$setId = exports.$searchNode = exports.$root = exports.$resolvePrototypes = exports.$removeChild = exports.$pushPara = exports.$pushGlyphs = exports.$popPara = exports.$onText = exports.$onChildCheck = exports.$onChild = exports.$nsAttributes = exports.$nodeName = exports.$namespaceId = exports.$isUsable = exports.$isTransparent = exports.$isThereMoreWidth = exports.$isSplittable = exports.$isNsAgnostic = exports.$isDescendent = exports.$isDataValue = exports.$isCDATAXml = exports.$isBindable = exports.$insertAt = exports.$indexOf = exports.$ids = exports.$hasSettableValue = exports.$globalData = exports.$getTemplateRoot = exports.$getSubformParent = exports.$getRealChildrenByNameIt = exports.$getParent = exports.$getNextPage = exports.$getExtra = exports.$getDataValue = exports.$getContainedChildren = exports.$getChildrenByNameIt = exports.$getChildrenByName = exports.$getChildrenByClass = exports.$getChildren = exports.$getAvailableSpace = exports.$getAttributes = exports.$getAttributeIt = exports.$flushHTML = exports.$finalize = exports.$extra = exports.$dump = exports.$data = exports.$content = exports.$consumed = exports.$clone = exports.$cleanup = exports.$cleanPage = exports.$clean = exports.$childrenToHTML = exports.$appendChild = exports.$addHTML = exports.$acceptWhitespace = void 0; +var _utils = __w_pdfjs_require__(207); +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +var _namespaces = __w_pdfjs_require__(208); +var _som = __w_pdfjs_require__(209); +const $acceptWhitespace = Symbol(); +exports.$acceptWhitespace = $acceptWhitespace; +const $addHTML = Symbol(); +exports.$addHTML = $addHTML; +const $appendChild = Symbol(); +exports.$appendChild = $appendChild; +const $childrenToHTML = Symbol(); +exports.$childrenToHTML = $childrenToHTML; +const $clean = Symbol(); +exports.$clean = $clean; +const $cleanPage = Symbol(); +exports.$cleanPage = $cleanPage; +const $cleanup = Symbol(); +exports.$cleanup = $cleanup; +const $clone = Symbol(); +exports.$clone = $clone; +const $consumed = Symbol(); +exports.$consumed = $consumed; +const $content = Symbol("content"); +exports.$content = $content; +const $data = Symbol("data"); +exports.$data = $data; +const $dump = Symbol(); +exports.$dump = $dump; +const $extra = Symbol("extra"); +exports.$extra = $extra; +const $finalize = Symbol(); +exports.$finalize = $finalize; +const $flushHTML = Symbol(); +exports.$flushHTML = $flushHTML; +const $getAttributeIt = Symbol(); +exports.$getAttributeIt = $getAttributeIt; +const $getAttributes = Symbol(); +exports.$getAttributes = $getAttributes; +const $getAvailableSpace = Symbol(); +exports.$getAvailableSpace = $getAvailableSpace; +const $getChildrenByClass = Symbol(); +exports.$getChildrenByClass = $getChildrenByClass; +const $getChildrenByName = Symbol(); +exports.$getChildrenByName = $getChildrenByName; +const $getChildrenByNameIt = Symbol(); +exports.$getChildrenByNameIt = $getChildrenByNameIt; +const $getDataValue = Symbol(); +exports.$getDataValue = $getDataValue; +const $getExtra = Symbol(); +exports.$getExtra = $getExtra; +const $getRealChildrenByNameIt = Symbol(); +exports.$getRealChildrenByNameIt = $getRealChildrenByNameIt; +const $getChildren = Symbol(); +exports.$getChildren = $getChildren; +const $getContainedChildren = Symbol(); +exports.$getContainedChildren = $getContainedChildren; +const $getNextPage = Symbol(); +exports.$getNextPage = $getNextPage; +const $getSubformParent = Symbol(); +exports.$getSubformParent = $getSubformParent; +const $getParent = Symbol(); +exports.$getParent = $getParent; +const $getTemplateRoot = Symbol(); +exports.$getTemplateRoot = $getTemplateRoot; +const $globalData = Symbol(); +exports.$globalData = $globalData; +const $hasSettableValue = Symbol(); +exports.$hasSettableValue = $hasSettableValue; +const $ids = Symbol(); +exports.$ids = $ids; +const $indexOf = Symbol(); +exports.$indexOf = $indexOf; +const $insertAt = Symbol(); +exports.$insertAt = $insertAt; +const $isCDATAXml = Symbol(); +exports.$isCDATAXml = $isCDATAXml; +const $isBindable = Symbol(); +exports.$isBindable = $isBindable; +const $isDataValue = Symbol(); +exports.$isDataValue = $isDataValue; +const $isDescendent = Symbol(); +exports.$isDescendent = $isDescendent; +const $isNsAgnostic = Symbol(); +exports.$isNsAgnostic = $isNsAgnostic; +const $isSplittable = Symbol(); +exports.$isSplittable = $isSplittable; +const $isThereMoreWidth = Symbol(); +exports.$isThereMoreWidth = $isThereMoreWidth; +const $isTransparent = Symbol(); +exports.$isTransparent = $isTransparent; +const $isUsable = Symbol(); +exports.$isUsable = $isUsable; +const $lastAttribute = Symbol(); +const $namespaceId = Symbol("namespaceId"); +exports.$namespaceId = $namespaceId; +const $nodeName = Symbol("nodeName"); +exports.$nodeName = $nodeName; +const $nsAttributes = Symbol(); +exports.$nsAttributes = $nsAttributes; +const $onChild = Symbol(); +exports.$onChild = $onChild; +const $onChildCheck = Symbol(); +exports.$onChildCheck = $onChildCheck; +const $onText = Symbol(); +exports.$onText = $onText; +const $pushGlyphs = Symbol(); +exports.$pushGlyphs = $pushGlyphs; +const $popPara = Symbol(); +exports.$popPara = $popPara; +const $pushPara = Symbol(); +exports.$pushPara = $pushPara; +const $removeChild = Symbol(); +exports.$removeChild = $removeChild; +const $root = Symbol("root"); +exports.$root = $root; +const $resolvePrototypes = Symbol(); +exports.$resolvePrototypes = $resolvePrototypes; +const $searchNode = Symbol(); +exports.$searchNode = $searchNode; +const $setId = Symbol(); +exports.$setId = $setId; +const $setSetAttributes = Symbol(); +exports.$setSetAttributes = $setSetAttributes; +const $setValue = Symbol(); +exports.$setValue = $setValue; +const $tabIndex = Symbol(); +exports.$tabIndex = $tabIndex; +const $text = Symbol(); +exports.$text = $text; +const $toPages = Symbol(); +exports.$toPages = $toPages; +const $toHTML = Symbol(); +exports.$toHTML = $toHTML; +const $toString = Symbol(); +exports.$toString = $toString; +const $toStyle = Symbol(); +exports.$toStyle = $toStyle; +const $uid = Symbol("uid"); +exports.$uid = $uid; +const _applyPrototype = Symbol(); +const _attributes = Symbol(); +const _attributeNames = Symbol(); +const _children = Symbol("_children"); +const _cloneAttribute = Symbol(); +const _dataValue = Symbol(); +const _defaultValue = Symbol(); +const _filteredChildrenGenerator = Symbol(); +const _getPrototype = Symbol(); +const _getUnsetAttributes = Symbol(); +const _hasChildren = Symbol(); +const _max = Symbol(); +const _options = Symbol(); +const _parent = Symbol("parent"); +const _resolvePrototypesHelper = Symbol(); +const _setAttributes = Symbol(); +const _validator = Symbol(); +let uid = 0; +const NS_DATASETS = _namespaces.NamespaceIds.datasets.id; +class XFAObject { + constructor(nsId, name) { + let hasChildren = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + this[$namespaceId] = nsId; + this[$nodeName] = name; + this[_hasChildren] = hasChildren; + this[_parent] = null; + this[_children] = []; + this[$uid] = `${name}${uid++}`; + this[$globalData] = null; + } + [$onChild](child) { + if (!this[_hasChildren] || !this[$onChildCheck](child)) { + return false; + } + const name = child[$nodeName]; + const node = this[name]; + if (node instanceof XFAObjectArray) { + if (node.push(child)) { + this[$appendChild](child); + return true; + } + } else { + if (node !== null) { + this[$removeChild](node); + } + this[name] = child; + this[$appendChild](child); + return true; + } + let id = ""; + if (this.id) { + id = ` (id: ${this.id})`; + } else if (this.name) { + id = ` (name: ${this.name} ${this.h.value})`; + } + (0, _util.warn)(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`); + return false; + } + [$onChildCheck](child) { + return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; + } + [$isNsAgnostic]() { + return false; + } + [$acceptWhitespace]() { + return false; + } + [$isCDATAXml]() { + return false; + } + [$isBindable]() { + return false; + } + [$popPara]() { + if (this.para) { + this[$getTemplateRoot]()[$extra].paraStack.pop(); + } + } + [$pushPara]() { + this[$getTemplateRoot]()[$extra].paraStack.push(this.para); + } + [$setId](ids) { + if (this.id && this[$namespaceId] === _namespaces.NamespaceIds.template.id) { + ids.set(this.id, this); + } + } + [$getTemplateRoot]() { + return this[$globalData].template; + } + [$isSplittable]() { + return false; + } + [$isThereMoreWidth]() { + return false; + } + [$appendChild](child) { + child[_parent] = this; + this[_children].push(child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$removeChild](child) { + const i = this[_children].indexOf(child); + this[_children].splice(i, 1); + } + [$hasSettableValue]() { + return this.hasOwnProperty("value"); + } + [$setValue](_) {} + [$onText](_) {} + [$finalize]() {} + [$clean](builder) { + delete this[_hasChildren]; + if (this[$cleanup]) { + builder.clean(this[$cleanup]); + delete this[$cleanup]; + } + } + [$indexOf](child) { + return this[_children].indexOf(child); + } + [$insertAt](i, child) { + child[_parent] = this; + this[_children].splice(i, 0, child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } + } + [$isTransparent]() { + return !this.name; + } + [$lastAttribute]() { + return ""; + } + [$text]() { + if (this[_children].length === 0) { + return this[$content]; + } + return this[_children].map(c => c[$text]()).join(""); + } + get [_attributeNames]() { + const proto = Object.getPrototypeOf(this); + if (!proto._attributes) { + const attributes = proto._attributes = new Set(); + for (const name of Object.getOwnPropertyNames(this)) { + if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) { + break; + } + attributes.add(name); + } + } + return (0, _util.shadow)(this, _attributeNames, proto._attributes); + } + [$isDescendent](parent) { + let node = this; + while (node) { + if (node === parent) { + return true; + } + node = node[$getParent](); + } + return false; + } + [$getParent]() { + return this[_parent]; + } + [$getSubformParent]() { + return this[$getParent](); + } + [$getChildren]() { + let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + if (!name) { + return this[_children]; + } + return this[name]; + } + [$dump]() { + const dumped = Object.create(null); + if (this[$content]) { + dumped.$content = this[$content]; + } + for (const name of Object.getOwnPropertyNames(this)) { + const value = this[name]; + if (value === null) { + continue; + } + if (value instanceof XFAObject) { + dumped[name] = value[$dump](); + } else if (value instanceof XFAObjectArray) { + if (!value.isEmpty()) { + dumped[name] = value.dump(); + } + } else { + dumped[name] = value; + } + } + return dumped; + } + [$toStyle]() { + return null; + } + [$toHTML]() { + return _utils.HTMLResult.EMPTY; + } + *[$getContainedChildren]() { + for (const node of this[$getChildren]()) { + yield node; + } + } + *[_filteredChildrenGenerator](filter, include) { + for (const node of this[$getContainedChildren]()) { + if (!filter || include === filter.has(node[$nodeName])) { + const availableSpace = this[$getAvailableSpace](); + const res = node[$toHTML](availableSpace); + if (!res.success) { + this[$extra].failingNode = node; + } + yield res; + } + } + } + [$flushHTML]() { + return null; + } + [$addHTML](html, bbox) { + this[$extra].children.push(html); + } + [$getAvailableSpace]() {} + [$childrenToHTML](_ref) { + let { + filter = null, + include = true + } = _ref; + if (!this[$extra].generator) { + this[$extra].generator = this[_filteredChildrenGenerator](filter, include); + } else { + const availableSpace = this[$getAvailableSpace](); + const res = this[$extra].failingNode[$toHTML](availableSpace); + if (!res.success) { + return res; + } + if (res.html) { + this[$addHTML](res.html, res.bbox); + } + delete this[$extra].failingNode; + } + while (true) { + const gen = this[$extra].generator.next(); + if (gen.done) { + break; + } + const res = gen.value; + if (!res.success) { + return res; + } + if (res.html) { + this[$addHTML](res.html, res.bbox); + } + } + this[$extra].generator = null; + return _utils.HTMLResult.EMPTY; + } + [$setSetAttributes](attributes) { + this[_setAttributes] = new Set(Object.keys(attributes)); + } + [_getUnsetAttributes](protoAttributes) { + const allAttr = this[_attributeNames]; + const setAttr = this[_setAttributes]; + return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x)); + } + [$resolvePrototypes](ids) { + let ancestors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); + for (const child of this[_children]) { + child[_resolvePrototypesHelper](ids, ancestors); + } + } + [_resolvePrototypesHelper](ids, ancestors) { + const proto = this[_getPrototype](ids, ancestors); + if (proto) { + this[_applyPrototype](proto, ids, ancestors); + } else { + this[$resolvePrototypes](ids, ancestors); + } + } + [_getPrototype](ids, ancestors) { + const { + use, + usehref + } = this; + if (!use && !usehref) { + return null; + } + let proto = null; + let somExpression = null; + let id = null; + let ref = use; + if (usehref) { + ref = usehref; + if (usehref.startsWith("#som(") && usehref.endsWith(")")) { + somExpression = usehref.slice("#som(".length, usehref.length - 1); + } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) { + somExpression = usehref.slice(".#som(".length, usehref.length - 1); + } else if (usehref.startsWith("#")) { + id = usehref.slice(1); + } else if (usehref.startsWith(".#")) { + id = usehref.slice(2); + } + } else if (use.startsWith("#")) { + id = use.slice(1); + } else { + somExpression = use; + } + this.use = this.usehref = ""; + if (id) { + proto = ids.get(id); + } else { + proto = (0, _som.searchNode)(ids.get($root), this, somExpression, true, false); + if (proto) { + proto = proto[0]; + } + } + if (!proto) { + (0, _util.warn)(`XFA - Invalid prototype reference: ${ref}.`); + return null; + } + if (proto[$nodeName] !== this[$nodeName]) { + (0, _util.warn)(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`); + return null; + } + if (ancestors.has(proto)) { + (0, _util.warn)(`XFA - Cycle detected in prototypes use.`); + return null; + } + ancestors.add(proto); + const protoProto = proto[_getPrototype](ids, ancestors); + if (protoProto) { + proto[_applyPrototype](protoProto, ids, ancestors); + } + proto[$resolvePrototypes](ids, ancestors); + ancestors.delete(proto); + return proto; + } + [_applyPrototype](proto, ids, ancestors) { + if (ancestors.has(proto)) { + (0, _util.warn)(`XFA - Cycle detected in prototypes use.`); + return; + } + if (!this[$content] && proto[$content]) { + this[$content] = proto[$content]; + } + const newAncestors = new Set(ancestors); + newAncestors.add(proto); + for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) { + this[unsetAttrName] = proto[unsetAttrName]; + if (this[_setAttributes]) { + this[_setAttributes].add(unsetAttrName); + } + } + for (const name of Object.getOwnPropertyNames(this)) { + if (this[_attributeNames].has(name)) { + continue; + } + const value = this[name]; + const protoValue = proto[name]; + if (value instanceof XFAObjectArray) { + for (const child of value[_children]) { + child[_resolvePrototypesHelper](ids, ancestors); + } + for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) { + const child = proto[_children][i][$clone](); + if (value.push(child)) { + child[_parent] = this; + this[_children].push(child); + child[_resolvePrototypesHelper](ids, ancestors); + } else { + break; + } + } + continue; + } + if (value !== null) { + value[$resolvePrototypes](ids, ancestors); + if (protoValue) { + value[_applyPrototype](protoValue, ids, ancestors); + } + continue; + } + if (protoValue !== null) { + const child = protoValue[$clone](); + child[_parent] = this; + this[name] = child; + this[_children].push(child); + child[_resolvePrototypesHelper](ids, ancestors); + } + } + } + static [_cloneAttribute](obj) { + if (Array.isArray(obj)) { + return obj.map(x => XFAObject[_cloneAttribute](x)); + } + if (typeof obj === "object" && obj !== null) { + return Object.assign({}, obj); + } + return obj; + } + [$clone]() { + const clone = Object.create(Object.getPrototypeOf(this)); + for (const $symbol of Object.getOwnPropertySymbols(this)) { + try { + clone[$symbol] = this[$symbol]; + } catch (_) { + (0, _util.shadow)(clone, $symbol, this[$symbol]); + } + } + clone[$uid] = `${clone[$nodeName]}${uid++}`; + clone[_children] = []; + for (const name of Object.getOwnPropertyNames(this)) { + if (this[_attributeNames].has(name)) { + clone[name] = XFAObject[_cloneAttribute](this[name]); + continue; + } + const value = this[name]; + if (value instanceof XFAObjectArray) { + clone[name] = new XFAObjectArray(value[_max]); + } else { + clone[name] = null; + } + } + for (const child of this[_children]) { + const name = child[$nodeName]; + const clonedChild = child[$clone](); + clone[_children].push(clonedChild); + clonedChild[_parent] = clone; + if (clone[name] === null) { + clone[name] = clonedChild; + } else { + clone[name][_children].push(clonedChild); + } + } + return clone; + } + [$getChildren]() { + let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + if (!name) { + return this[_children]; + } + return this[_children].filter(c => c[$nodeName] === name); + } + [$getChildrenByClass](name) { + return this[name]; + } + [$getChildrenByName](name, allTransparent) { + let first = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + return Array.from(this[$getChildrenByNameIt](name, allTransparent, first)); + } + [$getChildrenByNameIt](name, allTransparent) { + var _this = this; + let first = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + return function* () { + if (name === "parent") { + yield _this[_parent]; + return; + } + for (const child of _this[_children]) { + if (child[$nodeName] === name) { + yield child; + } + if (child.name === name) { + yield child; + } + if (allTransparent || child[$isTransparent]()) { + yield* child[$getChildrenByNameIt](name, allTransparent, false); + } + } + if (first && _this[_attributeNames].has(name)) { + yield new XFAAttribute(_this, name, _this[name]); + } + }(); + } +} +exports.XFAObject = XFAObject; +class XFAObjectArray { + constructor() { + let max = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity; + this[_max] = max; + this[_children] = []; + } + push(child) { + const len = this[_children].length; + if (len <= this[_max]) { + this[_children].push(child); + return true; + } + (0, _util.warn)(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`); + return false; + } + isEmpty() { + return this[_children].length === 0; + } + dump() { + return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]()); + } + [$clone]() { + const clone = new XFAObjectArray(this[_max]); + clone[_children] = this[_children].map(c => c[$clone]()); + return clone; + } + get children() { + return this[_children]; + } + clear() { + this[_children].length = 0; + } +} +exports.XFAObjectArray = XFAObjectArray; +class XFAAttribute { + constructor(node, name, value) { + this[_parent] = node; + this[$nodeName] = name; + this[$content] = value; + this[$consumed] = false; + this[$uid] = `attribute${uid++}`; + } + [$getParent]() { + return this[_parent]; + } + [$isDataValue]() { + return true; + } + [$getDataValue]() { + return this[$content].trim(); + } + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$text]() { + return this[$content]; + } + [$isDescendent](parent) { + return this[_parent] === parent || this[_parent][$isDescendent](parent); + } +} +exports.XFAAttribute = XFAAttribute; +class XmlObject extends XFAObject { + constructor(nsId, name) { + let attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + super(nsId, name); + this[$content] = ""; + this[_dataValue] = null; + if (name !== "#text") { + const map = new Map(); + this[_attributes] = map; + for (const [attrName, value] of Object.entries(attributes)) { + map.set(attrName, new XFAAttribute(this, attrName, value)); + } + if (attributes.hasOwnProperty($nsAttributes)) { + const dataNode = attributes[$nsAttributes].xfa.dataNode; + if (dataNode !== undefined) { + if (dataNode === "dataGroup") { + this[_dataValue] = false; + } else if (dataNode === "dataValue") { + this[_dataValue] = true; + } + } + } + } + this[$consumed] = false; + } + [$toString](buf) { + const tagName = this[$nodeName]; + if (tagName === "#text") { + buf.push((0, _core_utils.encodeToXmlString)(this[$content])); + return; + } + const utf8TagName = (0, _util.utf8StringToString)(tagName); + const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; + buf.push(`<${prefix}${utf8TagName}`); + for (const [name, value] of this[_attributes].entries()) { + const utf8Name = (0, _util.utf8StringToString)(name); + buf.push(` ${utf8Name}="${(0, _core_utils.encodeToXmlString)(value[$content])}"`); + } + if (this[_dataValue] !== null) { + if (this[_dataValue]) { + buf.push(` xfa:dataNode="dataValue"`); + } else { + buf.push(` xfa:dataNode="dataGroup"`); + } + } + if (!this[$content] && this[_children].length === 0) { + buf.push("/>"); + return; + } + buf.push(">"); + if (this[$content]) { + if (typeof this[$content] === "string") { + buf.push((0, _core_utils.encodeToXmlString)(this[$content])); + } else { + this[$content][$toString](buf); + } + } else { + for (const child of this[_children]) { + child[$toString](buf); + } + } + buf.push(``); + } + [$onChild](child) { + if (this[$content]) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + this[$content] = ""; + } + this[$appendChild](child); + return true; + } + [$onText](str) { + this[$content] += str; + } + [$finalize]() { + if (this[$content] && this[_children].length > 0) { + const node = new XmlObject(this[$namespaceId], "#text"); + this[$appendChild](node); + node[$content] = this[$content]; + delete this[$content]; + } + } + [$toHTML]() { + if (this[$nodeName] === "#text") { + return _utils.HTMLResult.success({ + name: "#text", + value: this[$content] + }); + } + return _utils.HTMLResult.EMPTY; + } + [$getChildren]() { + let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + if (!name) { + return this[_children]; + } + return this[_children].filter(c => c[$nodeName] === name); + } + [$getAttributes]() { + return this[_attributes]; + } + [$getChildrenByClass](name) { + const value = this[_attributes].get(name); + if (value !== undefined) { + return value; + } + return this[$getChildren](name); + } + *[$getChildrenByNameIt](name, allTransparent) { + const value = this[_attributes].get(name); + if (value) { + yield value; + } + for (const child of this[_children]) { + if (child[$nodeName] === name) { + yield child; + } + if (allTransparent) { + yield* child[$getChildrenByNameIt](name, allTransparent); + } + } + } + *[$getAttributeIt](name, skipConsumed) { + const value = this[_attributes].get(name); + if (value && (!skipConsumed || !value[$consumed])) { + yield value; + } + for (const child of this[_children]) { + yield* child[$getAttributeIt](name, skipConsumed); + } + } + *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) { + for (const child of this[_children]) { + if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) { + yield child; + } + if (allTransparent) { + yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed); + } + } + } + [$isDataValue]() { + if (this[_dataValue] === null) { + return this[_children].length === 0 || this[_children][0][$namespaceId] === _namespaces.NamespaceIds.xhtml.id; + } + return this[_dataValue]; + } + [$getDataValue]() { + if (this[_dataValue] === null) { + if (this[_children].length === 0) { + return this[$content].trim(); + } + if (this[_children][0][$namespaceId] === _namespaces.NamespaceIds.xhtml.id) { + return this[_children][0][$text]().trim(); + } + return null; + } + return this[$content].trim(); + } + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$dump]() { + let hasNS = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const dumped = Object.create(null); + if (hasNS) { + dumped.$ns = this[$namespaceId]; + } + if (this[$content]) { + dumped.$content = this[$content]; + } + dumped.$name = this[$nodeName]; + dumped.children = []; + for (const child of this[_children]) { + dumped.children.push(child[$dump](hasNS)); + } + dumped.attributes = Object.create(null); + for (const [name, value] of this[_attributes]) { + dumped.attributes[name] = value[$content]; + } + return dumped; + } +} +exports.XmlObject = XmlObject; +class ContentObject extends XFAObject { + constructor(nsId, name) { + super(nsId, name); + this[$content] = ""; + } + [$onText](text) { + this[$content] += text; + } + [$finalize]() {} +} +exports.ContentObject = ContentObject; +class OptionObject extends ContentObject { + constructor(nsId, name, options) { + super(nsId, name); + this[_options] = options; + } + [$finalize]() { + this[$content] = (0, _utils.getKeyword)({ + data: this[$content], + defaultValue: this[_options][0], + validate: k => this[_options].includes(k) + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_options]; + } +} +exports.OptionObject = OptionObject; +class StringObject extends ContentObject { + [$finalize]() { + this[$content] = this[$content].trim(); + } +} +exports.StringObject = StringObject; +class IntegerObject extends ContentObject { + constructor(nsId, name, defaultValue, validator) { + super(nsId, name); + this[_defaultValue] = defaultValue; + this[_validator] = validator; + } + [$finalize]() { + this[$content] = (0, _utils.getInteger)({ + data: this[$content], + defaultValue: this[_defaultValue], + validate: this[_validator] + }); + } + [$clean](builder) { + super[$clean](builder); + delete this[_defaultValue]; + delete this[_validator]; + } +} +exports.IntegerObject = IntegerObject; +class Option01 extends IntegerObject { + constructor(nsId, name) { + super(nsId, name, 0, n => n === 1); + } +} +exports.Option01 = Option01; +class Option10 extends IntegerObject { + constructor(nsId, name) { + super(nsId, name, 1, n => n === 0); + } +} +exports.Option10 = Option10; + +/***/ }), +/* 207 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.HTMLResult = void 0; +exports.getBBox = getBBox; +exports.getColor = getColor; +exports.getFloat = getFloat; +exports.getInteger = getInteger; +exports.getKeyword = getKeyword; +exports.getMeasurement = getMeasurement; +exports.getRatio = getRatio; +exports.getRelevant = getRelevant; +exports.getStringOption = getStringOption; +exports.stripQuotes = stripQuotes; +var _util = __w_pdfjs_require__(2); +const dimConverters = { + pt: x => x, + cm: x => x / 2.54 * 72, + mm: x => x / (10 * 2.54) * 72, + in: x => x * 72, + px: x => x +}; +const measurementPattern = /([+-]?\d+\.?\d*)(.*)/; +function stripQuotes(str) { + if (str.startsWith("'") || str.startsWith('"')) { + return str.slice(1, str.length - 1); + } + return str; +} +function getInteger(_ref) { + let { + data, + defaultValue, + validate + } = _ref; + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseInt(data, 10); + if (!isNaN(n) && validate(n)) { + return n; + } + return defaultValue; +} +function getFloat(_ref2) { + let { + data, + defaultValue, + validate + } = _ref2; + if (!data) { + return defaultValue; + } + data = data.trim(); + const n = parseFloat(data); + if (!isNaN(n) && validate(n)) { + return n; + } + return defaultValue; +} +function getKeyword(_ref3) { + let { + data, + defaultValue, + validate + } = _ref3; + if (!data) { + return defaultValue; + } + data = data.trim(); + if (validate(data)) { + return data; + } + return defaultValue; +} +function getStringOption(data, options) { + return getKeyword({ + data, + defaultValue: options[0], + validate: k => options.includes(k) + }); +} +function getMeasurement(str) { + let def = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "0"; + def = def || "0"; + if (!str) { + return getMeasurement(def); + } + const match = str.trim().match(measurementPattern); + if (!match) { + return getMeasurement(def); + } + const [, valueStr, unit] = match; + const value = parseFloat(valueStr); + if (isNaN(value)) { + return getMeasurement(def); + } + if (value === 0) { + return 0; + } + const conv = dimConverters[unit]; + if (conv) { + return conv(value); + } + return value; +} +function getRatio(data) { + if (!data) { + return { + num: 1, + den: 1 + }; + } + const ratio = data.trim().split(/\s*:\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x)); + if (ratio.length === 1) { + ratio.push(1); + } + if (ratio.length === 0) { + return { + num: 1, + den: 1 + }; + } + const [num, den] = ratio; + return { + num, + den + }; +} +function getRelevant(data) { + if (!data) { + return []; + } + return data.trim().split(/\s+/).map(e => { + return { + excluded: e[0] === "-", + viewname: e.substring(1) + }; + }); +} +function getColor(data) { + let def = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0, 0]; + let [r, g, b] = def; + if (!data) { + return { + r, + g, + b + }; + } + const color = data.trim().split(/\s*,\s*/).map(c => Math.min(Math.max(0, parseInt(c.trim(), 10)), 255)).map(c => isNaN(c) ? 0 : c); + if (color.length < 3) { + return { + r, + g, + b + }; + } + [r, g, b] = color; + return { + r, + g, + b + }; +} +function getBBox(data) { + const def = -1; + if (!data) { + return { + x: def, + y: def, + width: def, + height: def + }; + } + const bbox = data.trim().split(/\s*,\s*/).map(m => getMeasurement(m, "-1")); + if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) { + return { + x: def, + y: def, + width: def, + height: def + }; + } + const [x, y, width, height] = bbox; + return { + x, + y, + width, + height + }; +} +class HTMLResult { + static get FAILURE() { + return (0, _util.shadow)(this, "FAILURE", new HTMLResult(false, null, null, null)); + } + static get EMPTY() { + return (0, _util.shadow)(this, "EMPTY", new HTMLResult(true, null, null, null)); + } + constructor(success, html, bbox, breakNode) { + this.success = success; + this.html = html; + this.bbox = bbox; + this.breakNode = breakNode; + } + isBreak() { + return !!this.breakNode; + } + static breakNode(node) { + return new HTMLResult(false, null, null, node); + } + static success(html) { + let bbox = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + return new HTMLResult(true, html, bbox, null); + } +} +exports.HTMLResult = HTMLResult; + +/***/ }), +/* 208 */ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.NamespaceIds = exports.$buildXFAObject = void 0; +const $buildXFAObject = Symbol(); +exports.$buildXFAObject = $buildXFAObject; +const NamespaceIds = { + config: { + id: 0, + check: ns => ns.startsWith("http://www.xfa.org/schema/xci/") + }, + connectionSet: { + id: 1, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/") + }, + datasets: { + id: 2, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/") + }, + form: { + id: 3, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/") + }, + localeSet: { + id: 4, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/") + }, + pdf: { + id: 5, + check: ns => ns === "http://ns.adobe.com/xdp/pdf/" + }, + signature: { + id: 6, + check: ns => ns === "http://www.w3.org/2000/09/xmldsig#" + }, + sourceSet: { + id: 7, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/") + }, + stylesheet: { + id: 8, + check: ns => ns === "http://www.w3.org/1999/XSL/Transform" + }, + template: { + id: 9, + check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/") + }, + xdc: { + id: 10, + check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/") + }, + xdp: { + id: 11, + check: ns => ns === "http://ns.adobe.com/xdp/" + }, + xfdf: { + id: 12, + check: ns => ns === "http://ns.adobe.com/xfdf/" + }, + xhtml: { + id: 13, + check: ns => ns === "http://www.w3.org/1999/xhtml" + }, + xmpmeta: { + id: 14, + check: ns => ns === "http://ns.adobe.com/xmpmeta/" + } +}; +exports.NamespaceIds = NamespaceIds; + +/***/ }), +/* 209 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.createDataNode = createDataNode; +exports.searchNode = searchNode; +var _xfa_object = __w_pdfjs_require__(206); +var _namespaces = __w_pdfjs_require__(208); +var _util = __w_pdfjs_require__(2); +const namePattern = /^[^.[]+/; +const indexPattern = /^[^\]]+/; +const operators = { + dot: 0, + dotDot: 1, + dotHash: 2, + dotBracket: 3, + dotParen: 4 +}; +const shortcuts = new Map([["$data", (root, current) => root.datasets ? root.datasets.data : root], ["$record", (root, current) => (root.datasets ? root.datasets.data : root)[_xfa_object.$getChildren]()[0]], ["$template", (root, current) => root.template], ["$connectionSet", (root, current) => root.connectionSet], ["$form", (root, current) => root.form], ["$layout", (root, current) => root.layout], ["$host", (root, current) => root.host], ["$dataWindow", (root, current) => root.dataWindow], ["$event", (root, current) => root.event], ["!", (root, current) => root.datasets], ["$xfa", (root, current) => root], ["xfa", (root, current) => root], ["$", (root, current) => current]]); +const somCache = new WeakMap(); +const NS_DATASETS = _namespaces.NamespaceIds.datasets.id; +function parseIndex(index) { + index = index.trim(); + if (index === "*") { + return Infinity; + } + return parseInt(index, 10) || 0; +} +function parseExpression(expr, dotDotAllowed) { + let noExpr = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + let match = expr.match(namePattern); + if (!match) { + return null; + } + let [name] = match; + const parsed = [{ + name, + cacheName: "." + name, + index: 0, + js: null, + formCalc: null, + operator: operators.dot + }]; + let pos = name.length; + while (pos < expr.length) { + const spos = pos; + const char = expr.charAt(pos++); + if (char === "[") { + match = expr.slice(pos).match(indexPattern); + if (!match) { + (0, _util.warn)("XFA - Invalid index in SOM expression"); + return null; + } + parsed.at(-1).index = parseIndex(match[0]); + pos += match[0].length + 1; + continue; + } + let operator; + switch (expr.charAt(pos)) { + case ".": + if (!dotDotAllowed) { + return null; + } + pos++; + operator = operators.dotDot; + break; + case "#": + pos++; + operator = operators.dotHash; + break; + case "[": + if (noExpr) { + (0, _util.warn)("XFA - SOM expression contains a FormCalc subexpression which is not supported for now."); + return null; + } + operator = operators.dotBracket; + break; + case "(": + if (noExpr) { + (0, _util.warn)("XFA - SOM expression contains a JavaScript subexpression which is not supported for now."); + return null; + } + operator = operators.dotParen; + break; + default: + operator = operators.dot; + break; + } + match = expr.slice(pos).match(namePattern); + if (!match) { + break; + } + [name] = match; + pos += name.length; + parsed.push({ + name, + cacheName: expr.slice(spos, pos), + operator, + index: 0, + js: null, + formCalc: null + }); + } + return parsed; +} +function searchNode(root, container, expr) { + let dotDotAllowed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + let useCache = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + const parsed = parseExpression(expr, dotDotAllowed); + if (!parsed) { + return null; + } + const fn = shortcuts.get(parsed[0].name); + let i = 0; + let isQualified; + if (fn) { + isQualified = true; + root = [fn(root, container)]; + i = 1; + } else { + isQualified = container === null; + root = [container || root]; + } + for (let ii = parsed.length; i < ii; i++) { + const { + name, + cacheName, + operator, + index + } = parsed[i]; + const nodes = []; + for (const node of root) { + if (!(node instanceof _xfa_object.XFAObject)) { + continue; + } + let children, cached; + if (useCache) { + cached = somCache.get(node); + if (!cached) { + cached = new Map(); + somCache.set(node, cached); + } + children = cached.get(cacheName); + } + if (!children) { + switch (operator) { + case operators.dot: + children = node[_xfa_object.$getChildrenByName](name, false); + break; + case operators.dotDot: + children = node[_xfa_object.$getChildrenByName](name, true); + break; + case operators.dotHash: + children = node[_xfa_object.$getChildrenByClass](name); + if (children instanceof _xfa_object.XFAObjectArray) { + children = children.children; + } else { + children = [children]; + } + break; + default: + break; + } + if (useCache) { + cached.set(cacheName, children); + } + } + if (children.length > 0) { + nodes.push(children); + } + } + if (nodes.length === 0 && !isQualified && i === 0) { + const parent = container[_xfa_object.$getParent](); + container = parent; + if (!container) { + return null; + } + i = -1; + root = [container]; + continue; + } + if (isFinite(index)) { + root = nodes.filter(node => index < node.length).map(node => node[index]); + } else { + root = nodes.flat(); + } + } + if (root.length === 0) { + return null; + } + return root; +} +function createNodes(root, path) { + let node = null; + for (const { + name, + index + } of path) { + for (let i = 0, ii = !isFinite(index) ? 0 : index; i <= ii; i++) { + const nsId = root[_xfa_object.$namespaceId] === NS_DATASETS ? -1 : root[_xfa_object.$namespaceId]; + node = new _xfa_object.XmlObject(nsId, name); + root[_xfa_object.$appendChild](node); + } + root = node; + } + return node; +} +function createDataNode(root, container, expr) { + const parsed = parseExpression(expr); + if (!parsed) { + return null; + } + if (parsed.some(x => x.operator === operators.dotDot)) { + return null; + } + const fn = shortcuts.get(parsed[0].name); + let i = 0; + if (fn) { + root = fn(root, container); + i = 1; + } else { + root = container || root; + } + for (let ii = parsed.length; i < ii; i++) { + const { + name, + operator, + index + } = parsed[i]; + if (!isFinite(index)) { + parsed[i].index = 0; + return createNodes(root, parsed.slice(i)); + } + let children; + switch (operator) { + case operators.dot: + children = root[_xfa_object.$getChildrenByName](name, false); + break; + case operators.dotDot: + children = root[_xfa_object.$getChildrenByName](name, true); + break; + case operators.dotHash: + children = root[_xfa_object.$getChildrenByClass](name); + if (children instanceof _xfa_object.XFAObjectArray) { + children = children.children; + } else { + children = [children]; + } + break; + default: + break; + } + if (children.length === 0) { + return createNodes(root, parsed.slice(i)); + } + if (index < children.length) { + const child = children[index]; + if (!(child instanceof _xfa_object.XFAObject)) { + (0, _util.warn)(`XFA - Cannot create a node.`); + return null; + } + root = child; + } else { + parsed[i].index = index - children.length; + return createNodes(root, parsed.slice(i)); + } + } + return null; +} + +/***/ }), +/* 210 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Binder = void 0; +var _xfa_object = __w_pdfjs_require__(206); +var _template = __w_pdfjs_require__(211); +var _som = __w_pdfjs_require__(209); +var _namespaces = __w_pdfjs_require__(208); +var _util = __w_pdfjs_require__(2); +const NS_DATASETS = _namespaces.NamespaceIds.datasets.id; +function createText(content) { + const node = new _template.Text({}); + node[_xfa_object.$content] = content; + return node; +} +class Binder { + constructor(root) { + this.root = root; + this.datasets = root.datasets; + if (root.datasets && root.datasets.data) { + this.data = root.datasets.data; + } else { + this.data = new _xfa_object.XmlObject(_namespaces.NamespaceIds.datasets.id, "data"); + } + this.emptyMerge = this.data[_xfa_object.$getChildren]().length === 0; + this.root.form = this.form = root.template[_xfa_object.$clone](); + } + _isConsumeData() { + return !this.emptyMerge && this._mergeMode; + } + _isMatchTemplate() { + return !this._isConsumeData(); + } + bind() { + this._bindElement(this.form, this.data); + return this.form; + } + getData() { + return this.data; + } + _bindValue(formNode, data, picture) { + formNode[_xfa_object.$data] = data; + if (formNode[_xfa_object.$hasSettableValue]()) { + if (data[_xfa_object.$isDataValue]()) { + const value = data[_xfa_object.$getDataValue](); + formNode[_xfa_object.$setValue](createText(value)); + } else if (formNode instanceof _template.Field && formNode.ui && formNode.ui.choiceList && formNode.ui.choiceList.open === "multiSelect") { + const value = data[_xfa_object.$getChildren]().map(child => child[_xfa_object.$content].trim()).join("\n"); + formNode[_xfa_object.$setValue](createText(value)); + } else if (this._isConsumeData()) { + (0, _util.warn)(`XFA - Nodes haven't the same type.`); + } + } else if (!data[_xfa_object.$isDataValue]() || this._isMatchTemplate()) { + this._bindElement(formNode, data); + } else { + (0, _util.warn)(`XFA - Nodes haven't the same type.`); + } + } + _findDataByNameToConsume(name, isValue, dataNode, global) { + if (!name) { + return null; + } + let generator, match; + for (let i = 0; i < 3; i++) { + generator = dataNode[_xfa_object.$getRealChildrenByNameIt](name, false, true); + while (true) { + match = generator.next().value; + if (!match) { + break; + } + if (isValue === match[_xfa_object.$isDataValue]()) { + return match; + } + } + if (dataNode[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.datasets.id && dataNode[_xfa_object.$nodeName] === "data") { + break; + } + dataNode = dataNode[_xfa_object.$getParent](); + } + if (!global) { + return null; + } + generator = this.data[_xfa_object.$getRealChildrenByNameIt](name, true, false); + match = generator.next().value; + if (match) { + return match; + } + generator = this.data[_xfa_object.$getAttributeIt](name, true); + match = generator.next().value; + if (match && match[_xfa_object.$isDataValue]()) { + return match; + } + return null; + } + _setProperties(formNode, dataNode) { + if (!formNode.hasOwnProperty("setProperty")) { + return; + } + for (const { + ref, + target, + connection + } of formNode.setProperty.children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = (0, _som.searchNode)(this.root, dataNode, ref, false, false); + if (!nodes) { + (0, _util.warn)(`XFA - Invalid reference: ${ref}.`); + continue; + } + const [node] = nodes; + if (!node[_xfa_object.$isDescendent](this.data)) { + (0, _util.warn)(`XFA - Invalid node: must be a data node.`); + continue; + } + const targetNodes = (0, _som.searchNode)(this.root, formNode, target, false, false); + if (!targetNodes) { + (0, _util.warn)(`XFA - Invalid target: ${target}.`); + continue; + } + const [targetNode] = targetNodes; + if (!targetNode[_xfa_object.$isDescendent](formNode)) { + (0, _util.warn)(`XFA - Invalid target: must be a property or subproperty.`); + continue; + } + const targetParent = targetNode[_xfa_object.$getParent](); + if (targetNode instanceof _template.SetProperty || targetParent instanceof _template.SetProperty) { + (0, _util.warn)(`XFA - Invalid target: cannot be a setProperty or one of its properties.`); + continue; + } + if (targetNode instanceof _template.BindItems || targetParent instanceof _template.BindItems) { + (0, _util.warn)(`XFA - Invalid target: cannot be a bindItems or one of its properties.`); + continue; + } + const content = node[_xfa_object.$text](); + const name = targetNode[_xfa_object.$nodeName]; + if (targetNode instanceof _xfa_object.XFAAttribute) { + const attrs = Object.create(null); + attrs[name] = content; + const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]); + targetParent[name] = obj[name]; + continue; + } + if (!targetNode.hasOwnProperty(_xfa_object.$content)) { + (0, _util.warn)(`XFA - Invalid node to use in setProperty`); + continue; + } + targetNode[_xfa_object.$data] = node; + targetNode[_xfa_object.$content] = content; + targetNode[_xfa_object.$finalize](); + } + } + _bindItems(formNode, dataNode) { + if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || formNode.bindItems.isEmpty()) { + return; + } + for (const item of formNode.items.children) { + formNode[_xfa_object.$removeChild](item); + } + formNode.items.clear(); + const labels = new _template.Items({}); + const values = new _template.Items({}); + formNode[_xfa_object.$appendChild](labels); + formNode.items.push(labels); + formNode[_xfa_object.$appendChild](values); + formNode.items.push(values); + for (const { + ref, + labelRef, + valueRef, + connection + } of formNode.bindItems.children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = (0, _som.searchNode)(this.root, dataNode, ref, false, false); + if (!nodes) { + (0, _util.warn)(`XFA - Invalid reference: ${ref}.`); + continue; + } + for (const node of nodes) { + if (!node[_xfa_object.$isDescendent](this.datasets)) { + (0, _util.warn)(`XFA - Invalid ref (${ref}): must be a datasets child.`); + continue; + } + const labelNodes = (0, _som.searchNode)(this.root, node, labelRef, true, false); + if (!labelNodes) { + (0, _util.warn)(`XFA - Invalid label: ${labelRef}.`); + continue; + } + const [labelNode] = labelNodes; + if (!labelNode[_xfa_object.$isDescendent](this.datasets)) { + (0, _util.warn)(`XFA - Invalid label: must be a datasets child.`); + continue; + } + const valueNodes = (0, _som.searchNode)(this.root, node, valueRef, true, false); + if (!valueNodes) { + (0, _util.warn)(`XFA - Invalid value: ${valueRef}.`); + continue; + } + const [valueNode] = valueNodes; + if (!valueNode[_xfa_object.$isDescendent](this.datasets)) { + (0, _util.warn)(`XFA - Invalid value: must be a datasets child.`); + continue; + } + const label = createText(labelNode[_xfa_object.$text]()); + const value = createText(valueNode[_xfa_object.$text]()); + labels[_xfa_object.$appendChild](label); + labels.text.push(label); + values[_xfa_object.$appendChild](value); + values.text.push(value); + } + } + } + _bindOccurrences(formNode, matches, picture) { + let baseClone; + if (matches.length > 1) { + baseClone = formNode[_xfa_object.$clone](); + baseClone[_xfa_object.$removeChild](baseClone.occur); + baseClone.occur = null; + } + this._bindValue(formNode, matches[0], picture); + this._setProperties(formNode, matches[0]); + this._bindItems(formNode, matches[0]); + if (matches.length === 1) { + return; + } + const parent = formNode[_xfa_object.$getParent](); + const name = formNode[_xfa_object.$nodeName]; + const pos = parent[_xfa_object.$indexOf](formNode); + for (let i = 1, ii = matches.length; i < ii; i++) { + const match = matches[i]; + const clone = baseClone[_xfa_object.$clone](); + parent[name].push(clone); + parent[_xfa_object.$insertAt](pos + i, clone); + this._bindValue(clone, match, picture); + this._setProperties(clone, match); + this._bindItems(clone, match); + } + } + _createOccurrences(formNode) { + if (!this.emptyMerge) { + return; + } + const { + occur + } = formNode; + if (!occur || occur.initial <= 1) { + return; + } + const parent = formNode[_xfa_object.$getParent](); + const name = formNode[_xfa_object.$nodeName]; + if (!(parent[name] instanceof _xfa_object.XFAObjectArray)) { + return; + } + let currentNumber; + if (formNode.name) { + currentNumber = parent[name].children.filter(e => e.name === formNode.name).length; + } else { + currentNumber = parent[name].children.length; + } + const pos = parent[_xfa_object.$indexOf](formNode) + 1; + const ii = occur.initial - currentNumber; + if (ii) { + const nodeClone = formNode[_xfa_object.$clone](); + nodeClone[_xfa_object.$removeChild](nodeClone.occur); + nodeClone.occur = null; + parent[name].push(nodeClone); + parent[_xfa_object.$insertAt](pos, nodeClone); + for (let i = 1; i < ii; i++) { + const clone = nodeClone[_xfa_object.$clone](); + parent[name].push(clone); + parent[_xfa_object.$insertAt](pos + i, clone); + } + } + } + _getOccurInfo(formNode) { + const { + name, + occur + } = formNode; + if (!occur || !name) { + return [1, 1]; + } + const max = occur.max === -1 ? Infinity : occur.max; + return [occur.min, max]; + } + _setAndBind(formNode, dataNode) { + this._setProperties(formNode, dataNode); + this._bindItems(formNode, dataNode); + this._bindElement(formNode, dataNode); + } + _bindElement(formNode, dataNode) { + const uselessNodes = []; + this._createOccurrences(formNode); + for (const child of formNode[_xfa_object.$getChildren]()) { + if (child[_xfa_object.$data]) { + continue; + } + if (this._mergeMode === undefined && child[_xfa_object.$nodeName] === "subform") { + this._mergeMode = child.mergeMode === "consumeData"; + const dataChildren = dataNode[_xfa_object.$getChildren](); + if (dataChildren.length > 0) { + this._bindOccurrences(child, [dataChildren[0]], null); + } else if (this.emptyMerge) { + const nsId = dataNode[_xfa_object.$namespaceId] === NS_DATASETS ? -1 : dataNode[_xfa_object.$namespaceId]; + const dataChild = child[_xfa_object.$data] = new _xfa_object.XmlObject(nsId, child.name || "root"); + dataNode[_xfa_object.$appendChild](dataChild); + this._bindElement(child, dataChild); + } + continue; + } + if (!child[_xfa_object.$isBindable]()) { + continue; + } + let global = false; + let picture = null; + let ref = null; + let match = null; + if (child.bind) { + switch (child.bind.match) { + case "none": + this._setAndBind(child, dataNode); + continue; + case "global": + global = true; + break; + case "dataRef": + if (!child.bind.ref) { + (0, _util.warn)(`XFA - ref is empty in node ${child[_xfa_object.$nodeName]}.`); + this._setAndBind(child, dataNode); + continue; + } + ref = child.bind.ref; + break; + default: + break; + } + if (child.bind.picture) { + picture = child.bind.picture[_xfa_object.$content]; + } + } + const [min, max] = this._getOccurInfo(child); + if (ref) { + match = (0, _som.searchNode)(this.root, dataNode, ref, true, false); + if (match === null) { + match = (0, _som.createDataNode)(this.data, dataNode, ref); + if (!match) { + continue; + } + if (this._isConsumeData()) { + match[_xfa_object.$consumed] = true; + } + this._setAndBind(child, match); + continue; + } else { + if (this._isConsumeData()) { + match = match.filter(node => !node[_xfa_object.$consumed]); + } + if (match.length > max) { + match = match.slice(0, max); + } else if (match.length === 0) { + match = null; + } + if (match && this._isConsumeData()) { + match.forEach(node => { + node[_xfa_object.$consumed] = true; + }); + } + } + } else { + if (!child.name) { + this._setAndBind(child, dataNode); + continue; + } + if (this._isConsumeData()) { + const matches = []; + while (matches.length < max) { + const found = this._findDataByNameToConsume(child.name, child[_xfa_object.$hasSettableValue](), dataNode, global); + if (!found) { + break; + } + found[_xfa_object.$consumed] = true; + matches.push(found); + } + match = matches.length > 0 ? matches : null; + } else { + match = dataNode[_xfa_object.$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value; + if (!match) { + if (min === 0) { + uselessNodes.push(child); + continue; + } + const nsId = dataNode[_xfa_object.$namespaceId] === NS_DATASETS ? -1 : dataNode[_xfa_object.$namespaceId]; + match = child[_xfa_object.$data] = new _xfa_object.XmlObject(nsId, child.name); + if (this.emptyMerge) { + match[_xfa_object.$consumed] = true; + } + dataNode[_xfa_object.$appendChild](match); + this._setAndBind(child, match); + continue; + } + if (this.emptyMerge) { + match[_xfa_object.$consumed] = true; + } + match = [match]; + } + } + if (match) { + this._bindOccurrences(child, match, picture); + } else if (min > 0) { + this._setAndBind(child, dataNode); + } else { + uselessNodes.push(child); + } + } + uselessNodes.forEach(node => node[_xfa_object.$getParent]()[_xfa_object.$removeChild](node)); + } +} +exports.Binder = Binder; + +/***/ }), +/* 211 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Value = exports.Text = exports.TemplateNamespace = exports.Template = exports.SetProperty = exports.Items = exports.Field = exports.BindItems = void 0; +var _xfa_object = __w_pdfjs_require__(206); +var _namespaces = __w_pdfjs_require__(208); +var _layout = __w_pdfjs_require__(212); +var _html_utils = __w_pdfjs_require__(213); +var _utils = __w_pdfjs_require__(207); +var _util = __w_pdfjs_require__(2); +var _fonts = __w_pdfjs_require__(214); +var _core_utils = __w_pdfjs_require__(135); +var _som = __w_pdfjs_require__(209); +const TEMPLATE_NS_ID = _namespaces.NamespaceIds.template.id; +const SVG_NS = "http://www.w3.org/2000/svg"; +const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; +const MAX_EMPTY_PAGES = 3; +const DEFAULT_TAB_INDEX = 5000; +const HEADING_PATTERN = /^H(\d+)$/; +const MIMES = new Set(["image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/png", "image/apng", "image/x-png", "image/bmp", "image/x-ms-bmp", "image/tiff", "image/tif", "application/octet-stream"]); +const IMAGES_HEADERS = [[[0x42, 0x4d], "image/bmp"], [[0xff, 0xd8, 0xff], "image/jpeg"], [[0x49, 0x49, 0x2a, 0x00], "image/tiff"], [[0x4d, 0x4d, 0x00, 0x2a], "image/tiff"], [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], "image/gif"], [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], "image/png"]]; +function getBorderDims(node) { + if (!node || !node.border) { + return { + w: 0, + h: 0 + }; + } + const borderExtra = node.border[_xfa_object.$getExtra](); + if (!borderExtra) { + return { + w: 0, + h: 0 + }; + } + return { + w: borderExtra.widths[0] + borderExtra.widths[2] + borderExtra.insets[0] + borderExtra.insets[2], + h: borderExtra.widths[1] + borderExtra.widths[3] + borderExtra.insets[1] + borderExtra.insets[3] + }; +} +function hasMargin(node) { + return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset); +} +function _setValue(templateNode, value) { + if (!templateNode.value) { + const nodeValue = new Value({}); + templateNode[_xfa_object.$appendChild](nodeValue); + templateNode.value = nodeValue; + } + templateNode.value[_xfa_object.$setValue](value); +} +function* getContainedChildren(node) { + for (const child of node[_xfa_object.$getChildren]()) { + if (child instanceof SubformSet) { + yield* child[_xfa_object.$getContainedChildren](); + continue; + } + yield child; + } +} +function isRequired(node) { + return node.validate && node.validate.nullTest === "error"; +} +function setTabIndex(node) { + while (node) { + if (!node.traversal) { + node[_xfa_object.$tabIndex] = node[_xfa_object.$getParent]()[_xfa_object.$tabIndex]; + return; + } + if (node[_xfa_object.$tabIndex]) { + return; + } + let next = null; + for (const child of node.traversal[_xfa_object.$getChildren]()) { + if (child.operation === "next") { + next = child; + break; + } + } + if (!next || !next.ref) { + node[_xfa_object.$tabIndex] = node[_xfa_object.$getParent]()[_xfa_object.$tabIndex]; + return; + } + const root = node[_xfa_object.$getTemplateRoot](); + node[_xfa_object.$tabIndex] = ++root[_xfa_object.$tabIndex]; + const ref = root[_xfa_object.$searchNode](next.ref, node); + if (!ref) { + return; + } + node = ref[0]; + } +} +function applyAssist(obj, attributes) { + const assist = obj.assist; + if (assist) { + const assistTitle = assist[_xfa_object.$toHTML](); + if (assistTitle) { + attributes.title = assistTitle; + } + const role = assist.role; + const match = role.match(HEADING_PATTERN); + if (match) { + const ariaRole = "heading"; + const ariaLevel = match[1]; + attributes.role = ariaRole; + attributes["aria-level"] = ariaLevel; + } + } + if (obj.layout === "table") { + attributes.role = "table"; + } else if (obj.layout === "row") { + attributes.role = "row"; + } else { + const parent = obj[_xfa_object.$getParent](); + if (parent.layout === "row") { + if (parent.assist && parent.assist.role === "TH") { + attributes.role = "columnheader"; + } else { + attributes.role = "cell"; + } + } + } +} +function ariaLabel(obj) { + if (!obj.assist) { + return null; + } + const assist = obj.assist; + if (assist.speak && assist.speak[_xfa_object.$content] !== "") { + return assist.speak[_xfa_object.$content]; + } + if (assist.toolTip) { + return assist.toolTip[_xfa_object.$content]; + } + return null; +} +function valueToHtml(value) { + return _utils.HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: Object.create(null) + }, + children: [{ + name: "span", + attributes: { + style: Object.create(null) + }, + value + }] + }); +} +function setFirstUnsplittable(node) { + const root = node[_xfa_object.$getTemplateRoot](); + if (root[_xfa_object.$extra].firstUnsplittable === null) { + root[_xfa_object.$extra].firstUnsplittable = node; + root[_xfa_object.$extra].noLayoutFailure = true; + } +} +function unsetFirstUnsplittable(node) { + const root = node[_xfa_object.$getTemplateRoot](); + if (root[_xfa_object.$extra].firstUnsplittable === node) { + root[_xfa_object.$extra].noLayoutFailure = false; + } +} +function handleBreak(node) { + if (node[_xfa_object.$extra]) { + return false; + } + node[_xfa_object.$extra] = Object.create(null); + if (node.targetType === "auto") { + return false; + } + const root = node[_xfa_object.$getTemplateRoot](); + let target = null; + if (node.target) { + target = root[_xfa_object.$searchNode](node.target, node[_xfa_object.$getParent]()); + if (!target) { + return false; + } + target = target[0]; + } + const { + currentPageArea, + currentContentArea + } = root[_xfa_object.$extra]; + if (node.targetType === "pageArea") { + if (!(target instanceof PageArea)) { + target = null; + } + if (node.startNew) { + node[_xfa_object.$extra].target = target || currentPageArea; + return true; + } else if (target && target !== currentPageArea) { + node[_xfa_object.$extra].target = target; + return true; + } + return false; + } + if (!(target instanceof ContentArea)) { + target = null; + } + const pageArea = target && target[_xfa_object.$getParent](); + let index; + let nextPageArea = pageArea; + if (node.startNew) { + if (target) { + const contentAreas = pageArea.contentArea.children; + const indexForCurrent = contentAreas.indexOf(currentContentArea); + const indexForTarget = contentAreas.indexOf(target); + if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) { + nextPageArea = null; + } + index = indexForTarget - 1; + } else { + index = currentPageArea.contentArea.children.indexOf(currentContentArea); + } + } else if (target && target !== currentContentArea) { + const contentAreas = pageArea.contentArea.children; + index = contentAreas.indexOf(target) - 1; + nextPageArea = pageArea === currentPageArea ? null : pageArea; + } else { + return false; + } + node[_xfa_object.$extra].target = nextPageArea; + node[_xfa_object.$extra].index = index; + return true; +} +function handleOverflow(node, extraNode, space) { + const root = node[_xfa_object.$getTemplateRoot](); + const saved = root[_xfa_object.$extra].noLayoutFailure; + const savedMethod = extraNode[_xfa_object.$getSubformParent]; + extraNode[_xfa_object.$getSubformParent] = () => node; + root[_xfa_object.$extra].noLayoutFailure = true; + const res = extraNode[_xfa_object.$toHTML](space); + node[_xfa_object.$addHTML](res.html, res.bbox); + root[_xfa_object.$extra].noLayoutFailure = saved; + extraNode[_xfa_object.$getSubformParent] = savedMethod; +} +class AppearanceFilter extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "appearanceFilter"); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Arc extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "arc", true); + this.circular = (0, _utils.getInteger)({ + data: attributes.circular, + defaultValue: 0, + validate: x => x === 1 + }); + this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.startAngle = (0, _utils.getFloat)({ + data: attributes.startAngle, + defaultValue: 0, + validate: x => true + }); + this.sweepAngle = (0, _utils.getFloat)({ + data: attributes.sweepAngle, + defaultValue: 360, + validate: x => true + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.edge = null; + this.fill = null; + } + [_xfa_object.$toHTML]() { + const edge = this.edge || new Edge({}); + const edgeStyle = edge[_xfa_object.$toStyle](); + const style = Object.create(null); + if (this.fill && this.fill.presence === "visible") { + Object.assign(style, this.fill[_xfa_object.$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = (0, _html_utils.measureToString)(edge.presence === "visible" ? edge.thickness : 0); + style.stroke = edgeStyle.color; + let arc; + const attributes = { + xmlns: SVG_NS, + style: { + width: "100%", + height: "100%", + overflow: "visible" + } + }; + if (this.sweepAngle === 360) { + arc = { + name: "ellipse", + attributes: { + xmlns: SVG_NS, + cx: "50%", + cy: "50%", + rx: "50%", + ry: "50%", + style + } + }; + } else { + const startAngle = this.startAngle * Math.PI / 180; + const sweepAngle = this.sweepAngle * Math.PI / 180; + const largeArc = this.sweepAngle > 180 ? 1 : 0; + const [x1, y1, x2, y2] = [50 * (1 + Math.cos(startAngle)), 50 * (1 - Math.sin(startAngle)), 50 * (1 + Math.cos(startAngle + sweepAngle)), 50 * (1 - Math.sin(startAngle + sweepAngle))]; + arc = { + name: "path", + attributes: { + xmlns: SVG_NS, + d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`, + vectorEffect: "non-scaling-stroke", + style + } + }; + Object.assign(attributes, { + viewBox: "0 0 100 100", + preserveAspectRatio: "none" + }); + } + const svg = { + name: "svg", + children: [arc], + attributes + }; + const parent = this[_xfa_object.$getParent]()[_xfa_object.$getParent](); + if (hasMargin(parent)) { + return _utils.HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return _utils.HTMLResult.success(svg); + } +} +class Area extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "area", true); + this.colSpan = (0, _utils.getInteger)({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.x = (0, _utils.getMeasurement)(attributes.x, "0pt"); + this.y = (0, _utils.getMeasurement)(attributes.y, "0pt"); + this.desc = null; + this.extras = null; + this.area = new _xfa_object.XFAObjectArray(); + this.draw = new _xfa_object.XFAObjectArray(); + this.exObject = new _xfa_object.XFAObjectArray(); + this.exclGroup = new _xfa_object.XFAObjectArray(); + this.field = new _xfa_object.XFAObjectArray(); + this.subform = new _xfa_object.XFAObjectArray(); + this.subformSet = new _xfa_object.XFAObjectArray(); + } + *[_xfa_object.$getContainedChildren]() { + yield* getContainedChildren(this); + } + [_xfa_object.$isTransparent]() { + return true; + } + [_xfa_object.$isBindable]() { + return true; + } + [_xfa_object.$addHTML](html, bbox) { + const [x, y, w, h] = bbox; + this[_xfa_object.$extra].width = Math.max(this[_xfa_object.$extra].width, x + w); + this[_xfa_object.$extra].height = Math.max(this[_xfa_object.$extra].height, y + h); + this[_xfa_object.$extra].children.push(html); + } + [_xfa_object.$getAvailableSpace]() { + return this[_xfa_object.$extra].availableSpace; + } + [_xfa_object.$toHTML](availableSpace) { + const style = (0, _html_utils.toStyle)(this, "position"); + const attributes = { + style, + id: this[_xfa_object.$uid], + class: ["xfaArea"] + }; + if ((0, _html_utils.isPrintOnly)(this)) { + attributes.class.push("xfaPrintOnly"); + } + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + this[_xfa_object.$extra] = { + children, + width: 0, + height: 0, + availableSpace + }; + const result = this[_xfa_object.$childrenToHTML]({ + filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]), + include: true + }); + if (!result.success) { + if (result.isBreak()) { + return result; + } + delete this[_xfa_object.$extra]; + return _utils.HTMLResult.FAILURE; + } + style.width = (0, _html_utils.measureToString)(this[_xfa_object.$extra].width); + style.height = (0, _html_utils.measureToString)(this[_xfa_object.$extra].height); + const html = { + name: "div", + attributes, + children + }; + const bbox = [this.x, this.y, this[_xfa_object.$extra].width, this[_xfa_object.$extra].height]; + delete this[_xfa_object.$extra]; + return _utils.HTMLResult.success(html, bbox); + } +} +class Assist extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "assist", true); + this.id = attributes.id || ""; + this.role = attributes.role || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.speak = null; + this.toolTip = null; + } + [_xfa_object.$toHTML]() { + return this.toolTip && this.toolTip[_xfa_object.$content] ? this.toolTip[_xfa_object.$content] : null; + } +} +class Barcode extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "barcode", true); + this.charEncoding = (0, _utils.getKeyword)({ + data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + this.checksum = (0, _utils.getStringOption)(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]); + this.dataColumnCount = (0, _utils.getInteger)({ + data: attributes.dataColumnCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataLength = (0, _utils.getInteger)({ + data: attributes.dataLength, + defaultValue: -1, + validate: x => x >= 0 + }); + this.dataPrep = (0, _utils.getStringOption)(attributes.dataPrep, ["none", "flateCompress"]); + this.dataRowCount = (0, _utils.getInteger)({ + data: attributes.dataRowCount, + defaultValue: -1, + validate: x => x >= 0 + }); + this.endChar = attributes.endChar || ""; + this.errorCorrectionLevel = (0, _utils.getInteger)({ + data: attributes.errorCorrectionLevel, + defaultValue: -1, + validate: x => x >= 0 && x <= 8 + }); + this.id = attributes.id || ""; + this.moduleHeight = (0, _utils.getMeasurement)(attributes.moduleHeight, "5mm"); + this.moduleWidth = (0, _utils.getMeasurement)(attributes.moduleWidth, "0.25mm"); + this.printCheckDigit = (0, _utils.getInteger)({ + data: attributes.printCheckDigit, + defaultValue: 0, + validate: x => x === 1 + }); + this.rowColumnRatio = (0, _utils.getRatio)(attributes.rowColumnRatio); + this.startChar = attributes.startChar || ""; + this.textLocation = (0, _utils.getStringOption)(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]); + this.truncate = (0, _utils.getInteger)({ + data: attributes.truncate, + defaultValue: 0, + validate: x => x === 1 + }); + this.type = (0, _utils.getStringOption)(attributes.type ? attributes.type.toLowerCase() : "", ["aztec", "codabar", "code2of5industrial", "code2of5interleaved", "code2of5matrix", "code2of5standard", "code3of9", "code3of9extended", "code11", "code49", "code93", "code128", "code128a", "code128b", "code128c", "code128sscc", "datamatrix", "ean8", "ean8add2", "ean8add5", "ean13", "ean13add2", "ean13add5", "ean13pwcd", "fim", "logmars", "maxicode", "msi", "pdf417", "pdf417macro", "plessey", "postauscust2", "postauscust3", "postausreplypaid", "postausstandard", "postukrm4scc", "postusdpbc", "postusimb", "postusstandard", "postus5zip", "qrcode", "rfid", "rss14", "rss14expanded", "rss14limited", "rss14stacked", "rss14stackedomni", "rss14truncated", "telepen", "ucc128", "ucc128random", "ucc128sscc", "upca", "upcaadd2", "upcaadd5", "upcapwcd", "upce", "upceadd2", "upceadd5", "upcean2", "upcean5", "upsmaxicode"]); + this.upsMode = (0, _utils.getStringOption)(attributes.upsMode, ["usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wideNarrowRatio = (0, _utils.getRatio)(attributes.wideNarrowRatio); + this.encrypt = null; + this.extras = null; + } +} +class Bind extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bind", true); + this.match = (0, _utils.getStringOption)(attributes.match, ["once", "dataRef", "global", "none"]); + this.ref = attributes.ref || ""; + this.picture = null; + } +} +class BindItems extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bindItems"); + this.connection = attributes.connection || ""; + this.labelRef = attributes.labelRef || ""; + this.ref = attributes.ref || ""; + this.valueRef = attributes.valueRef || ""; + } +} +exports.BindItems = BindItems; +class Bookend extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "bookend"); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class BooleanElement extends _xfa_object.Option01 { + constructor(attributes) { + super(TEMPLATE_NS_ID, "boolean"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$toHTML](availableSpace) { + return valueToHtml(this[_xfa_object.$content] === 1 ? "1" : "0"); + } +} +class Border extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "border", true); + this.break = (0, _utils.getStringOption)(attributes.break, ["close", "open"]); + this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.corner = new _xfa_object.XFAObjectArray(4); + this.edge = new _xfa_object.XFAObjectArray(4); + this.extras = null; + this.fill = null; + this.margin = null; + } + [_xfa_object.$getExtra]() { + if (!this[_xfa_object.$extra]) { + const edges = this.edge.children.slice(); + if (edges.length < 4) { + const defaultEdge = edges.at(-1) || new Edge({}); + for (let i = edges.length; i < 4; i++) { + edges.push(defaultEdge); + } + } + const widths = edges.map(edge => edge.thickness); + const insets = [0, 0, 0, 0]; + if (this.margin) { + insets[0] = this.margin.topInset; + insets[1] = this.margin.rightInset; + insets[2] = this.margin.bottomInset; + insets[3] = this.margin.leftInset; + } + this[_xfa_object.$extra] = { + widths, + insets, + edges + }; + } + return this[_xfa_object.$extra]; + } + [_xfa_object.$toStyle]() { + const { + edges + } = this[_xfa_object.$getExtra](); + const edgeStyles = edges.map(node => { + const style = node[_xfa_object.$toStyle](); + style.color = style.color || "#000000"; + return style; + }); + const style = Object.create(null); + if (this.margin) { + Object.assign(style, this.margin[_xfa_object.$toStyle]()); + } + if (this.fill && this.fill.presence === "visible") { + Object.assign(style, this.fill[_xfa_object.$toStyle]()); + } + if (this.corner.children.some(node => node.radius !== 0)) { + const cornerStyles = this.corner.children.map(node => node[_xfa_object.$toStyle]()); + if (cornerStyles.length === 2 || cornerStyles.length === 3) { + const last = cornerStyles.at(-1); + for (let i = cornerStyles.length; i < 4; i++) { + cornerStyles.push(last); + } + } + style.borderRadius = cornerStyles.map(s => s.radius).join(" "); + } + switch (this.presence) { + case "invisible": + case "hidden": + style.borderStyle = ""; + break; + case "inactive": + style.borderStyle = "none"; + break; + default: + style.borderStyle = edgeStyles.map(s => s.style).join(" "); + break; + } + style.borderWidth = edgeStyles.map(s => s.width).join(" "); + style.borderColor = edgeStyles.map(s => s.color).join(" "); + return style; + } +} +class Break extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "break", true); + this.after = (0, _utils.getStringOption)(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.afterTarget = attributes.afterTarget || ""; + this.before = (0, _utils.getStringOption)(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); + this.beforeTarget = attributes.beforeTarget || ""; + this.bookendLeader = attributes.bookendLeader || ""; + this.bookendTrailer = attributes.bookendTrailer || ""; + this.id = attributes.id || ""; + this.overflowLeader = attributes.overflowLeader || ""; + this.overflowTarget = attributes.overflowTarget || ""; + this.overflowTrailer = attributes.overflowTrailer || ""; + this.startNew = (0, _utils.getInteger)({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class BreakAfter extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakAfter", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = (0, _utils.getInteger)({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = (0, _utils.getStringOption)(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } +} +class BreakBefore extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakBefore", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.startNew = (0, _utils.getInteger)({ + data: attributes.startNew, + defaultValue: 0, + validate: x => x === 1 + }); + this.target = attributes.target || ""; + this.targetType = (0, _utils.getStringOption)(attributes.targetType, ["auto", "contentArea", "pageArea"]); + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.script = null; + } + [_xfa_object.$toHTML](availableSpace) { + this[_xfa_object.$extra] = {}; + return _utils.HTMLResult.FAILURE; + } +} +class Button extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "button", true); + this.highlight = (0, _utils.getStringOption)(attributes.highlight, ["inverted", "none", "outline", "push"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [_xfa_object.$toHTML](availableSpace) { + const parent = this[_xfa_object.$getParent](); + const grandpa = parent[_xfa_object.$getParent](); + const htmlButton = { + name: "button", + attributes: { + id: this[_xfa_object.$uid], + class: ["xfaButton"], + style: {} + }, + children: [] + }; + for (const event of grandpa.event.children) { + if (event.activity !== "click" || !event.script) { + continue; + } + const jsURL = (0, _core_utils.recoverJsURL)(event.script[_xfa_object.$content]); + if (!jsURL) { + continue; + } + const href = (0, _html_utils.fixURL)(jsURL.url); + if (!href) { + continue; + } + htmlButton.children.push({ + name: "a", + attributes: { + id: "link" + this[_xfa_object.$uid], + href, + newWindow: jsURL.newWindow, + class: ["xfaLink"], + style: {} + }, + children: [] + }); + } + return _utils.HTMLResult.success(htmlButton); + } +} +class Calculate extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "calculate", true); + this.id = attributes.id || ""; + this.override = (0, _utils.getStringOption)(attributes.override, ["disabled", "error", "ignore", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.script = null; + } +} +class Caption extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "caption", true); + this.id = attributes.id || ""; + this.placement = (0, _utils.getStringOption)(attributes.placement, ["left", "bottom", "inline", "right", "top"]); + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.reserve = Math.ceil((0, _utils.getMeasurement)(attributes.reserve)); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.font = null; + this.margin = null; + this.para = null; + this.value = null; + } + [_xfa_object.$setValue](value) { + _setValue(this, value); + } + [_xfa_object.$getExtra](availableSpace) { + if (!this[_xfa_object.$extra]) { + let { + width, + height + } = availableSpace; + switch (this.placement) { + case "left": + case "right": + case "inline": + width = this.reserve <= 0 ? width : this.reserve; + break; + case "top": + case "bottom": + height = this.reserve <= 0 ? height : this.reserve; + break; + } + this[_xfa_object.$extra] = (0, _html_utils.layoutNode)(this, { + width, + height + }); + } + return this[_xfa_object.$extra]; + } + [_xfa_object.$toHTML](availableSpace) { + if (!this.value) { + return _utils.HTMLResult.EMPTY; + } + this[_xfa_object.$pushPara](); + const value = this.value[_xfa_object.$toHTML](availableSpace).html; + if (!value) { + this[_xfa_object.$popPara](); + return _utils.HTMLResult.EMPTY; + } + const savedReserve = this.reserve; + if (this.reserve <= 0) { + const { + w, + h + } = this[_xfa_object.$getExtra](availableSpace); + switch (this.placement) { + case "left": + case "right": + case "inline": + this.reserve = w; + break; + case "top": + case "bottom": + this.reserve = h; + break; + } + } + const children = []; + if (typeof value === "string") { + children.push({ + name: "#text", + value + }); + } else { + children.push(value); + } + const style = (0, _html_utils.toStyle)(this, "font", "margin", "visibility"); + switch (this.placement) { + case "left": + case "right": + if (this.reserve > 0) { + style.width = (0, _html_utils.measureToString)(this.reserve); + } + break; + case "top": + case "bottom": + if (this.reserve > 0) { + style.height = (0, _html_utils.measureToString)(this.reserve); + } + break; + } + (0, _html_utils.setPara)(this, null, value); + this[_xfa_object.$popPara](); + this.reserve = savedReserve; + return _utils.HTMLResult.success({ + name: "div", + attributes: { + style, + class: ["xfaCaption"] + }, + children + }); + } +} +class Certificate extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificate"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Certificates extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificates", true); + this.credentialServerPolicy = (0, _utils.getStringOption)(attributes.credentialServerPolicy, ["optional", "required"]); + this.id = attributes.id || ""; + this.url = attributes.url || ""; + this.urlPolicy = attributes.urlPolicy || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encryption = null; + this.issuers = null; + this.keyUsage = null; + this.oids = null; + this.signing = null; + this.subjectDNs = null; + } +} +class CheckButton extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "checkButton", true); + this.id = attributes.id || ""; + this.mark = (0, _utils.getStringOption)(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]); + this.shape = (0, _utils.getStringOption)(attributes.shape, ["square", "round"]); + this.size = (0, _utils.getMeasurement)(attributes.size, "10pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [_xfa_object.$toHTML](availableSpace) { + const style = (0, _html_utils.toStyle)("margin"); + const size = (0, _html_utils.measureToString)(this.size); + style.width = style.height = size; + let type; + let className; + let groupId; + const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent](); + const items = field.items.children.length && field.items.children[0][_xfa_object.$toHTML]().html || []; + const exportedValue = { + on: (items[0] !== undefined ? items[0] : "on").toString(), + off: (items[1] !== undefined ? items[1] : "off").toString() + }; + const value = field.value && field.value[_xfa_object.$text]() || "off"; + const checked = value === exportedValue.on || undefined; + const container = field[_xfa_object.$getSubformParent](); + const fieldId = field[_xfa_object.$uid]; + let dataId; + if (container instanceof ExclGroup) { + groupId = container[_xfa_object.$uid]; + type = "radio"; + className = "xfaRadio"; + dataId = container[_xfa_object.$data] && container[_xfa_object.$data][_xfa_object.$uid] || container[_xfa_object.$uid]; + } else { + type = "checkbox"; + className = "xfaCheckbox"; + dataId = field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || field[_xfa_object.$uid]; + } + const input = { + name: "input", + attributes: { + class: [className], + style, + fieldId, + dataId, + type, + checked, + xfaOn: exportedValue.on, + xfaOff: exportedValue.off, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (groupId) { + input.attributes.name = groupId; + } + if (isRequired(field)) { + input.attributes["aria-required"] = true; + input.attributes.required = true; + } + return _utils.HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [input] + }); + } +} +class ChoiceList extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "choiceList", true); + this.commitOn = (0, _utils.getStringOption)(attributes.commitOn, ["select", "exit"]); + this.id = attributes.id || ""; + this.open = (0, _utils.getStringOption)(attributes.open, ["userControl", "always", "multiSelect", "onEntry"]); + this.textEntry = (0, _utils.getInteger)({ + data: attributes.textEntry, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [_xfa_object.$toHTML](availableSpace) { + const style = (0, _html_utils.toStyle)(this, "border", "margin"); + const ui = this[_xfa_object.$getParent](); + const field = ui[_xfa_object.$getParent](); + const fontSize = field.font && field.font.size || 10; + const optionStyle = { + fontSize: `calc(${fontSize}px * var(--scale-factor))` + }; + const children = []; + if (field.items.children.length > 0) { + const items = field.items; + let displayedIndex = 0; + let saveIndex = 0; + if (items.children.length === 2) { + displayedIndex = items.children[0].save; + saveIndex = 1 - displayedIndex; + } + const displayed = items.children[displayedIndex][_xfa_object.$toHTML]().html; + const values = items.children[saveIndex][_xfa_object.$toHTML]().html; + let selected = false; + const value = field.value && field.value[_xfa_object.$text]() || ""; + for (let i = 0, ii = displayed.length; i < ii; i++) { + const option = { + name: "option", + attributes: { + value: values[i] || displayed[i], + style: optionStyle + }, + value: displayed[i] + }; + if (values[i] === value) { + option.attributes.selected = selected = true; + } + children.push(option); + } + if (!selected) { + children.splice(0, 0, { + name: "option", + attributes: { + hidden: true, + selected: true + }, + value: " " + }); + } + } + const selectAttributes = { + class: ["xfaSelect"], + fieldId: field[_xfa_object.$uid], + dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || field[_xfa_object.$uid], + style, + "aria-label": ariaLabel(field), + "aria-required": false + }; + if (isRequired(field)) { + selectAttributes["aria-required"] = true; + selectAttributes.required = true; + } + if (this.open === "multiSelect") { + selectAttributes.multiple = true; + } + return _utils.HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [{ + name: "select", + children, + attributes: selectAttributes + }] + }); + } +} +class Color extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "color", true); + this.cSpace = (0, _utils.getStringOption)(attributes.cSpace, ["SRGB"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.value = attributes.value ? (0, _utils.getColor)(attributes.value) : ""; + this.extras = null; + } + [_xfa_object.$hasSettableValue]() { + return false; + } + [_xfa_object.$toStyle]() { + return this.value ? _util.Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null; + } +} +class Comb extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "comb"); + this.id = attributes.id || ""; + this.numberOfCells = (0, _utils.getInteger)({ + data: attributes.numberOfCells, + defaultValue: 0, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Connect extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "connect", true); + this.connection = attributes.connection || ""; + this.id = attributes.id || ""; + this.ref = attributes.ref || ""; + this.usage = (0, _utils.getStringOption)(attributes.usage, ["exportAndImport", "exportOnly", "importOnly"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.picture = null; + } +} +class ContentArea extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "contentArea", true); + this.h = (0, _utils.getMeasurement)(attributes.h); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = (0, _utils.getMeasurement)(attributes.w); + this.x = (0, _utils.getMeasurement)(attributes.x, "0pt"); + this.y = (0, _utils.getMeasurement)(attributes.y, "0pt"); + this.desc = null; + this.extras = null; + } + [_xfa_object.$toHTML](availableSpace) { + const left = (0, _html_utils.measureToString)(this.x); + const top = (0, _html_utils.measureToString)(this.y); + const style = { + left, + top, + width: (0, _html_utils.measureToString)(this.w), + height: (0, _html_utils.measureToString)(this.h) + }; + const classNames = ["xfaContentarea"]; + if ((0, _html_utils.isPrintOnly)(this)) { + classNames.push("xfaPrintOnly"); + } + return _utils.HTMLResult.success({ + name: "div", + children: [], + attributes: { + style, + class: classNames, + id: this[_xfa_object.$uid] + } + }); + } +} +class Corner extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "corner", true); + this.id = attributes.id || ""; + this.inverted = (0, _utils.getInteger)({ + data: attributes.inverted, + defaultValue: 0, + validate: x => x === 1 + }); + this.join = (0, _utils.getStringOption)(attributes.join, ["square", "round"]); + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.radius = (0, _utils.getMeasurement)(attributes.radius); + this.stroke = (0, _utils.getStringOption)(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = (0, _utils.getMeasurement)(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [_xfa_object.$toStyle]() { + const style = (0, _html_utils.toStyle)(this, "visibility"); + style.radius = (0, _html_utils.measureToString)(this.join === "square" ? 0 : this.radius); + return style; + } +} +class DateElement extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "date"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + const date = this[_xfa_object.$content].trim(); + this[_xfa_object.$content] = date ? new Date(date) : null; + } + [_xfa_object.$toHTML](availableSpace) { + return valueToHtml(this[_xfa_object.$content] ? this[_xfa_object.$content].toString() : ""); + } +} +class DateTime extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTime"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + const date = this[_xfa_object.$content].trim(); + this[_xfa_object.$content] = date ? new Date(date) : null; + } + [_xfa_object.$toHTML](availableSpace) { + return valueToHtml(this[_xfa_object.$content] ? this[_xfa_object.$content].toString() : ""); + } +} +class DateTimeEdit extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTimeEdit", true); + this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.picker = (0, _utils.getStringOption)(attributes.picker, ["host", "none"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [_xfa_object.$toHTML](availableSpace) { + const style = (0, _html_utils.toStyle)(this, "border", "font", "margin"); + const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[_xfa_object.$uid], + dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || field[_xfa_object.$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return _utils.HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Decimal extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "decimal"); + this.fracDigits = (0, _utils.getInteger)({ + data: attributes.fracDigits, + defaultValue: 2, + validate: x => true + }); + this.id = attributes.id || ""; + this.leadDigits = (0, _utils.getInteger)({ + data: attributes.leadDigits, + defaultValue: -1, + validate: x => true + }); + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + const number = parseFloat(this[_xfa_object.$content].trim()); + this[_xfa_object.$content] = isNaN(number) ? null : number; + } + [_xfa_object.$toHTML](availableSpace) { + return valueToHtml(this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : ""); + } +} +class DefaultUi extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "defaultUi", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class Desc extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "desc", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new _xfa_object.XFAObjectArray(); + this.date = new _xfa_object.XFAObjectArray(); + this.dateTime = new _xfa_object.XFAObjectArray(); + this.decimal = new _xfa_object.XFAObjectArray(); + this.exData = new _xfa_object.XFAObjectArray(); + this.float = new _xfa_object.XFAObjectArray(); + this.image = new _xfa_object.XFAObjectArray(); + this.integer = new _xfa_object.XFAObjectArray(); + this.text = new _xfa_object.XFAObjectArray(); + this.time = new _xfa_object.XFAObjectArray(); + } +} +class DigestMethod extends _xfa_object.OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class DigestMethods extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethods", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.digestMethod = new _xfa_object.XFAObjectArray(); + } +} +class Draw extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "draw", true); + this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = (0, _utils.getInteger)({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : ""; + this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt"); + this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt"); + this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt"); + this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.rotate = (0, _utils.getInteger)({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : ""; + this.x = (0, _utils.getMeasurement)(attributes.x, "0pt"); + this.y = (0, _utils.getMeasurement)(attributes.y, "0pt"); + this.assist = null; + this.border = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.font = null; + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.value = null; + this.setProperty = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$setValue](value) { + _setValue(this, value); + } + [_xfa_object.$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive") { + return _utils.HTMLResult.EMPTY; + } + (0, _html_utils.fixDimensions)(this); + this[_xfa_object.$pushPara](); + const savedW = this.w; + const savedH = this.h; + const { + w, + h, + isBroken + } = (0, _html_utils.layoutNode)(this, availableSpace); + if (w && this.w === "") { + if (isBroken && this[_xfa_object.$getSubformParent]()[_xfa_object.$isThereMoreWidth]()) { + this[_xfa_object.$popPara](); + return _utils.HTMLResult.FAILURE; + } + this.w = w; + } + if (h && this.h === "") { + this.h = h; + } + setFirstUnsplittable(this); + if (!(0, _layout.checkDimensions)(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[_xfa_object.$popPara](); + return _utils.HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = (0, _html_utils.toStyle)(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin"); + (0, _html_utils.setMinMaxDimensions)(this, style); + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + const classNames = ["xfaDraw"]; + if (this.font) { + classNames.push("xfaFont"); + } + if ((0, _html_utils.isPrintOnly)(this)) { + classNames.push("xfaPrintOnly"); + } + const attributes = { + style, + id: this[_xfa_object.$uid], + class: classNames + }; + if (this.name) { + attributes.xfaName = this.name; + } + const html = { + name: "div", + attributes, + children: [] + }; + applyAssist(this, attributes); + const bbox = (0, _html_utils.computeBbox)(this, html, availableSpace); + const value = this.value ? this.value[_xfa_object.$toHTML](availableSpace).html : null; + if (value === null) { + this.w = savedW; + this.h = savedH; + this[_xfa_object.$popPara](); + return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox); + } + html.children.push(value); + (0, _html_utils.setPara)(this, style, value); + this.w = savedW; + this.h = savedH; + this[_xfa_object.$popPara](); + return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox); + } +} +class Edge extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "edge", true); + this.cap = (0, _utils.getStringOption)(attributes.cap, ["square", "butt", "round"]); + this.id = attributes.id || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.stroke = (0, _utils.getStringOption)(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); + this.thickness = (0, _utils.getMeasurement)(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [_xfa_object.$toStyle]() { + const style = (0, _html_utils.toStyle)(this, "visibility"); + Object.assign(style, { + linecap: this.cap, + width: (0, _html_utils.measureToString)(this.thickness), + color: this.color ? this.color[_xfa_object.$toStyle]() : "#000000", + style: "" + }); + if (this.presence !== "visible") { + style.style = "none"; + } else { + switch (this.stroke) { + case "solid": + style.style = "solid"; + break; + case "dashDot": + style.style = "dashed"; + break; + case "dashDotDot": + style.style = "dashed"; + break; + case "dashed": + style.style = "dashed"; + break; + case "dotted": + style.style = "dotted"; + break; + case "embossed": + style.style = "ridge"; + break; + case "etched": + style.style = "groove"; + break; + case "lowered": + style.style = "inset"; + break; + case "raised": + style.style = "outset"; + break; + } + } + return style; + } +} +class Encoding extends _xfa_object.OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Encodings extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encodings", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encoding = new _xfa_object.XFAObjectArray(); + } +} +class Encrypt extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encrypt", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = null; + } +} +class EncryptData extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptData", true); + this.id = attributes.id || ""; + this.operation = (0, _utils.getStringOption)(attributes.operation, ["encrypt", "decrypt"]); + this.target = attributes.target || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.filter = null; + this.manifest = null; + } +} +class Encryption extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryption", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new _xfa_object.XFAObjectArray(); + } +} +class EncryptionMethod extends _xfa_object.OptionObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class EncryptionMethods extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethods", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.encryptionMethod = new _xfa_object.XFAObjectArray(); + } +} +class Event extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "event", true); + this.activity = (0, _utils.getStringOption)(attributes.activity, ["click", "change", "docClose", "docReady", "enter", "exit", "full", "indexChange", "initialize", "mouseDown", "mouseEnter", "mouseExit", "mouseUp", "postExecute", "postOpen", "postPrint", "postSave", "postSign", "postSubmit", "preExecute", "preOpen", "prePrint", "preSave", "preSign", "preSubmit", "ready", "validationState"]); + this.id = attributes.id || ""; + this.listen = (0, _utils.getStringOption)(attributes.listen, ["refOnly", "refAndDescendents"]); + this.name = attributes.name || ""; + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.encryptData = null; + this.execute = null; + this.script = null; + this.signData = null; + this.submit = null; + } +} +class ExData extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exData"); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.maxLength = (0, _utils.getInteger)({ + data: attributes.maxLength, + defaultValue: -1, + validate: x => x >= -1 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.transferEncoding = (0, _utils.getStringOption)(attributes.transferEncoding, ["none", "base64", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$isCDATAXml]() { + return this.contentType === "text/html"; + } + [_xfa_object.$onChild](child) { + if (this.contentType === "text/html" && child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.xhtml.id) { + this[_xfa_object.$content] = child; + return true; + } + if (this.contentType === "text/xml") { + this[_xfa_object.$content] = child; + return true; + } + return false; + } + [_xfa_object.$toHTML](availableSpace) { + if (this.contentType !== "text/html" || !this[_xfa_object.$content]) { + return _utils.HTMLResult.EMPTY; + } + return this[_xfa_object.$content][_xfa_object.$toHTML](availableSpace); + } +} +class ExObject extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exObject", true); + this.archive = attributes.archive || ""; + this.classId = attributes.classId || ""; + this.codeBase = attributes.codeBase || ""; + this.codeType = attributes.codeType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.boolean = new _xfa_object.XFAObjectArray(); + this.date = new _xfa_object.XFAObjectArray(); + this.dateTime = new _xfa_object.XFAObjectArray(); + this.decimal = new _xfa_object.XFAObjectArray(); + this.exData = new _xfa_object.XFAObjectArray(); + this.exObject = new _xfa_object.XFAObjectArray(); + this.float = new _xfa_object.XFAObjectArray(); + this.image = new _xfa_object.XFAObjectArray(); + this.integer = new _xfa_object.XFAObjectArray(); + this.text = new _xfa_object.XFAObjectArray(); + this.time = new _xfa_object.XFAObjectArray(); + } +} +class ExclGroup extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "exclGroup", true); + this.access = (0, _utils.getStringOption)(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = (0, _utils.getInteger)({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : ""; + this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = (0, _utils.getStringOption)(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt"); + this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt"); + this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt"); + this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : ""; + this.x = (0, _utils.getMeasurement)(attributes.x, "0pt"); + this.y = (0, _utils.getMeasurement)(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.border = null; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.connect = new _xfa_object.XFAObjectArray(); + this.event = new _xfa_object.XFAObjectArray(); + this.field = new _xfa_object.XFAObjectArray(); + this.setProperty = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$isBindable]() { + return true; + } + [_xfa_object.$hasSettableValue]() { + return true; + } + [_xfa_object.$setValue](value) { + for (const field of this.field.children) { + if (!field.value) { + const nodeValue = new Value({}); + field[_xfa_object.$appendChild](nodeValue); + field.value = nodeValue; + } + field.value[_xfa_object.$setValue](value); + } + } + [_xfa_object.$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[_xfa_object.$extra].attempt === 0 && this[_xfa_object.$extra].numberInLine > 0 || this[_xfa_object.$getParent]()[_xfa_object.$isThereMoreWidth](); + } + [_xfa_object.$isSplittable]() { + const parent = this[_xfa_object.$getSubformParent](); + if (!parent[_xfa_object.$isSplittable]()) { + return false; + } + if (this[_xfa_object.$extra]._isSplittable !== undefined) { + return this[_xfa_object.$extra]._isSplittable; + } + if (this.layout === "position" || this.layout.includes("row")) { + this[_xfa_object.$extra]._isSplittable = false; + return false; + } + if (parent.layout && parent.layout.endsWith("-tb") && parent[_xfa_object.$extra].numberInLine !== 0) { + return false; + } + this[_xfa_object.$extra]._isSplittable = true; + return true; + } + [_xfa_object.$flushHTML]() { + return (0, _layout.flushHTML)(this); + } + [_xfa_object.$addHTML](html, bbox) { + (0, _layout.addHTML)(this, html, bbox); + } + [_xfa_object.$getAvailableSpace]() { + return (0, _layout.getAvailableSpace)(this); + } + [_xfa_object.$toHTML](availableSpace) { + setTabIndex(this); + if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return _utils.HTMLResult.EMPTY; + } + (0, _html_utils.fixDimensions)(this); + const children = []; + const attributes = { + id: this[_xfa_object.$uid], + class: [] + }; + (0, _html_utils.setAccess)(this, attributes.class); + if (!this[_xfa_object.$extra]) { + this[_xfa_object.$extra] = Object.create(null); + } + Object.assign(this[_xfa_object.$extra], { + children, + attributes, + attempt: 0, + line: null, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const isSplittable = this[_xfa_object.$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!(0, _layout.checkDimensions)(this, availableSpace)) { + return _utils.HTMLResult.FAILURE; + } + const filter = new Set(["field"]); + if (this.layout.includes("row")) { + const columnWidths = this[_xfa_object.$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[_xfa_object.$extra].columnWidths = columnWidths; + this[_xfa_object.$extra].currentColumn = 0; + } + } + const style = (0, _html_utils.toStyle)(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); + const classNames = ["xfaExclgroup"]; + const cl = (0, _html_utils.layoutClass)(this); + if (cl) { + classNames.push(cl); + } + if ((0, _html_utils.isPrintOnly)(this)) { + classNames.push("xfaPrintOnly"); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } + this[_xfa_object.$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[_xfa_object.$extra].attempt < maxRun; this[_xfa_object.$extra].attempt++) { + if (isLrTb && this[_xfa_object.$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[_xfa_object.$extra].numberInLine = 0; + } + const result = this[_xfa_object.$childrenToHTML]({ + filter, + include: true + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[_xfa_object.$popPara](); + return result; + } + if (isLrTb && this[_xfa_object.$extra].attempt === 0 && this[_xfa_object.$extra].numberInLine === 0 && !this[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) { + this[_xfa_object.$extra].attempt = maxRun; + break; + } + } + this[_xfa_object.$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + if (this[_xfa_object.$extra].attempt === maxRun) { + if (!isSplittable) { + delete this[_xfa_object.$extra]; + } + return _utils.HTMLResult.FAILURE; + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[_xfa_object.$extra].width + marginH, this.w || 0); + const height = Math.max(this[_xfa_object.$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = (0, _html_utils.measureToString)(width); + } + if (this.h === "") { + style.height = (0, _html_utils.measureToString)(height); + } + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + delete this[_xfa_object.$extra]; + return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox); + } +} +class Execute extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "execute"); + this.connection = attributes.connection || ""; + this.executeType = (0, _utils.getStringOption)(attributes.executeType, ["import", "remerge"]); + this.id = attributes.id || ""; + this.runAt = (0, _utils.getStringOption)(attributes.runAt, ["client", "both", "server"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Extras extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "extras", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new _xfa_object.XFAObjectArray(); + this.date = new _xfa_object.XFAObjectArray(); + this.dateTime = new _xfa_object.XFAObjectArray(); + this.decimal = new _xfa_object.XFAObjectArray(); + this.exData = new _xfa_object.XFAObjectArray(); + this.extras = new _xfa_object.XFAObjectArray(); + this.float = new _xfa_object.XFAObjectArray(); + this.image = new _xfa_object.XFAObjectArray(); + this.integer = new _xfa_object.XFAObjectArray(); + this.text = new _xfa_object.XFAObjectArray(); + this.time = new _xfa_object.XFAObjectArray(); + } +} +class Field extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "field", true); + this.access = (0, _utils.getStringOption)(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.accessKey = attributes.accessKey || ""; + this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = (0, _utils.getInteger)({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : ""; + this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt"); + this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt"); + this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt"); + this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.rotate = (0, _utils.getInteger)({ + data: attributes.rotate, + defaultValue: 0, + validate: x => x % 90 === 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : ""; + this.x = (0, _utils.getMeasurement)(attributes.x, "0pt"); + this.y = (0, _utils.getMeasurement)(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.border = null; + this.calculate = null; + this.caption = null; + this.desc = null; + this.extras = null; + this.font = null; + this.format = null; + this.items = new _xfa_object.XFAObjectArray(2); + this.keep = null; + this.margin = null; + this.para = null; + this.traversal = null; + this.ui = null; + this.validate = null; + this.value = null; + this.bindItems = new _xfa_object.XFAObjectArray(); + this.connect = new _xfa_object.XFAObjectArray(); + this.event = new _xfa_object.XFAObjectArray(); + this.setProperty = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$isBindable]() { + return true; + } + [_xfa_object.$setValue](value) { + _setValue(this, value); + } + [_xfa_object.$toHTML](availableSpace) { + setTabIndex(this); + if (!this.ui) { + this.ui = new Ui({}); + this.ui[_xfa_object.$globalData] = this[_xfa_object.$globalData]; + this[_xfa_object.$appendChild](this.ui); + let node; + switch (this.items.children.length) { + case 0: + node = new TextEdit({}); + this.ui.textEdit = node; + break; + case 1: + node = new CheckButton({}); + this.ui.checkButton = node; + break; + case 2: + node = new ChoiceList({}); + this.ui.choiceList = node; + break; + } + this.ui[_xfa_object.$appendChild](node); + } + if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { + return _utils.HTMLResult.EMPTY; + } + if (this.caption) { + delete this.caption[_xfa_object.$extra]; + } + this[_xfa_object.$pushPara](); + const caption = this.caption ? this.caption[_xfa_object.$toHTML](availableSpace).html : null; + const savedW = this.w; + const savedH = this.h; + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + let borderDims = null; + if (this.w === "" || this.h === "") { + let width = null; + let height = null; + let uiW = 0; + let uiH = 0; + if (this.ui.checkButton) { + uiW = uiH = this.ui.checkButton.size; + } else { + const { + w, + h + } = (0, _html_utils.layoutNode)(this, availableSpace); + if (w !== null) { + uiW = w; + uiH = h; + } else { + uiH = (0, _fonts.getMetrics)(this.font, true).lineNoGap; + } + } + borderDims = getBorderDims(this.ui[_xfa_object.$getExtra]()); + uiW += borderDims.w; + uiH += borderDims.h; + if (this.caption) { + const { + w, + h, + isBroken + } = this.caption[_xfa_object.$getExtra](availableSpace); + if (isBroken && this[_xfa_object.$getSubformParent]()[_xfa_object.$isThereMoreWidth]()) { + this[_xfa_object.$popPara](); + return _utils.HTMLResult.FAILURE; + } + width = w; + height = h; + switch (this.caption.placement) { + case "left": + case "right": + case "inline": + width += uiW; + break; + case "top": + case "bottom": + height += uiH; + break; + } + } else { + width = uiW; + height = uiH; + } + if (width && this.w === "") { + width += marginH; + this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW); + } + if (height && this.h === "") { + height += marginV; + this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH); + } + } + this[_xfa_object.$popPara](); + (0, _html_utils.fixDimensions)(this); + setFirstUnsplittable(this); + if (!(0, _layout.checkDimensions)(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[_xfa_object.$popPara](); + return _utils.HTMLResult.FAILURE; + } + unsetFirstUnsplittable(this); + const style = (0, _html_utils.toStyle)(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign"); + (0, _html_utils.setMinMaxDimensions)(this, style); + const classNames = ["xfaField"]; + if (this.font) { + classNames.push("xfaFont"); + } + if ((0, _html_utils.isPrintOnly)(this)) { + classNames.push("xfaPrintOnly"); + } + const attributes = { + style, + id: this[_xfa_object.$uid], + class: classNames + }; + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + (0, _html_utils.setAccess)(this, classNames); + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + const borderStyle = this.border ? this.border[_xfa_object.$toStyle]() : null; + const bbox = (0, _html_utils.computeBbox)(this, html, availableSpace); + const ui = this.ui[_xfa_object.$toHTML]().html; + if (!ui) { + Object.assign(style, borderStyle); + return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox); + } + if (this[_xfa_object.$tabIndex]) { + if (ui.children && ui.children[0]) { + ui.children[0].attributes.tabindex = this[_xfa_object.$tabIndex]; + } else { + ui.attributes.tabindex = this[_xfa_object.$tabIndex]; + } + } + if (!ui.attributes.style) { + ui.attributes.style = Object.create(null); + } + let aElement = null; + if (this.ui.button) { + if (ui.children.length === 1) { + [aElement] = ui.children.splice(0, 1); + } + Object.assign(ui.attributes.style, borderStyle); + } else { + Object.assign(style, borderStyle); + } + children.push(ui); + if (this.value) { + if (this.ui.imageEdit) { + ui.children.push(this.value[_xfa_object.$toHTML]().html); + } else if (!this.ui.button) { + let value = ""; + if (this.value.exData) { + value = this.value.exData[_xfa_object.$text](); + } else if (this.value.text) { + value = this.value.text[_xfa_object.$getExtra](); + } else { + const htmlValue = this.value[_xfa_object.$toHTML]().html; + if (htmlValue !== null) { + value = htmlValue.children[0].value; + } + } + if (this.ui.textEdit && this.value.text && this.value.text.maxChars) { + ui.children[0].attributes.maxLength = this.value.text.maxChars; + } + if (value) { + if (this.ui.numericEdit) { + value = parseFloat(value); + value = isNaN(value) ? "" : value.toString(); + } + if (ui.children[0].name === "textarea") { + ui.children[0].attributes.textContent = value; + } else { + ui.children[0].attributes.value = value; + } + } + } + } + if (!this.ui.imageEdit && ui.children && ui.children[0] && this.h) { + borderDims = borderDims || getBorderDims(this.ui[_xfa_object.$getExtra]()); + let captionHeight = 0; + if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { + captionHeight = this.caption.reserve; + if (captionHeight <= 0) { + captionHeight = this.caption[_xfa_object.$getExtra](availableSpace).h; + } + const inputHeight = this.h - captionHeight - marginV - borderDims.h; + ui.children[0].attributes.style.height = (0, _html_utils.measureToString)(inputHeight); + } else { + ui.children[0].attributes.style.height = "100%"; + } + } + if (aElement) { + ui.children.push(aElement); + } + if (!caption) { + if (ui.attributes.class) { + ui.attributes.class.push("xfaLeft"); + } + this.w = savedW; + this.h = savedH; + return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox); + } + if (this.ui.button) { + if (style.padding) { + delete style.padding; + } + if (caption.name === "div") { + caption.name = "span"; + } + ui.children.push(caption); + return _utils.HTMLResult.success(html, bbox); + } else if (this.ui.checkButton) { + caption.attributes.class[0] = "xfaCaptionForCheckButton"; + } + if (!ui.attributes.class) { + ui.attributes.class = []; + } + ui.children.splice(0, 0, caption); + switch (this.caption.placement) { + case "left": + ui.attributes.class.push("xfaLeft"); + break; + case "right": + ui.attributes.class.push("xfaRight"); + break; + case "top": + ui.attributes.class.push("xfaTop"); + break; + case "bottom": + ui.attributes.class.push("xfaBottom"); + break; + case "inline": + ui.attributes.class.push("xfaLeft"); + break; + } + this.w = savedW; + this.h = savedH; + return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox); + } +} +exports.Field = Field; +class Fill extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "fill", true); + this.id = attributes.id || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + this.linear = null; + this.pattern = null; + this.radial = null; + this.solid = null; + this.stipple = null; + } + [_xfa_object.$toStyle]() { + const parent = this[_xfa_object.$getParent](); + const grandpa = parent[_xfa_object.$getParent](); + const ggrandpa = grandpa[_xfa_object.$getParent](); + const style = Object.create(null); + let propName = "color"; + let altPropName = propName; + if (parent instanceof Border) { + propName = "background-color"; + altPropName = "background"; + if (ggrandpa instanceof Ui) { + style.backgroundColor = "white"; + } + } + if (parent instanceof Rectangle || parent instanceof Arc) { + propName = altPropName = "fill"; + style.fill = "white"; + } + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "color") { + continue; + } + const obj = this[name]; + if (!(obj instanceof _xfa_object.XFAObject)) { + continue; + } + const color = obj[_xfa_object.$toStyle](this.color); + if (color) { + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; + } + if (this.color && this.color.value) { + const color = this.color[_xfa_object.$toStyle](); + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; + } +} +class Filter extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "filter", true); + this.addRevocationInfo = (0, _utils.getStringOption)(attributes.addRevocationInfo, ["", "required", "optional", "none"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.version = (0, _utils.getInteger)({ + data: this.version, + defaultValue: 5, + validate: x => x >= 1 && x <= 5 + }); + this.appearanceFilter = null; + this.certificates = null; + this.digestMethods = null; + this.encodings = null; + this.encryptionMethods = null; + this.handler = null; + this.lockDocument = null; + this.mdp = null; + this.reasons = null; + this.timeStamp = null; + } +} +class Float extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "float"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + const number = parseFloat(this[_xfa_object.$content].trim()); + this[_xfa_object.$content] = isNaN(number) ? null : number; + } + [_xfa_object.$toHTML](availableSpace) { + return valueToHtml(this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : ""); + } +} +class Font extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "font", true); + this.baselineShift = (0, _utils.getMeasurement)(attributes.baselineShift); + this.fontHorizontalScale = (0, _utils.getFloat)({ + data: attributes.fontHorizontalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.fontVerticalScale = (0, _utils.getFloat)({ + data: attributes.fontVerticalScale, + defaultValue: 100, + validate: x => x >= 0 + }); + this.id = attributes.id || ""; + this.kerningMode = (0, _utils.getStringOption)(attributes.kerningMode, ["none", "pair"]); + this.letterSpacing = (0, _utils.getMeasurement)(attributes.letterSpacing, "0"); + this.lineThrough = (0, _utils.getInteger)({ + data: attributes.lineThrough, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.lineThroughPeriod = (0, _utils.getStringOption)(attributes.lineThroughPeriod, ["all", "word"]); + this.overline = (0, _utils.getInteger)({ + data: attributes.overline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.overlinePeriod = (0, _utils.getStringOption)(attributes.overlinePeriod, ["all", "word"]); + this.posture = (0, _utils.getStringOption)(attributes.posture, ["normal", "italic"]); + this.size = (0, _utils.getMeasurement)(attributes.size, "10pt"); + this.typeface = attributes.typeface || "Courier"; + this.underline = (0, _utils.getInteger)({ + data: attributes.underline, + defaultValue: 0, + validate: x => x === 1 || x === 2 + }); + this.underlinePeriod = (0, _utils.getStringOption)(attributes.underlinePeriod, ["all", "word"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.weight = (0, _utils.getStringOption)(attributes.weight, ["normal", "bold"]); + this.extras = null; + this.fill = null; + } + [_xfa_object.$clean](builder) { + super[_xfa_object.$clean](builder); + this[_xfa_object.$globalData].usedTypefaces.add(this.typeface); + } + [_xfa_object.$toStyle]() { + const style = (0, _html_utils.toStyle)(this, "fill"); + const color = style.color; + if (color) { + if (color === "#000000") { + delete style.color; + } else if (!color.startsWith("#")) { + style.background = color; + style.backgroundClip = "text"; + style.color = "transparent"; + } + } + if (this.baselineShift) { + style.verticalAlign = (0, _html_utils.measureToString)(this.baselineShift); + } + style.fontKerning = this.kerningMode === "none" ? "none" : "normal"; + style.letterSpacing = (0, _html_utils.measureToString)(this.letterSpacing); + if (this.lineThrough !== 0) { + style.textDecoration = "line-through"; + if (this.lineThrough === 2) { + style.textDecorationStyle = "double"; + } + } + if (this.overline !== 0) { + style.textDecoration = "overline"; + if (this.overline === 2) { + style.textDecorationStyle = "double"; + } + } + style.fontStyle = this.posture; + style.fontSize = (0, _html_utils.measureToString)(0.99 * this.size); + (0, _html_utils.setFontFamily)(this, this, this[_xfa_object.$globalData].fontFinder, style); + if (this.underline !== 0) { + style.textDecoration = "underline"; + if (this.underline === 2) { + style.textDecorationStyle = "double"; + } + } + style.fontWeight = this.weight; + return style; + } +} +class Format extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "format", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.picture = null; + } +} +class Handler extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "handler"); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Hyphenation extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "hyphenation"); + this.excludeAllCaps = (0, _utils.getInteger)({ + data: attributes.excludeAllCaps, + defaultValue: 0, + validate: x => x === 1 + }); + this.excludeInitialCap = (0, _utils.getInteger)({ + data: attributes.excludeInitialCap, + defaultValue: 0, + validate: x => x === 1 + }); + this.hyphenate = (0, _utils.getInteger)({ + data: attributes.hyphenate, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.pushCharacterCount = (0, _utils.getInteger)({ + data: attributes.pushCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.remainCharacterCount = (0, _utils.getInteger)({ + data: attributes.remainCharacterCount, + defaultValue: 3, + validate: x => x >= 0 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wordCharacterCount = (0, _utils.getInteger)({ + data: attributes.wordCharacterCount, + defaultValue: 7, + validate: x => x >= 0 + }); + } +} +class Image extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "image"); + this.aspect = (0, _utils.getStringOption)(attributes.aspect, ["fit", "actual", "height", "none", "width"]); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.transferEncoding = (0, _utils.getStringOption)(attributes.transferEncoding, ["base64", "none", "package"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$toHTML]() { + if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { + return _utils.HTMLResult.EMPTY; + } + let buffer = this[_xfa_object.$globalData].images && this[_xfa_object.$globalData].images.get(this.href); + if (!buffer && (this.href || !this[_xfa_object.$content])) { + return _utils.HTMLResult.EMPTY; + } + if (!buffer && this.transferEncoding === "base64") { + buffer = (0, _util.stringToBytes)(atob(this[_xfa_object.$content])); + } + if (!buffer) { + return _utils.HTMLResult.EMPTY; + } + if (!this.contentType) { + for (const [header, type] of IMAGES_HEADERS) { + if (buffer.length > header.length && header.every((x, i) => x === buffer[i])) { + this.contentType = type; + break; + } + } + if (!this.contentType) { + return _utils.HTMLResult.EMPTY; + } + } + const blob = new Blob([buffer], { + type: this.contentType + }); + let style; + switch (this.aspect) { + case "fit": + case "actual": + break; + case "height": + style = { + height: "100%", + objectFit: "fill" + }; + break; + case "none": + style = { + width: "100%", + height: "100%", + objectFit: "fill" + }; + break; + case "width": + style = { + width: "100%", + objectFit: "fill" + }; + break; + } + const parent = this[_xfa_object.$getParent](); + return _utils.HTMLResult.success({ + name: "img", + attributes: { + class: ["xfaImage"], + style, + src: URL.createObjectURL(blob), + alt: parent ? ariaLabel(parent[_xfa_object.$getParent]()) : null + } + }); + } +} +class ImageEdit extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "imageEdit", true); + this.data = (0, _utils.getStringOption)(attributes.data, ["link", "embed"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } + [_xfa_object.$toHTML](availableSpace) { + if (this.data === "embed") { + return _utils.HTMLResult.success({ + name: "div", + children: [], + attributes: {} + }); + } + return _utils.HTMLResult.EMPTY; + } +} +class Integer extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "integer"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + const number = parseInt(this[_xfa_object.$content].trim(), 10); + this[_xfa_object.$content] = isNaN(number) ? null : number; + } + [_xfa_object.$toHTML](availableSpace) { + return valueToHtml(this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : ""); + } +} +class Issuers extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "issuers", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new _xfa_object.XFAObjectArray(); + } +} +class Items extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "items", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.ref = attributes.ref || ""; + this.save = (0, _utils.getInteger)({ + data: attributes.save, + defaultValue: 0, + validate: x => x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new _xfa_object.XFAObjectArray(); + this.date = new _xfa_object.XFAObjectArray(); + this.dateTime = new _xfa_object.XFAObjectArray(); + this.decimal = new _xfa_object.XFAObjectArray(); + this.exData = new _xfa_object.XFAObjectArray(); + this.float = new _xfa_object.XFAObjectArray(); + this.image = new _xfa_object.XFAObjectArray(); + this.integer = new _xfa_object.XFAObjectArray(); + this.text = new _xfa_object.XFAObjectArray(); + this.time = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$toHTML]() { + const output = []; + for (const child of this[_xfa_object.$getChildren]()) { + output.push(child[_xfa_object.$text]()); + } + return _utils.HTMLResult.success(output); + } +} +exports.Items = Items; +class Keep extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "keep", true); + this.id = attributes.id || ""; + const options = ["none", "contentArea", "pageArea"]; + this.intact = (0, _utils.getStringOption)(attributes.intact, options); + this.next = (0, _utils.getStringOption)(attributes.next, options); + this.previous = (0, _utils.getStringOption)(attributes.previous, options); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } +} +class KeyUsage extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "keyUsage"); + const options = ["", "yes", "no"]; + this.crlSign = (0, _utils.getStringOption)(attributes.crlSign, options); + this.dataEncipherment = (0, _utils.getStringOption)(attributes.dataEncipherment, options); + this.decipherOnly = (0, _utils.getStringOption)(attributes.decipherOnly, options); + this.digitalSignature = (0, _utils.getStringOption)(attributes.digitalSignature, options); + this.encipherOnly = (0, _utils.getStringOption)(attributes.encipherOnly, options); + this.id = attributes.id || ""; + this.keyAgreement = (0, _utils.getStringOption)(attributes.keyAgreement, options); + this.keyCertSign = (0, _utils.getStringOption)(attributes.keyCertSign, options); + this.keyEncipherment = (0, _utils.getStringOption)(attributes.keyEncipherment, options); + this.nonRepudiation = (0, _utils.getStringOption)(attributes.nonRepudiation, options); + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Line extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "line", true); + this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.slope = (0, _utils.getStringOption)(attributes.slope, ["\\", "/"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.edge = null; + } + [_xfa_object.$toHTML]() { + const parent = this[_xfa_object.$getParent]()[_xfa_object.$getParent](); + const edge = this.edge || new Edge({}); + const edgeStyle = edge[_xfa_object.$toStyle](); + const style = Object.create(null); + const thickness = edge.presence === "visible" ? edge.thickness : 0; + style.strokeWidth = (0, _html_utils.measureToString)(thickness); + style.stroke = edgeStyle.color; + let x1, y1, x2, y2; + let width = "100%"; + let height = "100%"; + if (parent.w <= thickness) { + [x1, y1, x2, y2] = ["50%", 0, "50%", "100%"]; + width = style.strokeWidth; + } else if (parent.h <= thickness) { + [x1, y1, x2, y2] = [0, "50%", "100%", "50%"]; + height = style.strokeWidth; + } else { + if (this.slope === "\\") { + [x1, y1, x2, y2] = [0, 0, "100%", "100%"]; + } else { + [x1, y1, x2, y2] = [0, "100%", "100%", 0]; + } + } + const line = { + name: "line", + attributes: { + xmlns: SVG_NS, + x1, + y1, + x2, + y2, + style + } + }; + const svg = { + name: "svg", + children: [line], + attributes: { + xmlns: SVG_NS, + width, + height, + style: { + overflow: "visible" + } + } + }; + if (hasMargin(parent)) { + return _utils.HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return _utils.HTMLResult.success(svg); + } +} +class Linear extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "linear", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [_xfa_object.$toStyle](startColor) { + startColor = startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF"; + const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase(); + const endColor = this.color ? this.color[_xfa_object.$toStyle]() : "#000000"; + return `linear-gradient(${transf}, ${startColor}, ${endColor})`; + } +} +class LockDocument extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "lockDocument"); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = (0, _utils.getStringOption)(this[_xfa_object.$content], ["auto", "0", "1"]); + } +} +class Manifest extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "manifest", true); + this.action = (0, _utils.getStringOption)(attributes.action, ["include", "all", "exclude"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.ref = new _xfa_object.XFAObjectArray(); + } +} +class Margin extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "margin", true); + this.bottomInset = (0, _utils.getMeasurement)(attributes.bottomInset, "0"); + this.id = attributes.id || ""; + this.leftInset = (0, _utils.getMeasurement)(attributes.leftInset, "0"); + this.rightInset = (0, _utils.getMeasurement)(attributes.rightInset, "0"); + this.topInset = (0, _utils.getMeasurement)(attributes.topInset, "0"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [_xfa_object.$toStyle]() { + return { + margin: (0, _html_utils.measureToString)(this.topInset) + " " + (0, _html_utils.measureToString)(this.rightInset) + " " + (0, _html_utils.measureToString)(this.bottomInset) + " " + (0, _html_utils.measureToString)(this.leftInset) + }; + } +} +class Mdp extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "mdp"); + this.id = attributes.id || ""; + this.permissions = (0, _utils.getInteger)({ + data: attributes.permissions, + defaultValue: 2, + validate: x => x === 1 || x === 3 + }); + this.signatureType = (0, _utils.getStringOption)(attributes.signatureType, ["filler", "author"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Medium extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "medium"); + this.id = attributes.id || ""; + this.imagingBBox = (0, _utils.getBBox)(attributes.imagingBBox); + this.long = (0, _utils.getMeasurement)(attributes.long); + this.orientation = (0, _utils.getStringOption)(attributes.orientation, ["portrait", "landscape"]); + this.short = (0, _utils.getMeasurement)(attributes.short); + this.stock = attributes.stock || ""; + this.trayIn = (0, _utils.getStringOption)(attributes.trayIn, ["auto", "delegate", "pageFront"]); + this.trayOut = (0, _utils.getStringOption)(attributes.trayOut, ["auto", "delegate"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Message extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "message", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.text = new _xfa_object.XFAObjectArray(); + } +} +class NumericEdit extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "numericEdit", true); + this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [_xfa_object.$toHTML](availableSpace) { + const style = (0, _html_utils.toStyle)(this, "border", "font", "margin"); + const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[_xfa_object.$uid], + dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || field[_xfa_object.$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return _utils.HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Occur extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "occur", true); + this.id = attributes.id || ""; + this.initial = attributes.initial !== "" ? (0, _utils.getInteger)({ + data: attributes.initial, + defaultValue: "", + validate: x => true + }) : ""; + this.max = attributes.max !== "" ? (0, _utils.getInteger)({ + data: attributes.max, + defaultValue: 1, + validate: x => true + }) : ""; + this.min = attributes.min !== "" ? (0, _utils.getInteger)({ + data: attributes.min, + defaultValue: 1, + validate: x => true + }) : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [_xfa_object.$clean]() { + const parent = this[_xfa_object.$getParent](); + const originalMin = this.min; + if (this.min === "") { + this.min = parent instanceof PageArea || parent instanceof PageSet ? 0 : 1; + } + if (this.max === "") { + if (originalMin === "") { + this.max = parent instanceof PageArea || parent instanceof PageSet ? -1 : 1; + } else { + this.max = this.min; + } + } + if (this.max !== -1 && this.max < this.min) { + this.max = this.min; + } + if (this.initial === "") { + this.initial = parent instanceof Template ? 1 : this.min; + } + } +} +class Oid extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "oid"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Oids extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "oids", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.oid = new _xfa_object.XFAObjectArray(); + } +} +class Overflow extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "overflow"); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; + this.target = attributes.target || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$getExtra]() { + if (!this[_xfa_object.$extra]) { + const parent = this[_xfa_object.$getParent](); + const root = this[_xfa_object.$getTemplateRoot](); + const target = root[_xfa_object.$searchNode](this.target, parent); + const leader = root[_xfa_object.$searchNode](this.leader, parent); + const trailer = root[_xfa_object.$searchNode](this.trailer, parent); + this[_xfa_object.$extra] = { + target: target && target[0] || null, + leader: leader && leader[0] || null, + trailer: trailer && trailer[0] || null, + addLeader: false, + addTrailer: false + }; + } + return this[_xfa_object.$extra]; + } +} +class PageArea extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageArea", true); + this.blankOrNotBlank = (0, _utils.getStringOption)(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]); + this.id = attributes.id || ""; + this.initialNumber = (0, _utils.getInteger)({ + data: attributes.initialNumber, + defaultValue: 1, + validate: x => true + }); + this.name = attributes.name || ""; + this.numbered = (0, _utils.getInteger)({ + data: attributes.numbered, + defaultValue: 1, + validate: x => true + }); + this.oddOrEven = (0, _utils.getStringOption)(attributes.oddOrEven, ["any", "even", "odd"]); + this.pagePosition = (0, _utils.getStringOption)(attributes.pagePosition, ["any", "first", "last", "only", "rest"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.desc = null; + this.extras = null; + this.medium = null; + this.occur = null; + this.area = new _xfa_object.XFAObjectArray(); + this.contentArea = new _xfa_object.XFAObjectArray(); + this.draw = new _xfa_object.XFAObjectArray(); + this.exclGroup = new _xfa_object.XFAObjectArray(); + this.field = new _xfa_object.XFAObjectArray(); + this.subform = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$isUsable]() { + if (!this[_xfa_object.$extra]) { + this[_xfa_object.$extra] = { + numberOfUse: 0 + }; + return true; + } + return !this.occur || this.occur.max === -1 || this[_xfa_object.$extra].numberOfUse < this.occur.max; + } + [_xfa_object.$cleanPage]() { + delete this[_xfa_object.$extra]; + } + [_xfa_object.$getNextPage]() { + if (!this[_xfa_object.$extra]) { + this[_xfa_object.$extra] = { + numberOfUse: 0 + }; + } + const parent = this[_xfa_object.$getParent](); + if (parent.relation === "orderedOccurrence") { + if (this[_xfa_object.$isUsable]()) { + this[_xfa_object.$extra].numberOfUse += 1; + return this; + } + } + return parent[_xfa_object.$getNextPage](); + } + [_xfa_object.$getAvailableSpace]() { + return this[_xfa_object.$extra].space || { + width: 0, + height: 0 + }; + } + [_xfa_object.$toHTML]() { + if (!this[_xfa_object.$extra]) { + this[_xfa_object.$extra] = { + numberOfUse: 1 + }; + } + const children = []; + this[_xfa_object.$extra].children = children; + const style = Object.create(null); + if (this.medium && this.medium.short && this.medium.long) { + style.width = (0, _html_utils.measureToString)(this.medium.short); + style.height = (0, _html_utils.measureToString)(this.medium.long); + this[_xfa_object.$extra].space = { + width: this.medium.short, + height: this.medium.long + }; + if (this.medium.orientation === "landscape") { + const x = style.width; + style.width = style.height; + style.height = x; + this[_xfa_object.$extra].space = { + width: this.medium.long, + height: this.medium.short + }; + } + } else { + (0, _util.warn)("XFA - No medium specified in pageArea: please file a bug."); + } + this[_xfa_object.$childrenToHTML]({ + filter: new Set(["area", "draw", "field", "subform"]), + include: true + }); + this[_xfa_object.$childrenToHTML]({ + filter: new Set(["contentArea"]), + include: true + }); + return _utils.HTMLResult.success({ + name: "div", + children, + attributes: { + class: ["xfaPage"], + id: this[_xfa_object.$uid], + style, + xfaName: this.name + } + }); + } +} +class PageSet extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageSet", true); + this.duplexImposition = (0, _utils.getStringOption)(attributes.duplexImposition, ["longEdge", "shortEdge"]); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = (0, _utils.getStringOption)(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.occur = null; + this.pageArea = new _xfa_object.XFAObjectArray(); + this.pageSet = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$cleanPage]() { + for (const page of this.pageArea.children) { + page[_xfa_object.$cleanPage](); + } + for (const page of this.pageSet.children) { + page[_xfa_object.$cleanPage](); + } + } + [_xfa_object.$isUsable]() { + return !this.occur || this.occur.max === -1 || this[_xfa_object.$extra].numberOfUse < this.occur.max; + } + [_xfa_object.$getNextPage]() { + if (!this[_xfa_object.$extra]) { + this[_xfa_object.$extra] = { + numberOfUse: 1, + pageIndex: -1, + pageSetIndex: -1 + }; + } + if (this.relation === "orderedOccurrence") { + if (this[_xfa_object.$extra].pageIndex + 1 < this.pageArea.children.length) { + this[_xfa_object.$extra].pageIndex += 1; + const pageArea = this.pageArea.children[this[_xfa_object.$extra].pageIndex]; + return pageArea[_xfa_object.$getNextPage](); + } + if (this[_xfa_object.$extra].pageSetIndex + 1 < this.pageSet.children.length) { + this[_xfa_object.$extra].pageSetIndex += 1; + return this.pageSet.children[this[_xfa_object.$extra].pageSetIndex][_xfa_object.$getNextPage](); + } + if (this[_xfa_object.$isUsable]()) { + this[_xfa_object.$extra].numberOfUse += 1; + this[_xfa_object.$extra].pageIndex = -1; + this[_xfa_object.$extra].pageSetIndex = -1; + return this[_xfa_object.$getNextPage](); + } + const parent = this[_xfa_object.$getParent](); + if (parent instanceof PageSet) { + return parent[_xfa_object.$getNextPage](); + } + this[_xfa_object.$cleanPage](); + return this[_xfa_object.$getNextPage](); + } + const pageNumber = this[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].pageNumber; + const parity = pageNumber % 2 === 0 ? "even" : "odd"; + const position = pageNumber === 0 ? "first" : "rest"; + let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position); + if (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position); + if (page) { + return page; + } + page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any"); + if (page) { + return page; + } + return this.pageArea.children[0]; + } +} +class Para extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "para", true); + this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.lineHeight = attributes.lineHeight ? (0, _utils.getMeasurement)(attributes.lineHeight, "0pt") : ""; + this.marginLeft = attributes.marginLeft ? (0, _utils.getMeasurement)(attributes.marginLeft, "0pt") : ""; + this.marginRight = attributes.marginRight ? (0, _utils.getMeasurement)(attributes.marginRight, "0pt") : ""; + this.orphans = (0, _utils.getInteger)({ + data: attributes.orphans, + defaultValue: 0, + validate: x => x >= 0 + }); + this.preserve = attributes.preserve || ""; + this.radixOffset = attributes.radixOffset ? (0, _utils.getMeasurement)(attributes.radixOffset, "0pt") : ""; + this.spaceAbove = attributes.spaceAbove ? (0, _utils.getMeasurement)(attributes.spaceAbove, "0pt") : ""; + this.spaceBelow = attributes.spaceBelow ? (0, _utils.getMeasurement)(attributes.spaceBelow, "0pt") : ""; + this.tabDefault = attributes.tabDefault ? (0, _utils.getMeasurement)(this.tabDefault) : ""; + this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? (0, _utils.getMeasurement)(x) : x); + this.textIndent = attributes.textIndent ? (0, _utils.getMeasurement)(attributes.textIndent, "0pt") : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vAlign = (0, _utils.getStringOption)(attributes.vAlign, ["top", "bottom", "middle"]); + this.widows = (0, _utils.getInteger)({ + data: attributes.widows, + defaultValue: 0, + validate: x => x >= 0 + }); + this.hyphenation = null; + } + [_xfa_object.$toStyle]() { + const style = (0, _html_utils.toStyle)(this, "hAlign"); + if (this.marginLeft !== "") { + style.paddingLeft = (0, _html_utils.measureToString)(this.marginLeft); + } + if (this.marginRight !== "") { + style.paddingight = (0, _html_utils.measureToString)(this.marginRight); + } + if (this.spaceAbove !== "") { + style.paddingTop = (0, _html_utils.measureToString)(this.spaceAbove); + } + if (this.spaceBelow !== "") { + style.paddingBottom = (0, _html_utils.measureToString)(this.spaceBelow); + } + if (this.textIndent !== "") { + style.textIndent = (0, _html_utils.measureToString)(this.textIndent); + (0, _html_utils.fixTextIndent)(style); + } + if (this.lineHeight > 0) { + style.lineHeight = (0, _html_utils.measureToString)(this.lineHeight); + } + if (this.tabDefault !== "") { + style.tabSize = (0, _html_utils.measureToString)(this.tabDefault); + } + if (this.tabStops.length > 0) {} + if (this.hyphenatation) { + Object.assign(style, this.hyphenatation[_xfa_object.$toStyle]()); + } + return style; + } +} +class PasswordEdit extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "passwordEdit", true); + this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.passwordChar = attributes.passwordChar || "*"; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.margin = null; + } +} +class Pattern extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "pattern", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [_xfa_object.$toStyle](startColor) { + startColor = startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[_xfa_object.$toStyle]() : "#000000"; + const width = 5; + const cmd = "repeating-linear-gradient"; + const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`; + switch (this.type) { + case "crossHatch": + return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`; + case "crossDiagonal": + return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`; + case "diagonalLeft": + return `${cmd}(45deg,${colors})`; + case "diagonalRight": + return `${cmd}(-45deg,${colors})`; + case "horizontal": + return `${cmd}(to top,${colors})`; + case "vertical": + return `${cmd}(to right,${colors})`; + } + return ""; + } +} +class Picture extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "picture"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Proto extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "proto", true); + this.appearanceFilter = new _xfa_object.XFAObjectArray(); + this.arc = new _xfa_object.XFAObjectArray(); + this.area = new _xfa_object.XFAObjectArray(); + this.assist = new _xfa_object.XFAObjectArray(); + this.barcode = new _xfa_object.XFAObjectArray(); + this.bindItems = new _xfa_object.XFAObjectArray(); + this.bookend = new _xfa_object.XFAObjectArray(); + this.boolean = new _xfa_object.XFAObjectArray(); + this.border = new _xfa_object.XFAObjectArray(); + this.break = new _xfa_object.XFAObjectArray(); + this.breakAfter = new _xfa_object.XFAObjectArray(); + this.breakBefore = new _xfa_object.XFAObjectArray(); + this.button = new _xfa_object.XFAObjectArray(); + this.calculate = new _xfa_object.XFAObjectArray(); + this.caption = new _xfa_object.XFAObjectArray(); + this.certificate = new _xfa_object.XFAObjectArray(); + this.certificates = new _xfa_object.XFAObjectArray(); + this.checkButton = new _xfa_object.XFAObjectArray(); + this.choiceList = new _xfa_object.XFAObjectArray(); + this.color = new _xfa_object.XFAObjectArray(); + this.comb = new _xfa_object.XFAObjectArray(); + this.connect = new _xfa_object.XFAObjectArray(); + this.contentArea = new _xfa_object.XFAObjectArray(); + this.corner = new _xfa_object.XFAObjectArray(); + this.date = new _xfa_object.XFAObjectArray(); + this.dateTime = new _xfa_object.XFAObjectArray(); + this.dateTimeEdit = new _xfa_object.XFAObjectArray(); + this.decimal = new _xfa_object.XFAObjectArray(); + this.defaultUi = new _xfa_object.XFAObjectArray(); + this.desc = new _xfa_object.XFAObjectArray(); + this.digestMethod = new _xfa_object.XFAObjectArray(); + this.digestMethods = new _xfa_object.XFAObjectArray(); + this.draw = new _xfa_object.XFAObjectArray(); + this.edge = new _xfa_object.XFAObjectArray(); + this.encoding = new _xfa_object.XFAObjectArray(); + this.encodings = new _xfa_object.XFAObjectArray(); + this.encrypt = new _xfa_object.XFAObjectArray(); + this.encryptData = new _xfa_object.XFAObjectArray(); + this.encryption = new _xfa_object.XFAObjectArray(); + this.encryptionMethod = new _xfa_object.XFAObjectArray(); + this.encryptionMethods = new _xfa_object.XFAObjectArray(); + this.event = new _xfa_object.XFAObjectArray(); + this.exData = new _xfa_object.XFAObjectArray(); + this.exObject = new _xfa_object.XFAObjectArray(); + this.exclGroup = new _xfa_object.XFAObjectArray(); + this.execute = new _xfa_object.XFAObjectArray(); + this.extras = new _xfa_object.XFAObjectArray(); + this.field = new _xfa_object.XFAObjectArray(); + this.fill = new _xfa_object.XFAObjectArray(); + this.filter = new _xfa_object.XFAObjectArray(); + this.float = new _xfa_object.XFAObjectArray(); + this.font = new _xfa_object.XFAObjectArray(); + this.format = new _xfa_object.XFAObjectArray(); + this.handler = new _xfa_object.XFAObjectArray(); + this.hyphenation = new _xfa_object.XFAObjectArray(); + this.image = new _xfa_object.XFAObjectArray(); + this.imageEdit = new _xfa_object.XFAObjectArray(); + this.integer = new _xfa_object.XFAObjectArray(); + this.issuers = new _xfa_object.XFAObjectArray(); + this.items = new _xfa_object.XFAObjectArray(); + this.keep = new _xfa_object.XFAObjectArray(); + this.keyUsage = new _xfa_object.XFAObjectArray(); + this.line = new _xfa_object.XFAObjectArray(); + this.linear = new _xfa_object.XFAObjectArray(); + this.lockDocument = new _xfa_object.XFAObjectArray(); + this.manifest = new _xfa_object.XFAObjectArray(); + this.margin = new _xfa_object.XFAObjectArray(); + this.mdp = new _xfa_object.XFAObjectArray(); + this.medium = new _xfa_object.XFAObjectArray(); + this.message = new _xfa_object.XFAObjectArray(); + this.numericEdit = new _xfa_object.XFAObjectArray(); + this.occur = new _xfa_object.XFAObjectArray(); + this.oid = new _xfa_object.XFAObjectArray(); + this.oids = new _xfa_object.XFAObjectArray(); + this.overflow = new _xfa_object.XFAObjectArray(); + this.pageArea = new _xfa_object.XFAObjectArray(); + this.pageSet = new _xfa_object.XFAObjectArray(); + this.para = new _xfa_object.XFAObjectArray(); + this.passwordEdit = new _xfa_object.XFAObjectArray(); + this.pattern = new _xfa_object.XFAObjectArray(); + this.picture = new _xfa_object.XFAObjectArray(); + this.radial = new _xfa_object.XFAObjectArray(); + this.reason = new _xfa_object.XFAObjectArray(); + this.reasons = new _xfa_object.XFAObjectArray(); + this.rectangle = new _xfa_object.XFAObjectArray(); + this.ref = new _xfa_object.XFAObjectArray(); + this.script = new _xfa_object.XFAObjectArray(); + this.setProperty = new _xfa_object.XFAObjectArray(); + this.signData = new _xfa_object.XFAObjectArray(); + this.signature = new _xfa_object.XFAObjectArray(); + this.signing = new _xfa_object.XFAObjectArray(); + this.solid = new _xfa_object.XFAObjectArray(); + this.speak = new _xfa_object.XFAObjectArray(); + this.stipple = new _xfa_object.XFAObjectArray(); + this.subform = new _xfa_object.XFAObjectArray(); + this.subformSet = new _xfa_object.XFAObjectArray(); + this.subjectDN = new _xfa_object.XFAObjectArray(); + this.subjectDNs = new _xfa_object.XFAObjectArray(); + this.submit = new _xfa_object.XFAObjectArray(); + this.text = new _xfa_object.XFAObjectArray(); + this.textEdit = new _xfa_object.XFAObjectArray(); + this.time = new _xfa_object.XFAObjectArray(); + this.timeStamp = new _xfa_object.XFAObjectArray(); + this.toolTip = new _xfa_object.XFAObjectArray(); + this.traversal = new _xfa_object.XFAObjectArray(); + this.traverse = new _xfa_object.XFAObjectArray(); + this.ui = new _xfa_object.XFAObjectArray(); + this.validate = new _xfa_object.XFAObjectArray(); + this.value = new _xfa_object.XFAObjectArray(); + this.variables = new _xfa_object.XFAObjectArray(); + } +} +class Radial extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "radial", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["toEdge", "toCenter"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [_xfa_object.$toStyle](startColor) { + startColor = startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[_xfa_object.$toStyle]() : "#000000"; + const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`; + return `radial-gradient(circle at center, ${colors})`; + } +} +class Reason extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "reason"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Reasons extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "reasons", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.reason = new _xfa_object.XFAObjectArray(); + } +} +class Rectangle extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "rectangle", true); + this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.corner = new _xfa_object.XFAObjectArray(4); + this.edge = new _xfa_object.XFAObjectArray(4); + this.fill = null; + } + [_xfa_object.$toHTML]() { + const edge = this.edge.children.length ? this.edge.children[0] : new Edge({}); + const edgeStyle = edge[_xfa_object.$toStyle](); + const style = Object.create(null); + if (this.fill && this.fill.presence === "visible") { + Object.assign(style, this.fill[_xfa_object.$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = (0, _html_utils.measureToString)(edge.presence === "visible" ? edge.thickness : 0); + style.stroke = edgeStyle.color; + const corner = this.corner.children.length ? this.corner.children[0] : new Corner({}); + const cornerStyle = corner[_xfa_object.$toStyle](); + const rect = { + name: "rect", + attributes: { + xmlns: SVG_NS, + width: "100%", + height: "100%", + x: 0, + y: 0, + rx: cornerStyle.radius, + ry: cornerStyle.radius, + style + } + }; + const svg = { + name: "svg", + children: [rect], + attributes: { + xmlns: SVG_NS, + style: { + overflow: "visible" + }, + width: "100%", + height: "100%" + } + }; + const parent = this[_xfa_object.$getParent]()[_xfa_object.$getParent](); + if (hasMargin(parent)) { + return _utils.HTMLResult.success({ + name: "div", + attributes: { + style: { + display: "inline", + width: "100%", + height: "100%" + } + }, + children: [svg] + }); + } + svg.attributes.style.position = "absolute"; + return _utils.HTMLResult.success(svg); + } +} +class RefElement extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ref"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Script extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "script"); + this.binding = attributes.binding || ""; + this.contentType = attributes.contentType || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.runAt = (0, _utils.getStringOption)(attributes.runAt, ["client", "both", "server"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SetProperty extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "setProperty"); + this.connection = attributes.connection || ""; + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; + } +} +exports.SetProperty = SetProperty; +class SignData extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signData", true); + this.id = attributes.id || ""; + this.operation = (0, _utils.getStringOption)(attributes.operation, ["sign", "clear", "verify"]); + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.filter = null; + this.manifest = null; + } +} +class Signature extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signature", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["PDF1.3", "PDF1.6"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.border = null; + this.extras = null; + this.filter = null; + this.manifest = null; + this.margin = null; + } +} +class Signing extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "signing", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.certificate = new _xfa_object.XFAObjectArray(); + } +} +class Solid extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "solid", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + } + [_xfa_object.$toStyle](startColor) { + return startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF"; + } +} +class Speak extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "speak"); + this.disable = (0, _utils.getInteger)({ + data: attributes.disable, + defaultValue: 0, + validate: x => x === 1 + }); + this.id = attributes.id || ""; + this.priority = (0, _utils.getStringOption)(attributes.priority, ["custom", "caption", "name", "toolTip"]); + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Stipple extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "stipple", true); + this.id = attributes.id || ""; + this.rate = (0, _utils.getInteger)({ + data: attributes.rate, + defaultValue: 50, + validate: x => x >= 0 && x <= 100 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.color = null; + this.extras = null; + } + [_xfa_object.$toStyle](bgColor) { + const alpha = this.rate / 100; + return _util.Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha)); + } +} +class Subform extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subform", true); + this.access = (0, _utils.getStringOption)(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); + this.allowMacro = (0, _utils.getInteger)({ + data: attributes.allowMacro, + defaultValue: 0, + validate: x => x === 1 + }); + this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); + this.colSpan = (0, _utils.getInteger)({ + data: attributes.colSpan, + defaultValue: 1, + validate: n => n >= 1 || n === -1 + }); + this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : (0, _utils.getMeasurement)(x)); + this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : ""; + this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); + this.id = attributes.id || ""; + this.layout = (0, _utils.getStringOption)(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); + this.locale = attributes.locale || ""; + this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt"); + this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt"); + this.mergeMode = (0, _utils.getStringOption)(attributes.mergeMode, ["consumeData", "matchTemplate"]); + this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt"); + this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.restoreState = (0, _utils.getStringOption)(attributes.restoreState, ["manual", "auto"]); + this.scope = (0, _utils.getStringOption)(attributes.scope, ["name", "none"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : ""; + this.x = (0, _utils.getMeasurement)(attributes.x, "0pt"); + this.y = (0, _utils.getMeasurement)(attributes.y, "0pt"); + this.assist = null; + this.bind = null; + this.bookend = null; + this.border = null; + this.break = null; + this.calculate = null; + this.desc = null; + this.extras = null; + this.keep = null; + this.margin = null; + this.occur = null; + this.overflow = null; + this.pageSet = null; + this.para = null; + this.traversal = null; + this.validate = null; + this.variables = null; + this.area = new _xfa_object.XFAObjectArray(); + this.breakAfter = new _xfa_object.XFAObjectArray(); + this.breakBefore = new _xfa_object.XFAObjectArray(); + this.connect = new _xfa_object.XFAObjectArray(); + this.draw = new _xfa_object.XFAObjectArray(); + this.event = new _xfa_object.XFAObjectArray(); + this.exObject = new _xfa_object.XFAObjectArray(); + this.exclGroup = new _xfa_object.XFAObjectArray(); + this.field = new _xfa_object.XFAObjectArray(); + this.proto = new _xfa_object.XFAObjectArray(); + this.setProperty = new _xfa_object.XFAObjectArray(); + this.subform = new _xfa_object.XFAObjectArray(); + this.subformSet = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$getSubformParent]() { + const parent = this[_xfa_object.$getParent](); + if (parent instanceof SubformSet) { + return parent[_xfa_object.$getSubformParent](); + } + return parent; + } + [_xfa_object.$isBindable]() { + return true; + } + [_xfa_object.$isThereMoreWidth]() { + return this.layout.endsWith("-tb") && this[_xfa_object.$extra].attempt === 0 && this[_xfa_object.$extra].numberInLine > 0 || this[_xfa_object.$getParent]()[_xfa_object.$isThereMoreWidth](); + } + *[_xfa_object.$getContainedChildren]() { + yield* getContainedChildren(this); + } + [_xfa_object.$flushHTML]() { + return (0, _layout.flushHTML)(this); + } + [_xfa_object.$addHTML](html, bbox) { + (0, _layout.addHTML)(this, html, bbox); + } + [_xfa_object.$getAvailableSpace]() { + return (0, _layout.getAvailableSpace)(this); + } + [_xfa_object.$isSplittable]() { + const parent = this[_xfa_object.$getSubformParent](); + if (!parent[_xfa_object.$isSplittable]()) { + return false; + } + if (this[_xfa_object.$extra]._isSplittable !== undefined) { + return this[_xfa_object.$extra]._isSplittable; + } + if (this.layout === "position" || this.layout.includes("row")) { + this[_xfa_object.$extra]._isSplittable = false; + return false; + } + if (this.keep && this.keep.intact !== "none") { + this[_xfa_object.$extra]._isSplittable = false; + return false; + } + if (parent.layout && parent.layout.endsWith("-tb") && parent[_xfa_object.$extra].numberInLine !== 0) { + return false; + } + this[_xfa_object.$extra]._isSplittable = true; + return true; + } + [_xfa_object.$toHTML](availableSpace) { + setTabIndex(this); + if (this.break) { + if (this.break.after !== "auto" || this.break.afterTarget !== "") { + const node = new BreakAfter({ + targetType: this.break.after, + target: this.break.afterTarget, + startNew: this.break.startNew.toString() + }); + node[_xfa_object.$globalData] = this[_xfa_object.$globalData]; + this[_xfa_object.$appendChild](node); + this.breakAfter.push(node); + } + if (this.break.before !== "auto" || this.break.beforeTarget !== "") { + const node = new BreakBefore({ + targetType: this.break.before, + target: this.break.beforeTarget, + startNew: this.break.startNew.toString() + }); + node[_xfa_object.$globalData] = this[_xfa_object.$globalData]; + this[_xfa_object.$appendChild](node); + this.breakBefore.push(node); + } + if (this.break.overflowTarget !== "") { + const node = new Overflow({ + target: this.break.overflowTarget, + leader: this.break.overflowLeader, + trailer: this.break.overflowTrailer + }); + node[_xfa_object.$globalData] = this[_xfa_object.$globalData]; + this[_xfa_object.$appendChild](node); + this.overflow.push(node); + } + this[_xfa_object.$removeChild](this.break); + this.break = null; + } + if (this.presence === "hidden" || this.presence === "inactive") { + return _utils.HTMLResult.EMPTY; + } + if (this.breakBefore.children.length > 1 || this.breakAfter.children.length > 1) { + (0, _util.warn)("XFA - Several breakBefore or breakAfter in subforms: please file a bug."); + } + if (this.breakBefore.children.length >= 1) { + const breakBefore = this.breakBefore.children[0]; + if (handleBreak(breakBefore)) { + return _utils.HTMLResult.breakNode(breakBefore); + } + } + if (this[_xfa_object.$extra] && this[_xfa_object.$extra].afterBreakAfter) { + return _utils.HTMLResult.EMPTY; + } + (0, _html_utils.fixDimensions)(this); + const children = []; + const attributes = { + id: this[_xfa_object.$uid], + class: [] + }; + (0, _html_utils.setAccess)(this, attributes.class); + if (!this[_xfa_object.$extra]) { + this[_xfa_object.$extra] = Object.create(null); + } + Object.assign(this[_xfa_object.$extra], { + children, + line: null, + attributes, + attempt: 0, + numberInLine: 0, + availableSpace: { + width: Math.min(this.w || Infinity, availableSpace.width), + height: Math.min(this.h || Infinity, availableSpace.height) + }, + width: 0, + height: 0, + prevHeight: 0, + currentWidth: 0 + }); + const root = this[_xfa_object.$getTemplateRoot](); + const savedNoLayoutFailure = root[_xfa_object.$extra].noLayoutFailure; + const isSplittable = this[_xfa_object.$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!(0, _layout.checkDimensions)(this, availableSpace)) { + return _utils.HTMLResult.FAILURE; + } + const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]); + if (this.layout.includes("row")) { + const columnWidths = this[_xfa_object.$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[_xfa_object.$extra].columnWidths = columnWidths; + this[_xfa_object.$extra].currentColumn = 0; + } + } + const style = (0, _html_utils.toStyle)(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); + const classNames = ["xfaSubform"]; + const cl = (0, _html_utils.layoutClass)(this); + if (cl) { + classNames.push(cl); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } + if (this.overflow) { + const overflowExtra = this.overflow[_xfa_object.$getExtra](); + if (overflowExtra.addLeader) { + overflowExtra.addLeader = false; + handleOverflow(this, overflowExtra.leader, availableSpace); + } + } + this[_xfa_object.$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[_xfa_object.$extra].attempt < maxRun; this[_xfa_object.$extra].attempt++) { + if (isLrTb && this[_xfa_object.$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[_xfa_object.$extra].numberInLine = 0; + } + const result = this[_xfa_object.$childrenToHTML]({ + filter, + include: true + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[_xfa_object.$popPara](); + return result; + } + if (isLrTb && this[_xfa_object.$extra].attempt === 0 && this[_xfa_object.$extra].numberInLine === 0 && !root[_xfa_object.$extra].noLayoutFailure) { + this[_xfa_object.$extra].attempt = maxRun; + break; + } + } + this[_xfa_object.$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + root[_xfa_object.$extra].noLayoutFailure = savedNoLayoutFailure; + if (this[_xfa_object.$extra].attempt === maxRun) { + if (this.overflow) { + this[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].overflowNode = this.overflow; + } + if (!isSplittable) { + delete this[_xfa_object.$extra]; + } + return _utils.HTMLResult.FAILURE; + } + if (this.overflow) { + const overflowExtra = this.overflow[_xfa_object.$getExtra](); + if (overflowExtra.addTrailer) { + overflowExtra.addTrailer = false; + handleOverflow(this, overflowExtra.trailer, availableSpace); + } + } + let marginH = 0; + let marginV = 0; + if (this.margin) { + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; + } + const width = Math.max(this[_xfa_object.$extra].width + marginH, this.w || 0); + const height = Math.max(this[_xfa_object.$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = (0, _html_utils.measureToString)(width); + } + if (this.h === "") { + style.height = (0, _html_utils.measureToString)(height); + } + if ((style.width === "0px" || style.height === "0px") && children.length === 0) { + return _utils.HTMLResult.EMPTY; + } + const html = { + name: "div", + attributes, + children + }; + applyAssist(this, attributes); + const result = _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox); + if (this.breakAfter.children.length >= 1) { + const breakAfter = this.breakAfter.children[0]; + if (handleBreak(breakAfter)) { + this[_xfa_object.$extra].afterBreakAfter = result; + return _utils.HTMLResult.breakNode(breakAfter); + } + } + delete this[_xfa_object.$extra]; + return result; + } +} +class SubformSet extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subformSet", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = (0, _utils.getStringOption)(attributes.relation, ["ordered", "choice", "unordered"]); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.bookend = null; + this.break = null; + this.desc = null; + this.extras = null; + this.occur = null; + this.overflow = null; + this.breakAfter = new _xfa_object.XFAObjectArray(); + this.breakBefore = new _xfa_object.XFAObjectArray(); + this.subform = new _xfa_object.XFAObjectArray(); + this.subformSet = new _xfa_object.XFAObjectArray(); + } + *[_xfa_object.$getContainedChildren]() { + yield* getContainedChildren(this); + } + [_xfa_object.$getSubformParent]() { + let parent = this[_xfa_object.$getParent](); + while (!(parent instanceof Subform)) { + parent = parent[_xfa_object.$getParent](); + } + return parent; + } + [_xfa_object.$isBindable]() { + return true; + } +} +class SubjectDN extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDN"); + this.delimiter = attributes.delimiter || ","; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = new Map(this[_xfa_object.$content].split(this.delimiter).map(kv => { + kv = kv.split("=", 2); + kv[0] = kv[0].trim(); + return kv; + })); + } +} +class SubjectDNs extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDNs", true); + this.id = attributes.id || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.subjectDN = new _xfa_object.XFAObjectArray(); + } +} +class Submit extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "submit", true); + this.embedPDF = (0, _utils.getInteger)({ + data: attributes.embedPDF, + defaultValue: 0, + validate: x => x === 1 + }); + this.format = (0, _utils.getStringOption)(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]); + this.id = attributes.id || ""; + this.target = attributes.target || ""; + this.textEncoding = (0, _utils.getKeyword)({ + data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "", + defaultValue: "", + validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.xdpContent = attributes.xdpContent || ""; + this.encrypt = null; + this.encryptData = new _xfa_object.XFAObjectArray(); + this.signData = new _xfa_object.XFAObjectArray(); + } +} +class Template extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "template", true); + this.baseProfile = (0, _utils.getStringOption)(attributes.baseProfile, ["full", "interactiveForms"]); + this.extras = null; + this.subform = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$finalize]() { + if (this.subform.children.length === 0) { + (0, _util.warn)("XFA - No subforms in template node."); + } + if (this.subform.children.length >= 2) { + (0, _util.warn)("XFA - Several subforms in template node: please file a bug."); + } + this[_xfa_object.$tabIndex] = DEFAULT_TAB_INDEX; + } + [_xfa_object.$isSplittable]() { + return true; + } + [_xfa_object.$searchNode](expr, container) { + if (expr.startsWith("#")) { + return [this[_xfa_object.$ids].get(expr.slice(1))]; + } + return (0, _som.searchNode)(this, container, expr, true, true); + } + *[_xfa_object.$toPages]() { + if (!this.subform.children.length) { + return _utils.HTMLResult.success({ + name: "div", + children: [] + }); + } + this[_xfa_object.$extra] = { + overflowNode: null, + firstUnsplittable: null, + currentContentArea: null, + currentPageArea: null, + noLayoutFailure: false, + pageNumber: 1, + pagePosition: "first", + oddOrEven: "odd", + blankOrNotBlank: "nonBlank", + paraStack: [] + }; + const root = this.subform.children[0]; + root.pageSet[_xfa_object.$cleanPage](); + const pageAreas = root.pageSet.pageArea.children; + const mainHtml = { + name: "div", + children: [] + }; + let pageArea = null; + let breakBefore = null; + let breakBeforeTarget = null; + if (root.breakBefore.children.length >= 1) { + breakBefore = root.breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) { + breakBefore = root.subform.children[0].breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.break && root.break.beforeTarget) { + breakBefore = root.break; + breakBeforeTarget = breakBefore.beforeTarget; + } else if (root.subform.children.length >= 1 && root.subform.children[0].break && root.subform.children[0].break.beforeTarget) { + breakBefore = root.subform.children[0].break; + breakBeforeTarget = breakBefore.beforeTarget; + } + if (breakBefore) { + const target = this[_xfa_object.$searchNode](breakBeforeTarget, breakBefore[_xfa_object.$getParent]()); + if (target instanceof PageArea) { + pageArea = target; + breakBefore[_xfa_object.$extra] = {}; + } + } + if (!pageArea) { + pageArea = pageAreas[0]; + } + pageArea[_xfa_object.$extra] = { + numberOfUse: 1 + }; + const pageAreaParent = pageArea[_xfa_object.$getParent](); + pageAreaParent[_xfa_object.$extra] = { + numberOfUse: 1, + pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea), + pageSetIndex: 0 + }; + let targetPageArea; + let leader = null; + let trailer = null; + let hasSomething = true; + let hasSomethingCounter = 0; + let startIndex = 0; + while (true) { + if (!hasSomething) { + mainHtml.children.pop(); + if (++hasSomethingCounter === MAX_EMPTY_PAGES) { + (0, _util.warn)("XFA - Something goes wrong: please file a bug."); + return mainHtml; + } + } else { + hasSomethingCounter = 0; + } + targetPageArea = null; + this[_xfa_object.$extra].currentPageArea = pageArea; + const page = pageArea[_xfa_object.$toHTML]().html; + mainHtml.children.push(page); + if (leader) { + this[_xfa_object.$extra].noLayoutFailure = true; + page.children.push(leader[_xfa_object.$toHTML](pageArea[_xfa_object.$extra].space).html); + leader = null; + } + if (trailer) { + this[_xfa_object.$extra].noLayoutFailure = true; + page.children.push(trailer[_xfa_object.$toHTML](pageArea[_xfa_object.$extra].space).html); + trailer = null; + } + const contentAreas = pageArea.contentArea.children; + const htmlContentAreas = page.children.filter(node => node.attributes.class.includes("xfaContentarea")); + hasSomething = false; + this[_xfa_object.$extra].firstUnsplittable = null; + this[_xfa_object.$extra].noLayoutFailure = false; + const flush = index => { + const html = root[_xfa_object.$flushHTML](); + if (html) { + hasSomething = hasSomething || html.children && html.children.length !== 0; + htmlContentAreas[index].children.push(html); + } + }; + for (let i = startIndex, ii = contentAreas.length; i < ii; i++) { + const contentArea = this[_xfa_object.$extra].currentContentArea = contentAreas[i]; + const space = { + width: contentArea.w, + height: contentArea.h + }; + startIndex = 0; + if (leader) { + htmlContentAreas[i].children.push(leader[_xfa_object.$toHTML](space).html); + leader = null; + } + if (trailer) { + htmlContentAreas[i].children.push(trailer[_xfa_object.$toHTML](space).html); + trailer = null; + } + const html = root[_xfa_object.$toHTML](space); + if (html.success) { + if (html.html) { + hasSomething = hasSomething || html.html.children && html.html.children.length !== 0; + htmlContentAreas[i].children.push(html.html); + } else if (!hasSomething && mainHtml.children.length > 1) { + mainHtml.children.pop(); + } + return mainHtml; + } + if (html.isBreak()) { + const node = html.breakNode; + flush(i); + if (node.targetType === "auto") { + continue; + } + if (node.leader) { + leader = this[_xfa_object.$searchNode](node.leader, node[_xfa_object.$getParent]()); + leader = leader ? leader[0] : null; + } + if (node.trailer) { + trailer = this[_xfa_object.$searchNode](node.trailer, node[_xfa_object.$getParent]()); + trailer = trailer ? trailer[0] : null; + } + if (node.targetType === "pageArea") { + targetPageArea = node[_xfa_object.$extra].target; + i = Infinity; + } else if (!node[_xfa_object.$extra].target) { + i = node[_xfa_object.$extra].index; + } else { + targetPageArea = node[_xfa_object.$extra].target; + startIndex = node[_xfa_object.$extra].index + 1; + i = Infinity; + } + continue; + } + if (this[_xfa_object.$extra].overflowNode) { + const node = this[_xfa_object.$extra].overflowNode; + this[_xfa_object.$extra].overflowNode = null; + const overflowExtra = node[_xfa_object.$getExtra](); + const target = overflowExtra.target; + overflowExtra.addLeader = overflowExtra.leader !== null; + overflowExtra.addTrailer = overflowExtra.trailer !== null; + flush(i); + const currentIndex = i; + i = Infinity; + if (target instanceof PageArea) { + targetPageArea = target; + } else if (target instanceof ContentArea) { + const index = contentAreas.indexOf(target); + if (index !== -1) { + if (index > currentIndex) { + i = index - 1; + } else { + startIndex = index; + } + } else { + targetPageArea = target[_xfa_object.$getParent](); + startIndex = targetPageArea.contentArea.children.indexOf(target); + } + } + continue; + } + flush(i); + } + this[_xfa_object.$extra].pageNumber += 1; + if (targetPageArea) { + if (targetPageArea[_xfa_object.$isUsable]()) { + targetPageArea[_xfa_object.$extra].numberOfUse += 1; + } else { + targetPageArea = null; + } + } + pageArea = targetPageArea || pageArea[_xfa_object.$getNextPage](); + yield null; + } + } +} +exports.Template = Template; +class Text extends _xfa_object.ContentObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "text"); + this.id = attributes.id || ""; + this.maxChars = (0, _utils.getInteger)({ + data: attributes.maxChars, + defaultValue: 0, + validate: x => x >= 0 + }); + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$acceptWhitespace]() { + return true; + } + [_xfa_object.$onChild](child) { + if (child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.xhtml.id) { + this[_xfa_object.$content] = child; + return true; + } + (0, _util.warn)(`XFA - Invalid content in Text: ${child[_xfa_object.$nodeName]}.`); + return false; + } + [_xfa_object.$onText](str) { + if (this[_xfa_object.$content] instanceof _xfa_object.XFAObject) { + return; + } + super[_xfa_object.$onText](str); + } + [_xfa_object.$finalize]() { + if (typeof this[_xfa_object.$content] === "string") { + this[_xfa_object.$content] = this[_xfa_object.$content].replace(/\r\n/g, "\n"); + } + } + [_xfa_object.$getExtra]() { + if (typeof this[_xfa_object.$content] === "string") { + return this[_xfa_object.$content].split(/[\u2029\u2028\n]/).reduce((acc, line) => { + if (line) { + acc.push(line); + } + return acc; + }, []).join("\n"); + } + return this[_xfa_object.$content][_xfa_object.$text](); + } + [_xfa_object.$toHTML](availableSpace) { + if (typeof this[_xfa_object.$content] === "string") { + const html = valueToHtml(this[_xfa_object.$content]).html; + if (this[_xfa_object.$content].includes("\u2029")) { + html.name = "div"; + html.children = []; + this[_xfa_object.$content].split("\u2029").map(para => para.split(/[\u2028\n]/).reduce((acc, line) => { + acc.push({ + name: "span", + value: line + }, { + name: "br" + }); + return acc; + }, [])).forEach(lines => { + html.children.push({ + name: "p", + children: lines + }); + }); + } else if (/[\u2028\n]/.test(this[_xfa_object.$content])) { + html.name = "div"; + html.children = []; + this[_xfa_object.$content].split(/[\u2028\n]/).forEach(line => { + html.children.push({ + name: "span", + value: line + }, { + name: "br" + }); + }); + } + return _utils.HTMLResult.success(html); + } + return this[_xfa_object.$content][_xfa_object.$toHTML](availableSpace); + } +} +exports.Text = Text; +class TextEdit extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "textEdit", true); + this.allowRichText = (0, _utils.getInteger)({ + data: attributes.allowRichText, + defaultValue: 0, + validate: x => x === 1 + }); + this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]); + this.id = attributes.id || ""; + this.multiLine = (0, _utils.getInteger)({ + data: attributes.multiLine, + defaultValue: "", + validate: x => x === 0 || x === 1 + }); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vScrollPolicy = (0, _utils.getStringOption)(attributes.vScrollPolicy, ["auto", "off", "on"]); + this.border = null; + this.comb = null; + this.extras = null; + this.margin = null; + } + [_xfa_object.$toHTML](availableSpace) { + const style = (0, _html_utils.toStyle)(this, "border", "font", "margin"); + let html; + const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent](); + if (this.multiLine === "") { + this.multiLine = field instanceof Draw ? 1 : 0; + } + if (this.multiLine === 1) { + html = { + name: "textarea", + attributes: { + dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || field[_xfa_object.$uid], + fieldId: field[_xfa_object.$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + } else { + html = { + name: "input", + attributes: { + type: "text", + dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || field[_xfa_object.$uid], + fieldId: field[_xfa_object.$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false + } + }; + } + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; + } + return _utils.HTMLResult.success({ + name: "label", + attributes: { + class: ["xfaLabel"] + }, + children: [html] + }); + } +} +class Time extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "time"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } + [_xfa_object.$finalize]() { + const date = this[_xfa_object.$content].trim(); + this[_xfa_object.$content] = date ? new Date(date) : null; + } + [_xfa_object.$toHTML](availableSpace) { + return valueToHtml(this[_xfa_object.$content] ? this[_xfa_object.$content].toString() : ""); + } +} +class TimeStamp extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "timeStamp"); + this.id = attributes.id || ""; + this.server = attributes.server || ""; + this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class ToolTip extends _xfa_object.StringObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "toolTip"); + this.id = attributes.id || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Traversal extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "traversal", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.traverse = new _xfa_object.XFAObjectArray(); + } +} +class Traverse extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "traverse", true); + this.id = attributes.id || ""; + this.operation = (0, _utils.getStringOption)(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]); + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.script = null; + } + get name() { + return this.operation; + } + [_xfa_object.$isTransparent]() { + return false; + } +} +class Ui extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "ui", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.picture = null; + this.barcode = null; + this.button = null; + this.checkButton = null; + this.choiceList = null; + this.dateTimeEdit = null; + this.defaultUi = null; + this.imageEdit = null; + this.numericEdit = null; + this.passwordEdit = null; + this.signature = null; + this.textEdit = null; + } + [_xfa_object.$getExtra]() { + if (this[_xfa_object.$extra] === undefined) { + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "picture") { + continue; + } + const obj = this[name]; + if (!(obj instanceof _xfa_object.XFAObject)) { + continue; + } + this[_xfa_object.$extra] = obj; + return obj; + } + this[_xfa_object.$extra] = null; + } + return this[_xfa_object.$extra]; + } + [_xfa_object.$toHTML](availableSpace) { + const obj = this[_xfa_object.$getExtra](); + if (obj) { + return obj[_xfa_object.$toHTML](availableSpace); + } + return _utils.HTMLResult.EMPTY; + } +} +class Validate extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "validate", true); + this.formatTest = (0, _utils.getStringOption)(attributes.formatTest, ["warning", "disabled", "error"]); + this.id = attributes.id || ""; + this.nullTest = (0, _utils.getStringOption)(attributes.nullTest, ["disabled", "error", "warning"]); + this.scriptTest = (0, _utils.getStringOption)(attributes.scriptTest, ["error", "disabled", "warning"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.extras = null; + this.message = null; + this.picture = null; + this.script = null; + } +} +class Value extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "value", true); + this.id = attributes.id || ""; + this.override = (0, _utils.getInteger)({ + data: attributes.override, + defaultValue: 0, + validate: x => x === 1 + }); + this.relevant = (0, _utils.getRelevant)(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.arc = null; + this.boolean = null; + this.date = null; + this.dateTime = null; + this.decimal = null; + this.exData = null; + this.float = null; + this.image = null; + this.integer = null; + this.line = null; + this.rectangle = null; + this.text = null; + this.time = null; + } + [_xfa_object.$setValue](value) { + const parent = this[_xfa_object.$getParent](); + if (parent instanceof Field) { + if (parent.ui && parent.ui.imageEdit) { + if (!this.image) { + this.image = new Image({}); + this[_xfa_object.$appendChild](this.image); + } + this.image[_xfa_object.$content] = value[_xfa_object.$content]; + return; + } + } + const valueName = value[_xfa_object.$nodeName]; + if (this[valueName] !== null) { + this[valueName][_xfa_object.$content] = value[_xfa_object.$content]; + return; + } + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (obj instanceof _xfa_object.XFAObject) { + this[name] = null; + this[_xfa_object.$removeChild](obj); + } + } + this[value[_xfa_object.$nodeName]] = value; + this[_xfa_object.$appendChild](value); + } + [_xfa_object.$text]() { + if (this.exData) { + if (typeof this.exData[_xfa_object.$content] === "string") { + return this.exData[_xfa_object.$content].trim(); + } + return this.exData[_xfa_object.$content][_xfa_object.$text]().trim(); + } + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "image") { + continue; + } + const obj = this[name]; + if (obj instanceof _xfa_object.XFAObject) { + return (obj[_xfa_object.$content] || "").toString().trim(); + } + } + return null; + } + [_xfa_object.$toHTML](availableSpace) { + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (!(obj instanceof _xfa_object.XFAObject)) { + continue; + } + return obj[_xfa_object.$toHTML](availableSpace); + } + return _utils.HTMLResult.EMPTY; + } +} +exports.Value = Value; +class Variables extends _xfa_object.XFAObject { + constructor(attributes) { + super(TEMPLATE_NS_ID, "variables", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.boolean = new _xfa_object.XFAObjectArray(); + this.date = new _xfa_object.XFAObjectArray(); + this.dateTime = new _xfa_object.XFAObjectArray(); + this.decimal = new _xfa_object.XFAObjectArray(); + this.exData = new _xfa_object.XFAObjectArray(); + this.float = new _xfa_object.XFAObjectArray(); + this.image = new _xfa_object.XFAObjectArray(); + this.integer = new _xfa_object.XFAObjectArray(); + this.manifest = new _xfa_object.XFAObjectArray(); + this.script = new _xfa_object.XFAObjectArray(); + this.text = new _xfa_object.XFAObjectArray(); + this.time = new _xfa_object.XFAObjectArray(); + } + [_xfa_object.$isTransparent]() { + return true; + } +} +class TemplateNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (TemplateNamespace.hasOwnProperty(name)) { + const node = TemplateNamespace[name](attributes); + node[_xfa_object.$setSetAttributes](attributes); + return node; + } + return undefined; + } + static appearanceFilter(attrs) { + return new AppearanceFilter(attrs); + } + static arc(attrs) { + return new Arc(attrs); + } + static area(attrs) { + return new Area(attrs); + } + static assist(attrs) { + return new Assist(attrs); + } + static barcode(attrs) { + return new Barcode(attrs); + } + static bind(attrs) { + return new Bind(attrs); + } + static bindItems(attrs) { + return new BindItems(attrs); + } + static bookend(attrs) { + return new Bookend(attrs); + } + static boolean(attrs) { + return new BooleanElement(attrs); + } + static border(attrs) { + return new Border(attrs); + } + static break(attrs) { + return new Break(attrs); + } + static breakAfter(attrs) { + return new BreakAfter(attrs); + } + static breakBefore(attrs) { + return new BreakBefore(attrs); + } + static button(attrs) { + return new Button(attrs); + } + static calculate(attrs) { + return new Calculate(attrs); + } + static caption(attrs) { + return new Caption(attrs); + } + static certificate(attrs) { + return new Certificate(attrs); + } + static certificates(attrs) { + return new Certificates(attrs); + } + static checkButton(attrs) { + return new CheckButton(attrs); + } + static choiceList(attrs) { + return new ChoiceList(attrs); + } + static color(attrs) { + return new Color(attrs); + } + static comb(attrs) { + return new Comb(attrs); + } + static connect(attrs) { + return new Connect(attrs); + } + static contentArea(attrs) { + return new ContentArea(attrs); + } + static corner(attrs) { + return new Corner(attrs); + } + static date(attrs) { + return new DateElement(attrs); + } + static dateTime(attrs) { + return new DateTime(attrs); + } + static dateTimeEdit(attrs) { + return new DateTimeEdit(attrs); + } + static decimal(attrs) { + return new Decimal(attrs); + } + static defaultUi(attrs) { + return new DefaultUi(attrs); + } + static desc(attrs) { + return new Desc(attrs); + } + static digestMethod(attrs) { + return new DigestMethod(attrs); + } + static digestMethods(attrs) { + return new DigestMethods(attrs); + } + static draw(attrs) { + return new Draw(attrs); + } + static edge(attrs) { + return new Edge(attrs); + } + static encoding(attrs) { + return new Encoding(attrs); + } + static encodings(attrs) { + return new Encodings(attrs); + } + static encrypt(attrs) { + return new Encrypt(attrs); + } + static encryptData(attrs) { + return new EncryptData(attrs); + } + static encryption(attrs) { + return new Encryption(attrs); + } + static encryptionMethod(attrs) { + return new EncryptionMethod(attrs); + } + static encryptionMethods(attrs) { + return new EncryptionMethods(attrs); + } + static event(attrs) { + return new Event(attrs); + } + static exData(attrs) { + return new ExData(attrs); + } + static exObject(attrs) { + return new ExObject(attrs); + } + static exclGroup(attrs) { + return new ExclGroup(attrs); + } + static execute(attrs) { + return new Execute(attrs); + } + static extras(attrs) { + return new Extras(attrs); + } + static field(attrs) { + return new Field(attrs); + } + static fill(attrs) { + return new Fill(attrs); + } + static filter(attrs) { + return new Filter(attrs); + } + static float(attrs) { + return new Float(attrs); + } + static font(attrs) { + return new Font(attrs); + } + static format(attrs) { + return new Format(attrs); + } + static handler(attrs) { + return new Handler(attrs); + } + static hyphenation(attrs) { + return new Hyphenation(attrs); + } + static image(attrs) { + return new Image(attrs); + } + static imageEdit(attrs) { + return new ImageEdit(attrs); + } + static integer(attrs) { + return new Integer(attrs); + } + static issuers(attrs) { + return new Issuers(attrs); + } + static items(attrs) { + return new Items(attrs); + } + static keep(attrs) { + return new Keep(attrs); + } + static keyUsage(attrs) { + return new KeyUsage(attrs); + } + static line(attrs) { + return new Line(attrs); + } + static linear(attrs) { + return new Linear(attrs); + } + static lockDocument(attrs) { + return new LockDocument(attrs); + } + static manifest(attrs) { + return new Manifest(attrs); + } + static margin(attrs) { + return new Margin(attrs); + } + static mdp(attrs) { + return new Mdp(attrs); + } + static medium(attrs) { + return new Medium(attrs); + } + static message(attrs) { + return new Message(attrs); + } + static numericEdit(attrs) { + return new NumericEdit(attrs); + } + static occur(attrs) { + return new Occur(attrs); + } + static oid(attrs) { + return new Oid(attrs); + } + static oids(attrs) { + return new Oids(attrs); + } + static overflow(attrs) { + return new Overflow(attrs); + } + static pageArea(attrs) { + return new PageArea(attrs); + } + static pageSet(attrs) { + return new PageSet(attrs); + } + static para(attrs) { + return new Para(attrs); + } + static passwordEdit(attrs) { + return new PasswordEdit(attrs); + } + static pattern(attrs) { + return new Pattern(attrs); + } + static picture(attrs) { + return new Picture(attrs); + } + static proto(attrs) { + return new Proto(attrs); + } + static radial(attrs) { + return new Radial(attrs); + } + static reason(attrs) { + return new Reason(attrs); + } + static reasons(attrs) { + return new Reasons(attrs); + } + static rectangle(attrs) { + return new Rectangle(attrs); + } + static ref(attrs) { + return new RefElement(attrs); + } + static script(attrs) { + return new Script(attrs); + } + static setProperty(attrs) { + return new SetProperty(attrs); + } + static signData(attrs) { + return new SignData(attrs); + } + static signature(attrs) { + return new Signature(attrs); + } + static signing(attrs) { + return new Signing(attrs); + } + static solid(attrs) { + return new Solid(attrs); + } + static speak(attrs) { + return new Speak(attrs); + } + static stipple(attrs) { + return new Stipple(attrs); + } + static subform(attrs) { + return new Subform(attrs); + } + static subformSet(attrs) { + return new SubformSet(attrs); + } + static subjectDN(attrs) { + return new SubjectDN(attrs); + } + static subjectDNs(attrs) { + return new SubjectDNs(attrs); + } + static submit(attrs) { + return new Submit(attrs); + } + static template(attrs) { + return new Template(attrs); + } + static text(attrs) { + return new Text(attrs); + } + static textEdit(attrs) { + return new TextEdit(attrs); + } + static time(attrs) { + return new Time(attrs); + } + static timeStamp(attrs) { + return new TimeStamp(attrs); + } + static toolTip(attrs) { + return new ToolTip(attrs); + } + static traversal(attrs) { + return new Traversal(attrs); + } + static traverse(attrs) { + return new Traverse(attrs); + } + static ui(attrs) { + return new Ui(attrs); + } + static validate(attrs) { + return new Validate(attrs); + } + static value(attrs) { + return new Value(attrs); + } + static variables(attrs) { + return new Variables(attrs); + } +} +exports.TemplateNamespace = TemplateNamespace; + +/***/ }), +/* 212 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.addHTML = addHTML; +exports.checkDimensions = checkDimensions; +exports.flushHTML = flushHTML; +exports.getAvailableSpace = getAvailableSpace; +var _xfa_object = __w_pdfjs_require__(206); +var _html_utils = __w_pdfjs_require__(213); +function createLine(node, children) { + return { + name: "div", + attributes: { + class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"] + }, + children + }; +} +function flushHTML(node) { + if (!node[_xfa_object.$extra]) { + return null; + } + const attributes = node[_xfa_object.$extra].attributes; + const html = { + name: "div", + attributes, + children: node[_xfa_object.$extra].children + }; + if (node[_xfa_object.$extra].failingNode) { + const htmlFromFailing = node[_xfa_object.$extra].failingNode[_xfa_object.$flushHTML](); + if (htmlFromFailing) { + if (node.layout.endsWith("-tb")) { + html.children.push(createLine(node, [htmlFromFailing])); + } else { + html.children.push(htmlFromFailing); + } + } + } + if (html.children.length === 0) { + return null; + } + return html; +} +function addHTML(node, html, bbox) { + const extra = node[_xfa_object.$extra]; + const availableSpace = extra.availableSpace; + const [x, y, w, h] = bbox; + switch (node.layout) { + case "position": + { + extra.width = Math.max(extra.width, x + w); + extra.height = Math.max(extra.height, y + h); + extra.children.push(html); + break; + } + case "lr-tb": + case "rl-tb": + if (!extra.line || extra.attempt === 1) { + extra.line = createLine(node, []); + extra.children.push(extra.line); + extra.numberInLine = 0; + } + extra.numberInLine += 1; + extra.line.children.push(html); + if (extra.attempt === 0) { + extra.currentWidth += w; + extra.height = Math.max(extra.height, extra.prevHeight + h); + } else { + extra.currentWidth = w; + extra.prevHeight = extra.height; + extra.height += h; + extra.attempt = 0; + } + extra.width = Math.max(extra.width, extra.currentWidth); + break; + case "rl-row": + case "row": + { + extra.children.push(html); + extra.width += w; + extra.height = Math.max(extra.height, h); + const height = (0, _html_utils.measureToString)(extra.height); + for (const child of extra.children) { + child.attributes.style.height = height; + } + break; + } + case "table": + { + extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.height += h; + extra.children.push(html); + break; + } + case "tb": + { + extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.height += h; + extra.children.push(html); + break; + } + } +} +function getAvailableSpace(node) { + const availableSpace = node[_xfa_object.$extra].availableSpace; + const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0; + const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0; + switch (node.layout) { + case "lr-tb": + case "rl-tb": + if (node[_xfa_object.$extra].attempt === 0) { + return { + width: availableSpace.width - marginH - node[_xfa_object.$extra].currentWidth, + height: availableSpace.height - marginV - node[_xfa_object.$extra].prevHeight + }; + } + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[_xfa_object.$extra].height + }; + case "rl-row": + case "row": + const width = node[_xfa_object.$extra].columnWidths.slice(node[_xfa_object.$extra].currentColumn).reduce((a, x) => a + x); + return { + width, + height: availableSpace.height - marginH + }; + case "table": + case "tb": + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[_xfa_object.$extra].height + }; + case "position": + default: + return availableSpace; + } +} +function getTransformedBBox(node) { + let w = node.w === "" ? NaN : node.w; + let h = node.h === "" ? NaN : node.h; + let [centerX, centerY] = [0, 0]; + switch (node.anchorType || "") { + case "bottomCenter": + [centerX, centerY] = [w / 2, h]; + break; + case "bottomLeft": + [centerX, centerY] = [0, h]; + break; + case "bottomRight": + [centerX, centerY] = [w, h]; + break; + case "middleCenter": + [centerX, centerY] = [w / 2, h / 2]; + break; + case "middleLeft": + [centerX, centerY] = [0, h / 2]; + break; + case "middleRight": + [centerX, centerY] = [w, h / 2]; + break; + case "topCenter": + [centerX, centerY] = [w / 2, 0]; + break; + case "topRight": + [centerX, centerY] = [w, 0]; + break; + } + let x, y; + switch (node.rotate || 0) { + case 0: + [x, y] = [-centerX, -centerY]; + break; + case 90: + [x, y] = [-centerY, centerX]; + [w, h] = [h, -w]; + break; + case 180: + [x, y] = [centerX, centerY]; + [w, h] = [-w, -h]; + break; + case 270: + [x, y] = [centerY, -centerX]; + [w, h] = [-h, w]; + break; + } + return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)]; +} +function checkDimensions(node, space) { + if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].firstUnsplittable === null) { + return true; + } + if (node.w === 0 || node.h === 0) { + return true; + } + const ERROR = 2; + const parent = node[_xfa_object.$getSubformParent](); + const attempt = parent[_xfa_object.$extra] && parent[_xfa_object.$extra].attempt || 0; + const [, y, w, h] = getTransformedBBox(node); + switch (parent.layout) { + case "lr-tb": + case "rl-tb": + if (attempt === 0) { + if (!node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) { + if (node.h !== "" && Math.round(h - space.height) > ERROR) { + return false; + } + if (node.w !== "") { + if (Math.round(w - space.width) <= ERROR) { + return true; + } + if (parent[_xfa_object.$extra].numberInLine === 0) { + return space.height > ERROR; + } + return false; + } + return space.width > ERROR; + } + if (node.w !== "") { + return Math.round(w - space.width) <= ERROR; + } + return space.width > ERROR; + } + if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) { + return true; + } + if (node.h !== "" && Math.round(h - space.height) > ERROR) { + return false; + } + if (node.w === "" || Math.round(w - space.width) <= ERROR) { + return space.height > ERROR; + } + if (parent[_xfa_object.$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; + case "table": + case "tb": + if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) { + return true; + } + if (node.h !== "" && !node[_xfa_object.$isSplittable]()) { + return Math.round(h - space.height) <= ERROR; + } + if (node.w === "" || Math.round(w - space.width) <= ERROR) { + return space.height > ERROR; + } + if (parent[_xfa_object.$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; + case "position": + if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) { + return true; + } + if (node.h === "" || Math.round(h + y - space.height) <= ERROR) { + return true; + } + const area = node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].currentContentArea; + return h + y > area.h; + case "rl-row": + case "row": + if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) { + return true; + } + if (node.h !== "") { + return Math.round(h - space.height) <= ERROR; + } + return true; + default: + return true; + } +} + +/***/ }), +/* 213 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.computeBbox = computeBbox; +exports.createWrapper = createWrapper; +exports.fixDimensions = fixDimensions; +exports.fixTextIndent = fixTextIndent; +exports.fixURL = fixURL; +exports.isPrintOnly = isPrintOnly; +exports.layoutClass = layoutClass; +exports.layoutNode = layoutNode; +exports.measureToString = measureToString; +exports.setAccess = setAccess; +exports.setFontFamily = setFontFamily; +exports.setMinMaxDimensions = setMinMaxDimensions; +exports.setPara = setPara; +exports.toStyle = toStyle; +var _xfa_object = __w_pdfjs_require__(206); +var _util = __w_pdfjs_require__(2); +var _utils = __w_pdfjs_require__(207); +var _fonts = __w_pdfjs_require__(214); +var _text = __w_pdfjs_require__(215); +function measureToString(m) { + if (typeof m === "string") { + return "0px"; + } + return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`; +} +const converters = { + anchorType(node, style) { + const parent = node[_xfa_object.$getSubformParent](); + if (!parent || parent.layout && parent.layout !== "position") { + return; + } + if (!("transform" in style)) { + style.transform = ""; + } + switch (node.anchorType) { + case "bottomCenter": + style.transform += "translate(-50%, -100%)"; + break; + case "bottomLeft": + style.transform += "translate(0,-100%)"; + break; + case "bottomRight": + style.transform += "translate(-100%,-100%)"; + break; + case "middleCenter": + style.transform += "translate(-50%,-50%)"; + break; + case "middleLeft": + style.transform += "translate(0,-50%)"; + break; + case "middleRight": + style.transform += "translate(-100%,-50%)"; + break; + case "topCenter": + style.transform += "translate(-50%,0)"; + break; + case "topRight": + style.transform += "translate(-100%,0)"; + break; + } + }, + dimensions(node, style) { + const parent = node[_xfa_object.$getSubformParent](); + let width = node.w; + const height = node.h; + if (parent.layout && parent.layout.includes("row")) { + const extra = parent[_xfa_object.$extra]; + const colSpan = node.colSpan; + let w; + if (colSpan === -1) { + w = extra.columnWidths.slice(extra.currentColumn).reduce((a, x) => a + x, 0); + extra.currentColumn = 0; + } else { + w = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, x) => a + x, 0); + extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length; + } + if (!isNaN(w)) { + width = node.w = w; + } + } + if (width !== "") { + style.width = measureToString(width); + } else { + style.width = "auto"; + } + if (height !== "") { + style.height = measureToString(height); + } else { + style.height = "auto"; + } + }, + position(node, style) { + const parent = node[_xfa_object.$getSubformParent](); + if (parent && parent.layout && parent.layout !== "position") { + return; + } + style.position = "absolute"; + style.left = measureToString(node.x); + style.top = measureToString(node.y); + }, + rotate(node, style) { + if (node.rotate) { + if (!("transform" in style)) { + style.transform = ""; + } + style.transform += `rotate(-${node.rotate}deg)`; + style.transformOrigin = "top left"; + } + }, + presence(node, style) { + switch (node.presence) { + case "invisible": + style.visibility = "hidden"; + break; + case "hidden": + case "inactive": + style.display = "none"; + break; + } + }, + hAlign(node, style) { + if (node[_xfa_object.$nodeName] === "para") { + switch (node.hAlign) { + case "justifyAll": + style.textAlign = "justify-all"; + break; + case "radix": + style.textAlign = "left"; + break; + default: + style.textAlign = node.hAlign; + } + } else { + switch (node.hAlign) { + case "left": + style.alignSelf = "start"; + break; + case "center": + style.alignSelf = "center"; + break; + case "right": + style.alignSelf = "end"; + break; + } + } + }, + margin(node, style) { + if (node.margin) { + style.margin = node.margin[_xfa_object.$toStyle]().margin; + } + } +}; +function setMinMaxDimensions(node, style) { + const parent = node[_xfa_object.$getSubformParent](); + if (parent.layout === "position") { + if (node.minW > 0) { + style.minWidth = measureToString(node.minW); + } + if (node.maxW > 0) { + style.maxWidth = measureToString(node.maxW); + } + if (node.minH > 0) { + style.minHeight = measureToString(node.minH); + } + if (node.maxH > 0) { + style.maxHeight = measureToString(node.maxH); + } + } +} +function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) { + const measure = new _text.TextMeasure(xfaFont, margin, lineHeight, fontFinder); + if (typeof text === "string") { + measure.addString(text); + } else { + text[_xfa_object.$pushGlyphs](measure); + } + return measure.compute(width); +} +function layoutNode(node, availableSpace) { + let height = null; + let width = null; + let isBroken = false; + if ((!node.w || !node.h) && node.value) { + let marginH = 0; + let marginV = 0; + if (node.margin) { + marginH = node.margin.leftInset + node.margin.rightInset; + marginV = node.margin.topInset + node.margin.bottomInset; + } + let lineHeight = null; + let margin = null; + if (node.para) { + margin = Object.create(null); + lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight; + margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove; + margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow; + margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft; + margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight; + } + let font = node.font; + if (!font) { + const root = node[_xfa_object.$getTemplateRoot](); + let parent = node[_xfa_object.$getParent](); + while (parent && parent !== root) { + if (parent.font) { + font = parent.font; + break; + } + parent = parent[_xfa_object.$getParent](); + } + } + const maxWidth = (node.w || availableSpace.width) - marginH; + const fontFinder = node[_xfa_object.$globalData].fontFinder; + if (node.value.exData && node.value.exData[_xfa_object.$content] && node.value.exData.contentType === "text/html") { + const res = layoutText(node.value.exData[_xfa_object.$content], font, margin, lineHeight, fontFinder, maxWidth); + width = res.width; + height = res.height; + isBroken = res.isBroken; + } else { + const text = node.value[_xfa_object.$text](); + if (text) { + const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth); + width = res.width; + height = res.height; + isBroken = res.isBroken; + } + } + if (width !== null && !node.w) { + width += marginH; + } + if (height !== null && !node.h) { + height += marginV; + } + } + return { + w: width, + h: height, + isBroken + }; +} +function computeBbox(node, html, availableSpace) { + let bbox; + if (node.w !== "" && node.h !== "") { + bbox = [node.x, node.y, node.w, node.h]; + } else { + if (!availableSpace) { + return null; + } + let width = node.w; + if (width === "") { + if (node.maxW === 0) { + const parent = node[_xfa_object.$getSubformParent](); + if (parent.layout === "position" && parent.w !== "") { + width = 0; + } else { + width = node.minW; + } + } else { + width = Math.min(node.maxW, availableSpace.width); + } + html.attributes.style.width = measureToString(width); + } + let height = node.h; + if (height === "") { + if (node.maxH === 0) { + const parent = node[_xfa_object.$getSubformParent](); + if (parent.layout === "position" && parent.h !== "") { + height = 0; + } else { + height = node.minH; + } + } else { + height = Math.min(node.maxH, availableSpace.height); + } + html.attributes.style.height = measureToString(height); + } + bbox = [node.x, node.y, width, height]; + } + return bbox; +} +function fixDimensions(node) { + const parent = node[_xfa_object.$getSubformParent](); + if (parent.layout && parent.layout.includes("row")) { + const extra = parent[_xfa_object.$extra]; + const colSpan = node.colSpan; + let width; + if (colSpan === -1) { + width = extra.columnWidths.slice(extra.currentColumn).reduce((a, w) => a + w, 0); + } else { + width = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, w) => a + w, 0); + } + if (!isNaN(width)) { + node.w = width; + } + } + if (parent.layout && parent.layout !== "position") { + node.x = node.y = 0; + } + if (node.layout === "table") { + if (node.w === "" && Array.isArray(node.columnWidths)) { + node.w = node.columnWidths.reduce((a, x) => a + x, 0); + } + } +} +function layoutClass(node) { + switch (node.layout) { + case "position": + return "xfaPosition"; + case "lr-tb": + return "xfaLrTb"; + case "rl-row": + return "xfaRlRow"; + case "rl-tb": + return "xfaRlTb"; + case "row": + return "xfaRow"; + case "table": + return "xfaTable"; + case "tb": + return "xfaTb"; + default: + return "xfaPosition"; + } +} +function toStyle(node) { + const style = Object.create(null); + for (var _len = arguments.length, names = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + names[_key - 1] = arguments[_key]; + } + for (const name of names) { + const value = node[name]; + if (value === null) { + continue; + } + if (converters.hasOwnProperty(name)) { + converters[name](node, style); + continue; + } + if (value instanceof _xfa_object.XFAObject) { + const newStyle = value[_xfa_object.$toStyle](); + if (newStyle) { + Object.assign(style, newStyle); + } else { + (0, _util.warn)(`(DEBUG) - XFA - style for ${name} not implemented yet`); + } + } + } + return style; +} +function createWrapper(node, html) { + const { + attributes + } = html; + const { + style + } = attributes; + const wrapper = { + name: "div", + attributes: { + class: ["xfaWrapper"], + style: Object.create(null) + }, + children: [] + }; + attributes.class.push("xfaWrapped"); + if (node.border) { + const { + widths, + insets + } = node.border[_xfa_object.$extra]; + let width, height; + let top = insets[0]; + let left = insets[3]; + const insetsH = insets[0] + insets[2]; + const insetsW = insets[1] + insets[3]; + switch (node.border.hand) { + case "even": + top -= widths[0] / 2; + left -= widths[3] / 2; + width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`; + height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`; + break; + case "left": + top -= widths[0]; + left -= widths[3]; + width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`; + height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`; + break; + case "right": + width = insetsW ? `calc(100% - ${insetsW}px)` : "100%"; + height = insetsH ? `calc(100% - ${insetsH}px)` : "100%"; + break; + } + const classNames = ["xfaBorder"]; + if (isPrintOnly(node.border)) { + classNames.push("xfaPrintOnly"); + } + const border = { + name: "div", + attributes: { + class: classNames, + style: { + top: `${top}px`, + left: `${left}px`, + width, + height + } + }, + children: [] + }; + for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) { + if (style[key] !== undefined) { + border.attributes.style[key] = style[key]; + delete style[key]; + } + } + wrapper.children.push(border, html); + } else { + wrapper.children.push(html); + } + for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) { + if (style[key] !== undefined) { + wrapper.attributes.style[key] = style[key]; + delete style[key]; + } + } + if (style.position === "absolute") { + wrapper.attributes.style.position = "absolute"; + } else { + wrapper.attributes.style.position = "relative"; + } + delete style.position; + if (style.alignSelf) { + wrapper.attributes.style.alignSelf = style.alignSelf; + delete style.alignSelf; + } + return wrapper; +} +function fixTextIndent(styles) { + const indent = (0, _utils.getMeasurement)(styles.textIndent, "0px"); + if (indent >= 0) { + return; + } + const align = styles.textAlign === "right" ? "right" : "left"; + const name = "padding" + (align === "left" ? "Left" : "Right"); + const padding = (0, _utils.getMeasurement)(styles[name], "0px"); + styles[name] = `${padding - indent}px`; +} +function setAccess(node, classNames) { + switch (node.access) { + case "nonInteractive": + classNames.push("xfaNonInteractive"); + break; + case "readOnly": + classNames.push("xfaReadOnly"); + break; + case "protected": + classNames.push("xfaDisabled"); + break; + } +} +function isPrintOnly(node) { + return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print"; +} +function getCurrentPara(node) { + const stack = node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].paraStack; + return stack.length ? stack.at(-1) : null; +} +function setPara(node, nodeStyle, value) { + if (value.attributes.class && value.attributes.class.includes("xfaRich")) { + if (nodeStyle) { + if (node.h === "") { + nodeStyle.height = "auto"; + } + if (node.w === "") { + nodeStyle.width = "auto"; + } + } + const para = getCurrentPara(node); + if (para) { + const valueStyle = value.attributes.style; + valueStyle.display = "flex"; + valueStyle.flexDirection = "column"; + switch (para.vAlign) { + case "top": + valueStyle.justifyContent = "start"; + break; + case "bottom": + valueStyle.justifyContent = "end"; + break; + case "middle": + valueStyle.justifyContent = "center"; + break; + } + const paraStyle = para[_xfa_object.$toStyle](); + for (const [key, val] of Object.entries(paraStyle)) { + if (!(key in valueStyle)) { + valueStyle[key] = val; + } + } + } + } +} +function setFontFamily(xfaFont, node, fontFinder, style) { + if (!fontFinder) { + delete style.fontFamily; + return; + } + const name = (0, _utils.stripQuotes)(xfaFont.typeface); + style.fontFamily = `"${name}"`; + const typeface = fontFinder.find(name); + if (typeface) { + const { + fontFamily + } = typeface.regular.cssFontInfo; + if (fontFamily !== name) { + style.fontFamily = `"${fontFamily}"`; + } + const para = getCurrentPara(node); + if (para && para.lineHeight !== "") { + return; + } + if (style.lineHeight) { + return; + } + const pdfFont = (0, _fonts.selectFont)(xfaFont, typeface); + if (pdfFont) { + style.lineHeight = Math.max(1.2, pdfFont.lineHeight); + } + } +} +function fixURL(str) { + const absoluteUrl = (0, _util.createValidAbsoluteUrl)(str, null, { + addDefaultProtocol: true, + tryConvertEncoding: true + }); + return absoluteUrl ? absoluteUrl.href : null; +} + +/***/ }), +/* 214 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.FontFinder = void 0; +exports.getMetrics = getMetrics; +exports.selectFont = selectFont; +var _xfa_object = __w_pdfjs_require__(206); +var _utils = __w_pdfjs_require__(207); +var _util = __w_pdfjs_require__(2); +class FontFinder { + constructor(pdfFonts) { + this.fonts = new Map(); + this.cache = new Map(); + this.warned = new Set(); + this.defaultFont = null; + this.add(pdfFonts); + } + add(pdfFonts) { + let reallyMissingFonts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + for (const pdfFont of pdfFonts) { + this.addPdfFont(pdfFont); + } + for (const pdfFont of this.fonts.values()) { + if (!pdfFont.regular) { + pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic; + } + } + if (!reallyMissingFonts || reallyMissingFonts.size === 0) { + return; + } + const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA"); + for (const missing of reallyMissingFonts) { + this.fonts.set(missing, myriad); + } + } + addPdfFont(pdfFont) { + const cssFontInfo = pdfFont.cssFontInfo; + const name = cssFontInfo.fontFamily; + let font = this.fonts.get(name); + if (!font) { + font = Object.create(null); + this.fonts.set(name, font); + if (!this.defaultFont) { + this.defaultFont = font; + } + } + let property = ""; + const fontWeight = parseFloat(cssFontInfo.fontWeight); + if (parseFloat(cssFontInfo.italicAngle) !== 0) { + property = fontWeight >= 700 ? "bolditalic" : "italic"; + } else if (fontWeight >= 700) { + property = "bold"; + } + if (!property) { + if (pdfFont.name.includes("Bold") || pdfFont.psName && pdfFont.psName.includes("Bold")) { + property = "bold"; + } + if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName && (pdfFont.psName.includes("Italic") || pdfFont.psName.endsWith("It"))) { + property += "italic"; + } + } + if (!property) { + property = "regular"; + } + font[property] = pdfFont; + } + getDefault() { + return this.defaultFont; + } + find(fontName) { + let mustWarn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let font = this.fonts.get(fontName) || this.cache.get(fontName); + if (font) { + return font; + } + const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; + let name = fontName.replace(pattern, ""); + font = this.fonts.get(name); + if (font) { + this.cache.set(fontName, font); + return font; + } + name = name.toLowerCase(); + const maybe = []; + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replace(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + if (maybe.length === 0) { + for (const [, pdfFont] of this.fonts.entries()) { + if (pdfFont.regular.name && pdfFont.regular.name.replace(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + name = name.replace(/psmt|mt/gi, ""); + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replace(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + for (const pdfFont of this.fonts.values()) { + if (pdfFont.regular.name && pdfFont.regular.name.replace(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length >= 1) { + if (maybe.length !== 1 && mustWarn) { + (0, _util.warn)(`XFA - Too many choices to guess the correct font: ${fontName}`); + } + this.cache.set(fontName, maybe[0]); + return maybe[0]; + } + if (mustWarn && !this.warned.has(fontName)) { + this.warned.add(fontName); + (0, _util.warn)(`XFA - Cannot find the font: ${fontName}`); + } + return null; + } +} +exports.FontFinder = FontFinder; +function selectFont(xfaFont, typeface) { + if (xfaFont.posture === "italic") { + if (xfaFont.weight === "bold") { + return typeface.bolditalic; + } + return typeface.italic; + } else if (xfaFont.weight === "bold") { + return typeface.bold; + } + return typeface.regular; +} +function getMetrics(xfaFont) { + let real = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + let pdfFont = null; + if (xfaFont) { + const name = (0, _utils.stripQuotes)(xfaFont.typeface); + const typeface = xfaFont[_xfa_object.$globalData].fontFinder.find(name); + pdfFont = selectFont(xfaFont, typeface); + } + if (!pdfFont) { + return { + lineHeight: 12, + lineGap: 2, + lineNoGap: 10 + }; + } + const size = xfaFont.size || 10; + const lineHeight = pdfFont.lineHeight ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) : 1.2; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + return { + lineHeight: lineHeight * size, + lineGap: lineGap * size, + lineNoGap: Math.max(1, lineHeight - lineGap) * size + }; +} + +/***/ }), +/* 215 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.TextMeasure = void 0; +var _fonts = __w_pdfjs_require__(214); +const WIDTH_FACTOR = 1.02; +class FontInfo { + constructor(xfaFont, margin, lineHeight, fontFinder) { + this.lineHeight = lineHeight; + this.paraMargin = margin || { + top: 0, + bottom: 0, + left: 0, + right: 0 + }; + if (!xfaFont) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.xfaFont = { + typeface: xfaFont.typeface, + posture: xfaFont.posture, + weight: xfaFont.weight, + size: xfaFont.size, + letterSpacing: xfaFont.letterSpacing + }; + const typeface = fontFinder.find(xfaFont.typeface); + if (!typeface) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; + } + this.pdfFont = (0, _fonts.selectFont)(xfaFont, typeface); + if (!this.pdfFont) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + } + } + defaultFont(fontFinder) { + const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || fontFinder.find("Arial", false) || fontFinder.getDefault(); + if (font && font.regular) { + const pdfFont = font.regular; + const info = pdfFont.cssFontInfo; + const xfaFont = { + typeface: info.fontFamily, + posture: "normal", + weight: "normal", + size: 10, + letterSpacing: 0 + }; + return [pdfFont, xfaFont]; + } + const xfaFont = { + typeface: "Courier", + posture: "normal", + weight: "normal", + size: 10, + letterSpacing: 0 + }; + return [null, xfaFont]; + } +} +class FontSelector { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) { + this.fontFinder = fontFinder; + this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)]; + } + pushData(xfaFont, margin, lineHeight) { + const lastFont = this.stack.at(-1); + for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) { + if (!xfaFont[name]) { + xfaFont[name] = lastFont.xfaFont[name]; + } + } + for (const name of ["top", "bottom", "left", "right"]) { + if (isNaN(margin[name])) { + margin[name] = lastFont.paraMargin[name]; + } + } + const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder); + if (!fontInfo.pdfFont) { + fontInfo.pdfFont = lastFont.pdfFont; + } + this.stack.push(fontInfo); + } + popFont() { + this.stack.pop(); + } + topFont() { + return this.stack.at(-1); + } +} +class TextMeasure { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) { + this.glyphs = []; + this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts); + this.extraHeight = 0; + } + pushData(xfaFont, margin, lineHeight) { + this.fontSelector.pushData(xfaFont, margin, lineHeight); + } + popFont(xfaFont) { + return this.fontSelector.popFont(); + } + addPara() { + const lastFont = this.fontSelector.topFont(); + this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom; + } + addString(str) { + if (!str) { + return; + } + const lastFont = this.fontSelector.topFont(); + const fontSize = lastFont.xfaFont.size; + if (lastFont.pdfFont) { + const letterSpacing = lastFont.xfaFont.letterSpacing; + const pdfFont = lastFont.pdfFont; + const fontLineHeight = pdfFont.lineHeight || 1.2; + const lineHeight = lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + const noGap = fontLineHeight - lineGap; + const firstLineHeight = Math.max(1, noGap) * fontSize; + const scale = fontSize / 1000; + const fallbackWidth = pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width; + for (const line of str.split(/[\u2029\n]/)) { + const encodedLine = pdfFont.encodeString(line).join(""); + const glyphs = pdfFont.charsToGlyphs(encodedLine); + for (const glyph of glyphs) { + const width = glyph.width || fallbackWidth; + this.glyphs.push([width * scale + letterSpacing, lineHeight, firstLineHeight, glyph.unicode, false]); + } + this.glyphs.push([0, 0, 0, "\n", true]); + } + this.glyphs.pop(); + return; + } + for (const line of str.split(/[\u2029\n]/)) { + for (const char of line.split("")) { + this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]); + } + this.glyphs.push([0, 0, 0, "\n", true]); + } + this.glyphs.pop(); + } + compute(maxWidth) { + let lastSpacePos = -1, + lastSpaceWidth = 0, + width = 0, + height = 0, + currentLineWidth = 0, + currentLineHeight = 0; + let isBroken = false; + let isFirstLine = true; + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = this.glyphs[i]; + const isSpace = char === " "; + const glyphHeight = isFirstLine ? firstLineHeight : lineHeight; + if (isEOL) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isFirstLine = false; + continue; + } + if (isSpace) { + if (currentLineWidth + glyphWidth > maxWidth) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isBroken = true; + isFirstLine = false; + } else { + currentLineHeight = Math.max(glyphHeight, currentLineHeight); + lastSpaceWidth = currentLineWidth; + currentLineWidth += glyphWidth; + lastSpacePos = i; + } + continue; + } + if (currentLineWidth + glyphWidth > maxWidth) { + height += currentLineHeight; + currentLineHeight = glyphHeight; + if (lastSpacePos !== -1) { + i = lastSpacePos; + width = Math.max(width, lastSpaceWidth); + currentLineWidth = 0; + lastSpacePos = -1; + lastSpaceWidth = 0; + } else { + width = Math.max(width, currentLineWidth); + currentLineWidth = glyphWidth; + } + isBroken = true; + isFirstLine = false; + continue; + } + currentLineWidth += glyphWidth; + currentLineHeight = Math.max(glyphHeight, currentLineHeight); + } + width = Math.max(width, currentLineWidth); + height += currentLineHeight + this.extraHeight; + return { + width: WIDTH_FACTOR * width, + height, + isBroken + }; + } +} +exports.TextMeasure = TextMeasure; + +/***/ }), +/* 216 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.DataHandler = void 0; +var _xfa_object = __w_pdfjs_require__(206); +class DataHandler { + constructor(root, data) { + this.data = data; + this.dataset = root.datasets || null; + } + serialize(storage) { + const stack = [[-1, this.data[_xfa_object.$getChildren]()]]; + while (stack.length > 0) { + const last = stack.at(-1); + const [i, children] = last; + if (i + 1 === children.length) { + stack.pop(); + continue; + } + const child = children[++last[0]]; + const storageEntry = storage.get(child[_xfa_object.$uid]); + if (storageEntry) { + child[_xfa_object.$setValue](storageEntry); + } else { + const attributes = child[_xfa_object.$getAttributes](); + for (const value of attributes.values()) { + const entry = storage.get(value[_xfa_object.$uid]); + if (entry) { + value[_xfa_object.$setValue](entry); + break; + } + } + } + const nodes = child[_xfa_object.$getChildren](); + if (nodes.length > 0) { + stack.push([-1, nodes]); + } + } + const buf = [``]; + if (this.dataset) { + for (const child of this.dataset[_xfa_object.$getChildren]()) { + if (child[_xfa_object.$nodeName] !== "data") { + child[_xfa_object.$toString](buf); + } + } + } + this.data[_xfa_object.$toString](buf); + buf.push(""); + return buf.join(""); + } +} +exports.DataHandler = DataHandler; + +/***/ }), +/* 217 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XFAParser = void 0; +var _xfa_object = __w_pdfjs_require__(206); +var _xml_parser = __w_pdfjs_require__(195); +var _builder = __w_pdfjs_require__(218); +var _util = __w_pdfjs_require__(2); +class XFAParser extends _xml_parser.XMLParserBase { + constructor() { + let rootNameSpace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let richText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + super(); + this._builder = new _builder.Builder(rootNameSpace); + this._stack = []; + this._globalData = { + usedTypefaces: new Set() + }; + this._ids = new Map(); + this._current = this._builder.buildRoot(this._ids); + this._errorCode = _xml_parser.XMLParserErrorCode.NoError; + this._whiteRegex = /^\s+$/; + this._nbsps = /\xa0+/g; + this._richText = richText; + } + parse(data) { + this.parseXml(data); + if (this._errorCode !== _xml_parser.XMLParserErrorCode.NoError) { + return undefined; + } + this._current[_xfa_object.$finalize](); + return this._current.element; + } + onText(text) { + text = text.replace(this._nbsps, match => match.slice(1) + " "); + if (this._richText || this._current[_xfa_object.$acceptWhitespace]()) { + this._current[_xfa_object.$onText](text, this._richText); + return; + } + if (this._whiteRegex.test(text)) { + return; + } + this._current[_xfa_object.$onText](text.trim()); + } + onCdata(text) { + this._current[_xfa_object.$onText](text); + } + _mkAttributes(attributes, tagName) { + let namespace = null; + let prefixes = null; + const attributeObj = Object.create({}); + for (const { + name, + value + } of attributes) { + if (name === "xmlns") { + if (!namespace) { + namespace = value; + } else { + (0, _util.warn)(`XFA - multiple namespace definition in <${tagName}>`); + } + } else if (name.startsWith("xmlns:")) { + const prefix = name.substring("xmlns:".length); + if (!prefixes) { + prefixes = []; + } + prefixes.push({ + prefix, + value + }); + } else { + const i = name.indexOf(":"); + if (i === -1) { + attributeObj[name] = value; + } else { + let nsAttrs = attributeObj[_xfa_object.$nsAttributes]; + if (!nsAttrs) { + nsAttrs = attributeObj[_xfa_object.$nsAttributes] = Object.create(null); + } + const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)]; + let attrs = nsAttrs[ns]; + if (!attrs) { + attrs = nsAttrs[ns] = Object.create(null); + } + attrs[attrName] = value; + } + } + } + return [namespace, prefixes, attributeObj]; + } + _getNameAndPrefix(name, nsAgnostic) { + const i = name.indexOf(":"); + if (i === -1) { + return [name, null]; + } + return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)]; + } + onBeginElement(tagName, attributes, isEmpty) { + const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName); + const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic()); + const node = this._builder.build({ + nsPrefix, + name, + attributes: attributesObj, + namespace, + prefixes + }); + node[_xfa_object.$globalData] = this._globalData; + if (isEmpty) { + node[_xfa_object.$finalize](); + if (this._current[_xfa_object.$onChild](node)) { + node[_xfa_object.$setId](this._ids); + } + node[_xfa_object.$clean](this._builder); + return; + } + this._stack.push(this._current); + this._current = node; + } + onEndElement(name) { + const node = this._current; + if (node[_xfa_object.$isCDATAXml]() && typeof node[_xfa_object.$content] === "string") { + const parser = new XFAParser(); + parser._globalData = this._globalData; + const root = parser.parse(node[_xfa_object.$content]); + node[_xfa_object.$content] = null; + node[_xfa_object.$onChild](root); + } + node[_xfa_object.$finalize](); + this._current = this._stack.pop(); + if (this._current[_xfa_object.$onChild](node)) { + node[_xfa_object.$setId](this._ids); + } + node[_xfa_object.$clean](this._builder); + } + onError(code) { + this._errorCode = code; + } +} +exports.XFAParser = XFAParser; + +/***/ }), +/* 218 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.Builder = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +var _setup = __w_pdfjs_require__(219); +var _template = __w_pdfjs_require__(211); +var _unknown = __w_pdfjs_require__(228); +var _util = __w_pdfjs_require__(2); +class Root extends _xfa_object.XFAObject { + constructor(ids) { + super(-1, "root", Object.create(null)); + this.element = null; + this[_xfa_object.$ids] = ids; + } + [_xfa_object.$onChild](child) { + this.element = child; + return true; + } + [_xfa_object.$finalize]() { + super[_xfa_object.$finalize](); + if (this.element.template instanceof _template.Template) { + this[_xfa_object.$ids].set(_xfa_object.$root, this.element); + this.element.template[_xfa_object.$resolvePrototypes](this[_xfa_object.$ids]); + this.element.template[_xfa_object.$ids] = this[_xfa_object.$ids]; + } + } +} +class Empty extends _xfa_object.XFAObject { + constructor() { + super(-1, "", Object.create(null)); + } + [_xfa_object.$onChild](_) { + return false; + } +} +class Builder { + constructor() { + let rootNameSpace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + this._namespaceStack = []; + this._nsAgnosticLevel = 0; + this._namespacePrefixes = new Map(); + this._namespaces = new Map(); + this._nextNsId = Math.max(...Object.values(_namespaces.NamespaceIds).map(_ref => { + let { + id + } = _ref; + return id; + })); + this._currentNamespace = rootNameSpace || new _unknown.UnknownNamespace(++this._nextNsId); + } + buildRoot(ids) { + return new Root(ids); + } + build(_ref2) { + let { + nsPrefix, + name, + attributes, + namespace, + prefixes + } = _ref2; + const hasNamespaceDef = namespace !== null; + if (hasNamespaceDef) { + this._namespaceStack.push(this._currentNamespace); + this._currentNamespace = this._searchNamespace(namespace); + } + if (prefixes) { + this._addNamespacePrefix(prefixes); + } + if (attributes.hasOwnProperty(_xfa_object.$nsAttributes)) { + const dataTemplate = _setup.NamespaceSetUp.datasets; + const nsAttrs = attributes[_xfa_object.$nsAttributes]; + let xfaAttrs = null; + for (const [ns, attrs] of Object.entries(nsAttrs)) { + const nsToUse = this._getNamespaceToUse(ns); + if (nsToUse === dataTemplate) { + xfaAttrs = { + xfa: attrs + }; + break; + } + } + if (xfaAttrs) { + attributes[_xfa_object.$nsAttributes] = xfaAttrs; + } else { + delete attributes[_xfa_object.$nsAttributes]; + } + } + const namespaceToUse = this._getNamespaceToUse(nsPrefix); + const node = namespaceToUse && namespaceToUse[_namespaces.$buildXFAObject](name, attributes) || new Empty(); + if (node[_xfa_object.$isNsAgnostic]()) { + this._nsAgnosticLevel++; + } + if (hasNamespaceDef || prefixes || node[_xfa_object.$isNsAgnostic]()) { + node[_xfa_object.$cleanup] = { + hasNamespace: hasNamespaceDef, + prefixes, + nsAgnostic: node[_xfa_object.$isNsAgnostic]() + }; + } + return node; + } + isNsAgnostic() { + return this._nsAgnosticLevel > 0; + } + _searchNamespace(nsName) { + let ns = this._namespaces.get(nsName); + if (ns) { + return ns; + } + for (const [name, { + check + }] of Object.entries(_namespaces.NamespaceIds)) { + if (check(nsName)) { + ns = _setup.NamespaceSetUp[name]; + if (ns) { + this._namespaces.set(nsName, ns); + return ns; + } + break; + } + } + ns = new _unknown.UnknownNamespace(++this._nextNsId); + this._namespaces.set(nsName, ns); + return ns; + } + _addNamespacePrefix(prefixes) { + for (const { + prefix, + value + } of prefixes) { + const namespace = this._searchNamespace(value); + let prefixStack = this._namespacePrefixes.get(prefix); + if (!prefixStack) { + prefixStack = []; + this._namespacePrefixes.set(prefix, prefixStack); + } + prefixStack.push(namespace); + } + } + _getNamespaceToUse(prefix) { + if (!prefix) { + return this._currentNamespace; + } + const prefixStack = this._namespacePrefixes.get(prefix); + if (prefixStack && prefixStack.length > 0) { + return prefixStack.at(-1); + } + (0, _util.warn)(`Unknown namespace prefix: ${prefix}.`); + return null; + } + clean(data) { + const { + hasNamespace, + prefixes, + nsAgnostic + } = data; + if (hasNamespace) { + this._currentNamespace = this._namespaceStack.pop(); + } + if (prefixes) { + prefixes.forEach(_ref3 => { + let { + prefix + } = _ref3; + this._namespacePrefixes.get(prefix).pop(); + }); + } + if (nsAgnostic) { + this._nsAgnosticLevel--; + } + } +} +exports.Builder = Builder; + +/***/ }), +/* 219 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.NamespaceSetUp = void 0; +var _config = __w_pdfjs_require__(220); +var _connection_set = __w_pdfjs_require__(221); +var _datasets = __w_pdfjs_require__(222); +var _locale_set = __w_pdfjs_require__(223); +var _signature = __w_pdfjs_require__(224); +var _stylesheet = __w_pdfjs_require__(225); +var _template = __w_pdfjs_require__(211); +var _xdp = __w_pdfjs_require__(226); +var _xhtml = __w_pdfjs_require__(227); +const NamespaceSetUp = { + config: _config.ConfigNamespace, + connection: _connection_set.ConnectionSetNamespace, + datasets: _datasets.DatasetsNamespace, + localeSet: _locale_set.LocaleSetNamespace, + signature: _signature.SignatureNamespace, + stylesheet: _stylesheet.StylesheetNamespace, + template: _template.TemplateNamespace, + xdp: _xdp.XdpNamespace, + xhtml: _xhtml.XhtmlNamespace +}; +exports.NamespaceSetUp = NamespaceSetUp; + +/***/ }), +/* 220 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ConfigNamespace = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +var _utils = __w_pdfjs_require__(207); +var _util = __w_pdfjs_require__(2); +const CONFIG_NS_ID = _namespaces.NamespaceIds.config.id; +class Acrobat extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat", true); + this.acrobat7 = null; + this.autoSave = null; + this.common = null; + this.validate = null; + this.validateApprovalSignatures = null; + this.submitUrl = new _xfa_object.XFAObjectArray(); + } +} +class Acrobat7 extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat7", true); + this.dynamicRender = null; + } +} +class ADBE_JSConsole extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); + } +} +class ADBE_JSDebugger extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); + } +} +class AddSilentPrint extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addSilentPrint"); + } +} +class AddViewerPreferences extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "addViewerPreferences"); + } +} +class AdjustData extends _xfa_object.Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "adjustData"); + } +} +class AdobeExtensionLevel extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8); + } +} +class Agent extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "agent", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.common = new _xfa_object.XFAObjectArray(); + } +} +class AlwaysEmbed extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "alwaysEmbed"); + } +} +class Amd extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "amd"); + } +} +class Area extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "area"); + this.level = (0, _utils.getInteger)({ + data: attributes.level, + defaultValue: 0, + validate: n => n >= 1 && n <= 3 + }); + this.name = (0, _utils.getStringOption)(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]); + } +} +class Attributes extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]); + } +} +class AutoSave extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]); + } +} +class Base extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "base"); + } +} +class BatchOutput extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "batchOutput"); + this.format = (0, _utils.getStringOption)(attributes.format, ["none", "concat", "zip", "zipCompress"]); + } +} +class BehaviorOverride extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "behaviorOverride"); + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = new Map(this[_xfa_object.$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2))); + } +} +class Cache extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "cache", true); + this.templateCache = null; + } +} +class Change extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "change"); + } +} +class Common extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "common", true); + this.data = null; + this.locale = null; + this.localeSet = null; + this.messaging = null; + this.suppressBanner = null; + this.template = null; + this.validationMessaging = null; + this.versionControl = null; + this.log = new _xfa_object.XFAObjectArray(); + } +} +class Compress extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compress"); + this.scope = (0, _utils.getStringOption)(attributes.scope, ["imageOnly", "document"]); + } +} +class CompressLogicalStructure extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressLogicalStructure"); + } +} +class CompressObjectStream extends _xfa_object.Option10 { + constructor(attributes) { + super(CONFIG_NS_ID, "compressObjectStream"); + } +} +class Compression extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "compression", true); + this.compressLogicalStructure = null; + this.compressObjectStream = null; + this.level = null; + this.type = null; + } +} +class Config extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "config", true); + this.acrobat = null; + this.present = null; + this.trace = null; + this.agent = new _xfa_object.XFAObjectArray(); + } +} +class Conformance extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "conformance", ["A", "B"]); + } +} +class ContentCopy extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "contentCopy"); + } +} +class Copies extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "copies", 1, n => n >= 1); + } +} +class Creator extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "creator"); + } +} +class CurrentPage extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0); + } +} +class Data extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "data", true); + this.adjustData = null; + this.attributes = null; + this.incrementalLoad = null; + this.outputXSL = null; + this.range = null; + this.record = null; + this.startNode = null; + this.uri = null; + this.window = null; + this.xsl = null; + this.excludeNS = new _xfa_object.XFAObjectArray(); + this.transform = new _xfa_object.XFAObjectArray(); + } +} +class Debug extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "debug", true); + this.uri = null; + } +} +class DefaultTypeface extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "defaultTypeface"); + this.writingScript = (0, _utils.getStringOption)(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]); + } +} +class Destination extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]); + } +} +class DocumentAssembly extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "documentAssembly"); + } +} +class Driver extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "driver", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class DuplexOption extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]); + } +} +class DynamicRender extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]); + } +} +class Embed extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "embed"); + } +} +class Encrypt extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "encrypt"); + } +} +class Encryption extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryption", true); + this.encrypt = null; + this.encryptionLevel = null; + this.permissions = null; + } +} +class EncryptionLevel extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]); + } +} +class Enforce extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "enforce"); + } +} +class Equate extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equate"); + this.force = (0, _utils.getInteger)({ + data: attributes.force, + defaultValue: 1, + validate: n => n === 0 + }); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + } +} +class EquateRange extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "equateRange"); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + this._unicodeRange = attributes.unicodeRange || ""; + } + get unicodeRange() { + const ranges = []; + const unicodeRegex = /U\+([0-9a-fA-F]+)/; + const unicodeRange = this._unicodeRange; + for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) { + range = range.split("-", 2).map(x => { + const found = x.match(unicodeRegex); + if (!found) { + return 0; + } + return parseInt(found[1], 16); + }); + if (range.length === 1) { + range.push(range[0]); + } + ranges.push(range); + } + return (0, _util.shadow)(this, "unicodeRange", ranges); + } +} +class Exclude extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "exclude"); + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x)); + } +} +class ExcludeNS extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "excludeNS"); + } +} +class FlipLabel extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]); + } +} +class FontInfo extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "fontInfo", true); + this.embed = null; + this.map = null; + this.subsetBelow = null; + this.alwaysEmbed = new _xfa_object.XFAObjectArray(); + this.defaultTypeface = new _xfa_object.XFAObjectArray(); + this.neverEmbed = new _xfa_object.XFAObjectArray(); + } +} +class FormFieldFilling extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "formFieldFilling"); + } +} +class GroupParent extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "groupParent"); + } +} +class IfEmpty extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]); + } +} +class IncludeXDPContent extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "includeXDPContent"); + } +} +class IncrementalLoad extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]); + } +} +class IncrementalMerge extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalMerge"); + } +} +class Interactive extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "interactive"); + } +} +class Jog extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]); + } +} +class LabelPrinter extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "labelPrinter", true); + this.name = (0, _utils.getStringOption)(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]); + this.batchOutput = null; + this.flipLabel = null; + this.fontInfo = null; + this.xdc = null; + } +} +class Layout extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "layout", ["paginate", "panel"]); + } +} +class Level extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "level", 0, n => n > 0); + } +} +class Linearized extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "linearized"); + } +} +class Locale extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "locale"); + } +} +class LocaleSet extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "localeSet"); + } +} +class Log extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "log", true); + this.mode = null; + this.threshold = null; + this.to = null; + this.uri = null; + } +} +class MapElement extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "map", true); + this.equate = new _xfa_object.XFAObjectArray(); + this.equateRange = new _xfa_object.XFAObjectArray(); + } +} +class MediumInfo extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mediumInfo", true); + this.map = null; + } +} +class Message extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "message", true); + this.msgId = null; + this.severity = null; + } +} +class Messaging extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "messaging", true); + this.message = new _xfa_object.XFAObjectArray(); + } +} +class Mode extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "mode", ["append", "overwrite"]); + } +} +class ModifyAnnots extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "modifyAnnots"); + } +} +class MsgId extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "msgId", 1, n => n >= 1); + } +} +class NameAttr extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "nameAttr"); + } +} +class NeverEmbed extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "neverEmbed"); + } +} +class NumberOfCopies extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5); + } +} +class OpenAction extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "openAction", true); + this.destination = null; + } +} +class Output extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "output", true); + this.to = null; + this.type = null; + this.uri = null; + } +} +class OutputBin extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputBin"); + } +} +class OutputXSL extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "outputXSL", true); + this.uri = null; + } +} +class Overprint extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]); + } +} +class Packets extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "packets"); + } + [_xfa_object.$finalize]() { + if (this[_xfa_object.$content] === "*") { + return; + } + this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/).filter(x => ["config", "datasets", "template", "xfdf", "xslt"].includes(x)); + } +} +class PageOffset extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pageOffset"); + this.x = (0, _utils.getInteger)({ + data: attributes.x, + defaultValue: "useXDCSetting", + validate: n => true + }); + this.y = (0, _utils.getInteger)({ + data: attributes.y, + defaultValue: "useXDCSetting", + validate: n => true + }); + } +} +class PageRange extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pageRange"); + } + [_xfa_object.$finalize]() { + const numbers = this[_xfa_object.$content].trim().split(/\s+/).map(x => parseInt(x, 10)); + const ranges = []; + for (let i = 0, ii = numbers.length; i < ii; i += 2) { + ranges.push(numbers.slice(i, i + 2)); + } + this[_xfa_object.$content] = ranges; + } +} +class Pagination extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]); + } +} +class PaginationOverride extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]); + } +} +class Part extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "part", 1, n => false); + } +} +class Pcl extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pcl", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.pageOffset = null; + this.staple = null; + this.xdc = null; + } +} +class Pdf extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdf", true); + this.name = attributes.name || ""; + this.adobeExtensionLevel = null; + this.batchOutput = null; + this.compression = null; + this.creator = null; + this.encryption = null; + this.fontInfo = null; + this.interactive = null; + this.linearized = null; + this.openAction = null; + this.pdfa = null; + this.producer = null; + this.renderPolicy = null; + this.scriptModel = null; + this.silentPrint = null; + this.submitFormat = null; + this.tagged = null; + this.version = null; + this.viewerPreferences = null; + this.xdc = null; + } +} +class Pdfa extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "pdfa", true); + this.amd = null; + this.conformance = null; + this.includeXDPContent = null; + this.part = null; + } +} +class Permissions extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "permissions", true); + this.accessibleContent = null; + this.change = null; + this.contentCopy = null; + this.documentAssembly = null; + this.formFieldFilling = null; + this.modifyAnnots = null; + this.plaintextMetadata = null; + this.print = null; + this.printHighQuality = null; + } +} +class PickTrayByPDFSize extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "pickTrayByPDFSize"); + } +} +class Picture extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "picture"); + } +} +class PlaintextMetadata extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "plaintextMetadata"); + } +} +class Presence extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]); + } +} +class Present extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "present", true); + this.behaviorOverride = null; + this.cache = null; + this.common = null; + this.copies = null; + this.destination = null; + this.incrementalMerge = null; + this.layout = null; + this.output = null; + this.overprint = null; + this.pagination = null; + this.paginationOverride = null; + this.script = null; + this.validate = null; + this.xdp = null; + this.driver = new _xfa_object.XFAObjectArray(); + this.labelPrinter = new _xfa_object.XFAObjectArray(); + this.pcl = new _xfa_object.XFAObjectArray(); + this.pdf = new _xfa_object.XFAObjectArray(); + this.ps = new _xfa_object.XFAObjectArray(); + this.submitUrl = new _xfa_object.XFAObjectArray(); + this.webClient = new _xfa_object.XFAObjectArray(); + this.zpl = new _xfa_object.XFAObjectArray(); + } +} +class Print extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "print"); + } +} +class PrintHighQuality extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "printHighQuality"); + } +} +class PrintScaling extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]); + } +} +class PrinterName extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "printerName"); + } +} +class Producer extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "producer"); + } +} +class Ps extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "ps", true); + this.name = attributes.name || ""; + this.batchOutput = null; + this.fontInfo = null; + this.jog = null; + this.mediumInfo = null; + this.outputBin = null; + this.staple = null; + this.xdc = null; + } +} +class Range extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "range"); + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s*,\s*/, 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => { + if (range.length === 1) { + range.push(range[0]); + } + return range; + }); + } +} +class Record extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "record"); + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = this[_xfa_object.$content].trim(); + const n = parseInt(this[_xfa_object.$content], 10); + if (!isNaN(n) && n >= 0) { + this[_xfa_object.$content] = n; + } + } +} +class Relevant extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "relevant"); + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/); + } +} +class Rename extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "rename"); + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = this[_xfa_object.$content].trim(); + if (this[_xfa_object.$content].toLowerCase().startsWith("xml") || new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[_xfa_object.$content])) { + (0, _util.warn)("XFA - Rename: invalid XFA name"); + } + } +} +class RenderPolicy extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]); + } +} +class RunScripts extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]); + } +} +class Script extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "script", true); + this.currentPage = null; + this.exclude = null; + this.runScripts = null; + } +} +class ScriptModel extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]); + } +} +class Severity extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]); + } +} +class SilentPrint extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "silentPrint", true); + this.addSilentPrint = null; + this.printerName = null; + } +} +class Staple extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "staple"); + this.mode = (0, _utils.getStringOption)(attributes.mode, ["usePrinterSetting", "on", "off"]); + } +} +class StartNode extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startNode"); + } +} +class StartPage extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "startPage", 0, n => true); + } +} +class SubmitFormat extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]); + } +} +class SubmitUrl extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "submitUrl"); + } +} +class SubsetBelow extends _xfa_object.IntegerObject { + constructor(attributes) { + super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100); + } +} +class SuppressBanner extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "suppressBanner"); + } +} +class Tagged extends _xfa_object.Option01 { + constructor(attributes) { + super(CONFIG_NS_ID, "tagged"); + } +} +class Template extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "template", true); + this.base = null; + this.relevant = null; + this.startPage = null; + this.uri = null; + this.xsl = null; + } +} +class Threshold extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]); + } +} +class To extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]); + } +} +class TemplateCache extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "templateCache"); + this.maxEntries = (0, _utils.getInteger)({ + data: attributes.maxEntries, + defaultValue: 5, + validate: n => n >= 0 + }); + } +} +class Trace extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "trace", true); + this.area = new _xfa_object.XFAObjectArray(); + } +} +class Transform extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "transform", true); + this.groupParent = null; + this.ifEmpty = null; + this.nameAttr = null; + this.picture = null; + this.presence = null; + this.rename = null; + this.whitespace = null; + } +} +class Type extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]); + } +} +class Uri extends _xfa_object.StringObject { + constructor(attributes) { + super(CONFIG_NS_ID, "uri"); + } +} +class Validate extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]); + } +} +class ValidateApprovalSignatures extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validateApprovalSignatures"); + } + [_xfa_object.$finalize]() { + this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x)); + } +} +class ValidationMessaging extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]); + } +} +class Version extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); + } +} +class VersionControl extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "VersionControl"); + this.outputBelow = (0, _utils.getStringOption)(attributes.outputBelow, ["warn", "error", "update"]); + this.sourceAbove = (0, _utils.getStringOption)(attributes.sourceAbove, ["warn", "error"]); + this.sourceBelow = (0, _utils.getStringOption)(attributes.sourceBelow, ["update", "maintain"]); + } +} +class ViewerPreferences extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "viewerPreferences", true); + this.ADBE_JSConsole = null; + this.ADBE_JSDebugger = null; + this.addViewerPreferences = null; + this.duplexOption = null; + this.enforce = null; + this.numberOfCopies = null; + this.pageRange = null; + this.pickTrayByPDFSize = null; + this.printScaling = null; + } +} +class WebClient extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "webClient", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.fontInfo = null; + this.xdc = null; + } +} +class Whitespace extends _xfa_object.OptionObject { + constructor(attributes) { + super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]); + } +} +class Window extends _xfa_object.ContentObject { + constructor(attributes) { + super(CONFIG_NS_ID, "window"); + } + [_xfa_object.$finalize]() { + const pair = this[_xfa_object.$content].trim().split(/\s*,\s*/, 2).map(x => parseInt(x, 10)); + if (pair.some(x => isNaN(x))) { + this[_xfa_object.$content] = [0, 0]; + return; + } + if (pair.length === 1) { + pair.push(pair[0]); + } + this[_xfa_object.$content] = pair; + } +} +class Xdc extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xdc", true); + this.uri = new _xfa_object.XFAObjectArray(); + this.xsl = new _xfa_object.XFAObjectArray(); + } +} +class Xdp extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xdp", true); + this.packets = null; + } +} +class Xsl extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "xsl", true); + this.debug = null; + this.uri = null; + } +} +class Zpl extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONFIG_NS_ID, "zpl", true); + this.name = attributes.name ? attributes.name.trim() : ""; + this.batchOutput = null; + this.flipLabel = null; + this.fontInfo = null; + this.xdc = null; + } +} +class ConfigNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (ConfigNamespace.hasOwnProperty(name)) { + return ConfigNamespace[name](attributes); + } + return undefined; + } + static acrobat(attrs) { + return new Acrobat(attrs); + } + static acrobat7(attrs) { + return new Acrobat7(attrs); + } + static ADBE_JSConsole(attrs) { + return new ADBE_JSConsole(attrs); + } + static ADBE_JSDebugger(attrs) { + return new ADBE_JSDebugger(attrs); + } + static addSilentPrint(attrs) { + return new AddSilentPrint(attrs); + } + static addViewerPreferences(attrs) { + return new AddViewerPreferences(attrs); + } + static adjustData(attrs) { + return new AdjustData(attrs); + } + static adobeExtensionLevel(attrs) { + return new AdobeExtensionLevel(attrs); + } + static agent(attrs) { + return new Agent(attrs); + } + static alwaysEmbed(attrs) { + return new AlwaysEmbed(attrs); + } + static amd(attrs) { + return new Amd(attrs); + } + static area(attrs) { + return new Area(attrs); + } + static attributes(attrs) { + return new Attributes(attrs); + } + static autoSave(attrs) { + return new AutoSave(attrs); + } + static base(attrs) { + return new Base(attrs); + } + static batchOutput(attrs) { + return new BatchOutput(attrs); + } + static behaviorOverride(attrs) { + return new BehaviorOverride(attrs); + } + static cache(attrs) { + return new Cache(attrs); + } + static change(attrs) { + return new Change(attrs); + } + static common(attrs) { + return new Common(attrs); + } + static compress(attrs) { + return new Compress(attrs); + } + static compressLogicalStructure(attrs) { + return new CompressLogicalStructure(attrs); + } + static compressObjectStream(attrs) { + return new CompressObjectStream(attrs); + } + static compression(attrs) { + return new Compression(attrs); + } + static config(attrs) { + return new Config(attrs); + } + static conformance(attrs) { + return new Conformance(attrs); + } + static contentCopy(attrs) { + return new ContentCopy(attrs); + } + static copies(attrs) { + return new Copies(attrs); + } + static creator(attrs) { + return new Creator(attrs); + } + static currentPage(attrs) { + return new CurrentPage(attrs); + } + static data(attrs) { + return new Data(attrs); + } + static debug(attrs) { + return new Debug(attrs); + } + static defaultTypeface(attrs) { + return new DefaultTypeface(attrs); + } + static destination(attrs) { + return new Destination(attrs); + } + static documentAssembly(attrs) { + return new DocumentAssembly(attrs); + } + static driver(attrs) { + return new Driver(attrs); + } + static duplexOption(attrs) { + return new DuplexOption(attrs); + } + static dynamicRender(attrs) { + return new DynamicRender(attrs); + } + static embed(attrs) { + return new Embed(attrs); + } + static encrypt(attrs) { + return new Encrypt(attrs); + } + static encryption(attrs) { + return new Encryption(attrs); + } + static encryptionLevel(attrs) { + return new EncryptionLevel(attrs); + } + static enforce(attrs) { + return new Enforce(attrs); + } + static equate(attrs) { + return new Equate(attrs); + } + static equateRange(attrs) { + return new EquateRange(attrs); + } + static exclude(attrs) { + return new Exclude(attrs); + } + static excludeNS(attrs) { + return new ExcludeNS(attrs); + } + static flipLabel(attrs) { + return new FlipLabel(attrs); + } + static fontInfo(attrs) { + return new FontInfo(attrs); + } + static formFieldFilling(attrs) { + return new FormFieldFilling(attrs); + } + static groupParent(attrs) { + return new GroupParent(attrs); + } + static ifEmpty(attrs) { + return new IfEmpty(attrs); + } + static includeXDPContent(attrs) { + return new IncludeXDPContent(attrs); + } + static incrementalLoad(attrs) { + return new IncrementalLoad(attrs); + } + static incrementalMerge(attrs) { + return new IncrementalMerge(attrs); + } + static interactive(attrs) { + return new Interactive(attrs); + } + static jog(attrs) { + return new Jog(attrs); + } + static labelPrinter(attrs) { + return new LabelPrinter(attrs); + } + static layout(attrs) { + return new Layout(attrs); + } + static level(attrs) { + return new Level(attrs); + } + static linearized(attrs) { + return new Linearized(attrs); + } + static locale(attrs) { + return new Locale(attrs); + } + static localeSet(attrs) { + return new LocaleSet(attrs); + } + static log(attrs) { + return new Log(attrs); + } + static map(attrs) { + return new MapElement(attrs); + } + static mediumInfo(attrs) { + return new MediumInfo(attrs); + } + static message(attrs) { + return new Message(attrs); + } + static messaging(attrs) { + return new Messaging(attrs); + } + static mode(attrs) { + return new Mode(attrs); + } + static modifyAnnots(attrs) { + return new ModifyAnnots(attrs); + } + static msgId(attrs) { + return new MsgId(attrs); + } + static nameAttr(attrs) { + return new NameAttr(attrs); + } + static neverEmbed(attrs) { + return new NeverEmbed(attrs); + } + static numberOfCopies(attrs) { + return new NumberOfCopies(attrs); + } + static openAction(attrs) { + return new OpenAction(attrs); + } + static output(attrs) { + return new Output(attrs); + } + static outputBin(attrs) { + return new OutputBin(attrs); + } + static outputXSL(attrs) { + return new OutputXSL(attrs); + } + static overprint(attrs) { + return new Overprint(attrs); + } + static packets(attrs) { + return new Packets(attrs); + } + static pageOffset(attrs) { + return new PageOffset(attrs); + } + static pageRange(attrs) { + return new PageRange(attrs); + } + static pagination(attrs) { + return new Pagination(attrs); + } + static paginationOverride(attrs) { + return new PaginationOverride(attrs); + } + static part(attrs) { + return new Part(attrs); + } + static pcl(attrs) { + return new Pcl(attrs); + } + static pdf(attrs) { + return new Pdf(attrs); + } + static pdfa(attrs) { + return new Pdfa(attrs); + } + static permissions(attrs) { + return new Permissions(attrs); + } + static pickTrayByPDFSize(attrs) { + return new PickTrayByPDFSize(attrs); + } + static picture(attrs) { + return new Picture(attrs); + } + static plaintextMetadata(attrs) { + return new PlaintextMetadata(attrs); + } + static presence(attrs) { + return new Presence(attrs); + } + static present(attrs) { + return new Present(attrs); + } + static print(attrs) { + return new Print(attrs); + } + static printHighQuality(attrs) { + return new PrintHighQuality(attrs); + } + static printScaling(attrs) { + return new PrintScaling(attrs); + } + static printerName(attrs) { + return new PrinterName(attrs); + } + static producer(attrs) { + return new Producer(attrs); + } + static ps(attrs) { + return new Ps(attrs); + } + static range(attrs) { + return new Range(attrs); + } + static record(attrs) { + return new Record(attrs); + } + static relevant(attrs) { + return new Relevant(attrs); + } + static rename(attrs) { + return new Rename(attrs); + } + static renderPolicy(attrs) { + return new RenderPolicy(attrs); + } + static runScripts(attrs) { + return new RunScripts(attrs); + } + static script(attrs) { + return new Script(attrs); + } + static scriptModel(attrs) { + return new ScriptModel(attrs); + } + static severity(attrs) { + return new Severity(attrs); + } + static silentPrint(attrs) { + return new SilentPrint(attrs); + } + static staple(attrs) { + return new Staple(attrs); + } + static startNode(attrs) { + return new StartNode(attrs); + } + static startPage(attrs) { + return new StartPage(attrs); + } + static submitFormat(attrs) { + return new SubmitFormat(attrs); + } + static submitUrl(attrs) { + return new SubmitUrl(attrs); + } + static subsetBelow(attrs) { + return new SubsetBelow(attrs); + } + static suppressBanner(attrs) { + return new SuppressBanner(attrs); + } + static tagged(attrs) { + return new Tagged(attrs); + } + static template(attrs) { + return new Template(attrs); + } + static templateCache(attrs) { + return new TemplateCache(attrs); + } + static threshold(attrs) { + return new Threshold(attrs); + } + static to(attrs) { + return new To(attrs); + } + static trace(attrs) { + return new Trace(attrs); + } + static transform(attrs) { + return new Transform(attrs); + } + static type(attrs) { + return new Type(attrs); + } + static uri(attrs) { + return new Uri(attrs); + } + static validate(attrs) { + return new Validate(attrs); + } + static validateApprovalSignatures(attrs) { + return new ValidateApprovalSignatures(attrs); + } + static validationMessaging(attrs) { + return new ValidationMessaging(attrs); + } + static version(attrs) { + return new Version(attrs); + } + static versionControl(attrs) { + return new VersionControl(attrs); + } + static viewerPreferences(attrs) { + return new ViewerPreferences(attrs); + } + static webClient(attrs) { + return new WebClient(attrs); + } + static whitespace(attrs) { + return new Whitespace(attrs); + } + static window(attrs) { + return new Window(attrs); + } + static xdc(attrs) { + return new Xdc(attrs); + } + static xdp(attrs) { + return new Xdp(attrs); + } + static xsl(attrs) { + return new Xsl(attrs); + } + static zpl(attrs) { + return new Zpl(attrs); + } +} +exports.ConfigNamespace = ConfigNamespace; + +/***/ }), +/* 221 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ConnectionSetNamespace = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +const CONNECTION_SET_NS_ID = _namespaces.NamespaceIds.connectionSet.id; +class ConnectionSet extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "connectionSet", true); + this.wsdlConnection = new _xfa_object.XFAObjectArray(); + this.xmlConnection = new _xfa_object.XFAObjectArray(); + this.xsdConnection = new _xfa_object.XFAObjectArray(); + } +} +class EffectiveInputPolicy extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "effectiveInputPolicy"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class EffectiveOutputPolicy extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Operation extends _xfa_object.StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "operation"); + this.id = attributes.id || ""; + this.input = attributes.input || ""; + this.name = attributes.name || ""; + this.output = attributes.output || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class RootElement extends _xfa_object.StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "rootElement"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SoapAction extends _xfa_object.StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "soapAction"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class SoapAddress extends _xfa_object.StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "soapAddress"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class Uri extends _xfa_object.StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "uri"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class WsdlAddress extends _xfa_object.StringObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "wsdlAddress"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + } +} +class WsdlConnection extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "wsdlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.effectiveInputPolicy = null; + this.effectiveOutputPolicy = null; + this.operation = null; + this.soapAction = null; + this.soapAddress = null; + this.wsdlAddress = null; + } +} +class XmlConnection extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "xmlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.uri = null; + } +} +class XsdConnection extends _xfa_object.XFAObject { + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "xsdConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; + this.rootElement = null; + this.uri = null; + } +} +class ConnectionSetNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (ConnectionSetNamespace.hasOwnProperty(name)) { + return ConnectionSetNamespace[name](attributes); + } + return undefined; + } + static connectionSet(attrs) { + return new ConnectionSet(attrs); + } + static effectiveInputPolicy(attrs) { + return new EffectiveInputPolicy(attrs); + } + static effectiveOutputPolicy(attrs) { + return new EffectiveOutputPolicy(attrs); + } + static operation(attrs) { + return new Operation(attrs); + } + static rootElement(attrs) { + return new RootElement(attrs); + } + static soapAction(attrs) { + return new SoapAction(attrs); + } + static soapAddress(attrs) { + return new SoapAddress(attrs); + } + static uri(attrs) { + return new Uri(attrs); + } + static wsdlAddress(attrs) { + return new WsdlAddress(attrs); + } + static wsdlConnection(attrs) { + return new WsdlConnection(attrs); + } + static xmlConnection(attrs) { + return new XmlConnection(attrs); + } + static xsdConnection(attrs) { + return new XsdConnection(attrs); + } +} +exports.ConnectionSetNamespace = ConnectionSetNamespace; + +/***/ }), +/* 222 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.DatasetsNamespace = void 0; +var _xfa_object = __w_pdfjs_require__(206); +var _namespaces = __w_pdfjs_require__(208); +const DATASETS_NS_ID = _namespaces.NamespaceIds.datasets.id; +class Data extends _xfa_object.XmlObject { + constructor(attributes) { + super(DATASETS_NS_ID, "data", attributes); + } + [_xfa_object.$isNsAgnostic]() { + return true; + } +} +class Datasets extends _xfa_object.XFAObject { + constructor(attributes) { + super(DATASETS_NS_ID, "datasets", true); + this.data = null; + this.Signature = null; + } + [_xfa_object.$onChild](child) { + const name = child[_xfa_object.$nodeName]; + if (name === "data" && child[_xfa_object.$namespaceId] === DATASETS_NS_ID || name === "Signature" && child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.signature.id) { + this[name] = child; + } + this[_xfa_object.$appendChild](child); + } +} +class DatasetsNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (DatasetsNamespace.hasOwnProperty(name)) { + return DatasetsNamespace[name](attributes); + } + return undefined; + } + static datasets(attributes) { + return new Datasets(attributes); + } + static data(attributes) { + return new Data(attributes); + } +} +exports.DatasetsNamespace = DatasetsNamespace; + +/***/ }), +/* 223 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.LocaleSetNamespace = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +var _utils = __w_pdfjs_require__(207); +const LOCALE_SET_NS_ID = _namespaces.NamespaceIds.localeSet.id; +class CalendarSymbols extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "calendarSymbols", true); + this.name = "gregorian"; + this.dayNames = new _xfa_object.XFAObjectArray(2); + this.eraNames = null; + this.meridiemNames = null; + this.monthNames = new _xfa_object.XFAObjectArray(2); + } +} +class CurrencySymbol extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbol"); + this.name = (0, _utils.getStringOption)(attributes.name, ["symbol", "isoname", "decimal"]); + } +} +class CurrencySymbols extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbols", true); + this.currencySymbol = new _xfa_object.XFAObjectArray(3); + } +} +class DatePattern extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePattern"); + this.name = (0, _utils.getStringOption)(attributes.name, ["full", "long", "med", "short"]); + } +} +class DatePatterns extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePatterns", true); + this.datePattern = new _xfa_object.XFAObjectArray(4); + } +} +class DateTimeSymbols extends _xfa_object.ContentObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dateTimeSymbols"); + } +} +class Day extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "day"); + } +} +class DayNames extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dayNames", true); + this.abbr = (0, _utils.getInteger)({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.day = new _xfa_object.XFAObjectArray(7); + } +} +class Era extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "era"); + } +} +class EraNames extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "eraNames", true); + this.era = new _xfa_object.XFAObjectArray(2); + } +} +class Locale extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "locale", true); + this.desc = attributes.desc || ""; + this.name = "isoname"; + this.calendarSymbols = null; + this.currencySymbols = null; + this.datePatterns = null; + this.dateTimeSymbols = null; + this.numberPatterns = null; + this.numberSymbols = null; + this.timePatterns = null; + this.typeFaces = null; + } +} +class LocaleSet extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "localeSet", true); + this.locale = new _xfa_object.XFAObjectArray(); + } +} +class Meridiem extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiem"); + } +} +class MeridiemNames extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiemNames", true); + this.meridiem = new _xfa_object.XFAObjectArray(2); + } +} +class Month extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "month"); + } +} +class MonthNames extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "monthNames", true); + this.abbr = (0, _utils.getInteger)({ + data: attributes.abbr, + defaultValue: 0, + validate: x => x === 1 + }); + this.month = new _xfa_object.XFAObjectArray(12); + } +} +class NumberPattern extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPattern"); + this.name = (0, _utils.getStringOption)(attributes.name, ["full", "long", "med", "short"]); + } +} +class NumberPatterns extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPatterns", true); + this.numberPattern = new _xfa_object.XFAObjectArray(4); + } +} +class NumberSymbol extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbol"); + this.name = (0, _utils.getStringOption)(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]); + } +} +class NumberSymbols extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbols", true); + this.numberSymbol = new _xfa_object.XFAObjectArray(5); + } +} +class TimePattern extends _xfa_object.StringObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePattern"); + this.name = (0, _utils.getStringOption)(attributes.name, ["full", "long", "med", "short"]); + } +} +class TimePatterns extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePatterns", true); + this.timePattern = new _xfa_object.XFAObjectArray(4); + } +} +class TypeFace extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFace", true); + this.name = attributes.name | ""; + } +} +class TypeFaces extends _xfa_object.XFAObject { + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFaces", true); + this.typeFace = new _xfa_object.XFAObjectArray(); + } +} +class LocaleSetNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (LocaleSetNamespace.hasOwnProperty(name)) { + return LocaleSetNamespace[name](attributes); + } + return undefined; + } + static calendarSymbols(attrs) { + return new CalendarSymbols(attrs); + } + static currencySymbol(attrs) { + return new CurrencySymbol(attrs); + } + static currencySymbols(attrs) { + return new CurrencySymbols(attrs); + } + static datePattern(attrs) { + return new DatePattern(attrs); + } + static datePatterns(attrs) { + return new DatePatterns(attrs); + } + static dateTimeSymbols(attrs) { + return new DateTimeSymbols(attrs); + } + static day(attrs) { + return new Day(attrs); + } + static dayNames(attrs) { + return new DayNames(attrs); + } + static era(attrs) { + return new Era(attrs); + } + static eraNames(attrs) { + return new EraNames(attrs); + } + static locale(attrs) { + return new Locale(attrs); + } + static localeSet(attrs) { + return new LocaleSet(attrs); + } + static meridiem(attrs) { + return new Meridiem(attrs); + } + static meridiemNames(attrs) { + return new MeridiemNames(attrs); + } + static month(attrs) { + return new Month(attrs); + } + static monthNames(attrs) { + return new MonthNames(attrs); + } + static numberPattern(attrs) { + return new NumberPattern(attrs); + } + static numberPatterns(attrs) { + return new NumberPatterns(attrs); + } + static numberSymbol(attrs) { + return new NumberSymbol(attrs); + } + static numberSymbols(attrs) { + return new NumberSymbols(attrs); + } + static timePattern(attrs) { + return new TimePattern(attrs); + } + static timePatterns(attrs) { + return new TimePatterns(attrs); + } + static typeFace(attrs) { + return new TypeFace(attrs); + } + static typeFaces(attrs) { + return new TypeFaces(attrs); + } +} +exports.LocaleSetNamespace = LocaleSetNamespace; + +/***/ }), +/* 224 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.SignatureNamespace = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +const SIGNATURE_NS_ID = _namespaces.NamespaceIds.signature.id; +class Signature extends _xfa_object.XFAObject { + constructor(attributes) { + super(SIGNATURE_NS_ID, "signature", true); + } +} +class SignatureNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (SignatureNamespace.hasOwnProperty(name)) { + return SignatureNamespace[name](attributes); + } + return undefined; + } + static signature(attributes) { + return new Signature(attributes); + } +} +exports.SignatureNamespace = SignatureNamespace; + +/***/ }), +/* 225 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.StylesheetNamespace = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +const STYLESHEET_NS_ID = _namespaces.NamespaceIds.stylesheet.id; +class Stylesheet extends _xfa_object.XFAObject { + constructor(attributes) { + super(STYLESHEET_NS_ID, "stylesheet", true); + } +} +class StylesheetNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (StylesheetNamespace.hasOwnProperty(name)) { + return StylesheetNamespace[name](attributes); + } + return undefined; + } + static stylesheet(attributes) { + return new Stylesheet(attributes); + } +} +exports.StylesheetNamespace = StylesheetNamespace; + +/***/ }), +/* 226 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XdpNamespace = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +const XDP_NS_ID = _namespaces.NamespaceIds.xdp.id; +class Xdp extends _xfa_object.XFAObject { + constructor(attributes) { + super(XDP_NS_ID, "xdp", true); + this.uuid = attributes.uuid || ""; + this.timeStamp = attributes.timeStamp || ""; + this.config = null; + this.connectionSet = null; + this.datasets = null; + this.localeSet = null; + this.stylesheet = new _xfa_object.XFAObjectArray(); + this.template = null; + } + [_xfa_object.$onChildCheck](child) { + const ns = _namespaces.NamespaceIds[child[_xfa_object.$nodeName]]; + return ns && child[_xfa_object.$namespaceId] === ns.id; + } +} +class XdpNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (XdpNamespace.hasOwnProperty(name)) { + return XdpNamespace[name](attributes); + } + return undefined; + } + static xdp(attributes) { + return new Xdp(attributes); + } +} +exports.XdpNamespace = XdpNamespace; + +/***/ }), +/* 227 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XhtmlNamespace = void 0; +var _xfa_object = __w_pdfjs_require__(206); +var _namespaces = __w_pdfjs_require__(208); +var _html_utils = __w_pdfjs_require__(213); +var _utils = __w_pdfjs_require__(207); +const XHTML_NS_ID = _namespaces.NamespaceIds.xhtml.id; +const $richText = Symbol(); +const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]); +const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => { + value = original.fontSize = (0, _utils.getMeasurement)(value); + return (0, _html_utils.measureToString)(0.99 * value); +}], ["letter-spacing", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["line-height", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-bottom", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-left", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-right", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-top", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["text-indent", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["font-family", value => value], ["vertical-align", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))]]); +const spacesRegExp = /\s+/g; +const crlfRegExp = /[\r\n]+/g; +const crlfForRichTextRegExp = /\r\n?/g; +function mapStyle(styleStr, node, richText) { + const style = Object.create(null); + if (!styleStr) { + return style; + } + const original = Object.create(null); + for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) { + const mapping = StyleMapping.get(key); + if (mapping === "") { + continue; + } + let newValue = value; + if (mapping) { + if (typeof mapping === "string") { + newValue = mapping; + } else { + newValue = mapping(value, original); + } + } + if (key.endsWith("scale")) { + if (style.transform) { + style.transform = `${style[key]} ${newValue}`; + } else { + style.transform = newValue; + } + } else { + style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue; + } + } + if (style.fontFamily) { + (0, _html_utils.setFontFamily)({ + typeface: style.fontFamily, + weight: style.fontWeight || "normal", + posture: style.fontStyle || "normal", + size: original.fontSize || 0 + }, node, node[_xfa_object.$globalData].fontFinder, style); + } + if (richText && style.verticalAlign && style.verticalAlign !== "0px" && style.fontSize) { + const SUB_SUPER_SCRIPT_FACTOR = 0.583; + const VERTICAL_FACTOR = 0.333; + const fontSize = (0, _utils.getMeasurement)(style.fontSize); + style.fontSize = (0, _html_utils.measureToString)(fontSize * SUB_SUPER_SCRIPT_FACTOR); + style.verticalAlign = (0, _html_utils.measureToString)(Math.sign((0, _utils.getMeasurement)(style.verticalAlign)) * fontSize * VERTICAL_FACTOR); + } + if (richText && style.fontSize) { + style.fontSize = `calc(${style.fontSize} * var(--scale-factor))`; + } + (0, _html_utils.fixTextIndent)(style); + return style; +} +function checkStyle(node) { + if (!node.style) { + return ""; + } + return node.style.trim().split(/\s*;\s*/).filter(s => !!s).map(s => s.split(/\s*:\s*/, 2)).filter(_ref => { + let [key, value] = _ref; + if (key === "font-family") { + node[_xfa_object.$globalData].usedTypefaces.add(value); + } + return VALID_STYLES.has(key); + }).map(kv => kv.join(":")).join(";"); +} +const NoWhites = new Set(["body", "html"]); +class XhtmlObject extends _xfa_object.XmlObject { + constructor(attributes, name) { + super(XHTML_NS_ID, name); + this[$richText] = false; + this.style = attributes.style || ""; + } + [_xfa_object.$clean](builder) { + super[_xfa_object.$clean](builder); + this.style = checkStyle(this); + } + [_xfa_object.$acceptWhitespace]() { + return !NoWhites.has(this[_xfa_object.$nodeName]); + } + [_xfa_object.$onText](str) { + let richText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (!richText) { + str = str.replace(crlfRegExp, ""); + if (!this.style.includes("xfa-spacerun:yes")) { + str = str.replace(spacesRegExp, " "); + } + } else { + this[$richText] = true; + } + if (str) { + this[_xfa_object.$content] += str; + } + } + [_xfa_object.$pushGlyphs](measure) { + let mustPop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + const xfaFont = Object.create(null); + const margin = { + top: NaN, + bottom: NaN, + left: NaN, + right: NaN + }; + let lineHeight = null; + for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) { + switch (key) { + case "font-family": + xfaFont.typeface = (0, _utils.stripQuotes)(value); + break; + case "font-size": + xfaFont.size = (0, _utils.getMeasurement)(value); + break; + case "font-weight": + xfaFont.weight = value; + break; + case "font-style": + xfaFont.posture = value; + break; + case "letter-spacing": + xfaFont.letterSpacing = (0, _utils.getMeasurement)(value); + break; + case "margin": + const values = value.split(/ \t/).map(x => (0, _utils.getMeasurement)(x)); + switch (values.length) { + case 1: + margin.top = margin.bottom = margin.left = margin.right = values[0]; + break; + case 2: + margin.top = margin.bottom = values[0]; + margin.left = margin.right = values[1]; + break; + case 3: + margin.top = values[0]; + margin.bottom = values[2]; + margin.left = margin.right = values[1]; + break; + case 4: + margin.top = values[0]; + margin.left = values[1]; + margin.bottom = values[2]; + margin.right = values[3]; + break; + } + break; + case "margin-top": + margin.top = (0, _utils.getMeasurement)(value); + break; + case "margin-bottom": + margin.bottom = (0, _utils.getMeasurement)(value); + break; + case "margin-left": + margin.left = (0, _utils.getMeasurement)(value); + break; + case "margin-right": + margin.right = (0, _utils.getMeasurement)(value); + break; + case "line-height": + lineHeight = (0, _utils.getMeasurement)(value); + break; + } + } + measure.pushData(xfaFont, margin, lineHeight); + if (this[_xfa_object.$content]) { + measure.addString(this[_xfa_object.$content]); + } else { + for (const child of this[_xfa_object.$getChildren]()) { + if (child[_xfa_object.$nodeName] === "#text") { + measure.addString(child[_xfa_object.$content]); + continue; + } + child[_xfa_object.$pushGlyphs](measure); + } + } + if (mustPop) { + measure.popFont(); + } + } + [_xfa_object.$toHTML](availableSpace) { + const children = []; + this[_xfa_object.$extra] = { + children + }; + this[_xfa_object.$childrenToHTML]({}); + if (children.length === 0 && !this[_xfa_object.$content]) { + return _utils.HTMLResult.EMPTY; + } + let value; + if (this[$richText]) { + value = this[_xfa_object.$content] ? this[_xfa_object.$content].replace(crlfForRichTextRegExp, "\n") : undefined; + } else { + value = this[_xfa_object.$content] || undefined; + } + return _utils.HTMLResult.success({ + name: this[_xfa_object.$nodeName], + attributes: { + href: this.href, + style: mapStyle(this.style, this, this[$richText]) + }, + children, + value + }); + } +} +class A extends XhtmlObject { + constructor(attributes) { + super(attributes, "a"); + this.href = (0, _html_utils.fixURL)(attributes.href) || ""; + } +} +class B extends XhtmlObject { + constructor(attributes) { + super(attributes, "b"); + } + [_xfa_object.$pushGlyphs](measure) { + measure.pushFont({ + weight: "bold" + }); + super[_xfa_object.$pushGlyphs](measure); + measure.popFont(); + } +} +class Body extends XhtmlObject { + constructor(attributes) { + super(attributes, "body"); + } + [_xfa_object.$toHTML](availableSpace) { + const res = super[_xfa_object.$toHTML](availableSpace); + const { + html + } = res; + if (!html) { + return _utils.HTMLResult.EMPTY; + } + html.name = "div"; + html.attributes.class = ["xfaRich"]; + return res; + } +} +class Br extends XhtmlObject { + constructor(attributes) { + super(attributes, "br"); + } + [_xfa_object.$text]() { + return "\n"; + } + [_xfa_object.$pushGlyphs](measure) { + measure.addString("\n"); + } + [_xfa_object.$toHTML](availableSpace) { + return _utils.HTMLResult.success({ + name: "br" + }); + } +} +class Html extends XhtmlObject { + constructor(attributes) { + super(attributes, "html"); + } + [_xfa_object.$toHTML](availableSpace) { + const children = []; + this[_xfa_object.$extra] = { + children + }; + this[_xfa_object.$childrenToHTML]({}); + if (children.length === 0) { + return _utils.HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: {} + }, + value: this[_xfa_object.$content] || "" + }); + } + if (children.length === 1) { + const child = children[0]; + if (child.attributes && child.attributes.class.includes("xfaRich")) { + return _utils.HTMLResult.success(child); + } + } + return _utils.HTMLResult.success({ + name: "div", + attributes: { + class: ["xfaRich"], + style: {} + }, + children + }); + } +} +class I extends XhtmlObject { + constructor(attributes) { + super(attributes, "i"); + } + [_xfa_object.$pushGlyphs](measure) { + measure.pushFont({ + posture: "italic" + }); + super[_xfa_object.$pushGlyphs](measure); + measure.popFont(); + } +} +class Li extends XhtmlObject { + constructor(attributes) { + super(attributes, "li"); + } +} +class Ol extends XhtmlObject { + constructor(attributes) { + super(attributes, "ol"); + } +} +class P extends XhtmlObject { + constructor(attributes) { + super(attributes, "p"); + } + [_xfa_object.$pushGlyphs](measure) { + super[_xfa_object.$pushGlyphs](measure, false); + measure.addString("\n"); + measure.addPara(); + measure.popFont(); + } + [_xfa_object.$text]() { + const siblings = this[_xfa_object.$getParent]()[_xfa_object.$getChildren](); + if (siblings.at(-1) === this) { + return super[_xfa_object.$text](); + } + return super[_xfa_object.$text]() + "\n"; + } +} +class Span extends XhtmlObject { + constructor(attributes) { + super(attributes, "span"); + } +} +class Sub extends XhtmlObject { + constructor(attributes) { + super(attributes, "sub"); + } +} +class Sup extends XhtmlObject { + constructor(attributes) { + super(attributes, "sup"); + } +} +class Ul extends XhtmlObject { + constructor(attributes) { + super(attributes, "ul"); + } +} +class XhtmlNamespace { + static [_namespaces.$buildXFAObject](name, attributes) { + if (XhtmlNamespace.hasOwnProperty(name)) { + return XhtmlNamespace[name](attributes); + } + return undefined; + } + static a(attributes) { + return new A(attributes); + } + static b(attributes) { + return new B(attributes); + } + static body(attributes) { + return new Body(attributes); + } + static br(attributes) { + return new Br(attributes); + } + static html(attributes) { + return new Html(attributes); + } + static i(attributes) { + return new I(attributes); + } + static li(attributes) { + return new Li(attributes); + } + static ol(attributes) { + return new Ol(attributes); + } + static p(attributes) { + return new P(attributes); + } + static span(attributes) { + return new Span(attributes); + } + static sub(attributes) { + return new Sub(attributes); + } + static sup(attributes) { + return new Sup(attributes); + } + static ul(attributes) { + return new Ul(attributes); + } +} +exports.XhtmlNamespace = XhtmlNamespace; + +/***/ }), +/* 228 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.UnknownNamespace = void 0; +var _namespaces = __w_pdfjs_require__(208); +var _xfa_object = __w_pdfjs_require__(206); +class UnknownNamespace { + constructor(nsId) { + this.namespaceId = nsId; + } + [_namespaces.$buildXFAObject](name, attributes) { + return new _xfa_object.XmlObject(this.namespaceId, name, attributes); + } +} +exports.UnknownNamespace = UnknownNamespace; + +/***/ }), +/* 229 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.DatasetReader = void 0; +var _util = __w_pdfjs_require__(2); +var _core_utils = __w_pdfjs_require__(135); +var _xml_parser = __w_pdfjs_require__(195); +function decodeString(str) { + try { + return (0, _util.stringToUTF8String)(str); + } catch (ex) { + (0, _util.warn)(`UTF-8 decoding failed: "${ex}".`); + return str; + } +} +class DatasetXMLParser extends _xml_parser.SimpleXMLParser { + constructor(options) { + super(options); + this.node = null; + } + onEndElement(name) { + const node = super.onEndElement(name); + if (node && name === "xfa:datasets") { + this.node = node; + throw new Error("Aborting DatasetXMLParser."); + } + } +} +class DatasetReader { + constructor(data) { + if (data.datasets) { + this.node = new _xml_parser.SimpleXMLParser({ + hasAttributes: true + }).parseFromString(data.datasets).documentElement; + } else { + const parser = new DatasetXMLParser({ + hasAttributes: true + }); + try { + parser.parseFromString(data["xdp:xdp"]); + } catch (_) {} + this.node = parser.node; + } + } + getValue(path) { + if (!this.node || !path) { + return ""; + } + const node = this.node.searchNode((0, _core_utils.parseXFAPath)(path), 0); + if (!node) { + return ""; + } + const first = node.firstChild; + if (first && first.nodeName === "value") { + return node.children.map(child => decodeString(child.textContent)); + } + return decodeString(node.textContent); + } +} +exports.DatasetReader = DatasetReader; + +/***/ }), +/* 230 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.XRef = void 0; +var _util = __w_pdfjs_require__(2); +var _primitives = __w_pdfjs_require__(134); +var _core_utils = __w_pdfjs_require__(135); +var _parser = __w_pdfjs_require__(146); +var _base_stream = __w_pdfjs_require__(136); +var _crypto = __w_pdfjs_require__(196); +class XRef { + constructor(stream, pdfManager) { + this.stream = stream; + this.pdfManager = pdfManager; + this.entries = []; + this.xrefstms = Object.create(null); + this._cacheMap = new Map(); + this._pendingRefs = new _primitives.RefSet(); + this.stats = new _core_utils.DocStats(pdfManager.msgHandler); + this._newPersistentRefNum = null; + this._newTemporaryRefNum = null; + } + getNewPersistentRef(obj) { + if (this._newPersistentRefNum === null) { + this._newPersistentRefNum = this.entries.length || 1; + } + const num = this._newPersistentRefNum++; + this._cacheMap.set(num, obj); + return _primitives.Ref.get(num, 0); + } + getNewTemporaryRef() { + if (this._newTemporaryRefNum === null) { + this._newTemporaryRefNum = this.entries.length || 1; + } + return _primitives.Ref.get(this._newTemporaryRefNum++, 0); + } + resetNewTemporaryRef() { + this._newTemporaryRefNum = null; + } + setStartXRef(startXRef) { + this.startXRefQueue = [startXRef]; + } + parse() { + let recoveryMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + let trailerDict; + if (!recoveryMode) { + trailerDict = this.readXRef(); + } else { + (0, _util.warn)("Indexing all PDF objects"); + trailerDict = this.indexObjects(); + } + trailerDict.assignXref(this); + this.trailer = trailerDict; + let encrypt; + try { + encrypt = trailerDict.get("Encrypt"); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`); + } + if (encrypt instanceof _primitives.Dict) { + const ids = trailerDict.get("ID"); + const fileId = ids && ids.length ? ids[0] : ""; + encrypt.suppressEncryption = true; + this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password); + } + let root; + try { + root = trailerDict.get("Root"); + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)(`XRef.parse - Invalid "Root" reference: "${ex}".`); + } + if (root instanceof _primitives.Dict) { + try { + const pages = root.get("Pages"); + if (pages instanceof _primitives.Dict) { + this.root = root; + return; + } + } catch (ex) { + if (ex instanceof _core_utils.MissingDataException) { + throw ex; + } + (0, _util.warn)(`XRef.parse - Invalid "Pages" reference: "${ex}".`); + } + } + if (!recoveryMode) { + throw new _core_utils.XRefParseException(); + } + throw new _util.InvalidPDFException("Invalid Root reference."); + } + processXRefTable(parser) { + if (!("tableState" in this)) { + this.tableState = { + entryNum: 0, + streamPos: parser.lexer.stream.pos, + parserBuf1: parser.buf1, + parserBuf2: parser.buf2 + }; + } + const obj = this.readXRefTable(parser); + if (!(0, _primitives.isCmd)(obj, "trailer")) { + throw new _util.FormatError("Invalid XRef table: could not find trailer dictionary"); + } + let dict = parser.getObj(); + if (!(dict instanceof _primitives.Dict) && dict.dict) { + dict = dict.dict; + } + if (!(dict instanceof _primitives.Dict)) { + throw new _util.FormatError("Invalid XRef table: could not parse trailer dictionary"); + } + delete this.tableState; + return dict; + } + readXRefTable(parser) { + const stream = parser.lexer.stream; + const tableState = this.tableState; + stream.pos = tableState.streamPos; + parser.buf1 = tableState.parserBuf1; + parser.buf2 = tableState.parserBuf2; + let obj; + while (true) { + if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) { + if ((0, _primitives.isCmd)(obj = parser.getObj(), "trailer")) { + break; + } + tableState.firstEntryNum = obj; + tableState.entryCount = parser.getObj(); + } + let first = tableState.firstEntryNum; + const count = tableState.entryCount; + if (!Number.isInteger(first) || !Number.isInteger(count)) { + throw new _util.FormatError("Invalid XRef table: wrong types in subsection header"); + } + for (let i = tableState.entryNum; i < count; i++) { + tableState.streamPos = stream.pos; + tableState.entryNum = i; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + const entry = {}; + entry.offset = parser.getObj(); + entry.gen = parser.getObj(); + const type = parser.getObj(); + if (type instanceof _primitives.Cmd) { + switch (type.cmd) { + case "f": + entry.free = true; + break; + case "n": + entry.uncompressed = true; + break; + } + } + if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) { + throw new _util.FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`); + } + if (i === 0 && entry.free && first === 1) { + first = 0; + } + if (!this.entries[i + first]) { + this.entries[i + first] = entry; + } + } + tableState.entryNum = 0; + tableState.streamPos = stream.pos; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + delete tableState.firstEntryNum; + delete tableState.entryCount; + } + if (this.entries[0] && !this.entries[0].free) { + throw new _util.FormatError("Invalid XRef table: unexpected first object"); + } + return obj; + } + processXRefStream(stream) { + if (!("streamState" in this)) { + const streamParameters = stream.dict; + const byteWidths = streamParameters.get("W"); + let range = streamParameters.get("Index"); + if (!range) { + range = [0, streamParameters.get("Size")]; + } + this.streamState = { + entryRanges: range, + byteWidths, + entryNum: 0, + streamPos: stream.pos + }; + } + this.readXRefStream(stream); + delete this.streamState; + return stream.dict; + } + readXRefStream(stream) { + const streamState = this.streamState; + stream.pos = streamState.streamPos; + const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = streamState.byteWidths; + const entryRanges = streamState.entryRanges; + while (entryRanges.length > 0) { + const [first, n] = entryRanges; + if (!Number.isInteger(first) || !Number.isInteger(n)) { + throw new _util.FormatError(`Invalid XRef range fields: ${first}, ${n}`); + } + if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) { + throw new _util.FormatError(`Invalid XRef entry fields length: ${first}, ${n}`); + } + for (let i = streamState.entryNum; i < n; ++i) { + streamState.entryNum = i; + streamState.streamPos = stream.pos; + let type = 0, + offset = 0, + generation = 0; + for (let j = 0; j < typeFieldWidth; ++j) { + const typeByte = stream.getByte(); + if (typeByte === -1) { + throw new _util.FormatError("Invalid XRef byteWidths 'type'."); + } + type = type << 8 | typeByte; + } + if (typeFieldWidth === 0) { + type = 1; + } + for (let j = 0; j < offsetFieldWidth; ++j) { + const offsetByte = stream.getByte(); + if (offsetByte === -1) { + throw new _util.FormatError("Invalid XRef byteWidths 'offset'."); + } + offset = offset << 8 | offsetByte; + } + for (let j = 0; j < generationFieldWidth; ++j) { + const generationByte = stream.getByte(); + if (generationByte === -1) { + throw new _util.FormatError("Invalid XRef byteWidths 'generation'."); + } + generation = generation << 8 | generationByte; + } + const entry = {}; + entry.offset = offset; + entry.gen = generation; + switch (type) { + case 0: + entry.free = true; + break; + case 1: + entry.uncompressed = true; + break; + case 2: + break; + default: + throw new _util.FormatError(`Invalid XRef entry type: ${type}`); + } + if (!this.entries[first + i]) { + this.entries[first + i] = entry; + } + } + streamState.entryNum = 0; + streamState.streamPos = stream.pos; + entryRanges.splice(0, 2); + } + } + indexObjects() { + const TAB = 0x9, + LF = 0xa, + CR = 0xd, + SPACE = 0x20; + const PERCENT = 0x25, + LT = 0x3c; + function readToken(data, offset) { + let token = "", + ch = data[offset]; + while (ch !== LF && ch !== CR && ch !== LT) { + if (++offset >= data.length) { + break; + } + token += String.fromCharCode(ch); + ch = data[offset]; + } + return token; + } + function skipUntil(data, offset, what) { + const length = what.length, + dataLength = data.length; + let skipped = 0; + while (offset < dataLength) { + let i = 0; + while (i < length && data[offset + i] === what[i]) { + ++i; + } + if (i >= length) { + break; + } + offset++; + skipped++; + } + return skipped; + } + const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer)\b/g; + const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g; + const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; + const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); + const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]); + const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); + this.entries.length = 0; + this._cacheMap.clear(); + const stream = this.stream; + stream.pos = 0; + const buffer = stream.getBytes(), + bufferStr = (0, _util.bytesToString)(buffer), + length = buffer.length; + let position = stream.start; + const trailers = [], + xrefStms = []; + while (position < length) { + let ch = buffer[position]; + if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { + ++position; + continue; + } + if (ch === PERCENT) { + do { + ++position; + if (position >= length) { + break; + } + ch = buffer[position]; + } while (ch !== LF && ch !== CR); + continue; + } + const token = readToken(buffer, position); + let m; + if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) { + position += skipUntil(buffer, position, trailerBytes); + trailers.push(position); + position += skipUntil(buffer, position, startxrefBytes); + } else if (m = objRegExp.exec(token)) { + const num = m[1] | 0, + gen = m[2] | 0; + const startPos = position + token.length; + let contentLength, + updateEntries = false; + if (!this.entries[num]) { + updateEntries = true; + } else if (this.entries[num].gen === gen) { + try { + const parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream.makeSubStream(startPos)) + }); + parser.getObj(); + updateEntries = true; + } catch (ex) { + if (ex instanceof _core_utils.ParserEOFException) { + (0, _util.warn)(`indexObjects -- checking object (${token}): "${ex}".`); + } else { + updateEntries = true; + } + } + } + if (updateEntries) { + this.entries[num] = { + offset: position - stream.start, + gen, + uncompressed: true + }; + } + gEndobjRegExp.lastIndex = startPos; + const match = gEndobjRegExp.exec(bufferStr); + if (match) { + const endPos = gEndobjRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "endobj") { + (0, _util.warn)(`indexObjects: Found "${match[1]}" inside of another "obj", ` + 'caused by missing "endobj" -- trying to recover.'); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + const content = buffer.subarray(position, position + contentLength); + const xrefTagOffset = skipUntil(content, 0, xrefBytes); + if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { + xrefStms.push(position - stream.start); + this.xrefstms[position - stream.start] = 1; + } + position += contentLength; + } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) { + trailers.push(position); + const startPos = position + token.length; + let contentLength; + gStartxrefRegExp.lastIndex = startPos; + const match = gStartxrefRegExp.exec(bufferStr); + if (match) { + const endPos = gStartxrefRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "startxref") { + (0, _util.warn)(`indexObjects: Found "${match[1]}" after "trailer", ` + 'caused by missing "startxref" -- trying to recover.'); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + position += contentLength; + } else { + position += token.length + 1; + } + } + for (const xrefStm of xrefStms) { + this.startXRefQueue.push(xrefStm); + this.readXRef(true); + } + let trailerDict, trailerError; + for (const trailer of [...trailers, "generationFallback", ...trailers]) { + if (trailer === "generationFallback") { + if (!trailerError) { + break; + } + this._generationFallback = true; + continue; + } + stream.pos = trailer; + const parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true, + recoveryMode: true + }); + const obj = parser.getObj(); + if (!(0, _primitives.isCmd)(obj, "trailer")) { + continue; + } + const dict = parser.getObj(); + if (!(dict instanceof _primitives.Dict)) { + continue; + } + let validPagesDict = false; + try { + const rootDict = dict.get("Root"); + if (!(rootDict instanceof _primitives.Dict)) { + continue; + } + const pagesDict = rootDict.get("Pages"); + if (!(pagesDict instanceof _primitives.Dict)) { + continue; + } + const pagesCount = pagesDict.get("Count"); + if (Number.isInteger(pagesCount)) { + validPagesDict = true; + } + } catch (ex) { + trailerError = ex; + continue; + } + if (validPagesDict && dict.has("ID")) { + return dict; + } + trailerDict = dict; + } + if (trailerDict) { + return trailerDict; + } + if (this.topDict) { + return this.topDict; + } + throw new _util.InvalidPDFException("Invalid PDF structure."); + } + readXRef() { + let recoveryMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + const stream = this.stream; + const startXRefParsedCache = new Set(); + while (this.startXRefQueue.length) { + try { + const startXRef = this.startXRefQueue[0]; + if (startXRefParsedCache.has(startXRef)) { + (0, _util.warn)("readXRef - skipping XRef table since it was already parsed."); + this.startXRefQueue.shift(); + continue; + } + startXRefParsedCache.add(startXRef); + stream.pos = startXRef + stream.start; + const parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true + }); + let obj = parser.getObj(); + let dict; + if ((0, _primitives.isCmd)(obj, "xref")) { + dict = this.processXRefTable(parser); + if (!this.topDict) { + this.topDict = dict; + } + obj = dict.get("XRefStm"); + if (Number.isInteger(obj)) { + const pos = obj; + if (!(pos in this.xrefstms)) { + this.xrefstms[pos] = 1; + this.startXRefQueue.push(pos); + } + } + } else if (Number.isInteger(obj)) { + if (!Number.isInteger(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof _base_stream.BaseStream)) { + throw new _util.FormatError("Invalid XRef stream"); + } + dict = this.processXRefStream(obj); + if (!this.topDict) { + this.topDict = dict; + } + if (!dict) { + throw new _util.FormatError("Failed to read XRef stream"); + } + } else { + throw new _util.FormatError("Invalid XRef stream header"); + } + obj = dict.get("Prev"); + if (Number.isInteger(obj)) { + this.startXRefQueue.push(obj); + } else if (obj instanceof _primitives.Ref) { + this.startXRefQueue.push(obj.num); + } + } catch (e) { + if (e instanceof _core_utils.MissingDataException) { + throw e; + } + (0, _util.info)("(while reading XRef): " + e); + } + this.startXRefQueue.shift(); + } + if (this.topDict) { + return this.topDict; + } + if (recoveryMode) { + return undefined; + } + throw new _core_utils.XRefParseException(); + } + getEntry(i) { + const xrefEntry = this.entries[i]; + if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { + return xrefEntry; + } + return null; + } + fetchIfRef(obj) { + let suppressEncryption = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (obj instanceof _primitives.Ref) { + return this.fetch(obj, suppressEncryption); + } + return obj; + } + fetch(ref) { + let suppressEncryption = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (!(ref instanceof _primitives.Ref)) { + throw new Error("ref object is not a reference"); + } + const num = ref.num; + const cacheEntry = this._cacheMap.get(num); + if (cacheEntry !== undefined) { + if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) { + cacheEntry.objId = ref.toString(); + } + return cacheEntry; + } + let xrefEntry = this.getEntry(num); + if (xrefEntry === null) { + this._cacheMap.set(num, xrefEntry); + return xrefEntry; + } + if (this._pendingRefs.has(ref)) { + this._pendingRefs.remove(ref); + (0, _util.warn)(`Ignoring circular reference: ${ref}.`); + return _primitives.CIRCULAR_REF; + } + this._pendingRefs.put(ref); + try { + if (xrefEntry.uncompressed) { + xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); + } else { + xrefEntry = this.fetchCompressed(ref, xrefEntry, suppressEncryption); + } + this._pendingRefs.remove(ref); + } catch (ex) { + this._pendingRefs.remove(ref); + throw ex; + } + if (xrefEntry instanceof _primitives.Dict) { + xrefEntry.objId = ref.toString(); + } else if (xrefEntry instanceof _base_stream.BaseStream) { + xrefEntry.dict.objId = ref.toString(); + } + return xrefEntry; + } + fetchUncompressed(ref, xrefEntry) { + let suppressEncryption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + const gen = ref.gen; + let num = ref.num; + if (xrefEntry.gen !== gen) { + const msg = `Inconsistent generation in XRef: ${ref}`; + if (this._generationFallback && xrefEntry.gen < gen) { + (0, _util.warn)(msg); + return this.fetchUncompressed(_primitives.Ref.get(num, xrefEntry.gen), xrefEntry, suppressEncryption); + } + throw new _core_utils.XRefEntryException(msg); + } + const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); + const parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true + }); + const obj1 = parser.getObj(); + const obj2 = parser.getObj(); + const obj3 = parser.getObj(); + if (obj1 !== num || obj2 !== gen || !(obj3 instanceof _primitives.Cmd)) { + throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); + } + if (obj3.cmd !== "obj") { + if (obj3.cmd.startsWith("obj")) { + num = parseInt(obj3.cmd.substring(3), 10); + if (!Number.isNaN(num)) { + return num; + } + } + throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); + } + if (this.encrypt && !suppressEncryption) { + xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); + } else { + xrefEntry = parser.getObj(); + } + if (!(xrefEntry instanceof _base_stream.BaseStream)) { + this._cacheMap.set(num, xrefEntry); + } + return xrefEntry; + } + fetchCompressed(ref, xrefEntry) { + let suppressEncryption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + const tableOffset = xrefEntry.offset; + const stream = this.fetch(_primitives.Ref.get(tableOffset, 0)); + if (!(stream instanceof _base_stream.BaseStream)) { + throw new _util.FormatError("bad ObjStm stream"); + } + const first = stream.dict.get("First"); + const n = stream.dict.get("N"); + if (!Number.isInteger(first) || !Number.isInteger(n)) { + throw new _util.FormatError("invalid first and n parameters for ObjStm stream"); + } + let parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream), + xref: this, + allowStreams: true + }); + const nums = new Array(n); + const offsets = new Array(n); + for (let i = 0; i < n; ++i) { + const num = parser.getObj(); + if (!Number.isInteger(num)) { + throw new _util.FormatError(`invalid object number in the ObjStm stream: ${num}`); + } + const offset = parser.getObj(); + if (!Number.isInteger(offset)) { + throw new _util.FormatError(`invalid object offset in the ObjStm stream: ${offset}`); + } + nums[i] = num; + offsets[i] = offset; + } + const start = (stream.start || 0) + first; + const entries = new Array(n); + for (let i = 0; i < n; ++i) { + const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined; + if (length < 0) { + throw new _util.FormatError("Invalid offset in the ObjStm stream."); + } + parser = new _parser.Parser({ + lexer: new _parser.Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)), + xref: this, + allowStreams: true + }); + const obj = parser.getObj(); + entries[i] = obj; + if (obj instanceof _base_stream.BaseStream) { + continue; + } + const num = nums[i], + entry = this.entries[num]; + if (entry && entry.offset === tableOffset && entry.gen === i) { + this._cacheMap.set(num, obj); + } + } + xrefEntry = entries[xrefEntry.gen]; + if (xrefEntry === undefined) { + throw new _core_utils.XRefEntryException(`Bad (compressed) XRef entry: ${ref}`); + } + return xrefEntry; + } + async fetchIfRefAsync(obj, suppressEncryption) { + if (obj instanceof _primitives.Ref) { + return this.fetchAsync(obj, suppressEncryption); + } + return obj; + } + async fetchAsync(ref, suppressEncryption) { + try { + return this.fetch(ref, suppressEncryption); + } catch (ex) { + if (!(ex instanceof _core_utils.MissingDataException)) { + throw ex; + } + await this.pdfManager.requestRange(ex.begin, ex.end); + return this.fetchAsync(ref, suppressEncryption); + } + } + getCatalogObj() { + return this.root; + } +} +exports.XRef = XRef; + +/***/ }), +/* 231 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.MessageHandler = void 0; +var _util = __w_pdfjs_require__(2); +const CallbackKind = { + UNKNOWN: 0, + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + UNKNOWN: 0, + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function wrapReason(reason) { + if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { + (0, _util.unreachable)('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (reason.name) { + case "AbortException": + return new _util.AbortException(reason.message); + case "MissingPDFException": + return new _util.MissingPDFException(reason.message); + case "PasswordException": + return new _util.PasswordException(reason.message, reason.code); + case "UnexpectedResponseException": + return new _util.UnexpectedResponseException(reason.message, reason.status); + case "UnknownErrorException": + return new _util.UnknownErrorException(reason.message, reason.details); + default: + return new _util.UnknownErrorException(reason.message, reason.toString()); + } +} +class MessageHandler { + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + this._onComObjOnMessage = event => { + const data = event.data; + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this._processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const cbSourceName = this.sourceName; + const cbTargetName = data.sourceName; + new Promise(function (resolve) { + resolve(action(data.data)); + }).then(function (result) { + comObj.postMessage({ + sourceName: cbSourceName, + targetName: cbTargetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName: cbSourceName, + targetName: cbTargetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this._createStreamSink(data); + return; + } + action(data.data); + }; + comObj.addEventListener("message", this._onComObjOnMessage); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = (0, _util.createPromiseCapability)(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = (0, _util.createPromiseCapability)(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = (0, _util.createPromiseCapability)(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + (0, _util.assert)(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = (0, _util.createPromiseCapability)(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + _createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk) { + let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + let transfers = arguments.length > 2 ? arguments[2] : undefined; + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = (0, _util.createPromiseCapability)(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + (0, _util.assert)(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: (0, _util.createPromiseCapability)(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + new Promise(function (resolve) { + resolve(action(data.data, streamSink)); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + _processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + new Promise(function (resolve) { + resolve(streamSink.onPull && streamSink.onPull()); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + (0, _util.assert)(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + (0, _util.assert)(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this._deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + (0, _util.assert)(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this._deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this._deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + new Promise(function (resolve) { + resolve(streamSink.onCancel && streamSink.onCancel(wrapReason(data.reason))); + }).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(wrapReason(data.reason)); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async _deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall && streamController.startCall.promise, streamController.pullCall && streamController.pullCall.promise, streamController.cancelCall && streamController.cancelCall.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.comObj.removeEventListener("message", this._onComObjOnMessage); + } +} +exports.MessageHandler = MessageHandler; + +/***/ }), +/* 232 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.PDFWorkerStream = void 0; +var _util = __w_pdfjs_require__(2); +class PDFWorkerStream { + constructor(msgHandler) { + this._msgHandler = msgHandler; + this._contentLength = null; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + getFullReader() { + (0, _util.assert)(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + if (this._fullRequestReader) { + this._fullRequestReader.cancel(reason); + } + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +exports.PDFWorkerStream = PDFWorkerStream; +class PDFWorkerStreamReader { + constructor(msgHandler) { + this._msgHandler = msgHandler; + this.onProgress = null; + this._contentLength = null; + this._isRangeSupported = false; + this._isStreamingSupported = false; + const readableStream = this._msgHandler.sendWithStream("GetReader"); + this._reader = readableStream.getReader(); + this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { + this._isStreamingSupported = data.isStreamingSupported; + this._isRangeSupported = data.isRangeSupported; + this._contentLength = data.contentLength; + }); + } + get headersReady() { + return this._headersReady; + } + get contentLength() { + return this._contentLength; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get isRangeSupported() { + return this._isRangeSupported; + } + async read() { + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true + }; + } + return { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} +class PDFWorkerStreamRangeReader { + constructor(begin, end, msgHandler) { + this._msgHandler = msgHandler; + this.onProgress = null; + const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { + begin, + end + }); + this._reader = readableStream.getReader(); + } + get isStreamingSupported() { + return false; + } + async read() { + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true + }; + } + return { + value: value.buffer, + done: false + }; + } + cancel(reason) { + this._reader.cancel(reason); + } +} + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __w_pdfjs_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __w_pdfjs_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__w_pdfjs_require__.o(definition, key) && !__w_pdfjs_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __w_pdfjs_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __w_pdfjs_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +var exports = __webpack_exports__; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "WorkerMessageHandler", ({ + enumerable: true, + get: function () { + return _worker.WorkerMessageHandler; + } +})); +var _worker = __w_pdfjs_require__(1); +const pdfjsVersion = '3.2.146'; +const pdfjsBuild = '3fd2a3548'; +})(); + +/******/ return __webpack_exports__; +/******/ })() +; +}); +//# sourceMappingURL=pdf.worker.js.map diff --git a/src/assets/pdf-annotation/css/annotation.css b/src/assets/pdf-annotation/css/annotation.css new file mode 100755 index 0000000..ada7aab --- /dev/null +++ b/src/assets/pdf-annotation/css/annotation.css @@ -0,0 +1,997 @@ +.btn { + display: block; + padding: 10px; + font-size: 20px; + padding-top: 30px; + /* background-image: linear-gradient(45deg, #2edd1d, #f2ff56); */ + background-image: linear-gradient(45deg, #0081ff, #1cbbb4); + /* background-image: linear-gradient(45deg, #9000ff, #5e00ff); */ + /* background-image: linear-gradient(45deg, #f43f3b, #ec008c); */ + border: 0; + text-align: left; + color: #ffffff; + height: 70px; + vertical-align: bottom; + width: 100%; +} + +.btn-red { + background-color: #dd524d; +} + +.btn-yellow { + background-color: #f0ad4e; +} + +.desc { + padding: 10px; + color: #999999; +} + +.post-message-section { + visibility: hidden; +} + +.caves-wrapper { + position: relative; + border: 1px solid black; +} + +.annotation-buttons-hor { + display: flex; + flex-direction: row; + position: absolute; + /* top: 40%; */ + z-index: 5000000; + background-color: #FFFFFF; + padding: 2px 3px 2px 3px; + border: #dedede 1px solid; + border-radius: 5px; + box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1); + + -moz-user-select: none; + /*火狐*/ + -webkit-user-select: none; + /*webkit浏览器*/ + -ms-user-select: none; + /*IE10*/ + -khtml-user-select: none; + /*早期浏览器*/ + user-select: none; +} + +.annotation-buttons-hor button { + background-color: #ffffff; + /* background-color: #e7ebee; */ + border: none; + color: rgba(134, 142, 150, 1); + padding: 2px; + /* margin-left: 10px; */ + /* margin: 2px 2px 2px 0px; */ + width: 32px; + height: 32px; +} + +.annotation-buttons-hor button:hover { + background-color: rgba(207, 216, 224, 1); + border-radius: 3px; +} + +.annotation-buttons-hor button i:active { + border-radius: 3px; + background-color: rgba(207, 216, 224, 1); + border-radius: 3px; +} + + +.hor-annotation-buttons { + display: flex; + flex-direction: row; + position: absolute; + bottom: 5%; + z-index: 5000000; + padding: 5px 7px 5px 7px; + background-color: rgba(136, 136, 136); + border-radius: 5px; + /* opacity: 0.7; */ + /* background-color: rgba(136, 136, 136, 1); */ + /* box-shadow: 0px 2px 5px rgba(136, 136, 136, 1); */ +} + +.hor-annotation-buttons button { + /* box-shadow: 0px 2px 5px rgba(136, 136, 136, 1); */ + /* border: solid 0.2px #B2B2B2; */ + transition: visibility 0s .2s; + visibility: hidden; + background-color: rgba(136, 136, 136, 0); + /* background-color: #464646; */ + border: none; + /* margin-right: 10px; */ + color: #fefefe; + border-radius: 3px; + padding: 1px; + font-weight: 600; + font-family: "Microsoft Yahei"; + font-size: 20px; +} + +.hor-annotation-buttons button:hover { + visibility:visible; + color: #FFD700; + /* background-color: #DDDDDD; */ + /* box-shadow: 0px 2px 5px rgba(136, 136, 136, 1); */ +} + +.hor-annotation-buttons button span:active { + color: #FFD700; + /* background-color: #DDDDDD; */ + /* box-shadow: 0px 2px 5px rgba(136, 136, 136, 1); */ +} + +.hor-annotation-buttons button i:active { + color: #FFD700; +} + +.op-buttons-container { + width: 100%; + min-height: 32px; + /* background-color: #1CBBB4; */ + display: flex; + +} + +.annotation-buttons { + overflow-x: auto; + width: 100%; + /* height: 32px; */ + display: flex; + flex-direction: row; + justify-content: space-between; + float: left; + /* flex-wrap: wrap; */ + /* position: absolute; */ + /* top: 40%; */ + /* z-index: 5000000; */ + padding-right: 10px; + height: 36px; + /* color: #000000; */ + background-color: #e7ebee; + /* background-color: rgba(156, 156, 156); */ + /* background-color: var(--body-bg-color); */ + /* background-color: var(--toolbar-bg-color); */ + box-shadow: var(--toolbar-box-shadow); + border-bottom: var(--toolbar-border-bottom); + /* border-bottom: 2px solid rgba(156, 156, 156); */ + /* border-radius: 0px 5px 5px 0px; */ + /* opacity: 0.7; */ + /* background-color: rgba(136, 136, 136, 1); */ + /* box-shadow: 0px 2px 5px rgba(255, 255, 255, 1); */ +} + +.annotation-buttons div { + display: flex; + flex-direction: row; +} + +/*定义了滚动条滑块的样式*/ +.annotation-buttons ::-webkit-scrollbar-thumb { + border-radius: 10px; + border-style: dashed; + /* background-color: rgba(0, 0, 0, 0.15); */ + background-color: #fbbd08; + /* background-color: #ffed00; */ + border-color: #e2242400; + border-width: 1.5px; + background-clip: padding-box; +} + +.annotation-buttons button { + white-space: nowrap; + background-color: rgba(136, 136, 136, 0); + /* background-color: #868e96; */ + border: none; + color: rgba(134, 142, 150, 1); + border-radius: 3px; + padding: 2px; + /* margin-left: 10px; */ + margin: 2px 2px 2px 0px; + min-width: 32px; + max-height: 32px; +} + + +.annotation-buttons button:hover{ + background-color: rgba(207, 216, 224, 1); + color: #0081ff; +} + +.annotation-buttons button:hover i { + background-color: rgba(207, 216, 224, 1); + color: #0081ff; +} + +.annotation-buttons button:hover i span { + background-color: rgba(207, 216, 224, 1); + color: #0081ff; + padding-top: 8px; + padding-bottom: 8px; +} + +.annotation-buttons button:active { + /* color: #FFD700; */ + background-color: rgba(207, 216, 224, 1); + color: #0081ff; +} + +.button-active { + /* background-color: rgba(207, 216, 224, 1); */ + color: #0081ff; + /* color: #FFD700; */ +} + +.closeAnnotationListDiv { + position: fixed; + display: flex; + flex-direction: row; + align-items: center; + /* justify-content: space-between; */ + /* position: absolute; + top: 0; */ + width: 100%; + height: 32px; + padding-top: 4px; + padding-bottom: 2px; + /* padding-left: 5px; */ + box-shadow: var(--toolbarSidebar-box-shadow); + border-bottom: var(--toolbarSidebar-border-bottom); + background-color: var(--sidebar-toolbar-bg-color); + /* opacity: 1; */ + /* border-bottom: solid 1px #000000; */ + /* background-color: #dddddd; */ +} + +.closeAnnotationListDiv div { + border: #000000 2px solid; + border-radius: 5px; + margin-right: 5px; + background-color: #DDDDDD; + padding: 2px; + height: 20px; +} + +.closeAnnotationListDiv div button { + background-color: rgba(0, 0, 0, 0); +} + +.annotations-list { + /* z-index: 450000; */ + width: 100%; + height: 100%; + /* background-color: #404040; */ + /* background-color: #efefef; */ + /* opacity: 0.5; */ + position: absolute; + /* border-radius: 0px 10px 10px 0px; */ + /* top: 0px; */ + overflow-y: auto; + box-shadow: + 0 -4px 4px rgba(0, 0, 0, 0.1), + 0 0 0 2px rgb(255, 255, 255), + 4px 4px 4px rgba(0, 0, 0, 0.2); +} + +.annotation-container { + display: flex; + align-items: center; + width: 25%; + max-width: 250px; + min-width: 200px; + height: 85%; + position: absolute; + top: 10%; +} + +.page-annotations { + display: flex; + flex-direction: column; + width: 100%; +} + +.page-annotations-title { + display: flex; + flex-direction: row; + /* align-items: center; */ + justify-content: space-between; + width: 100%; + /* margin-top: 5px; + margin-bottom: 5px; */ + margin-right: 10px; + padding-bottom: 7px; + padding-top: 7px; + border-bottom: solid 1px #bbbbbb; + /* background-color: #dddddd; */ + background-color: rgba(248, 249, 250, 1); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); +} + +.page-annotations-title div { + display: flex; + flex-direction: row; +} + +.page-annotations-title:hover { + /* background-color: #F2BD08; */ + background-color: #ffed00; +} + +.page-annotations-title p { + /* margin-left: 15px; */ + margin-top: auto; +} + +.page-annotations-title i { + /* margin:auto; */ + margin-left: 5px; + margin-right: 5px; + margin-top: auto; +} + +.page-annotations-container { + padding: 10px 10px 10px 10px; + font-size: 13px; + /* border-bottom: solid 0.5px #888888; */ + /* background-color: #F8f8f8; */ + background-color: rgba(255, 255, 255, 1); + margin: 5px 10px 5px 10px; + border-radius: 5px; + /* border: #888888 2px solid; */ + box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.1); + /* 0 -4px 4px rgba(0, 0, 0, 0.1), + 0 0 0 2px rgb(255, 255, 255), + 4px 4px 4px rgba(0, 0, 0, 0.2); */ + + -moz-user-select: none; + /*火狐*/ + -webkit-user-select: none; + /*webkit浏览器*/ + -ms-user-select: none; + /*IE10*/ + -khtml-user-select: none; + /*早期浏览器*/ + user-select: none; +} + +.page-annotations-container:hover { + /* background-color: #F2BD08; */ + background-color: #ffed00; + +} + +.page-annotations-container i { + float: right; + position: relative; + top: 0px; +} + +/* .annotations-list::-webkit-scrollbar { + height: 10px !important; + width: 10px !important; +} + +.annotations-list::-webkit-scrollbar-thumb { + border-radius: 10px; + border-style: dashed; + background-color: #fbbd08; + border-color: #e2242400; + border-width: 1.5px; + background-clip: padding-box; +} */ + + +/*定义了滚动条滑块的样式*/ +.annotation-buttons ::-webkit-scrollbar-thumb { + border-radius: 10px; + border-style: dashed; + /* background-color: rgba(0, 0, 0, 0.15); */ + background-color: #fbbd08; + /* background-color: #ffed00; */ + border-color: #e2242400; + border-width: 1.5px; + background-clip: padding-box; +} + +.anno-canvas { + background: rgba(255, 255, 255, 0); + /*关键点*/ + position: absolute; + z-index: 1; + /*确保在遮盖的元素的上方*/ + left: 0px; + top: 0px; +} + +.my-processing-tip { + z-index: 10000; + position: absolute; + display: flex; + align-items: center; + /* top:20%; */ + top: -500px; + width: 100%; + justify-content: center; + text-align: center; +} + +.my-processing-tip div { + background-color: #efefef; + border: #808080 1px solid; + border-radius: 10px; + padding: 20px; + width: 300px; + z-index: 10000000; + box-shadow: + 0 -4px 4px rgba(0, 0, 0, 0.1), + 0 0 0 2px rgb(255, 255, 255), + 4px 4px 4px rgba(0, 0, 0, 0.2); +} + + +.my-extract-processing-tip { + z-index: 10000; + position: absolute; + display: flex; + align-items: center; + /* top:20%; */ + top: -500px; + width: 100%; + justify-content: center; + text-align: center; +} + +.my-extract-processing-tip div { + background-color: #efefef; + border: #808080 1px solid; + border-radius: 10px; + padding: 20px; + width: 300px; + z-index: 10000000; + box-shadow: + 0 -4px 4px rgba(0, 0, 0, 0.1), + 0 0 0 2px rgb(255, 255, 255), + 4px 4px 4px rgba(0, 0, 0, 0.2); +} + +.operation-tip { + z-index: 10000; + position: absolute; + display: flex; + flex-direction: column; + align-items: center; + float: left; + left: 10px; + top: 80px; + /* top: -500px; */ + /* width: 100%; */ + justify-content: center; + text-align: left; +} + +.operation-tip div { + background-color: #efefef; + border: #808080 1px solid; + border-radius: 10px; + margin-top: 20px; + padding: 10px; + font-size: 15px; + width: 240px; + display: flex; + justify-content: space-between; + display: flex; + align-items: center; + z-index: 10000000; + box-shadow: + 0 -4px 4px rgba(0, 0, 0, 0.1), + 0 0 0 2px rgb(255, 255, 255), + 4px 4px 4px rgba(0, 0, 0, 0.2); +} + + + +canvas, +.canvas-container { + background: rgba(255, 255, 255, 0); + position: absolute; + z-index: 1; + left: 0px; + top: 0px; +} + +.canvas-container { + z-index: 10; +} + +.my-menu-x { + visibility: hidden; + z-index: -100; + position: absolute; + top: 85px; + right: 25px; + box-sizing: border-box; + border-radius: 4px; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); + /* background-color: rgba(0, 0, 0, 0.1); */ + background-color: #fff; + font-size: 10px; + transition-duration: var(--sidebar-transition-duration); +} + +.my-menu-x div { + min-height: 26px; + display: flex; + align-items: center; + justify-content: space-between; + padding-left: 10px; + padding-right: 10px; + padding-inline: 10px; + +} + +.my-menu-x div:hover { + background-color:rgba(235,238,250,1); + color: #0081FF; + font-size: 700; +} + +.my-menu-x div input { + border: none; + background-color: rgba(0, 0, 0, 0); +} + +.copy-btn-container { + z-index: 10000; + position: absolute; + top: -50px; + left: -50px; +} + +.vertical-split { + border-right: #ffffff solid 1px; + margin-left: 12px; + margin-right: 12px; +} + +.member_list_form { + display: flex; + flex-direction: column; + margin: 5px 2px 5px 0; + font-size: 13px; + float: right; +} + +.member_name_item { + text-align: right; + /* margin-right: 5px; + margin-top: 5px; */ + vertical-align: middle; + padding: 3px; + border-radius: 2px; + /* background-color: #fbbd08; */ +} + +.member_name_item:hover { + /* background-color: #fbbd08; */ + background-color: #ffed00; +} + + +.member_list_form input { + vertical-align: middle; + margin-top: -3px; + margin-left: 5px; +} + +.my-annotation-toolbar { + display: flex; + align-items: center; +} + +.my-annotation-tool { + background: none; + border: none; + padding: 4px; + font-size: 1rem; + background-color: #dddddd; + margin-top: 2px; +} + +.my-annotation-tool:active { + /* color: #FFD700; */ + /* font-weight: 600; */ + background-color: #dedede; +} + +.my-annotation-tool i { + font-size: 20px; +} + +.my-annotation-toolbar button { + font-size: 1.25rem; + padding: 10px; +} + +.my-annotation-toolbar button:hover { + /* color: #FFD700; */ + /* font-weight: 600; */ + background-color: #dedede; +} + +.my-mouse-move-text { + position: fixed; + top: -500px; + z-index: 100000; + background-color: #0081FF; + color: #fff; + border-radius: 4px; + padding: 5px; + width: auto; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); +} + +.link-annotation-item { + border: 3px dotted red; +} + +.my-annotation-history { + position: fixed; + top: -500px; + left: 0px; + width: 300px; + z-index: 100000; + border-radius: 5px; + /* border: #888888 2px solid; */ +} + +.triangle-down { + display: block; + width: 0; + height: 0; + border-width: 10px 10px 0; + position: absolute; + left: 46%; + top: -10px; + border-style: solid; + /* 红 透明 透明 */ + border-color: #dedede transparent transparent transparent; + transform: scaleY(-1); +} + +.triangle-down em { + display: block; + width: 0; + height: 0; + border-width: 10px 10px 0; + position: absolute; + left: -10px; + top: -11px; + border-style: solid; + /* 红 透明 透明 */ + border-color: #fff transparent transparent transparent; +} + +/* 四象三角形 */ +.triangle-all { + width: 0; + height: 0; + border-width: 30px; + border-style: solid; + border-color: #c03 #fc0 #69c #6c6; + /* 红 黄 蓝 绿 */ +} + +.show-connect-div { + white-space: nowrap; + color: rgba(134, 142, 150, 1); +} + + +.my_horizontalToolbarSeparator { + margin-top: -5px; + margin-bottom: -5px; + width: 100%; + border-bottom: 1px solid #ddd; +} + +.column-div { + display: flex; + justify-content: left; + /* background-color: #808080; */ + margin: 5px 0px 5px 0px; + align-items: center; +} + +.simple-input { + border: 2px solid #ccc; + border-radius: 5px; + width: 45px; + margin-left: 10px; + text-align: center; +} + +.save-comment-button { + margin-top: 5px; + font-size: 12px; + font-weight: 600; + padding: 5px; + /* background-color: rgba(207, 216, 224, 1); */ + border: none; + border-radius: 5px; +} + +.save-comment-button:active { + color: #0081ff; +} + +#my-setting-menu div{ + display: flex; + flex-direction: row; + font-size: 13px; +} + +#my-menu div{ + font-size: 13px; +} + +/* +#my-setting-menu{ + font-size: 14px; + font-weight: 500; +} */ + + +/* .show-connect-div :hover{ + color:#0081ff; +} */ + +/* .popup { + width: 100px; + background: #fc0; + padding: 10px 20px; + color: #333; + border-radius: 4px; + position: absolute; + top: 30px; + left: 30px; + border: 1px solid #333; +} + +.popup span { + display: block; + width: 0; + height: 0; + border-width: 10px 10px 0; + border-style: solid; + border-color:transparent transparent #333; + position: absolute; + top: 36px; + left: 50%; + margin-left: -10px; +} + +.popup em { + display: block; + width: 0; + height: 0; + border-width:10px 10px 0; + border-style: solid; + border-color: transparent transparent #fc0; + position: absolute; + top: 1px; + left: -10px; +} */ + +.ribbons { + display: flex; + align-items: center; + justify-content: center; + background-color:rgba(235,238,250,1); + border-radius: 4px; + height: 28px; + margin-top: 2px; + /* transform: translateX(-50%); */ +/* height: 28px; + position: absolute; + left: 50%; + transform: translateX(-50%); + top: 0; + bottom: 0; + margin: auto; */ +} + +.selectform { + display: flex; + flex-direction: row; + /* background-color: aliceblue; */ + border:1px solid #808080; + border-radius: 5px; + justify-content: space-between; + padding: 10px; + font-size: 17px; + /* margin-bottom: 10px; */ +} + +.linktip { + margin-top: 10px; + /* background-color: antiquewhite; */ + text-align: left; + float: left; + width: 100%; + justify-content: left; + font-size: 15px; + font-weight: 600; +} + +.selectform label { + /* background-color: aliceblue; */ + padding: 10px; +} + +.hyper-link-p{ + text-decoration: underline; + font-weight: bold; + font-style: italic; + color:#0081FF; + padding: 3px; + margin-top: 5px; + margin-bottom: -5px; + background-color: #fff; + border-radius: 2px; + overflow-wrap: break-word; +} + +.link-process-tip { + z-index: 10000; + position: absolute; + display: flex; + align-items: center; + /* top: 20%; */ + top: -500px; + width: 100%; + justify-content: center; + text-align: center; +} + +.link-process-tip div { + background-color: #efefef; + border: #808080 1px solid; + border-radius: 10px; + padding: 20px; + width: 500px; + z-index: 10000000; + box-shadow: + 0 -4px 4px rgba(0, 0, 0, 0.1), + 0 0 0 2px rgb(255, 255, 255), + 4px 4px 4px rgba(0, 0, 0, 0.2); +} + +.ribbons .ribbon-group { + padding: 0; + border: none; + background-color: transparent; + font-size: 12px; + font-weight: 600; + margin:0px 4px 0px 4px; + /* margin: 0 22px; */ + cursor: pointer; + color:rgba(134,142,150,1); + white-space: nowrap; + padding: 4px; + border-radius: 2px; +} + +.ribbons .ribbon-group:hover { + color: #0081FF; + background-color: rgba(255, 255, 255, 1); +} + +::-webkit-scrollbar{ + height: 10px !important; + width: 10px !important; +} + +/*定义了滚动条滑块的样式*/ +::-webkit-scrollbar-thumb { + border-style: dashed; + background-color: rgba(173, 181, 189, 1); + padding: 5px; + border-radius: 5px; + /* background-color: #fbbd08; */ + border-color: #e2242400; + border-width: 1.5px; + background-clip: padding-box; +} + +::-webkit-scrollbar-thumb:hover { + background-color: rgba(0, 0, 0, 0.2) +} + +/* sider container */ + + +[dir="ltr"] #mySidebarContainer { + left: calc(100% - var(--annotation-right-sidebar-width)); +} + +[dir="rtl"] #mySidebarContainer { + right: calc(1 * var(--annotation-sidebar-width)); + /* right: 10px; */ +} + +[dir="ltr"] #mySidebarContainer { + border-right: var(--doorhanger-border-color-whcm); +} + +[dir="rtl"] #mySidebarContainer { + border-left: var(--doorhanger-border-color-whcm); +} + +[dir="ltr"] #mySidebarContainer { + transition-property: left; +} + +[dir="rtl"] #mySidebarContainer { + transition-property: right; +} + +#mySidebarContainer { + position: absolute; + /* background-color: #1CBBB4; */ + background-color: var(--body-bg-color); + box-shadow: inset calc(-1px * var(--dir-factor)) 0 0 rgba(0, 0, 0, 0.25); + /* top: 32px; */ + top: 72px; + bottom: 0; + inset-inline-start: calc(-1 * var(--annotation-sidebar-width)); + width: var(--annotation-sidebar-width); + visibility: hidden; + z-index: 100; + font: message-box; + border-top: 1px solid rgba(51, 51, 51, 1); + -webkit-border-end: var(--doorhanger-border-color-whcm); + border-inline-end: var(--doorhanger-border-color-whcm); + transition-property: inset-inline-start; + transition-duration: var(--sidebar-transition-duration); + transition-timing-function: var(--sidebar-transition-timing-function); +} + +/* #outerContainer.sidebarMoving #mySidebarContainer, */ +#outerContainer.myAnnotationSidebarOpen #mySidebarContainer { + visibility: visible; +} + +#outerContainer.myAnnotationSidebarOpen #viewerContainer:not(.pdfPresentationMode) { + margin-right: var(--annotation-sidebar-width); + /* transition-property: inset-inline-start; */ +} + +#outerContainer.myAnnotationSidebarOpen #my-menu { + /* visibility: visible; */ + right: calc(25px + var(--annotation-sidebar-width)); +} + +#outerContainer.myAnnotationSidebarOpen #my-setting-menu { + /* visibility: visible; */ + right: calc(25px + var(--annotation-sidebar-width)); +} + +#current_file_url{ + margin-left: 5px; + margin-top: -3px; + font-weight: 600; + color: rgba(134, 142, 150, 1); + text-decoration: none; +} + +#current_file_url:hover{ + background-color: rgba(207, 216, 224, 1); + color: #0081ff; +} \ No newline at end of file diff --git a/src/assets/pdf-annotation/css/svgs/edgecontrol.svg b/src/assets/pdf-annotation/css/svgs/edgecontrol.svg new file mode 100755 index 0000000..8fe63b6 --- /dev/null +++ b/src/assets/pdf-annotation/css/svgs/edgecontrol.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/pdf-annotation/css/svgs/middlecontrol.svg b/src/assets/pdf-annotation/css/svgs/middlecontrol.svg new file mode 100755 index 0000000..53fb5b5 --- /dev/null +++ b/src/assets/pdf-annotation/css/svgs/middlecontrol.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/pdf-annotation/css/svgs/middlecontrolhoz.svg b/src/assets/pdf-annotation/css/svgs/middlecontrolhoz.svg new file mode 100755 index 0000000..ba05d9a --- /dev/null +++ b/src/assets/pdf-annotation/css/svgs/middlecontrolhoz.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/pdf-annotation/css/svgs/rotateicon.svg b/src/assets/pdf-annotation/css/svgs/rotateicon.svg new file mode 100755 index 0000000..7b1d4db --- /dev/null +++ b/src/assets/pdf-annotation/css/svgs/rotateicon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/pdf-annotation/fontawesome/HELP-US-OUT.txt b/src/assets/pdf-annotation/fontawesome/HELP-US-OUT.txt new file mode 100755 index 0000000..83d083d --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/HELP-US-OUT.txt @@ -0,0 +1,7 @@ +I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, +Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, +comprehensive icon sets or copy and paste your own. + +Please. Check it out. + +-Dave Gandy diff --git a/src/assets/pdf-annotation/fontawesome/css/font-awesome.css b/src/assets/pdf-annotation/fontawesome/css/font-awesome.css new file mode 100755 index 0000000..ee906a8 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/src/assets/pdf-annotation/fontawesome/css/font-awesome.min.css b/src/assets/pdf-annotation/fontawesome/css/font-awesome.min.css new file mode 100755 index 0000000..540440c --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/src/assets/pdf-annotation/fontawesome/fonts/FontAwesome.otf b/src/assets/pdf-annotation/fontawesome/fonts/FontAwesome.otf new file mode 100755 index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70 GIT binary patch literal 134808 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.eot b/src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 GIT binary patch literal 165742 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 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW 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

5q!RY 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 + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.ttf b/src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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 d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.woff2 b/src/assets/pdf-annotation/fontawesome/fonts/fontawesome-webfont.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/fontawesome/less/animated.less b/src/assets/pdf-annotation/fontawesome/less/animated.less new file mode 100755 index 0000000..66ad52a --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/src/assets/pdf-annotation/fontawesome/less/bordered-pulled.less b/src/assets/pdf-annotation/fontawesome/less/bordered-pulled.less new file mode 100755 index 0000000..f1c8ad7 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/src/assets/pdf-annotation/fontawesome/less/core.less b/src/assets/pdf-annotation/fontawesome/less/core.less new file mode 100755 index 0000000..c577ac8 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/src/assets/pdf-annotation/fontawesome/less/fixed-width.less b/src/assets/pdf-annotation/fontawesome/less/fixed-width.less new file mode 100755 index 0000000..110289f --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/src/assets/pdf-annotation/fontawesome/less/font-awesome.less b/src/assets/pdf-annotation/fontawesome/less/font-awesome.less new file mode 100755 index 0000000..c3677de --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/src/assets/pdf-annotation/fontawesome/less/icons.less b/src/assets/pdf-annotation/fontawesome/less/icons.less new file mode 100755 index 0000000..159d600 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/icons.less @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } +.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } +.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } +.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } +.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } +.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } +.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } +.@{fa-css-prefix}-vcard:before, +.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } +.@{fa-css-prefix}-vcard-o:before, +.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } +.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } +.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } +.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } +.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } +.@{fa-css-prefix}-drivers-license:before, +.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } +.@{fa-css-prefix}-drivers-license-o:before, +.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } +.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } +.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } +.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } +.@{fa-css-prefix}-thermometer-4:before, +.@{fa-css-prefix}-thermometer:before, +.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } +.@{fa-css-prefix}-thermometer-3:before, +.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } +.@{fa-css-prefix}-thermometer-2:before, +.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } +.@{fa-css-prefix}-thermometer-1:before, +.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } +.@{fa-css-prefix}-thermometer-0:before, +.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } +.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } +.@{fa-css-prefix}-bathtub:before, +.@{fa-css-prefix}-s15:before, +.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } +.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } +.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } +.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } +.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } +.@{fa-css-prefix}-times-rectangle:before, +.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } +.@{fa-css-prefix}-times-rectangle-o:before, +.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } +.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } +.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } +.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } +.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } +.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } +.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } +.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } +.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } +.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } +.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } +.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/src/assets/pdf-annotation/fontawesome/less/larger.less b/src/assets/pdf-annotation/fontawesome/less/larger.less new file mode 100755 index 0000000..c9d6467 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/src/assets/pdf-annotation/fontawesome/less/list.less b/src/assets/pdf-annotation/fontawesome/less/list.less new file mode 100755 index 0000000..0b44038 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/src/assets/pdf-annotation/fontawesome/less/mixins.less b/src/assets/pdf-annotation/fontawesome/less/mixins.less new file mode 100755 index 0000000..beef231 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/src/assets/pdf-annotation/fontawesome/less/path.less b/src/assets/pdf-annotation/fontawesome/less/path.less new file mode 100755 index 0000000..835be41 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/src/assets/pdf-annotation/fontawesome/less/rotated-flipped.less b/src/assets/pdf-annotation/fontawesome/less/rotated-flipped.less new file mode 100755 index 0000000..f6ba814 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/src/assets/pdf-annotation/fontawesome/less/screen-reader.less b/src/assets/pdf-annotation/fontawesome/less/screen-reader.less new file mode 100755 index 0000000..11c1881 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/src/assets/pdf-annotation/fontawesome/less/stacked.less b/src/assets/pdf-annotation/fontawesome/less/stacked.less new file mode 100755 index 0000000..fc53fb0 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/src/assets/pdf-annotation/fontawesome/less/variables.less b/src/assets/pdf-annotation/fontawesome/less/variables.less new file mode 100755 index 0000000..7ddbbc0 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/less/variables.less @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.7.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-address-book: "\f2b9"; +@fa-var-address-book-o: "\f2ba"; +@fa-var-address-card: "\f2bb"; +@fa-var-address-card-o: "\f2bc"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bandcamp: "\f2d5"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-bath: "\f2cd"; +@fa-var-bathtub: "\f2cd"; +@fa-var-battery: "\f240"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-drivers-license: "\f2c2"; +@fa-var-drivers-license-o: "\f2c3"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eercast: "\f2da"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-open: "\f2b6"; +@fa-var-envelope-open-o: "\f2b7"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-etsy: "\f2d7"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-free-code-camp: "\f2c5"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-grav: "\f2d6"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-handshake-o: "\f2b5"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-id-badge: "\f2c1"; +@fa-var-id-card: "\f2c2"; +@fa-var-id-card-o: "\f2c3"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-imdb: "\f2d8"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linode: "\f2b8"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meetup: "\f2e0"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microchip: "\f2db"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-podcast: "\f2ce"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quora: "\f2c4"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-ravelry: "\f2d9"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-s15: "\f2cd"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-shower: "\f2cc"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-snowflake-o: "\f2dc"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superpowers: "\f2dd"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-telegram: "\f2c6"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thermometer: "\f2c7"; +@fa-var-thermometer-0: "\f2cb"; +@fa-var-thermometer-1: "\f2ca"; +@fa-var-thermometer-2: "\f2c9"; +@fa-var-thermometer-3: "\f2c8"; +@fa-var-thermometer-4: "\f2c7"; +@fa-var-thermometer-empty: "\f2cb"; +@fa-var-thermometer-full: "\f2c7"; +@fa-var-thermometer-half: "\f2c9"; +@fa-var-thermometer-quarter: "\f2ca"; +@fa-var-thermometer-three-quarters: "\f2c8"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-times-rectangle: "\f2d3"; +@fa-var-times-rectangle-o: "\f2d4"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-circle: "\f2bd"; +@fa-var-user-circle-o: "\f2be"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-o: "\f2c0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-vcard: "\f2bb"; +@fa-var-vcard-o: "\f2bc"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-window-close: "\f2d3"; +@fa-var-window-close-o: "\f2d4"; +@fa-var-window-maximize: "\f2d0"; +@fa-var-window-minimize: "\f2d1"; +@fa-var-window-restore: "\f2d2"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpexplorer: "\f2de"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/src/assets/pdf-annotation/fontawesome/scss/_animated.scss b/src/assets/pdf-annotation/fontawesome/scss/_animated.scss new file mode 100755 index 0000000..8a020db --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_bordered-pulled.scss b/src/assets/pdf-annotation/fontawesome/scss/_bordered-pulled.scss new file mode 100755 index 0000000..d4b85a0 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_core.scss b/src/assets/pdf-annotation/fontawesome/scss/_core.scss new file mode 100755 index 0000000..7425ef8 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_fixed-width.scss b/src/assets/pdf-annotation/fontawesome/scss/_fixed-width.scss new file mode 100755 index 0000000..b221c98 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_icons.scss b/src/assets/pdf-annotation/fontawesome/scss/_icons.scss new file mode 100755 index 0000000..e63e702 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_icons.scss @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } +.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } +.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } +.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } +.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } +.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } +.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } +.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } +.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } +.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } +.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } +.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } +.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } +.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } +.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } +.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } +.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } +.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } +.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } +.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } +.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } +.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } +.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } +.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } +.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } +.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } +.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } +.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } +.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } +.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/src/assets/pdf-annotation/fontawesome/scss/_larger.scss b/src/assets/pdf-annotation/fontawesome/scss/_larger.scss new file mode 100755 index 0000000..41e9a81 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/src/assets/pdf-annotation/fontawesome/scss/_list.scss b/src/assets/pdf-annotation/fontawesome/scss/_list.scss new file mode 100755 index 0000000..7d1e4d5 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_mixins.scss b/src/assets/pdf-annotation/fontawesome/scss/_mixins.scss new file mode 100755 index 0000000..c3bbd57 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_path.scss b/src/assets/pdf-annotation/fontawesome/scss/_path.scss new file mode 100755 index 0000000..bb457c2 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_rotated-flipped.scss b/src/assets/pdf-annotation/fontawesome/scss/_rotated-flipped.scss new file mode 100755 index 0000000..a3558fd --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/src/assets/pdf-annotation/fontawesome/scss/_screen-reader.scss b/src/assets/pdf-annotation/fontawesome/scss/_screen-reader.scss new file mode 100755 index 0000000..637426f --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/src/assets/pdf-annotation/fontawesome/scss/_stacked.scss b/src/assets/pdf-annotation/fontawesome/scss/_stacked.scss new file mode 100755 index 0000000..aef7403 --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/src/assets/pdf-annotation/fontawesome/scss/_variables.scss b/src/assets/pdf-annotation/fontawesome/scss/_variables.scss new file mode 100755 index 0000000..498fc4a --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/_variables.scss @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.7.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-address-book: "\f2b9"; +$fa-var-address-book-o: "\f2ba"; +$fa-var-address-card: "\f2bb"; +$fa-var-address-card-o: "\f2bc"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bandcamp: "\f2d5"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-bath: "\f2cd"; +$fa-var-bathtub: "\f2cd"; +$fa-var-battery: "\f240"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-drivers-license: "\f2c2"; +$fa-var-drivers-license-o: "\f2c3"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eercast: "\f2da"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-open: "\f2b6"; +$fa-var-envelope-open-o: "\f2b7"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-etsy: "\f2d7"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-free-code-camp: "\f2c5"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-grav: "\f2d6"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-handshake-o: "\f2b5"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-id-badge: "\f2c1"; +$fa-var-id-card: "\f2c2"; +$fa-var-id-card-o: "\f2c3"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-imdb: "\f2d8"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linode: "\f2b8"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meetup: "\f2e0"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microchip: "\f2db"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-podcast: "\f2ce"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quora: "\f2c4"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-ravelry: "\f2d9"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-s15: "\f2cd"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-shower: "\f2cc"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-snowflake-o: "\f2dc"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superpowers: "\f2dd"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-telegram: "\f2c6"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thermometer: "\f2c7"; +$fa-var-thermometer-0: "\f2cb"; +$fa-var-thermometer-1: "\f2ca"; +$fa-var-thermometer-2: "\f2c9"; +$fa-var-thermometer-3: "\f2c8"; +$fa-var-thermometer-4: "\f2c7"; +$fa-var-thermometer-empty: "\f2cb"; +$fa-var-thermometer-full: "\f2c7"; +$fa-var-thermometer-half: "\f2c9"; +$fa-var-thermometer-quarter: "\f2ca"; +$fa-var-thermometer-three-quarters: "\f2c8"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-times-rectangle: "\f2d3"; +$fa-var-times-rectangle-o: "\f2d4"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-circle: "\f2bd"; +$fa-var-user-circle-o: "\f2be"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-o: "\f2c0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-vcard: "\f2bb"; +$fa-var-vcard-o: "\f2bc"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-window-close: "\f2d3"; +$fa-var-window-close-o: "\f2d4"; +$fa-var-window-maximize: "\f2d0"; +$fa-var-window-minimize: "\f2d1"; +$fa-var-window-restore: "\f2d2"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpexplorer: "\f2de"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/src/assets/pdf-annotation/fontawesome/scss/font-awesome.scss b/src/assets/pdf-annotation/fontawesome/scss/font-awesome.scss new file mode 100755 index 0000000..f1c83aa --- /dev/null +++ b/src/assets/pdf-annotation/fontawesome/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/src/assets/pdf-annotation/thirdjs/1.js b/src/assets/pdf-annotation/thirdjs/1.js new file mode 100755 index 0000000..7ae305a --- /dev/null +++ b/src/assets/pdf-annotation/thirdjs/1.js @@ -0,0 +1,31542 @@ +/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */ + +var fabric = fabric || { version: '5.2.0' }; +if (typeof exports !== 'undefined') { + exports.fabric = fabric; +} +/* _AMD_START_ */ +else if (typeof define === 'function' && define.amd) { + define([], function() { return fabric; }); +} +/* _AMD_END_ */ +if (typeof document !== 'undefined' && typeof window !== 'undefined') { + if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) { + fabric.document = document; + } + else { + fabric.document = document.implementation.createHTMLDocument(''); + } + fabric.window = window; +} +else { + // assume we're running under node.js when document/window are not present + var jsdom = require('jsdom'); + var virtualWindow = new jsdom.JSDOM( + decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'), + { + features: { + FetchExternalResources: ['img'] + }, + resources: 'usable' + }).window; + fabric.document = virtualWindow.document; + fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper; + fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas; + fabric.window = virtualWindow; + DOMParser = fabric.window.DOMParser; +} + +/** + * True when in environment that supports touch events + * @type boolean + */ +fabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document || + (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0); + +/** + * True when in environment that's probably Node.js + * @type boolean + */ +fabric.isLikelyNode = typeof Buffer !== 'undefined' && + typeof window === 'undefined'; + +/* _FROM_SVG_START_ */ +/** + * Attributes parsed from all SVG elements + * @type array + */ +fabric.SHARED_ATTRIBUTES = [ + 'display', + 'transform', + 'fill', 'fill-opacity', 'fill-rule', + 'opacity', + 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset', + 'stroke-linejoin', 'stroke-miterlimit', + 'stroke-opacity', 'stroke-width', + 'id', 'paint-order', 'vector-effect', + 'instantiated_by_use', 'clip-path', +]; +/* _FROM_SVG_END_ */ + +/** + * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion. + */ +fabric.DPI = 96; +fabric.reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:[eE][-+]?\\d+)?)'; +fabric.commaWsp = '(?:\\s+,?\\s*|,\\s*)'; +fabric.rePathCommand = /([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:[eE][-+]?\d+)?)/ig; +fabric.reNonWord = /[ \n\.,;!\?\-]/; +fabric.fontPaths = { }; +fabric.iMatrix = [1, 0, 0, 1, 0, 0]; +fabric.svgNS = 'http://www.w3.org/2000/svg'; + +/** + * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine. + * @since 1.7.14 + * @type Number + * @default + */ +fabric.perfLimitSizeTotal = 2097152; + +/** + * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000 + * @since 1.7.14 + * @type Number + * @default + */ +fabric.maxCacheSideLimit = 4096; + +/** + * Lowest pixel limit for cache canvases, set at 256PX + * @since 1.7.14 + * @type Number + * @default + */ +fabric.minCacheSideLimit = 256; + +/** + * Cache Object for widths of chars in text rendering. + */ +fabric.charWidthsCache = { }; + +/** + * if webgl is enabled and available, textureSize will determine the size + * of the canvas backend + * @since 2.0.0 + * @type Number + * @default + */ +fabric.textureSize = 2048; + +/** + * When 'true', style information is not retained when copy/pasting text, making + * pasted text use destination style. + * Defaults to 'false'. + * @type Boolean + * @default + */ +fabric.disableStyleCopyPaste = false; + +/** + * Enable webgl for filtering picture is available + * A filtering backend will be initialized, this will both take memory and + * time since a default 2048x2048 canvas will be created for the gl context + * @since 2.0.0 + * @type Boolean + * @default + */ +fabric.enableGLFiltering = true; + +/** + * Device Pixel Ratio + * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html + */ +fabric.devicePixelRatio = fabric.window.devicePixelRatio || + fabric.window.webkitDevicePixelRatio || + fabric.window.mozDevicePixelRatio || + 1; +/** + * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value, + * which is unitless and not rendered equally across browsers. + * + * Values that work quite well (as of October 2017) are: + * - Chrome: 1.5 + * - Edge: 1.75 + * - Firefox: 0.9 + * - Safari: 0.95 + * + * @since 2.0.0 + * @type Number + * @default 1 + */ +fabric.browserShadowBlurConstant = 1; + +/** + * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again. + * It was an internal variable, is accessible since version 2.3.4 + */ +fabric.arcToSegmentsCache = { }; + +/** + * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it. + * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing + * you do not get any speed benefit and you get a big object in memory. + * The object was a private variable before, while now is appended to the lib so that you have access to it and you + * can eventually clear it. + * It was an internal variable, is accessible since version 2.3.4 + */ +fabric.boundsOfCurveCache = { }; + +/** + * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better + * @default true + */ +fabric.cachesBoundsOfCurve = true; + +/** + * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on + * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true + * this has to be set before instantiating the filtering backend ( before filtering the first image ) + * @type Boolean + * @default false + */ +fabric.forceGLPutImageData = false; + +fabric.initFilterBackend = function() { + if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) { + console.log('max texture size: ' + fabric.maxTextureSize); + return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize })); + } + else if (fabric.Canvas2dFilterBackend) { + return (new fabric.Canvas2dFilterBackend()); + } +}; +if (typeof document !== 'undefined' && typeof window !== 'undefined') { + // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system) + window.fabric = fabric; +} +(function() { + + /** + * @private + * @param {String} eventName + * @param {Function} handler + */ + function _removeEventListener(eventName, handler) { + if (!this.__eventListeners[eventName]) { + return; + } + var eventListener = this.__eventListeners[eventName]; + if (handler) { + eventListener[eventListener.indexOf(handler)] = false; + } + else { + fabric.util.array.fill(eventListener, false); + } + } + + /** + * Observes specified event + * @memberOf fabric.Observable + * @alias on + * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler}) + * @param {Function} handler Function that receives a notification when an event of the specified type occurs + * @return {Self} thisArg + * @chainable + */ + function on(eventName, handler) { + if (!this.__eventListeners) { + this.__eventListeners = { }; + } + // one object with key/value pairs was passed + if (arguments.length === 1) { + for (var prop in eventName) { + this.on(prop, eventName[prop]); + } + } + else { + if (!this.__eventListeners[eventName]) { + this.__eventListeners[eventName] = []; + } + this.__eventListeners[eventName].push(handler); + } + return this; + } + + function _once(eventName, handler) { + var _handler = function () { + handler.apply(this, arguments); + this.off(eventName, _handler); + }.bind(this); + this.on(eventName, _handler); + } + + function once(eventName, handler) { + // one object with key/value pairs was passed + if (arguments.length === 1) { + for (var prop in eventName) { + _once.call(this, prop, eventName[prop]); + } + } + else { + _once.call(this, eventName, handler); + } + return this; + } + + /** + * Stops event observing for a particular event handler. Calling this method + * without arguments removes all handlers for all events + * @memberOf fabric.Observable + * @alias off + * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler}) + * @param {Function} handler Function to be deleted from EventListeners + * @return {Self} thisArg + * @chainable + */ + function off(eventName, handler) { + if (!this.__eventListeners) { + return this; + } + + // remove all key/value pairs (event name -> event handler) + if (arguments.length === 0) { + for (eventName in this.__eventListeners) { + _removeEventListener.call(this, eventName); + } + } + // one object with key/value pairs was passed + else if (arguments.length === 1 && typeof arguments[0] === 'object') { + for (var prop in eventName) { + _removeEventListener.call(this, prop, eventName[prop]); + } + } + else { + _removeEventListener.call(this, eventName, handler); + } + return this; + } + + /** + * Fires event with an optional options object + * @memberOf fabric.Observable + * @param {String} eventName Event name to fire + * @param {Object} [options] Options object + * @return {Self} thisArg + * @chainable + */ + function fire(eventName, options) { + if (!this.__eventListeners) { + return this; + } + + var listenersForEvent = this.__eventListeners[eventName]; + if (!listenersForEvent) { + return this; + } + + for (var i = 0, len = listenersForEvent.length; i < len; i++) { + listenersForEvent[i] && listenersForEvent[i].call(this, options || { }); + } + this.__eventListeners[eventName] = listenersForEvent.filter(function(value) { + return value !== false; + }); + return this; + } + + /** + * @namespace fabric.Observable + * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events} + * @see {@link http://fabricjs.com/events|Events demo} + */ + fabric.Observable = { + fire: fire, + on: on, + once: once, + off: off, + }; +})(); +/** + * @namespace fabric.Collection + */ +fabric.Collection = { + + _objects: [], + + /** + * Adds objects to collection, Canvas or Group, then renders canvas + * (if `renderOnAddRemove` is not `false`). + * in case of Group no changes to bounding box are made. + * Objects should be instances of (or inherit from) fabric.Object + * Use of this function is highly discouraged for groups. + * you can add a bunch of objects with the add method but then you NEED + * to run a addWithUpdate call for the Group class or position/bbox will be wrong. + * @param {...fabric.Object} object Zero or more fabric instances + * @return {Self} thisArg + * @chainable + */ + add: function () { + this._objects.push.apply(this._objects, arguments); + if (this._onObjectAdded) { + for (var i = 0, length = arguments.length; i < length; i++) { + this._onObjectAdded(arguments[i]); + } + } + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`) + * An object should be an instance of (or inherit from) fabric.Object + * Use of this function is highly discouraged for groups. + * you can add a bunch of objects with the insertAt method but then you NEED + * to run a addWithUpdate call for the Group class or position/bbox will be wrong. + * @param {Object} object Object to insert + * @param {Number} index Index to insert object at + * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs + * @return {Self} thisArg + * @chainable + */ + insertAt: function (object, index, nonSplicing) { + var objects = this._objects; + if (nonSplicing) { + objects[index] = object; + } + else { + objects.splice(index, 0, object); + } + this._onObjectAdded && this._onObjectAdded(object); + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`) + * @param {...fabric.Object} object Zero or more fabric instances + * @return {Self} thisArg + * @chainable + */ + remove: function() { + var objects = this._objects, + index, somethingRemoved = false; + + for (var i = 0, length = arguments.length; i < length; i++) { + index = objects.indexOf(arguments[i]); + + // only call onObjectRemoved if an object was actually removed + if (index !== -1) { + somethingRemoved = true; + objects.splice(index, 1); + this._onObjectRemoved && this._onObjectRemoved(arguments[i]); + } + } + + this.renderOnAddRemove && somethingRemoved && this.requestRenderAll(); + return this; + }, + + /** + * Executes given function for each object in this group + * @param {Function} callback + * Callback invoked with current object as first argument, + * index - as second and an array of all objects - as third. + * Callback is invoked in a context of Global Object (e.g. `window`) + * when no `context` argument is given + * + * @param {Object} context Context (aka thisObject) + * @return {Self} thisArg + * @chainable + */ + forEachObject: function(callback, context) { + var objects = this.getObjects(); + for (var i = 0, len = objects.length; i < len; i++) { + callback.call(context, objects[i], i, objects); + } + return this; + }, + + /** + * Returns an array of children objects of this instance + * Type parameter introduced in 1.3.10 + * since 2.3.5 this method return always a COPY of the array; + * @param {String} [type] When specified, only objects of this type are returned + * @return {Array} + */ + getObjects: function(type) { + if (typeof type === 'undefined') { + return this._objects.concat(); + } + return this._objects.filter(function(o) { + return o.type === type; + }); + }, + + /** + * Returns object at specified index + * @param {Number} index + * @return {Self} thisArg + */ + item: function (index) { + return this._objects[index]; + }, + + /** + * Returns true if collection contains no objects + * @return {Boolean} true if collection is empty + */ + isEmpty: function () { + return this._objects.length === 0; + }, + + /** + * Returns a size of a collection (i.e: length of an array containing its objects) + * @return {Number} Collection size + */ + size: function() { + return this._objects.length; + }, + + /** + * Returns true if collection contains an object + * @param {Object} object Object to check against + * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects` + * @return {Boolean} `true` if collection contains an object + */ + contains: function (object, deep) { + if (this._objects.indexOf(object) > -1) { + return true; + } + else if (deep) { + return this._objects.some(function (obj) { + return typeof obj.contains === 'function' && obj.contains(object, true); + }); + } + return false; + }, + + /** + * Returns number representation of a collection complexity + * @return {Number} complexity + */ + complexity: function () { + return this._objects.reduce(function (memo, current) { + memo += current.complexity ? current.complexity() : 0; + return memo; + }, 0); + } +}; +/** + * @namespace fabric.CommonMethods + */ +fabric.CommonMethods = { + + /** + * Sets object's properties from options + * @param {Object} [options] Options object + */ + _setOptions: function(options) { + for (var prop in options) { + this.set(prop, options[prop]); + } + }, + + /** + * @private + * @param {Object} [filler] Options object + * @param {String} [property] property to set the Gradient to + */ + _initGradient: function(filler, property) { + if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) { + this.set(property, new fabric.Gradient(filler)); + } + }, + + /** + * @private + * @param {Object} [filler] Options object + * @param {String} [property] property to set the Pattern to + * @param {Function} [callback] callback to invoke after pattern load + */ + _initPattern: function(filler, property, callback) { + if (filler && filler.source && !(filler instanceof fabric.Pattern)) { + this.set(property, new fabric.Pattern(filler, callback)); + } + else { + callback && callback(); + } + }, + + /** + * @private + */ + _setObject: function(obj) { + for (var prop in obj) { + this._set(prop, obj[prop]); + } + }, + + /** + * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. + * @param {String|Object} key Property name or object (if object, iterate over the object properties) + * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) + * @return {fabric.Object} thisArg + * @chainable + */ + set: function(key, value) { + if (typeof key === 'object') { + this._setObject(key); + } + else { + this._set(key, value); + } + return this; + }, + + _set: function(key, value) { + this[key] = value; + }, + + /** + * Toggles specified property from `true` to `false` or from `false` to `true` + * @param {String} property Property to toggle + * @return {fabric.Object} thisArg + * @chainable + */ + toggle: function(property) { + var value = this.get(property); + if (typeof value === 'boolean') { + this.set(property, !value); + } + return this; + }, + + /** + * Basic getter + * @param {String} property Property name + * @return {*} value of a property + */ + get: function(property) { + return this[property]; + } +}; +(function(global) { + + var sqrt = Math.sqrt, + atan2 = Math.atan2, + pow = Math.pow, + PiBy180 = Math.PI / 180, + PiBy2 = Math.PI / 2; + + /** + * @namespace fabric.util + */ + fabric.util = { + + /** + * Calculate the cos of an angle, avoiding returning floats for known results + * @static + * @memberOf fabric.util + * @param {Number} angle the angle in radians or in degree + * @return {Number} + */ + cos: function(angle) { + if (angle === 0) { return 1; } + if (angle < 0) { + // cos(a) = cos(-a) + angle = -angle; + } + var angleSlice = angle / PiBy2; + switch (angleSlice) { + case 1: case 3: return 0; + case 2: return -1; + } + return Math.cos(angle); + }, + + /** + * Calculate the sin of an angle, avoiding returning floats for known results + * @static + * @memberOf fabric.util + * @param {Number} angle the angle in radians or in degree + * @return {Number} + */ + sin: function(angle) { + if (angle === 0) { return 0; } + var angleSlice = angle / PiBy2, sign = 1; + if (angle < 0) { + // sin(-a) = -sin(a) + sign = -1; + } + switch (angleSlice) { + case 1: return sign; + case 2: return 0; + case 3: return -sign; + } + return Math.sin(angle); + }, + + /** + * Removes value from an array. + * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf` + * @static + * @memberOf fabric.util + * @param {Array} array + * @param {*} value + * @return {Array} original array + */ + removeFromArray: function(array, value) { + var idx = array.indexOf(value); + if (idx !== -1) { + array.splice(idx, 1); + } + return array; + }, + + /** + * Returns random number between 2 specified ones. + * @static + * @memberOf fabric.util + * @param {Number} min lower limit + * @param {Number} max upper limit + * @return {Number} random value (between min and max) + */ + getRandomInt: function(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + }, + + /** + * Transforms degrees to radians. + * @static + * @memberOf fabric.util + * @param {Number} degrees value in degrees + * @return {Number} value in radians + */ + degreesToRadians: function(degrees) { + return degrees * PiBy180; + }, + + /** + * Transforms radians to degrees. + * @static + * @memberOf fabric.util + * @param {Number} radians value in radians + * @return {Number} value in degrees + */ + radiansToDegrees: function(radians) { + return radians / PiBy180; + }, + + /** + * Rotates `point` around `origin` with `radians` + * @static + * @memberOf fabric.util + * @param {fabric.Point} point The point to rotate + * @param {fabric.Point} origin The origin of the rotation + * @param {Number} radians The radians of the angle for the rotation + * @return {fabric.Point} The new rotated point + */ + rotatePoint: function(point, origin, radians) { + var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y), + v = fabric.util.rotateVector(newPoint, radians); + return new fabric.Point(v.x, v.y).addEquals(origin); + }, + + /** + * Rotates `vector` with `radians` + * @static + * @memberOf fabric.util + * @param {Object} vector The vector to rotate (x and y) + * @param {Number} radians The radians of the angle for the rotation + * @return {Object} The new rotated point + */ + rotateVector: function(vector, radians) { + var sin = fabric.util.sin(radians), + cos = fabric.util.cos(radians), + rx = vector.x * cos - vector.y * sin, + ry = vector.x * sin + vector.y * cos; + return { + x: rx, + y: ry + }; + }, + + /** + * Creates a vetor from points represented as a point + * @static + * @memberOf fabric.util + * + * @typedef {Object} Point + * @property {number} x + * @property {number} y + * + * @param {Point} from + * @param {Point} to + * @returns {Point} vector + */ + createVector: function (from, to) { + return new fabric.Point(to.x - from.x, to.y - from.y); + }, + + /** + * Calculates angle between 2 vectors using dot product + * @static + * @memberOf fabric.util + * @param {Point} a + * @param {Point} b + * @returns the angle in radian between the vectors + */ + calcAngleBetweenVectors: function (a, b) { + return Math.acos((a.x * b.x + a.y * b.y) / (Math.hypot(a.x, a.y) * Math.hypot(b.x, b.y))); + }, + + /** + * @static + * @memberOf fabric.util + * @param {Point} v + * @returns {Point} vector representing the unit vector of pointing to the direction of `v` + */ + getHatVector: function (v) { + return new fabric.Point(v.x, v.y).multiply(1 / Math.hypot(v.x, v.y)); + }, + + /** + * @static + * @memberOf fabric.util + * @param {Point} A + * @param {Point} B + * @param {Point} C + * @returns {{ vector: Point, angle: number }} vector representing the bisector of A and A's angle + */ + getBisector: function (A, B, C) { + var AB = fabric.util.createVector(A, B), AC = fabric.util.createVector(A, C); + var alpha = fabric.util.calcAngleBetweenVectors(AB, AC); + // check if alpha is relative to AB->BC + var ro = fabric.util.calcAngleBetweenVectors(fabric.util.rotateVector(AB, alpha), AC); + var phi = alpha * (ro === 0 ? 1 : -1) / 2; + return { + vector: fabric.util.getHatVector(fabric.util.rotateVector(AB, phi)), + angle: alpha + }; + }, + + /** + * Project stroke width on points returning 2 projections for each point as follows: + * - `miter`: 2 points corresponding to the outer boundary and the inner boundary of stroke. + * - `bevel`: 2 points corresponding to the bevel boundaries, tangent to the bisector. + * - `round`: same as `bevel` + * Used to calculate object's bounding box + * @static + * @memberOf fabric.util + * @param {Point[]} points + * @param {Object} options + * @param {number} options.strokeWidth + * @param {'miter'|'bevel'|'round'} options.strokeLineJoin + * @param {number} options.strokeMiterLimit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit + * @param {boolean} options.strokeUniform + * @param {number} options.scaleX + * @param {number} options.scaleY + * @param {boolean} [openPath] whether the shape is open or not, affects the calculations of the first and last points + * @returns {fabric.Point[]} array of size 2n/4n of all suspected points + */ + projectStrokeOnPoints: function (points, options, openPath) { + var coords = [], s = options.strokeWidth / 2, + strokeUniformScalar = options.strokeUniform ? + new fabric.Point(1 / options.scaleX, 1 / options.scaleY) : new fabric.Point(1, 1), + getStrokeHatVector = function (v) { + var scalar = s / (Math.hypot(v.x, v.y)); + return new fabric.Point(v.x * scalar * strokeUniformScalar.x, v.y * scalar * strokeUniformScalar.y); + }; + if (points.length <= 1) {return coords;} + points.forEach(function (p, index) { + var A = new fabric.Point(p.x, p.y), B, C; + if (index === 0) { + C = points[index + 1]; + B = openPath ? getStrokeHatVector(fabric.util.createVector(C, A)).addEquals(A) : points[points.length - 1]; + } + else if (index === points.length - 1) { + B = points[index - 1]; + C = openPath ? getStrokeHatVector(fabric.util.createVector(B, A)).addEquals(A) : points[0]; + } + else { + B = points[index - 1]; + C = points[index + 1]; + } + var bisector = fabric.util.getBisector(A, B, C), + bisectorVector = bisector.vector, + alpha = bisector.angle, + scalar, + miterVector; + if (options.strokeLineJoin === 'miter') { + scalar = -s / Math.sin(alpha / 2); + miterVector = new fabric.Point( + bisectorVector.x * scalar * strokeUniformScalar.x, + bisectorVector.y * scalar * strokeUniformScalar.y + ); + if (Math.hypot(miterVector.x, miterVector.y) / s <= options.strokeMiterLimit) { + coords.push(A.add(miterVector)); + coords.push(A.subtract(miterVector)); + return; + } + } + scalar = -s * Math.SQRT2; + miterVector = new fabric.Point( + bisectorVector.x * scalar * strokeUniformScalar.x, + bisectorVector.y * scalar * strokeUniformScalar.y + ); + coords.push(A.add(miterVector)); + coords.push(A.subtract(miterVector)); + }); + return coords; + }, + + /** + * Apply transform t to point p + * @static + * @memberOf fabric.util + * @param {fabric.Point} p The point to transform + * @param {Array} t The transform + * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied + * @return {fabric.Point} The transformed point + */ + transformPoint: function(p, t, ignoreOffset) { + if (ignoreOffset) { + return new fabric.Point( + t[0] * p.x + t[2] * p.y, + t[1] * p.x + t[3] * p.y + ); + } + return new fabric.Point( + t[0] * p.x + t[2] * p.y + t[4], + t[1] * p.x + t[3] * p.y + t[5] + ); + }, + + /** + * Returns coordinates of points's bounding rectangle (left, top, width, height) + * @param {Array} points 4 points array + * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix + * @return {Object} Object with left, top, width, height properties + */ + makeBoundingBoxFromPoints: function(points, transform) { + if (transform) { + for (var i = 0; i < points.length; i++) { + points[i] = fabric.util.transformPoint(points[i], transform); + } + } + var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x], + minX = fabric.util.array.min(xPoints), + maxX = fabric.util.array.max(xPoints), + width = maxX - minX, + yPoints = [points[0].y, points[1].y, points[2].y, points[3].y], + minY = fabric.util.array.min(yPoints), + maxY = fabric.util.array.max(yPoints), + height = maxY - minY; + + return { + left: minX, + top: minY, + width: width, + height: height + }; + }, + + /** + * Invert transformation t + * @static + * @memberOf fabric.util + * @param {Array} t The transform + * @return {Array} The inverted transform + */ + invertTransform: function(t) { + var a = 1 / (t[0] * t[3] - t[1] * t[2]), + r = [a * t[3], -a * t[1], -a * t[2], a * t[0]], + o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true); + r[4] = -o.x; + r[5] = -o.y; + return r; + }, + + /** + * A wrapper around Number#toFixed, which contrary to native method returns number, not string. + * @static + * @memberOf fabric.util + * @param {Number|String} number number to operate on + * @param {Number} fractionDigits number of fraction digits to "leave" + * @return {Number} + */ + toFixed: function(number, fractionDigits) { + return parseFloat(Number(number).toFixed(fractionDigits)); + }, + + /** + * Converts from attribute value to pixel value if applicable. + * Returns converted pixels or original value not converted. + * @param {Number|String} value number to operate on + * @param {Number} fontSize + * @return {Number|String} + */ + parseUnit: function(value, fontSize) { + var unit = /\D{0,2}$/.exec(value), + number = parseFloat(value); + if (!fontSize) { + fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; + } + switch (unit[0]) { + case 'mm': + return number * fabric.DPI / 25.4; + + case 'cm': + return number * fabric.DPI / 2.54; + + case 'in': + return number * fabric.DPI; + + case 'pt': + return number * fabric.DPI / 72; // or * 4 / 3 + + case 'pc': + return number * fabric.DPI / 72 * 12; // or * 16 + + case 'em': + return number * fontSize; + + default: + return number; + } + }, + + /** + * Function which always returns `false`. + * @static + * @memberOf fabric.util + * @return {Boolean} + */ + falseFunction: function() { + return false; + }, + + /** + * Returns klass "Class" object of given namespace + * @memberOf fabric.util + * @param {String} type Type of object (eg. 'circle') + * @param {String} namespace Namespace to get klass "Class" object from + * @return {Object} klass "Class" + */ + getKlass: function(type, namespace) { + // capitalize first letter only + type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1)); + return fabric.util.resolveNamespace(namespace)[type]; + }, + + /** + * Returns array of attributes for given svg that fabric parses + * @memberOf fabric.util + * @param {String} type Type of svg element (eg. 'circle') + * @return {Array} string names of supported attributes + */ + getSvgAttributes: function(type) { + var attributes = [ + 'instantiated_by_use', + 'style', + 'id', + 'class' + ]; + switch (type) { + case 'linearGradient': + attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']); + break; + case 'radialGradient': + attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']); + break; + case 'stop': + attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']); + break; + } + return attributes; + }, + + /** + * Returns object of given namespace + * @memberOf fabric.util + * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric' + * @return {Object} Object for given namespace (default fabric) + */ + resolveNamespace: function(namespace) { + if (!namespace) { + return fabric; + } + + var parts = namespace.split('.'), + len = parts.length, i, + obj = global || fabric.window; + + for (i = 0; i < len; ++i) { + obj = obj[parts[i]]; + } + + return obj; + }, + + /** + * Loads image element from given url and passes it to a callback + * @memberOf fabric.util + * @param {String} url URL representing an image + * @param {Function} callback Callback; invoked with loaded image + * @param {*} [context] Context to invoke callback in + * @param {Object} [crossOrigin] crossOrigin value to set image element to + */ + loadImage: function(url, callback, context, crossOrigin) { + if (!url) { + callback && callback.call(context, url); + return; + } + + var img = fabric.util.createImage(); + + /** @ignore */ + var onLoadCallback = function () { + callback && callback.call(context, img, false); + img = img.onload = img.onerror = null; + }; + + img.onload = onLoadCallback; + /** @ignore */ + img.onerror = function() { + fabric.log('Error loading ' + img.src); + callback && callback.call(context, null, true); + img = img.onload = img.onerror = null; + }; + + // data-urls appear to be buggy with crossOrigin + // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767 + // see https://code.google.com/p/chromium/issues/detail?id=315152 + // https://bugzilla.mozilla.org/show_bug.cgi?id=935069 + // crossOrigin null is the same as not set. + if (url.indexOf('data') !== 0 && + crossOrigin !== undefined && + crossOrigin !== null) { + img.crossOrigin = crossOrigin; + } + + // IE10 / IE11-Fix: SVG contents from data: URI + // will only be available if the IMG is present + // in the DOM (and visible) + if (url.substring(0,14) === 'data:image/svg') { + img.onload = null; + fabric.util.loadImageInDom(img, onLoadCallback); + } + + img.src = url; + }, + + /** + * Attaches SVG image with data: URL to the dom + * @memberOf fabric.util + * @param {Object} img Image object with data:image/svg src + * @param {Function} callback Callback; invoked with loaded image + * @return {Object} DOM element (div containing the SVG image) + */ + loadImageInDom: function(img, onLoadCallback) { + var div = fabric.document.createElement('div'); + div.style.width = div.style.height = '1px'; + div.style.left = div.style.top = '-100%'; + div.style.position = 'absolute'; + div.appendChild(img); + fabric.document.querySelector('body').appendChild(div); + /** + * Wrap in function to: + * 1. Call existing callback + * 2. Cleanup DOM + */ + img.onload = function () { + onLoadCallback(); + div.parentNode.removeChild(div); + div = null; + }; + }, + + /** + * Creates corresponding fabric instances from their object representations + * @static + * @memberOf fabric.util + * @param {Array} objects Objects to enliven + * @param {Function} callback Callback to invoke when all objects are created + * @param {String} namespace Namespace to get klass "Class" object from + * @param {Function} reviver Method for further parsing of object elements, + * called after each fabric object created. + */ + enlivenObjects: function(objects, callback, namespace, reviver) { + objects = objects || []; + + var enlivenedObjects = [], + numLoadedObjects = 0, + numTotalObjects = objects.length; + + function onLoaded() { + if (++numLoadedObjects === numTotalObjects) { + callback && callback(enlivenedObjects.filter(function(obj) { + // filter out undefined objects (objects that gave error) + return obj; + })); + } + } + + if (!numTotalObjects) { + callback && callback(enlivenedObjects); + return; + } + + objects.forEach(function (o, index) { + // if sparse array + if (!o || !o.type) { + onLoaded(); + return; + } + var klass = fabric.util.getKlass(o.type, namespace); + klass.fromObject(o, function (obj, error) { + error || (enlivenedObjects[index] = obj); + reviver && reviver(o, obj, error); + onLoaded(); + }); + }); + }, + + /** + * Creates corresponding fabric instances residing in an object, e.g. `clipPath` + * @see {@link fabric.Object.ENLIVEN_PROPS} + * @param {Object} object + * @param {Object} [context] assign enlived props to this object (pass null to skip this) + * @param {(objects:fabric.Object[]) => void} callback + */ + enlivenObjectEnlivables: function (object, context, callback) { + var enlivenProps = fabric.Object.ENLIVEN_PROPS.filter(function (key) { return !!object[key]; }); + fabric.util.enlivenObjects(enlivenProps.map(function (key) { return object[key]; }), function (enlivedProps) { + var objects = {}; + enlivenProps.forEach(function (key, index) { + objects[key] = enlivedProps[index]; + context && (context[key] = enlivedProps[index]); + }); + callback && callback(objects); + }); + }, + + /** + * Create and wait for loading of patterns + * @static + * @memberOf fabric.util + * @param {Array} patterns Objects to enliven + * @param {Function} callback Callback to invoke when all objects are created + * called after each fabric object created. + */ + enlivenPatterns: function(patterns, callback) { + patterns = patterns || []; + + function onLoaded() { + if (++numLoadedPatterns === numPatterns) { + callback && callback(enlivenedPatterns); + } + } + + var enlivenedPatterns = [], + numLoadedPatterns = 0, + numPatterns = patterns.length; + + if (!numPatterns) { + callback && callback(enlivenedPatterns); + return; + } + + patterns.forEach(function (p, index) { + if (p && p.source) { + new fabric.Pattern(p, function(pattern) { + enlivenedPatterns[index] = pattern; + onLoaded(); + }); + } + else { + enlivenedPatterns[index] = p; + onLoaded(); + } + }); + }, + + /** + * Groups SVG elements (usually those retrieved from SVG document) + * @static + * @memberOf fabric.util + * @param {Array} elements SVG elements to group + * @param {Object} [options] Options object + * @param {String} path Value to set sourcePath to + * @return {fabric.Object|fabric.Group} + */ + groupSVGElements: function(elements, options, path) { + var object; + if (elements && elements.length === 1) { + return elements[0]; + } + if (options) { + if (options.width && options.height) { + options.centerPoint = { + x: options.width / 2, + y: options.height / 2 + }; + } + else { + delete options.width; + delete options.height; + } + } + object = new fabric.Group(elements, options); + if (typeof path !== 'undefined') { + object.sourcePath = path; + } + return object; + }, + + /** + * Populates an object with properties of another object + * @static + * @memberOf fabric.util + * @param {Object} source Source object + * @param {Object} destination Destination object + * @return {Array} properties Properties names to include + */ + populateWithProperties: function(source, destination, properties) { + if (properties && Array.isArray(properties)) { + for (var i = 0, len = properties.length; i < len; i++) { + if (properties[i] in source) { + destination[properties[i]] = source[properties[i]]; + } + } + } + }, + + /** + * Creates canvas element + * @static + * @memberOf fabric.util + * @return {CanvasElement} initialized canvas element + */ + createCanvasElement: function() { + return fabric.document.createElement('canvas'); + }, + + /** + * Creates a canvas element that is a copy of another and is also painted + * @param {CanvasElement} canvas to copy size and content of + * @static + * @memberOf fabric.util + * @return {CanvasElement} initialized canvas element + */ + copyCanvasElement: function(canvas) { + var newCanvas = fabric.util.createCanvasElement(); + newCanvas.width = canvas.width; + newCanvas.height = canvas.height; + newCanvas.getContext('2d').drawImage(canvas, 0, 0); + return newCanvas; + }, + + /** + * since 2.6.0 moved from canvas instance to utility. + * @param {CanvasElement} canvasEl to copy size and content of + * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too + * @param {Number} quality <= 1 and > 0 + * @static + * @memberOf fabric.util + * @return {String} data url + */ + toDataURL: function(canvasEl, format, quality) { + return canvasEl.toDataURL('image/' + format, quality); + }, + + /** + * Creates image element (works on client and node) + * @static + * @memberOf fabric.util + * @return {HTMLImageElement} HTML image element + */ + createImage: function() { + return fabric.document.createElement('img'); + }, + + /** + * Multiply matrix A by matrix B to nest transformations + * @static + * @memberOf fabric.util + * @param {Array} a First transformMatrix + * @param {Array} b Second transformMatrix + * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices + * @return {Array} The product of the two transform matrices + */ + multiplyTransformMatrices: function(a, b, is2x2) { + // Matrix multiply a * b + return [ + a[0] * b[0] + a[2] * b[1], + a[1] * b[0] + a[3] * b[1], + a[0] * b[2] + a[2] * b[3], + a[1] * b[2] + a[3] * b[3], + is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4], + is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5] + ]; + }, + + /** + * Decomposes standard 2x3 matrix into transform components + * @static + * @memberOf fabric.util + * @param {Array} a transformMatrix + * @return {Object} Components of transform + */ + qrDecompose: function(a) { + var angle = atan2(a[1], a[0]), + denom = pow(a[0], 2) + pow(a[1], 2), + scaleX = sqrt(denom), + scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX, + skewX = atan2(a[0] * a[2] + a[1] * a [3], denom); + return { + angle: angle / PiBy180, + scaleX: scaleX, + scaleY: scaleY, + skewX: skewX / PiBy180, + skewY: 0, + translateX: a[4], + translateY: a[5] + }; + }, + + /** + * Returns a transform matrix starting from an object of the same kind of + * the one returned from qrDecompose, useful also if you want to calculate some + * transformations from an object that is not enlived yet + * @static + * @memberOf fabric.util + * @param {Object} options + * @param {Number} [options.angle] angle in degrees + * @return {Number[]} transform matrix + */ + calcRotateMatrix: function(options) { + if (!options.angle) { + return fabric.iMatrix.concat(); + } + var theta = fabric.util.degreesToRadians(options.angle), + cos = fabric.util.cos(theta), + sin = fabric.util.sin(theta); + return [cos, sin, -sin, cos, 0, 0]; + }, + + /** + * Returns a transform matrix starting from an object of the same kind of + * the one returned from qrDecompose, useful also if you want to calculate some + * transformations from an object that is not enlived yet. + * is called DimensionsTransformMatrix because those properties are the one that influence + * the size of the resulting box of the object. + * @static + * @memberOf fabric.util + * @param {Object} options + * @param {Number} [options.scaleX] + * @param {Number} [options.scaleY] + * @param {Boolean} [options.flipX] + * @param {Boolean} [options.flipY] + * @param {Number} [options.skewX] + * @param {Number} [options.skewY] + * @return {Number[]} transform matrix + */ + calcDimensionsMatrix: function(options) { + var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX, + scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY, + scaleMatrix = [ + options.flipX ? -scaleX : scaleX, + 0, + 0, + options.flipY ? -scaleY : scaleY, + 0, + 0], + multiply = fabric.util.multiplyTransformMatrices, + degreesToRadians = fabric.util.degreesToRadians; + if (options.skewX) { + scaleMatrix = multiply( + scaleMatrix, + [1, 0, Math.tan(degreesToRadians(options.skewX)), 1], + true); + } + if (options.skewY) { + scaleMatrix = multiply( + scaleMatrix, + [1, Math.tan(degreesToRadians(options.skewY)), 0, 1], + true); + } + return scaleMatrix; + }, + + /** + * Returns a transform matrix starting from an object of the same kind of + * the one returned from qrDecompose, useful also if you want to calculate some + * transformations from an object that is not enlived yet + * @static + * @memberOf fabric.util + * @param {Object} options + * @param {Number} [options.angle] + * @param {Number} [options.scaleX] + * @param {Number} [options.scaleY] + * @param {Boolean} [options.flipX] + * @param {Boolean} [options.flipY] + * @param {Number} [options.skewX] + * @param {Number} [options.skewX] + * @param {Number} [options.translateX] + * @param {Number} [options.translateY] + * @return {Number[]} transform matrix + */ + composeMatrix: function(options) { + var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0], + multiply = fabric.util.multiplyTransformMatrices; + if (options.angle) { + matrix = multiply(matrix, fabric.util.calcRotateMatrix(options)); + } + if (options.scaleX !== 1 || options.scaleY !== 1 || + options.skewX || options.skewY || options.flipX || options.flipY) { + matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options)); + } + return matrix; + }, + + /** + * reset an object transform state to neutral. Top and left are not accounted for + * @static + * @memberOf fabric.util + * @param {fabric.Object} target object to transform + */ + resetObjectTransform: function (target) { + target.scaleX = 1; + target.scaleY = 1; + target.skewX = 0; + target.skewY = 0; + target.flipX = false; + target.flipY = false; + target.rotate(0); + }, + + /** + * Extract Object transform values + * @static + * @memberOf fabric.util + * @param {fabric.Object} target object to read from + * @return {Object} Components of transform + */ + saveObjectTransform: function (target) { + return { + scaleX: target.scaleX, + scaleY: target.scaleY, + skewX: target.skewX, + skewY: target.skewY, + angle: target.angle, + left: target.left, + flipX: target.flipX, + flipY: target.flipY, + top: target.top + }; + }, + + /** + * Returns true if context has transparent pixel + * at specified location (taking tolerance into account) + * @param {CanvasRenderingContext2D} ctx context + * @param {Number} x x coordinate + * @param {Number} y y coordinate + * @param {Number} tolerance Tolerance + */ + isTransparent: function(ctx, x, y, tolerance) { + + // If tolerance is > 0 adjust start coords to take into account. + // If moves off Canvas fix to 0 + if (tolerance > 0) { + if (x > tolerance) { + x -= tolerance; + } + else { + x = 0; + } + if (y > tolerance) { + y -= tolerance; + } + else { + y = 0; + } + } + + var _isTransparent = true, i, temp, + imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1), + l = imageData.data.length; + + // Split image data - for tolerance > 1, pixelDataSize = 4; + for (i = 3; i < l; i += 4) { + temp = imageData.data[i]; + _isTransparent = temp <= 0; + if (_isTransparent === false) { + break; // Stop if colour found + } + } + + imageData = null; + + return _isTransparent; + }, + + /** + * Parse preserveAspectRatio attribute from element + * @param {string} attribute to be parsed + * @return {Object} an object containing align and meetOrSlice attribute + */ + parsePreserveAspectRatioAttribute: function(attribute) { + var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid', + aspectRatioAttrs = attribute.split(' '), align; + + if (aspectRatioAttrs && aspectRatioAttrs.length) { + meetOrSlice = aspectRatioAttrs.pop(); + if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') { + align = meetOrSlice; + meetOrSlice = 'meet'; + } + else if (aspectRatioAttrs.length) { + align = aspectRatioAttrs.pop(); + } + } + //divide align in alignX and alignY + alignX = align !== 'none' ? align.slice(1, 4) : 'none'; + alignY = align !== 'none' ? align.slice(5, 8) : 'none'; + return { + meetOrSlice: meetOrSlice, + alignX: alignX, + alignY: alignY + }; + }, + + /** + * Clear char widths cache for the given font family or all the cache if no + * fontFamily is specified. + * Use it if you know you are loading fonts in a lazy way and you are not waiting + * for custom fonts to load properly when adding text objects to the canvas. + * If a text object is added when its own font is not loaded yet, you will get wrong + * measurement and so wrong bounding boxes. + * After the font cache is cleared, either change the textObject text content or call + * initDimensions() to trigger a recalculation + * @memberOf fabric.util + * @param {String} [fontFamily] font family to clear + */ + clearFabricFontCache: function(fontFamily) { + fontFamily = (fontFamily || '').toLowerCase(); + if (!fontFamily) { + fabric.charWidthsCache = { }; + } + else if (fabric.charWidthsCache[fontFamily]) { + delete fabric.charWidthsCache[fontFamily]; + } + }, + + /** + * Given current aspect ratio, determines the max width and height that can + * respect the total allowed area for the cache. + * @memberOf fabric.util + * @param {Number} ar aspect ratio + * @param {Number} maximumArea Maximum area you want to achieve + * @return {Object.x} Limited dimensions by X + * @return {Object.y} Limited dimensions by Y + */ + limitDimsByArea: function(ar, maximumArea) { + var roughWidth = Math.sqrt(maximumArea * ar), + perfLimitSizeY = Math.floor(maximumArea / roughWidth); + return { x: Math.floor(roughWidth), y: perfLimitSizeY }; + }, + + capValue: function(min, value, max) { + return Math.max(min, Math.min(value, max)); + }, + + /** + * Finds the scale for the object source to fit inside the object destination, + * keeping aspect ratio intact. + * respect the total allowed area for the cache. + * @memberOf fabric.util + * @param {Object | fabric.Object} source + * @param {Number} source.height natural unscaled height of the object + * @param {Number} source.width natural unscaled width of the object + * @param {Object | fabric.Object} destination + * @param {Number} destination.height natural unscaled height of the object + * @param {Number} destination.width natural unscaled width of the object + * @return {Number} scale factor to apply to source to fit into destination + */ + findScaleToFit: function(source, destination) { + return Math.min(destination.width / source.width, destination.height / source.height); + }, + + /** + * Finds the scale for the object source to cover entirely the object destination, + * keeping aspect ratio intact. + * respect the total allowed area for the cache. + * @memberOf fabric.util + * @param {Object | fabric.Object} source + * @param {Number} source.height natural unscaled height of the object + * @param {Number} source.width natural unscaled width of the object + * @param {Object | fabric.Object} destination + * @param {Number} destination.height natural unscaled height of the object + * @param {Number} destination.width natural unscaled width of the object + * @return {Number} scale factor to apply to source to cover destination + */ + findScaleToCover: function(source, destination) { + return Math.max(destination.width / source.width, destination.height / source.height); + }, + + /** + * given an array of 6 number returns something like `"matrix(...numbers)"` + * @memberOf fabric.util + * @param {Array} transform an array with 6 numbers + * @return {String} transform matrix for svg + * @return {Object.y} Limited dimensions by Y + */ + matrixToSVG: function(transform) { + return 'matrix(' + transform.map(function(value) { + return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS); + }).join(' ') + ')'; + }, + + /** + * given an object and a transform, apply the inverse transform to the object, + * this is equivalent to remove from that object that transformation, so that + * added in a space with the removed transform, the object will be the same as before. + * Removing from an object a transform that scale by 2 is like scaling it by 1/2. + * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg + * in the opposite direction. + * This util is used to add objects inside transformed groups or nested groups. + * @memberOf fabric.util + * @param {fabric.Object} object the object you want to transform + * @param {Array} transform the destination transform + */ + removeTransformFromObject: function(object, transform) { + var inverted = fabric.util.invertTransform(transform), + finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix()); + fabric.util.applyTransformToObject(object, finalTransform); + }, + + /** + * given an object and a transform, apply the transform to the object. + * this is equivalent to change the space where the object is drawn. + * Adding to an object a transform that scale by 2 is like scaling it by 2. + * This is used when removing an object from an active selection for example. + * @memberOf fabric.util + * @param {fabric.Object} object the object you want to transform + * @param {Array} transform the destination transform + */ + addTransformToObject: function(object, transform) { + fabric.util.applyTransformToObject( + object, + fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix()) + ); + }, + + /** + * discard an object transform state and apply the one from the matrix. + * @memberOf fabric.util + * @param {fabric.Object} object the object you want to transform + * @param {Array} transform the destination transform + */ + applyTransformToObject: function(object, transform) { + var options = fabric.util.qrDecompose(transform), + center = new fabric.Point(options.translateX, options.translateY); + object.flipX = false; + object.flipY = false; + object.set('scaleX', options.scaleX); + object.set('scaleY', options.scaleY); + object.skewX = options.skewX; + object.skewY = options.skewY; + object.angle = options.angle; + object.setPositionByOrigin(center, 'center', 'center'); + }, + + /** + * given a width and height, return the size of the bounding box + * that can contains the box with width/height with applied transform + * described in options. + * Use to calculate the boxes around objects for controls. + * @memberOf fabric.util + * @param {Number} width + * @param {Number} height + * @param {Object} options + * @param {Number} options.scaleX + * @param {Number} options.scaleY + * @param {Number} options.skewX + * @param {Number} options.skewY + * @return {Object.x} width of containing + * @return {Object.y} height of containing + */ + sizeAfterTransform: function(width, height, options) { + var dimX = width / 2, dimY = height / 2, + points = [ + { + x: -dimX, + y: -dimY + }, + { + x: dimX, + y: -dimY + }, + { + x: -dimX, + y: dimY + }, + { + x: dimX, + y: dimY + }], + transformMatrix = fabric.util.calcDimensionsMatrix(options), + bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix); + return { + x: bbox.width, + y: bbox.height, + }; + }, + + /** + * Merges 2 clip paths into one visually equal clip path + * + * **IMPORTANT**:\ + * Does **NOT** clone the arguments, clone them proir if necessary. + * + * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap. + * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible. + * + * In order to handle the `inverted` property we follow logic described in the following cases:\ + * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\ + * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\ + * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged. + * + * @memberOf fabric.util + * @param {fabric.Object} c1 + * @param {fabric.Object} c2 + * @returns {fabric.Object} merged clip path + */ + mergeClipPaths: function (c1, c2) { + var a = c1, b = c2; + if (a.inverted && !b.inverted) { + // case (2) + a = c2; + b = c1; + } + // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane + fabric.util.applyTransformToObject( + b, + fabric.util.multiplyTransformMatrices( + fabric.util.invertTransform(a.calcTransformMatrix()), + b.calcTransformMatrix() + ) + ); + // assign the `inverted` prop to the wrapping group + var inverted = a.inverted && b.inverted; + if (inverted) { + // case (1) + a.inverted = b.inverted = false; + } + return new fabric.Group([a], { clipPath: b, inverted: inverted }); + }, + }; +})(typeof exports !== 'undefined' ? exports : this); +(function() { + var _join = Array.prototype.join, + commandLengths = { + m: 2, + l: 2, + h: 1, + v: 1, + c: 6, + s: 4, + q: 4, + t: 2, + a: 7 + }, + repeatedCommands = { + m: 'l', + M: 'L' + }; + function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) { + var costh2 = fabric.util.cos(th2), + sinth2 = fabric.util.sin(th2), + costh3 = fabric.util.cos(th3), + sinth3 = fabric.util.sin(th3), + toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1, + toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1, + cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2), + cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2), + cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3), + cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3); + + return ['C', + cp1X, cp1Y, + cp2X, cp2Y, + toX, toY + ]; + } + + /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp + * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here + * http://mozilla.org/MPL/2.0/ + */ + function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) { + var PI = Math.PI, th = rotateX * PI / 180, + sinTh = fabric.util.sin(th), + cosTh = fabric.util.cos(th), + fromX = 0, fromY = 0; + + rx = Math.abs(rx); + ry = Math.abs(ry); + + var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5, + py = -cosTh * toY * 0.5 + sinTh * toX * 0.5, + rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px, + pl = rx2 * ry2 - rx2 * py2 - ry2 * px2, + root = 0; + + if (pl < 0) { + var s = Math.sqrt(1 - pl / (rx2 * ry2)); + rx *= s; + ry *= s; + } + else { + root = (large === sweep ? -1.0 : 1.0) * + Math.sqrt( pl / (rx2 * py2 + ry2 * px2)); + } + + var cx = root * rx * py / ry, + cy = -root * ry * px / rx, + cx1 = cosTh * cx - sinTh * cy + toX * 0.5, + cy1 = sinTh * cx + cosTh * cy + toY * 0.5, + mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry), + dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry); + + if (sweep === 0 && dtheta > 0) { + dtheta -= 2 * PI; + } + else if (sweep === 1 && dtheta < 0) { + dtheta += 2 * PI; + } + + // Convert into cubic bezier segments <= 90deg + var segments = Math.ceil(Math.abs(dtheta / PI * 2)), + result = [], mDelta = dtheta / segments, + mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2), + th3 = mTheta + mDelta; + + for (var i = 0; i < segments; i++) { + result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY); + fromX = result[i][5]; + fromY = result[i][6]; + mTheta = th3; + th3 += mDelta; + } + return result; + } + + /* + * Private + */ + function calcVectorAngle(ux, uy, vx, vy) { + var ta = Math.atan2(uy, ux), + tb = Math.atan2(vy, vx); + if (tb >= ta) { + return tb - ta; + } + else { + return 2 * Math.PI - (ta - tb); + } + } + + /** + * Calculate bounding box of a beziercurve + * @param {Number} x0 starting point + * @param {Number} y0 + * @param {Number} x1 first control point + * @param {Number} y1 + * @param {Number} x2 secondo control point + * @param {Number} y2 + * @param {Number} x3 end of bezier + * @param {Number} y3 + */ + // taken from http://jsbin.com/ivomiq/56/edit no credits available for that. + // TODO: can we normalize this with the starting points set at 0 and then translated the bbox? + function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) { + var argsString; + if (fabric.cachesBoundsOfCurve) { + argsString = _join.call(arguments); + if (fabric.boundsOfCurveCache[argsString]) { + return fabric.boundsOfCurveCache[argsString]; + } + } + + var sqrt = Math.sqrt, + min = Math.min, max = Math.max, + abs = Math.abs, tvalues = [], + bounds = [[], []], + a, b, c, t, t1, t2, b2ac, sqrtb2ac; + + b = 6 * x0 - 12 * x1 + 6 * x2; + a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; + c = 3 * x1 - 3 * x0; + + for (var i = 0; i < 2; ++i) { + if (i > 0) { + b = 6 * y0 - 12 * y1 + 6 * y2; + a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; + c = 3 * y1 - 3 * y0; + } + + if (abs(a) < 1e-12) { + if (abs(b) < 1e-12) { + continue; + } + t = -c / b; + if (0 < t && t < 1) { + tvalues.push(t); + } + continue; + } + b2ac = b * b - 4 * c * a; + if (b2ac < 0) { + continue; + } + sqrtb2ac = sqrt(b2ac); + t1 = (-b + sqrtb2ac) / (2 * a); + if (0 < t1 && t1 < 1) { + tvalues.push(t1); + } + t2 = (-b - sqrtb2ac) / (2 * a); + if (0 < t2 && t2 < 1) { + tvalues.push(t2); + } + } + + var x, y, j = tvalues.length, jlen = j, mt; + while (j--) { + t = tvalues[j]; + mt = 1 - t; + x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); + bounds[0][j] = x; + + y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3); + bounds[1][j] = y; + } + + bounds[0][jlen] = x0; + bounds[1][jlen] = y0; + bounds[0][jlen + 1] = x3; + bounds[1][jlen + 1] = y3; + var result = [ + { + x: min.apply(null, bounds[0]), + y: min.apply(null, bounds[1]) + }, + { + x: max.apply(null, bounds[0]), + y: max.apply(null, bounds[1]) + } + ]; + if (fabric.cachesBoundsOfCurve) { + fabric.boundsOfCurveCache[argsString] = result; + } + return result; + } + + /** + * Converts arc to a bunch of bezier curves + * @param {Number} fx starting point x + * @param {Number} fy starting point y + * @param {Array} coords Arc command + */ + function fromArcToBeziers(fx, fy, coords) { + var rx = coords[1], + ry = coords[2], + rot = coords[3], + large = coords[4], + sweep = coords[5], + tx = coords[6], + ty = coords[7], + segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot); + + for (var i = 0, len = segsNorm.length; i < len; i++) { + segsNorm[i][1] += fx; + segsNorm[i][2] += fy; + segsNorm[i][3] += fx; + segsNorm[i][4] += fy; + segsNorm[i][5] += fx; + segsNorm[i][6] += fy; + } + return segsNorm; + }; + + /** + * This function take a parsed SVG path and make it simpler for fabricJS logic. + * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute ) + * S converted in C, T converted in Q, A converted in C. + * @param {Array} path the array of commands of a parsed svg path for fabric.Path + * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path + */ + function makePathSimpler(path) { + // x and y represent the last point of the path. the previous command point. + // we add them to each relative command to make it an absolute comment. + // we also swap the v V h H with L, because are easier to transform. + var x = 0, y = 0, len = path.length, + // x1 and y1 represent the last point of the subpath. the subpath is started with + // m or M command. When a z or Z command is drawn, x and y need to be resetted to + // the last x1 and y1. + x1 = 0, y1 = 0, current, i, converted, + // previous will host the letter of the previous command, to handle S and T. + // controlX and controlY will host the previous reflected control point + destinationPath = [], previous, controlX, controlY; + for (i = 0; i < len; ++i) { + converted = false; + current = path[i].slice(0); + switch (current[0]) { // first letter + case 'l': // lineto, relative + current[0] = 'L'; + current[1] += x; + current[2] += y; + // falls through + case 'L': + x = current[1]; + y = current[2]; + break; + case 'h': // horizontal lineto, relative + current[1] += x; + // falls through + case 'H': + current[0] = 'L'; + current[2] = y; + x = current[1]; + break; + case 'v': // vertical lineto, relative + current[1] += y; + // falls through + case 'V': + current[0] = 'L'; + y = current[1]; + current[1] = x; + current[2] = y; + break; + case 'm': // moveTo, relative + current[0] = 'M'; + current[1] += x; + current[2] += y; + // falls through + case 'M': + x = current[1]; + y = current[2]; + x1 = current[1]; + y1 = current[2]; + break; + case 'c': // bezierCurveTo, relative + current[0] = 'C'; + current[1] += x; + current[2] += y; + current[3] += x; + current[4] += y; + current[5] += x; + current[6] += y; + // falls through + case 'C': + controlX = current[3]; + controlY = current[4]; + x = current[5]; + y = current[6]; + break; + case 's': // shorthand cubic bezierCurveTo, relative + current[0] = 'S'; + current[1] += x; + current[2] += y; + current[3] += x; + current[4] += y; + // falls through + case 'S': + // would be sScC but since we are swapping sSc for C, we check just that. + if (previous === 'C') { + // calculate reflection of previous control points + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + } + else { + // If there is no previous command or if the previous command was not a C, c, S, or s, + // the control point is coincident with the current point + controlX = x; + controlY = y; + } + x = current[3]; + y = current[4]; + current[0] = 'C'; + current[5] = current[3]; + current[6] = current[4]; + current[3] = current[1]; + current[4] = current[2]; + current[1] = controlX; + current[2] = controlY; + // current[3] and current[4] are NOW the second control point. + // we keep it for the next reflection. + controlX = current[3]; + controlY = current[4]; + break; + case 'q': // quadraticCurveTo, relative + current[0] = 'Q'; + current[1] += x; + current[2] += y; + current[3] += x; + current[4] += y; + // falls through + case 'Q': + controlX = current[1]; + controlY = current[2]; + x = current[3]; + y = current[4]; + break; + case 't': // shorthand quadraticCurveTo, relative + current[0] = 'T'; + current[1] += x; + current[2] += y; + // falls through + case 'T': + if (previous === 'Q') { + // calculate reflection of previous control point + controlX = 2 * x - controlX; + controlY = 2 * y - controlY; + } + else { + // If there is no previous command or if the previous command was not a Q, q, T or t, + // assume the control point is coincident with the current point + controlX = x; + controlY = y; + } + current[0] = 'Q'; + x = current[1]; + y = current[2]; + current[1] = controlX; + current[2] = controlY; + current[3] = x; + current[4] = y; + break; + case 'a': + current[0] = 'A'; + current[6] += x; + current[7] += y; + // falls through + case 'A': + converted = true; + destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current)); + x = current[6]; + y = current[7]; + break; + case 'z': + case 'Z': + x = x1; + y = y1; + break; + default: + } + if (!converted) { + destinationPath.push(current); + } + previous = current[0]; + } + return destinationPath; + }; + + /** + * Calc length from point x1,y1 to x2,y2 + * @param {Number} x1 starting point x + * @param {Number} y1 starting point y + * @param {Number} x2 starting point x + * @param {Number} y2 starting point y + * @return {Number} length of segment + */ + function calcLineLength(x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + } + + // functions for the Cubic beizer + // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350 + function CB1(t) { + return t * t * t; + } + function CB2(t) { + return 3 * t * t * (1 - t); + } + function CB3(t) { + return 3 * t * (1 - t) * (1 - t); + } + function CB4(t) { + return (1 - t) * (1 - t) * (1 - t); + } + + function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { + return function(pct) { + var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct); + return { + x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4, + y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4 + }; + }; + } + + function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { + return function (pct) { + var invT = 1 - pct, + tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) + + (3 * pct * pct * (p4x - p3x)), + tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) + + (3 * pct * pct * (p4y - p3y)); + return Math.atan2(tangentY, tangentX); + }; + } + + function QB1(t) { + return t * t; + } + + function QB2(t) { + return 2 * t * (1 - t); + } + + function QB3(t) { + return (1 - t) * (1 - t); + } + + function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) { + return function(pct) { + var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct); + return { + x: p3x * c1 + p2x * c2 + p1x * c3, + y: p3y * c1 + p2y * c2 + p1y * c3 + }; + }; + } + + function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) { + return function (pct) { + var invT = 1 - pct, + tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)), + tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y)); + return Math.atan2(tangentY, tangentX); + }; + } + + + // this will run over a path segment ( a cubic or quadratic segment) and approximate it + // with 100 segemnts. This will good enough to calculate the length of the curve + function pathIterator(iterator, x1, y1) { + var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc; + for (perc = 1; perc <= 100; perc += 1) { + p = iterator(perc / 100); + tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y); + tempP = p; + } + return tmpLen; + } + + /** + * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1 + * that correspond to that pixels run over the path. + * The percentage will be then used to find the correct point on the canvas for the path. + * @param {Array} segInfo fabricJS collection of information on a parsed path + * @param {Number} distance from starting point, in pixels. + * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point; + */ + function findPercentageForDistance(segInfo, distance) { + var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y }, + p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc; + // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100 + // the path + while (tmpLen < distance && nextStep > 0.0001) { + p = iterator(perc); + lastPerc = perc; + nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y); + // compare tmpLen each cycle with distance, decide next perc to test. + if ((nextLen + tmpLen) > distance) { + // we discard this step and we make smaller steps. + perc -= nextStep; + nextStep /= 2; + } + else { + tempP = p; + perc += nextStep; + tmpLen += nextLen; + } + } + p.angle = angleFinder(lastPerc); + return p; + } + + /** + * Run over a parsed and simplifed path and extrac some informations. + * informations are length of each command and starting point + * @param {Array} path fabricJS parsed path commands + * @return {Array} path commands informations + */ + function getPathSegmentsInfo(path) { + var totalLength = 0, len = path.length, current, + //x2 and y2 are the coords of segment start + //x1 and y1 are the coords of the current point + x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder; + for (var i = 0; i < len; i++) { + current = path[i]; + tempInfo = { + x: x1, + y: y1, + command: current[0], + }; + switch (current[0]) { //first letter + case 'M': + tempInfo.length = 0; + x2 = x1 = current[1]; + y2 = y1 = current[2]; + break; + case 'L': + tempInfo.length = calcLineLength(x1, y1, current[1], current[2]); + x1 = current[1]; + y1 = current[2]; + break; + case 'C': + iterator = getPointOnCubicBezierIterator( + x1, + y1, + current[1], + current[2], + current[3], + current[4], + current[5], + current[6] + ); + angleFinder = getTangentCubicIterator( + x1, + y1, + current[1], + current[2], + current[3], + current[4], + current[5], + current[6] + ); + tempInfo.iterator = iterator; + tempInfo.angleFinder = angleFinder; + tempInfo.length = pathIterator(iterator, x1, y1); + x1 = current[5]; + y1 = current[6]; + break; + case 'Q': + iterator = getPointOnQuadraticBezierIterator( + x1, + y1, + current[1], + current[2], + current[3], + current[4] + ); + angleFinder = getTangentQuadraticIterator( + x1, + y1, + current[1], + current[2], + current[3], + current[4] + ); + tempInfo.iterator = iterator; + tempInfo.angleFinder = angleFinder; + tempInfo.length = pathIterator(iterator, x1, y1); + x1 = current[3]; + y1 = current[4]; + break; + case 'Z': + case 'z': + // we add those in order to ease calculations later + tempInfo.destX = x2; + tempInfo.destY = y2; + tempInfo.length = calcLineLength(x1, y1, x2, y2); + x1 = x2; + y1 = y2; + break; + } + totalLength += tempInfo.length; + info.push(tempInfo); + } + info.push({ length: totalLength, x: x1, y: y1 }); + return info; + } + + function getPointOnPath(path, distance, infos) { + if (!infos) { + infos = getPathSegmentsInfo(path); + } + var i = 0; + while ((distance - infos[i].length > 0) && i < (infos.length - 2)) { + distance -= infos[i].length; + i++; + } + // var distance = infos[infos.length - 1] * perc; + var segInfo = infos[i], segPercent = distance / segInfo.length, + command = segInfo.command, segment = path[i], info; + + switch (command) { + case 'M': + return { x: segInfo.x, y: segInfo.y, angle: 0 }; + case 'Z': + case 'z': + info = new fabric.Point(segInfo.x, segInfo.y).lerp( + new fabric.Point(segInfo.destX, segInfo.destY), + segPercent + ); + info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x); + return info; + case 'L': + info = new fabric.Point(segInfo.x, segInfo.y).lerp( + new fabric.Point(segment[1], segment[2]), + segPercent + ); + info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x); + return info; + case 'C': + return findPercentageForDistance(segInfo, distance); + case 'Q': + return findPercentageForDistance(segInfo, distance); + } + } + + /** + * + * @param {string} pathString + * @return {(string|number)[][]} An array of SVG path commands + * @example Usage + * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [ + * ['M', 3, 4], + * ['Q', 3, 5, 2, 1, 4, 0], + * ['Q', 9, 12, 2, 1, 4, 0], + * ]; + * + */ + function parsePath(pathString) { + var result = [], + coords = [], + currentPath, + parsed, + re = fabric.rePathCommand, + rNumber = '[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?\\s*', + rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp, + rFlagCommaWsp = '([01])' + fabric.commaWsp + '?', + rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp + + rNumberCommaWsp + '?(' + rNumber + ')', + regArcArgumentSequence = new RegExp(rArcSeq, 'g'), + match, + coordsStr, + // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values) + path; + if (!pathString || !pathString.match) { + return result; + } + path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi); + + for (var i = 0, coordsParsed, len = path.length; i < len; i++) { + currentPath = path[i]; + + coordsStr = currentPath.slice(1).trim(); + coords.length = 0; + + var command = currentPath.charAt(0); + coordsParsed = [command]; + + if (command.toLowerCase() === 'a') { + // arcs have special flags that apparently don't require spaces so handle special + for (var args; (args = regArcArgumentSequence.exec(coordsStr));) { + for (var j = 1; j < args.length; j++) { + coords.push(args[j]); + } + } + } + else { + while ((match = re.exec(coordsStr))) { + coords.push(match[0]); + } + } + + for (var j = 0, jlen = coords.length; j < jlen; j++) { + parsed = parseFloat(coords[j]); + if (!isNaN(parsed)) { + coordsParsed.push(parsed); + } + } + + var commandLength = commandLengths[command.toLowerCase()], + repeatedCommand = repeatedCommands[command] || command; + + if (coordsParsed.length - 1 > commandLength) { + for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) { + result.push([command].concat(coordsParsed.slice(k, k + commandLength))); + command = repeatedCommand; + } + } + else { + result.push(coordsParsed); + } + } + + return result; + }; + + /** + * + * Converts points to a smooth SVG path + * @param {{ x: number,y: number }[]} points Array of points + * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value. + * @return {(string|number)[][]} An array of SVG path commands + */ + function getSmoothPathFromPoints(points, correction) { + var path = [], i, + p1 = new fabric.Point(points[0].x, points[0].y), + p2 = new fabric.Point(points[1].x, points[1].y), + len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2; + correction = correction || 0; + + if (manyPoints) { + multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1; + multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1; + } + path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]); + for (i = 1; i < len; i++) { + if (!p1.eq(p2)) { + var midPoint = p1.midPointFrom(p2); + // p1 is our bezier control point + // midpoint is our endpoint + // start point is p(i-1) value. + path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]); + } + p1 = points[i]; + if ((i + 1) < points.length) { + p2 = points[i + 1]; + } + } + if (manyPoints) { + multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1; + multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1; + } + path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]); + return path; + } + /** + * Transform a path by transforming each segment. + * it has to be a simplified path or it won't work. + * WARNING: this depends from pathOffset for correct operation + * @param {Array} path fabricJS parsed and simplified path commands + * @param {Array} transform matrix that represent the transformation + * @param {Object} [pathOffset] the fabric.Path pathOffset + * @param {Number} pathOffset.x + * @param {Number} pathOffset.y + * @returns {Array} the transformed path + */ + function transformPath(path, transform, pathOffset) { + if (pathOffset) { + transform = fabric.util.multiplyTransformMatrices( + transform, + [1, 0, 0, 1, -pathOffset.x, -pathOffset.y] + ); + } + return path.map(function(pathSegment) { + var newSegment = pathSegment.slice(0), point = {}; + for (var i = 1; i < pathSegment.length - 1; i += 2) { + point.x = pathSegment[i]; + point.y = pathSegment[i + 1]; + point = fabric.util.transformPoint(point, transform); + newSegment[i] = point.x; + newSegment[i + 1] = point.y; + } + return newSegment; + }); + } + + /** + * Join path commands to go back to svg format + * @param {Array} pathData fabricJS parsed path commands + * @return {String} joined path 'M 0 0 L 20 30' + */ + fabric.util.joinPath = function(pathData) { + return pathData.map(function (segment) { return segment.join(' '); }).join(' '); + }; + fabric.util.parsePath = parsePath; + fabric.util.makePathSimpler = makePathSimpler; + fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints; + fabric.util.getPathSegmentsInfo = getPathSegmentsInfo; + fabric.util.getBoundsOfCurve = getBoundsOfCurve; + fabric.util.getPointOnPath = getPointOnPath; + fabric.util.transformPath = transformPath; +})(); +(function() { + + var slice = Array.prototype.slice; + + /** + * Invokes method on all items in a given array + * @memberOf fabric.util.array + * @param {Array} array Array to iterate over + * @param {String} method Name of a method to invoke + * @return {Array} + */ + function invoke(array, method) { + var args = slice.call(arguments, 2), result = []; + for (var i = 0, len = array.length; i < len; i++) { + result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]); + } + return result; + } + + /** + * Finds maximum value in array (not necessarily "first" one) + * @memberOf fabric.util.array + * @param {Array} array Array to iterate over + * @param {String} byProperty + * @return {*} + */ + function max(array, byProperty) { + return find(array, byProperty, function(value1, value2) { + return value1 >= value2; + }); + } + + /** + * Finds minimum value in array (not necessarily "first" one) + * @memberOf fabric.util.array + * @param {Array} array Array to iterate over + * @param {String} byProperty + * @return {*} + */ + function min(array, byProperty) { + return find(array, byProperty, function(value1, value2) { + return value1 < value2; + }); + } + + /** + * @private + */ + function fill(array, value) { + var k = array.length; + while (k--) { + array[k] = value; + } + return array; + } + + /** + * @private + */ + function find(array, byProperty, condition) { + if (!array || array.length === 0) { + return; + } + + var i = array.length - 1, + result = byProperty ? array[i][byProperty] : array[i]; + if (byProperty) { + while (i--) { + if (condition(array[i][byProperty], result)) { + result = array[i][byProperty]; + } + } + } + else { + while (i--) { + if (condition(array[i], result)) { + result = array[i]; + } + } + } + return result; + } + + /** + * @namespace fabric.util.array + */ + fabric.util.array = { + fill: fill, + invoke: invoke, + min: min, + max: max + }; + +})(); +(function() { + /** + * Copies all enumerable properties of one js object to another + * this does not and cannot compete with generic utils. + * Does not clone or extend fabric.Object subclasses. + * This is mostly for internal use and has extra handling for fabricJS objects + * it skips the canvas and group properties in deep cloning. + * @memberOf fabric.util.object + * @param {Object} destination Where to copy to + * @param {Object} source Where to copy from + * @param {Boolean} [deep] Whether to extend nested objects + * @return {Object} + */ + + function extend(destination, source, deep) { + // JScript DontEnum bug is not taken care of + // the deep clone is for internal use, is not meant to avoid + // javascript traps or cloning html element or self referenced objects. + if (deep) { + if (!fabric.isLikelyNode && source instanceof Element) { + // avoid cloning deep images, canvases, + destination = source; + } + else if (source instanceof Array) { + destination = []; + for (var i = 0, len = source.length; i < len; i++) { + destination[i] = extend({ }, source[i], deep); + } + } + else if (source && typeof source === 'object') { + for (var property in source) { + if (property === 'canvas' || property === 'group') { + // we do not want to clone this props at all. + // we want to keep the keys in the copy + destination[property] = null; + } + else if (source.hasOwnProperty(property)) { + destination[property] = extend({ }, source[property], deep); + } + } + } + else { + // this sounds odd for an extend but is ok for recursive use + destination = source; + } + } + else { + for (var property in source) { + destination[property] = source[property]; + } + } + return destination; + } + + /** + * Creates an empty object and copies all enumerable properties of another object to it + * This method is mostly for internal use, and not intended for duplicating shapes in canvas. + * @memberOf fabric.util.object + * @param {Object} object Object to clone + * @param {Boolean} [deep] Whether to clone nested objects + * @return {Object} + */ + + //TODO: this function return an empty object if you try to clone null + function clone(object, deep) { + return extend({ }, object, deep); + } + + /** @namespace fabric.util.object */ + fabric.util.object = { + extend: extend, + clone: clone + }; + fabric.util.object.extend(fabric.util, fabric.Observable); +})(); +(function() { + + /** + * Camelizes a string + * @memberOf fabric.util.string + * @param {String} string String to camelize + * @return {String} Camelized version of a string + */ + function camelize(string) { + return string.replace(/-+(.)?/g, function(match, character) { + return character ? character.toUpperCase() : ''; + }); + } + + /** + * Capitalizes a string + * @memberOf fabric.util.string + * @param {String} string String to capitalize + * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized + * and other letters stay untouched, if false first letter is capitalized + * and other letters are converted to lowercase. + * @return {String} Capitalized version of a string + */ + function capitalize(string, firstLetterOnly) { + return string.charAt(0).toUpperCase() + + (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()); + } + + /** + * Escapes XML in a string + * @memberOf fabric.util.string + * @param {String} string String to escape + * @return {String} Escaped version of a string + */ + function escapeXml(string) { + return string.replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, ''') + .replace(//g, '>'); + } + + /** + * Divide a string in the user perceived single units + * @memberOf fabric.util.string + * @param {String} textstring String to escape + * @return {Array} array containing the graphemes + */ + function graphemeSplit(textstring) { + var i = 0, chr, graphemes = []; + for (i = 0, chr; i < textstring.length; i++) { + if ((chr = getWholeChar(textstring, i)) === false) { + continue; + } + graphemes.push(chr); + } + return graphemes; + } + + // taken from mdn in the charAt doc page. + function getWholeChar(str, i) { + var code = str.charCodeAt(i); + + if (isNaN(code)) { + return ''; // Position not found + } + if (code < 0xD800 || code > 0xDFFF) { + return str.charAt(i); + } + + // High surrogate (could change last hex to 0xDB7F to treat high private + // surrogates as single characters) + if (0xD800 <= code && code <= 0xDBFF) { + if (str.length <= (i + 1)) { + throw 'High surrogate without following low surrogate'; + } + var next = str.charCodeAt(i + 1); + if (0xDC00 > next || next > 0xDFFF) { + throw 'High surrogate without following low surrogate'; + } + return str.charAt(i) + str.charAt(i + 1); + } + // Low surrogate (0xDC00 <= code && code <= 0xDFFF) + if (i === 0) { + throw 'Low surrogate without preceding high surrogate'; + } + var prev = str.charCodeAt(i - 1); + + // (could change last hex to 0xDB7F to treat high private + // surrogates as single characters) + if (0xD800 > prev || prev > 0xDBFF) { + throw 'Low surrogate without preceding high surrogate'; + } + // We can pass over low surrogates now as the second component + // in a pair which we have already processed + return false; + } + + + /** + * String utilities + * @namespace fabric.util.string + */ + fabric.util.string = { + camelize: camelize, + capitalize: capitalize, + escapeXml: escapeXml, + graphemeSplit: graphemeSplit + }; +})(); +(function() { + + var slice = Array.prototype.slice, emptyFunction = function() { }, + + IS_DONTENUM_BUGGY = (function() { + for (var p in { toString: 1 }) { + if (p === 'toString') { + return false; + } + } + return true; + })(), + + /** @ignore */ + addMethods = function(klass, source, parent) { + for (var property in source) { + + if (property in klass.prototype && + typeof klass.prototype[property] === 'function' && + (source[property] + '').indexOf('callSuper') > -1) { + + klass.prototype[property] = (function(property) { + return function() { + + var superclass = this.constructor.superclass; + this.constructor.superclass = parent; + var returnValue = source[property].apply(this, arguments); + this.constructor.superclass = superclass; + + if (property !== 'initialize') { + return returnValue; + } + }; + })(property); + } + else { + klass.prototype[property] = source[property]; + } + + if (IS_DONTENUM_BUGGY) { + if (source.toString !== Object.prototype.toString) { + klass.prototype.toString = source.toString; + } + if (source.valueOf !== Object.prototype.valueOf) { + klass.prototype.valueOf = source.valueOf; + } + } + } + }; + + function Subclass() { } + + function callSuper(methodName) { + var parentMethod = null, + _this = this; + + // climb prototype chain to find method not equal to callee's method + while (_this.constructor.superclass) { + var superClassMethod = _this.constructor.superclass.prototype[methodName]; + if (_this[methodName] !== superClassMethod) { + parentMethod = superClassMethod; + break; + } + // eslint-disable-next-line + _this = _this.constructor.superclass.prototype; + } + + if (!parentMethod) { + return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this); + } + + return (arguments.length > 1) + ? parentMethod.apply(this, slice.call(arguments, 1)) + : parentMethod.call(this); + } + + /** + * Helper for creation of "classes". + * @memberOf fabric.util + * @param {Function} [parent] optional "Class" to inherit from + * @param {Object} [properties] Properties shared by all instances of this class + * (be careful modifying objects defined here as this would affect all instances) + */ + function createClass() { + var parent = null, + properties = slice.call(arguments, 0); + + if (typeof properties[0] === 'function') { + parent = properties.shift(); + } + function klass() { + this.initialize.apply(this, arguments); + } + + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + Subclass.prototype = parent.prototype; + klass.prototype = new Subclass(); + parent.subclasses.push(klass); + } + for (var i = 0, length = properties.length; i < length; i++) { + addMethods(klass, properties[i], parent); + } + if (!klass.prototype.initialize) { + klass.prototype.initialize = emptyFunction; + } + klass.prototype.constructor = klass; + klass.prototype.callSuper = callSuper; + return klass; + } + + fabric.util.createClass = createClass; +})(); +(function () { + // since ie11 can use addEventListener but they do not support options, i need to check + var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent, + touchEvents = ['touchstart', 'touchmove', 'touchend']; + /** + * Adds an event listener to an element + * @function + * @memberOf fabric.util + * @param {HTMLElement} element + * @param {String} eventName + * @param {Function} handler + */ + fabric.util.addListener = function(element, eventName, handler, options) { + element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options); + }; + + /** + * Removes an event listener from an element + * @function + * @memberOf fabric.util + * @param {HTMLElement} element + * @param {String} eventName + * @param {Function} handler + */ + fabric.util.removeListener = function(element, eventName, handler, options) { + element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options); + }; + + function getTouchInfo(event) { + var touchProp = event.changedTouches; + if (touchProp && touchProp[0]) { + return touchProp[0]; + } + return event; + } + + fabric.util.getPointer = function(event) { + var element = event.target, + scroll = fabric.util.getScrollLeftTop(element), + _evt = getTouchInfo(event); + return { + x: _evt.clientX + scroll.left, + y: _evt.clientY + scroll.top + }; + }; + + fabric.util.isTouchEvent = function(event) { + return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch'; + }; +})(); +(function () { + + /** + * Cross-browser wrapper for setting element's style + * @memberOf fabric.util + * @param {HTMLElement} element + * @param {Object} styles + * @return {HTMLElement} Element that was passed as a first argument + */ + function setStyle(element, styles) { + var elementStyle = element.style; + if (!elementStyle) { + return element; + } + if (typeof styles === 'string') { + element.style.cssText += ';' + styles; + return styles.indexOf('opacity') > -1 + ? setOpacity(element, styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) + : element; + } + for (var property in styles) { + if (property === 'opacity') { + setOpacity(element, styles[property]); + } + else { + var normalizedProperty = (property === 'float' || property === 'cssFloat') + ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat') + : property; + elementStyle[normalizedProperty] = styles[property]; + } + } + return element; + } + + var parseEl = fabric.document.createElement('div'), + supportsOpacity = typeof parseEl.style.opacity === 'string', + supportsFilters = typeof parseEl.style.filter === 'string', + reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/, + + /** @ignore */ + setOpacity = function (element) { return element; }; + + if (supportsOpacity) { + /** @ignore */ + setOpacity = function(element, value) { + element.style.opacity = value; + return element; + }; + } + else if (supportsFilters) { + /** @ignore */ + setOpacity = function(element, value) { + var es = element.style; + if (element.currentStyle && !element.currentStyle.hasLayout) { + es.zoom = 1; + } + if (reOpacity.test(es.filter)) { + value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')'); + es.filter = es.filter.replace(reOpacity, value); + } + else { + es.filter += ' alpha(opacity=' + (value * 100) + ')'; + } + return element; + }; + } + + fabric.util.setStyle = setStyle; + +})(); +(function() { + + var _slice = Array.prototype.slice; + + /** + * Takes id and returns an element with that id (if one exists in a document) + * @memberOf fabric.util + * @param {String|HTMLElement} id + * @return {HTMLElement|null} + */ + function getById(id) { + return typeof id === 'string' ? fabric.document.getElementById(id) : id; + } + + var sliceCanConvertNodelists, + /** + * Converts an array-like object (e.g. arguments or NodeList) to an array + * @memberOf fabric.util + * @param {Object} arrayLike + * @return {Array} + */ + toArray = function(arrayLike) { + return _slice.call(arrayLike, 0); + }; + + try { + sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array; + } + catch (err) { } + + if (!sliceCanConvertNodelists) { + toArray = function(arrayLike) { + var arr = new Array(arrayLike.length), i = arrayLike.length; + while (i--) { + arr[i] = arrayLike[i]; + } + return arr; + }; + } + + /** + * Creates specified element with specified attributes + * @memberOf fabric.util + * @param {String} tagName Type of an element to create + * @param {Object} [attributes] Attributes to set on an element + * @return {HTMLElement} Newly created element + */ + function makeElement(tagName, attributes) { + var el = fabric.document.createElement(tagName); + for (var prop in attributes) { + if (prop === 'class') { + el.className = attributes[prop]; + } + else if (prop === 'for') { + el.htmlFor = attributes[prop]; + } + else { + el.setAttribute(prop, attributes[prop]); + } + } + return el; + } + + /** + * Adds class to an element + * @memberOf fabric.util + * @param {HTMLElement} element Element to add class to + * @param {String} className Class to add to an element + */ + function addClass(element, className) { + if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) { + element.className += (element.className ? ' ' : '') + className; + } + } + + /** + * Wraps element with another element + * @memberOf fabric.util + * @param {HTMLElement} element Element to wrap + * @param {HTMLElement|String} wrapper Element to wrap with + * @param {Object} [attributes] Attributes to set on a wrapper + * @return {HTMLElement} wrapper + */ + function wrapElement(element, wrapper, attributes) { + if (typeof wrapper === 'string') { + wrapper = makeElement(wrapper, attributes); + } + if (element.parentNode) { + element.parentNode.replaceChild(wrapper, element); + } + wrapper.appendChild(element); + return wrapper; + } + + /** + * Returns element scroll offsets + * @memberOf fabric.util + * @param {HTMLElement} element Element to operate on + * @return {Object} Object with left/top values + */ + function getScrollLeftTop(element) { + + var left = 0, + top = 0, + docElement = fabric.document.documentElement, + body = fabric.document.body || { + scrollLeft: 0, scrollTop: 0 + }; + + // While loop checks (and then sets element to) .parentNode OR .host + // to account for ShadowDOM. We still want to traverse up out of ShadowDOM, + // but the .parentNode of a root ShadowDOM node will always be null, instead + // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938 + while (element && (element.parentNode || element.host)) { + + // Set element to element parent, or 'host' in case of ShadowDOM + element = element.parentNode || element.host; + + if (element === fabric.document) { + left = body.scrollLeft || docElement.scrollLeft || 0; + top = body.scrollTop || docElement.scrollTop || 0; + } + else { + left += element.scrollLeft || 0; + top += element.scrollTop || 0; + } + + if (element.nodeType === 1 && element.style.position === 'fixed') { + break; + } + } + + return { left: left, top: top }; + } + + /** + * Returns offset for a given element + * @function + * @memberOf fabric.util + * @param {HTMLElement} element Element to get offset for + * @return {Object} Object with "left" and "top" properties + */ + function getElementOffset(element) { + var docElem, + doc = element && element.ownerDocument, + box = { left: 0, top: 0 }, + offset = { left: 0, top: 0 }, + scrollLeftTop, + offsetAttributes = { + borderLeftWidth: 'left', + borderTopWidth: 'top', + paddingLeft: 'left', + paddingTop: 'top' + }; + + if (!doc) { + return offset; + } + + for (var attr in offsetAttributes) { + offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0; + } + + docElem = doc.documentElement; + if ( typeof element.getBoundingClientRect !== 'undefined' ) { + box = element.getBoundingClientRect(); + } + + scrollLeftTop = getScrollLeftTop(element); + + return { + left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left, + top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top + }; + } + + /** + * Returns style attribute value of a given element + * @memberOf fabric.util + * @param {HTMLElement} element Element to get style attribute for + * @param {String} attr Style attribute to get for element + * @return {String} Style attribute value of the given element. + */ + var getElementStyle; + if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) { + getElementStyle = function(element, attr) { + var style = fabric.document.defaultView.getComputedStyle(element, null); + return style ? style[attr] : undefined; + }; + } + else { + getElementStyle = function(element, attr) { + var value = element.style[attr]; + if (!value && element.currentStyle) { + value = element.currentStyle[attr]; + } + return value; + }; + } + + (function () { + var style = fabric.document.documentElement.style, + selectProp = 'userSelect' in style + ? 'userSelect' + : 'MozUserSelect' in style + ? 'MozUserSelect' + : 'WebkitUserSelect' in style + ? 'WebkitUserSelect' + : 'KhtmlUserSelect' in style + ? 'KhtmlUserSelect' + : ''; + + /** + * Makes element unselectable + * @memberOf fabric.util + * @param {HTMLElement} element Element to make unselectable + * @return {HTMLElement} Element that was passed in + */ + function makeElementUnselectable(element) { + if (typeof element.onselectstart !== 'undefined') { + element.onselectstart = fabric.util.falseFunction; + } + if (selectProp) { + element.style[selectProp] = 'none'; + } + else if (typeof element.unselectable === 'string') { + element.unselectable = 'on'; + } + return element; + } + + /** + * Makes element selectable + * @memberOf fabric.util + * @param {HTMLElement} element Element to make selectable + * @return {HTMLElement} Element that was passed in + */ + function makeElementSelectable(element) { + if (typeof element.onselectstart !== 'undefined') { + element.onselectstart = null; + } + if (selectProp) { + element.style[selectProp] = ''; + } + else if (typeof element.unselectable === 'string') { + element.unselectable = ''; + } + return element; + } + + fabric.util.makeElementUnselectable = makeElementUnselectable; + fabric.util.makeElementSelectable = makeElementSelectable; + })(); + + function getNodeCanvas(element) { + var impl = fabric.jsdomImplForWrapper(element); + return impl._canvas || impl._image; + }; + + function cleanUpJsdomNode(element) { + if (!fabric.isLikelyNode) { + return; + } + var impl = fabric.jsdomImplForWrapper(element); + if (impl) { + impl._image = null; + impl._canvas = null; + // unsure if necessary + impl._currentSrc = null; + impl._attributes = null; + impl._classList = null; + } + } + + function setImageSmoothing(ctx, value) { + ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled + || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled; + ctx.imageSmoothingEnabled = value; + } + + /** + * setImageSmoothing sets the context imageSmoothingEnabled property. + * Used by canvas and by ImageObject. + * @memberOf fabric.util + * @since 4.0.0 + * @param {HTMLRenderingContext2D} ctx to set on + * @param {Boolean} value true or false + */ + fabric.util.setImageSmoothing = setImageSmoothing; + fabric.util.getById = getById; + fabric.util.toArray = toArray; + fabric.util.addClass = addClass; + fabric.util.makeElement = makeElement; + fabric.util.wrapElement = wrapElement; + fabric.util.getScrollLeftTop = getScrollLeftTop; + fabric.util.getElementOffset = getElementOffset; + fabric.util.getNodeCanvas = getNodeCanvas; + fabric.util.cleanUpJsdomNode = cleanUpJsdomNode; + +})(); +(function() { + + function addParamToUrl(url, param) { + return url + (/\?/.test(url) ? '&' : '?') + param; + } + + function emptyFn() { } + + /** + * Cross-browser abstraction for sending XMLHttpRequest + * @memberOf fabric.util + * @param {String} url URL to send XMLHttpRequest to + * @param {Object} [options] Options object + * @param {String} [options.method="GET"] + * @param {String} [options.parameters] parameters to append to url in GET or in body + * @param {String} [options.body] body to send with POST or PUT request + * @param {Function} options.onComplete Callback to invoke when request is completed + * @return {XMLHttpRequest} request + */ + function request(url, options) { + options || (options = { }); + + var method = options.method ? options.method.toUpperCase() : 'GET', + onComplete = options.onComplete || function() { }, + xhr = new fabric.window.XMLHttpRequest(), + body = options.body || options.parameters; + + /** @ignore */ + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + onComplete(xhr); + xhr.onreadystatechange = emptyFn; + } + }; + + if (method === 'GET') { + body = null; + if (typeof options.parameters === 'string') { + url = addParamToUrl(url, options.parameters); + } + } + + xhr.open(method, url, true); + + if (method === 'POST' || method === 'PUT') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + } + + xhr.send(body); + return xhr; + } + + fabric.util.request = request; +})(); +/** + * Wrapper around `console.log` (when available) + * @param {*} [values] Values to log + */ +fabric.log = console.log; + +/** + * Wrapper around `console.warn` (when available) + * @param {*} [values] Values to log as a warning + */ +fabric.warn = console.warn; +(function () { + + var extend = fabric.util.object.extend, + clone = fabric.util.object.clone; + + /** + * @typedef {Object} AnimationOptions + * Animation of a value or list of values. + * When using lists, think of something like this: + * fabric.util.animate({ + * startValue: [1, 2, 3], + * endValue: [2, 4, 6], + * onChange: function([a, b, c]) { + * canvas.zoomToPoint({x: b, y: c}, a) + * canvas.renderAll() + * } + * }); + * @example + * @property {Function} [onChange] Callback; invoked on every value change + * @property {Function} [onComplete] Callback; invoked when value change is completed + * @example + * // Note: startValue, endValue, and byValue must match the type + * var animationOptions = { startValue: 0, endValue: 1, byValue: 0.25 } + * var animationOptions = { startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] } + * @property {number | number[]} [startValue=0] Starting value + * @property {number | number[]} [endValue=100] Ending value + * @property {number | number[]} [byValue=100] Value to modify the property by + * @property {Function} [easing] Easing function + * @property {Number} [duration=500] Duration of change (in ms) + * @property {Function} [abort] Additional function with logic. If returns true, animation aborts. + * + * @typedef {() => void} CancelFunction + * + * @typedef {Object} AnimationCurrentState + * @property {number | number[]} currentValue value in range [`startValue`, `endValue`] + * @property {number} completionRate value in range [0, 1] + * @property {number} durationRate value in range [0, 1] + * + * @typedef {(AnimationOptions & AnimationCurrentState & { cancel: CancelFunction }} AnimationContext + */ + + /** + * Array holding all running animations + * @memberof fabric + * @type {AnimationContext[]} + */ + var RUNNING_ANIMATIONS = []; + fabric.util.object.extend(RUNNING_ANIMATIONS, { + + /** + * cancel all running animations at the next requestAnimFrame + * @returns {AnimationContext[]} + */ + cancelAll: function () { + var animations = this.splice(0); + animations.forEach(function (animation) { + animation.cancel(); + }); + return animations; + }, + + /** + * cancel all running animations attached to canvas at the next requestAnimFrame + * @param {fabric.Canvas} canvas + * @returns {AnimationContext[]} + */ + cancelByCanvas: function (canvas) { + if (!canvas) { + return []; + } + var cancelled = this.filter(function (animation) { + return typeof animation.target === 'object' && animation.target.canvas === canvas; + }); + cancelled.forEach(function (animation) { + animation.cancel(); + }); + return cancelled; + }, + + /** + * cancel all running animations for target at the next requestAnimFrame + * @param {*} target + * @returns {AnimationContext[]} + */ + cancelByTarget: function (target) { + var cancelled = this.findAnimationsByTarget(target); + cancelled.forEach(function (animation) { + animation.cancel(); + }); + return cancelled; + }, + + /** + * + * @param {CancelFunction} cancelFunc the function returned by animate + * @returns {number} + */ + findAnimationIndex: function (cancelFunc) { + return this.indexOf(this.findAnimation(cancelFunc)); + }, + + /** + * + * @param {CancelFunction} cancelFunc the function returned by animate + * @returns {AnimationContext | undefined} animation's options object + */ + findAnimation: function (cancelFunc) { + return this.find(function (animation) { + return animation.cancel === cancelFunc; + }); + }, + + /** + * + * @param {*} target the object that is assigned to the target property of the animation context + * @returns {AnimationContext[]} array of animation options object associated with target + */ + findAnimationsByTarget: function (target) { + if (!target) { + return []; + } + return this.filter(function (animation) { + return animation.target === target; + }); + } + }); + + function noop() { + return false; + } + + function defaultEasing(t, b, c, d) { + return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; + } + + /** + * Changes value from one to another within certain period of time, invoking callbacks as value is being changed. + * @memberOf fabric.util + * @param {AnimationOptions} [options] Animation options + * @example + * // Note: startValue, endValue, and byValue must match the type + * fabric.util.animate({ startValue: 0, endValue: 1, byValue: 0.25 }) + * fabric.util.animate({ startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] }) + * @returns {CancelFunction} cancel function + */ + function animate(options) { + options || (options = {}); + var cancel = false, + context, + removeFromRegistry = function () { + var index = fabric.runningAnimations.indexOf(context); + return index > -1 && fabric.runningAnimations.splice(index, 1)[0]; + }; + + context = extend(clone(options), { + cancel: function () { + cancel = true; + return removeFromRegistry(); + }, + currentValue: 'startValue' in options ? options.startValue : 0, + completionRate: 0, + durationRate: 0 + }); + fabric.runningAnimations.push(context); + + requestAnimFrame(function(timestamp) { + var start = timestamp || +new Date(), + duration = options.duration || 500, + finish = start + duration, time, + onChange = options.onChange || noop, + abort = options.abort || noop, + onComplete = options.onComplete || noop, + easing = options.easing || defaultEasing, + isMany = 'startValue' in options ? options.startValue.length > 0 : false, + startValue = 'startValue' in options ? options.startValue : 0, + endValue = 'endValue' in options ? options.endValue : 100, + byValue = options.byValue || (isMany ? startValue.map(function(value, i) { + return endValue[i] - startValue[i]; + }) : endValue - startValue); + + options.onStart && options.onStart(); + + (function tick(ticktime) { + time = ticktime || +new Date(); + var currentTime = time > finish ? duration : (time - start), + timePerc = currentTime / duration, + current = isMany ? startValue.map(function(_value, i) { + return easing(currentTime, startValue[i], byValue[i], duration); + }) : easing(currentTime, startValue, byValue, duration), + valuePerc = isMany ? Math.abs((current[0] - startValue[0]) / byValue[0]) + : Math.abs((current - startValue) / byValue); + // update context + context.currentValue = isMany ? current.slice() : current; + context.completionRate = valuePerc; + context.durationRate = timePerc; + if (cancel) { + return; + } + if (abort(current, valuePerc, timePerc)) { + removeFromRegistry(); + return; + } + if (time > finish) { + // update context + context.currentValue = isMany ? endValue.slice() : endValue; + context.completionRate = 1; + context.durationRate = 1; + // execute callbacks + onChange(isMany ? endValue.slice() : endValue, 1, 1); + onComplete(endValue, 1, 1); + removeFromRegistry(); + return; + } + else { + onChange(current, valuePerc, timePerc); + requestAnimFrame(tick); + } + })(start); + }); + + return context.cancel; + } + + var _requestAnimFrame = fabric.window.requestAnimationFrame || + fabric.window.webkitRequestAnimationFrame || + fabric.window.mozRequestAnimationFrame || + fabric.window.oRequestAnimationFrame || + fabric.window.msRequestAnimationFrame || + function(callback) { + return fabric.window.setTimeout(callback, 1000 / 60); + }; + + var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout; + + /** + * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method + * @memberOf fabric.util + * @param {Function} callback Callback to invoke + * @param {DOMElement} element optional Element to associate with animation + */ + function requestAnimFrame() { + return _requestAnimFrame.apply(fabric.window, arguments); + } + + function cancelAnimFrame() { + return _cancelAnimFrame.apply(fabric.window, arguments); + } + + fabric.util.animate = animate; + fabric.util.requestAnimFrame = requestAnimFrame; + fabric.util.cancelAnimFrame = cancelAnimFrame; + fabric.runningAnimations = RUNNING_ANIMATIONS; +})(); +(function() { + // Calculate an in-between color. Returns a "rgba()" string. + // Credit: Edwin Martin + // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js + function calculateColor(begin, end, pos) { + var color = 'rgba(' + + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ',' + + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ',' + + parseInt((begin[2] + pos * (end[2] - begin[2])), 10); + + color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1); + color += ')'; + return color; + } + + /** + * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed. + * @memberOf fabric.util + * @param {String} fromColor The starting color in hex or rgb(a) format. + * @param {String} toColor The starting color in hex or rgb(a) format. + * @param {Number} [duration] Duration of change (in ms). + * @param {Object} [options] Animation options + * @param {Function} [options.onChange] Callback; invoked on every value change + * @param {Function} [options.onComplete] Callback; invoked when value change is completed + * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used. + * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called. + * @returns {Function} abort function + */ + function animateColor(fromColor, toColor, duration, options) { + var startColor = new fabric.Color(fromColor).getSource(), + endColor = new fabric.Color(toColor).getSource(), + originalOnComplete = options.onComplete, + originalOnChange = options.onChange; + options = options || {}; + + return fabric.util.animate(fabric.util.object.extend(options, { + duration: duration || 500, + startValue: startColor, + endValue: endColor, + byValue: endColor, + easing: function (currentTime, startValue, byValue, duration) { + var posValue = options.colorEasing + ? options.colorEasing(currentTime, duration) + : 1 - Math.cos(currentTime / duration * (Math.PI / 2)); + return calculateColor(startValue, byValue, posValue); + }, + // has to take in account for color restoring; + onComplete: function(current, valuePerc, timePerc) { + if (originalOnComplete) { + return originalOnComplete( + calculateColor(endColor, endColor, 0), + valuePerc, + timePerc + ); + } + }, + onChange: function(current, valuePerc, timePerc) { + if (originalOnChange) { + if (Array.isArray(current)) { + return originalOnChange( + calculateColor(current, current, 0), + valuePerc, + timePerc + ); + } + originalOnChange(current, valuePerc, timePerc); + } + } + })); + } + + fabric.util.animateColor = animateColor; + +})(); +(function() { + + function normalize(a, c, p, s) { + if (a < Math.abs(c)) { + a = c; + s = p / 4; + } + else { + //handle the 0/0 case: + if (c === 0 && a === 0) { + s = p / (2 * Math.PI) * Math.asin(1); + } + else { + s = p / (2 * Math.PI) * Math.asin(c / a); + } + } + return { a: a, c: c, p: p, s: s }; + } + + function elastic(opts, t, d) { + return opts.a * + Math.pow(2, 10 * (t -= 1)) * + Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p ); + } + + /** + * Cubic easing out + * @memberOf fabric.util.ease + */ + function easeOutCubic(t, b, c, d) { + return c * ((t = t / d - 1) * t * t + 1) + b; + } + + /** + * Cubic easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutCubic(t, b, c, d) { + t /= d / 2; + if (t < 1) { + return c / 2 * t * t * t + b; + } + return c / 2 * ((t -= 2) * t * t + 2) + b; + } + + /** + * Quartic easing in + * @memberOf fabric.util.ease + */ + function easeInQuart(t, b, c, d) { + return c * (t /= d) * t * t * t + b; + } + + /** + * Quartic easing out + * @memberOf fabric.util.ease + */ + function easeOutQuart(t, b, c, d) { + return -c * ((t = t / d - 1) * t * t * t - 1) + b; + } + + /** + * Quartic easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutQuart(t, b, c, d) { + t /= d / 2; + if (t < 1) { + return c / 2 * t * t * t * t + b; + } + return -c / 2 * ((t -= 2) * t * t * t - 2) + b; + } + + /** + * Quintic easing in + * @memberOf fabric.util.ease + */ + function easeInQuint(t, b, c, d) { + return c * (t /= d) * t * t * t * t + b; + } + + /** + * Quintic easing out + * @memberOf fabric.util.ease + */ + function easeOutQuint(t, b, c, d) { + return c * ((t = t / d - 1) * t * t * t * t + 1) + b; + } + + /** + * Quintic easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutQuint(t, b, c, d) { + t /= d / 2; + if (t < 1) { + return c / 2 * t * t * t * t * t + b; + } + return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; + } + + /** + * Sinusoidal easing in + * @memberOf fabric.util.ease + */ + function easeInSine(t, b, c, d) { + return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; + } + + /** + * Sinusoidal easing out + * @memberOf fabric.util.ease + */ + function easeOutSine(t, b, c, d) { + return c * Math.sin(t / d * (Math.PI / 2)) + b; + } + + /** + * Sinusoidal easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutSine(t, b, c, d) { + return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; + } + + /** + * Exponential easing in + * @memberOf fabric.util.ease + */ + function easeInExpo(t, b, c, d) { + return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; + } + + /** + * Exponential easing out + * @memberOf fabric.util.ease + */ + function easeOutExpo(t, b, c, d) { + return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; + } + + /** + * Exponential easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutExpo(t, b, c, d) { + if (t === 0) { + return b; + } + if (t === d) { + return b + c; + } + t /= d / 2; + if (t < 1) { + return c / 2 * Math.pow(2, 10 * (t - 1)) + b; + } + return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; + } + + /** + * Circular easing in + * @memberOf fabric.util.ease + */ + function easeInCirc(t, b, c, d) { + return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; + } + + /** + * Circular easing out + * @memberOf fabric.util.ease + */ + function easeOutCirc(t, b, c, d) { + return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; + } + + /** + * Circular easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutCirc(t, b, c, d) { + t /= d / 2; + if (t < 1) { + return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; + } + return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; + } + + /** + * Elastic easing in + * @memberOf fabric.util.ease + */ + function easeInElastic(t, b, c, d) { + var s = 1.70158, p = 0, a = c; + if (t === 0) { + return b; + } + t /= d; + if (t === 1) { + return b + c; + } + if (!p) { + p = d * 0.3; + } + var opts = normalize(a, c, p, s); + return -elastic(opts, t, d) + b; + } + + /** + * Elastic easing out + * @memberOf fabric.util.ease + */ + function easeOutElastic(t, b, c, d) { + var s = 1.70158, p = 0, a = c; + if (t === 0) { + return b; + } + t /= d; + if (t === 1) { + return b + c; + } + if (!p) { + p = d * 0.3; + } + var opts = normalize(a, c, p, s); + return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b; + } + + /** + * Elastic easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutElastic(t, b, c, d) { + var s = 1.70158, p = 0, a = c; + if (t === 0) { + return b; + } + t /= d / 2; + if (t === 2) { + return b + c; + } + if (!p) { + p = d * (0.3 * 1.5); + } + var opts = normalize(a, c, p, s); + if (t < 1) { + return -0.5 * elastic(opts, t, d) + b; + } + return opts.a * Math.pow(2, -10 * (t -= 1)) * + Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b; + } + + /** + * Backwards easing in + * @memberOf fabric.util.ease + */ + function easeInBack(t, b, c, d, s) { + if (s === undefined) { + s = 1.70158; + } + return c * (t /= d) * t * ((s + 1) * t - s) + b; + } + + /** + * Backwards easing out + * @memberOf fabric.util.ease + */ + function easeOutBack(t, b, c, d, s) { + if (s === undefined) { + s = 1.70158; + } + return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; + } + + /** + * Backwards easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutBack(t, b, c, d, s) { + if (s === undefined) { + s = 1.70158; + } + t /= d / 2; + if (t < 1) { + return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; + } + return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; + } + + /** + * Bouncing easing in + * @memberOf fabric.util.ease + */ + function easeInBounce(t, b, c, d) { + return c - easeOutBounce (d - t, 0, c, d) + b; + } + + /** + * Bouncing easing out + * @memberOf fabric.util.ease + */ + function easeOutBounce(t, b, c, d) { + if ((t /= d) < (1 / 2.75)) { + return c * (7.5625 * t * t) + b; + } + else if (t < (2 / 2.75)) { + return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b; + } + else if (t < (2.5 / 2.75)) { + return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b; + } + else { + return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b; + } + } + + /** + * Bouncing easing in and out + * @memberOf fabric.util.ease + */ + function easeInOutBounce(t, b, c, d) { + if (t < d / 2) { + return easeInBounce (t * 2, 0, c, d) * 0.5 + b; + } + return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b; + } + + /** + * Easing functions + * See Easing Equations by Robert Penner + * @namespace fabric.util.ease + */ + fabric.util.ease = { + + /** + * Quadratic easing in + * @memberOf fabric.util.ease + */ + easeInQuad: function(t, b, c, d) { + return c * (t /= d) * t + b; + }, + + /** + * Quadratic easing out + * @memberOf fabric.util.ease + */ + easeOutQuad: function(t, b, c, d) { + return -c * (t /= d) * (t - 2) + b; + }, + + /** + * Quadratic easing in and out + * @memberOf fabric.util.ease + */ + easeInOutQuad: function(t, b, c, d) { + t /= (d / 2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c / 2 * ((--t) * (t - 2) - 1) + b; + }, + + /** + * Cubic easing in + * @memberOf fabric.util.ease + */ + easeInCubic: function(t, b, c, d) { + return c * (t /= d) * t * t + b; + }, + + easeOutCubic: easeOutCubic, + easeInOutCubic: easeInOutCubic, + easeInQuart: easeInQuart, + easeOutQuart: easeOutQuart, + easeInOutQuart: easeInOutQuart, + easeInQuint: easeInQuint, + easeOutQuint: easeOutQuint, + easeInOutQuint: easeInOutQuint, + easeInSine: easeInSine, + easeOutSine: easeOutSine, + easeInOutSine: easeInOutSine, + easeInExpo: easeInExpo, + easeOutExpo: easeOutExpo, + easeInOutExpo: easeInOutExpo, + easeInCirc: easeInCirc, + easeOutCirc: easeOutCirc, + easeInOutCirc: easeInOutCirc, + easeInElastic: easeInElastic, + easeOutElastic: easeOutElastic, + easeInOutElastic: easeInOutElastic, + easeInBack: easeInBack, + easeOutBack: easeOutBack, + easeInOutBack: easeInOutBack, + easeInBounce: easeInBounce, + easeOutBounce: easeOutBounce, + easeInOutBounce: easeInOutBounce + }; + +})(); +(function(global) { + + 'use strict'; + + /** + * @name fabric + * @namespace + */ + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + clone = fabric.util.object.clone, + toFixed = fabric.util.toFixed, + parseUnit = fabric.util.parseUnit, + multiplyTransformMatrices = fabric.util.multiplyTransformMatrices, + + svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line', + 'image', 'text'], + svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'], + svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'], + svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'], + + attributesMap = { + cx: 'left', + x: 'left', + r: 'radius', + cy: 'top', + y: 'top', + display: 'visible', + visibility: 'visible', + transform: 'transformMatrix', + 'fill-opacity': 'fillOpacity', + 'fill-rule': 'fillRule', + 'font-family': 'fontFamily', + 'font-size': 'fontSize', + 'font-style': 'fontStyle', + 'font-weight': 'fontWeight', + 'letter-spacing': 'charSpacing', + 'paint-order': 'paintFirst', + 'stroke-dasharray': 'strokeDashArray', + 'stroke-dashoffset': 'strokeDashOffset', + 'stroke-linecap': 'strokeLineCap', + 'stroke-linejoin': 'strokeLineJoin', + 'stroke-miterlimit': 'strokeMiterLimit', + 'stroke-opacity': 'strokeOpacity', + 'stroke-width': 'strokeWidth', + 'text-decoration': 'textDecoration', + 'text-anchor': 'textAnchor', + opacity: 'opacity', + 'clip-path': 'clipPath', + 'clip-rule': 'clipRule', + 'vector-effect': 'strokeUniform', + 'image-rendering': 'imageSmoothing', + }, + + colorAttributes = { + stroke: 'strokeOpacity', + fill: 'fillOpacity' + }, + + fSize = 'font-size', cPath = 'clip-path'; + + fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames); + fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements); + fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors); + fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents); + + fabric.cssRules = { }; + fabric.gradientDefs = { }; + fabric.clipPaths = { }; + + function normalizeAttr(attr) { + // transform attribute names + if (attr in attributesMap) { + return attributesMap[attr]; + } + return attr; + } + + function normalizeValue(attr, value, parentAttributes, fontSize) { + var isArray = Array.isArray(value), parsed; + + if ((attr === 'fill' || attr === 'stroke') && value === 'none') { + value = ''; + } + else if (attr === 'strokeUniform') { + return (value === 'non-scaling-stroke'); + } + else if (attr === 'strokeDashArray') { + if (value === 'none') { + value = null; + } + else { + value = value.replace(/,/g, ' ').split(/\s+/).map(parseFloat); + } + } + else if (attr === 'transformMatrix') { + if (parentAttributes && parentAttributes.transformMatrix) { + value = multiplyTransformMatrices( + parentAttributes.transformMatrix, fabric.parseTransformAttribute(value)); + } + else { + value = fabric.parseTransformAttribute(value); + } + } + else if (attr === 'visible') { + value = value !== 'none' && value !== 'hidden'; + // display=none on parent element always takes precedence over child element + if (parentAttributes && parentAttributes.visible === false) { + value = false; + } + } + else if (attr === 'opacity') { + value = parseFloat(value); + if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') { + value *= parentAttributes.opacity; + } + } + else if (attr === 'textAnchor' /* text-anchor */) { + value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center'; + } + else if (attr === 'charSpacing') { + // parseUnit returns px and we convert it to em + parsed = parseUnit(value, fontSize) / fontSize * 1000; + } + else if (attr === 'paintFirst') { + var fillIndex = value.indexOf('fill'); + var strokeIndex = value.indexOf('stroke'); + var value = 'fill'; + if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) { + value = 'stroke'; + } + else if (fillIndex === -1 && strokeIndex > -1) { + value = 'stroke'; + } + } + else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') { + return value; + } + else if (attr === 'imageSmoothing') { + return (value === 'optimizeQuality'); + } + else { + parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize); + } + + return (!isArray && isNaN(parsed) ? value : parsed); + } + + /** + * @private + */ + function getSvgRegex(arr) { + return new RegExp('^(' + arr.join('|') + ')\\b', 'i'); + } + + /** + * @private + * @param {Object} attributes Array of attributes to parse + */ + function _setStrokeFillOpacity(attributes) { + for (var attr in colorAttributes) { + + if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') { + continue; + } + + if (typeof attributes[attr] === 'undefined') { + if (!fabric.Object.prototype[attr]) { + continue; + } + attributes[attr] = fabric.Object.prototype[attr]; + } + + if (attributes[attr].indexOf('url(') === 0) { + continue; + } + + var color = new fabric.Color(attributes[attr]); + attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba(); + } + return attributes; + } + + /** + * @private + */ + function _getMultipleNodes(doc, nodeNames) { + var nodeName, nodeArray = [], nodeList, i, len; + for (i = 0, len = nodeNames.length; i < len; i++) { + nodeName = nodeNames[i]; + nodeList = doc.getElementsByTagName(nodeName); + nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList)); + } + return nodeArray; + } + + /** + * Parses "transform" attribute, returning an array of values + * @static + * @function + * @memberOf fabric + * @param {String} attributeValue String containing attribute value + * @return {Array} Array of 6 elements representing transformation matrix + */ + fabric.parseTransformAttribute = (function() { + function rotateMatrix(matrix, args) { + var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]), + x = 0, y = 0; + if (args.length === 3) { + x = args[1]; + y = args[2]; + } + + matrix[0] = cos; + matrix[1] = sin; + matrix[2] = -sin; + matrix[3] = cos; + matrix[4] = x - (cos * x - sin * y); + matrix[5] = y - (sin * x + cos * y); + } + + function scaleMatrix(matrix, args) { + var multiplierX = args[0], + multiplierY = (args.length === 2) ? args[1] : args[0]; + + matrix[0] = multiplierX; + matrix[3] = multiplierY; + } + + function skewMatrix(matrix, args, pos) { + matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0])); + } + + function translateMatrix(matrix, args) { + matrix[4] = args[0]; + if (args.length === 2) { + matrix[5] = args[1]; + } + } + + // identity matrix + var iMatrix = fabric.iMatrix, + + // == begin transform regexp + number = fabric.reNum, + + commaWsp = fabric.commaWsp, + + skewX = '(?:(skewX)\\s*\\(\\s*(' + number + ')\\s*\\))', + + skewY = '(?:(skewY)\\s*\\(\\s*(' + number + ')\\s*\\))', + + rotate = '(?:(rotate)\\s*\\(\\s*(' + number + ')(?:' + + commaWsp + '(' + number + ')' + + commaWsp + '(' + number + '))?\\s*\\))', + + scale = '(?:(scale)\\s*\\(\\s*(' + number + ')(?:' + + commaWsp + '(' + number + '))?\\s*\\))', + + translate = '(?:(translate)\\s*\\(\\s*(' + number + ')(?:' + + commaWsp + '(' + number + '))?\\s*\\))', + + matrix = '(?:(matrix)\\s*\\(\\s*' + + '(' + number + ')' + commaWsp + + '(' + number + ')' + commaWsp + + '(' + number + ')' + commaWsp + + '(' + number + ')' + commaWsp + + '(' + number + ')' + commaWsp + + '(' + number + ')' + + '\\s*\\))', + + transform = '(?:' + + matrix + '|' + + translate + '|' + + scale + '|' + + rotate + '|' + + skewX + '|' + + skewY + + ')', + + transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')', + + transformList = '^\\s*(?:' + transforms + '?)\\s*$', + + // http://www.w3.org/TR/SVG/coords.html#TransformAttribute + reTransformList = new RegExp(transformList), + // == end transform regexp + + reTransform = new RegExp(transform, 'g'); + + return function(attributeValue) { + + // start with identity matrix + var matrix = iMatrix.concat(), + matrices = []; + + // return if no argument was given or + // an argument does not match transform attribute regexp + if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) { + return matrix; + } + + attributeValue.replace(reTransform, function(match) { + + var m = new RegExp(transform).exec(match).filter(function (match) { + // match !== '' && match != null + return (!!match); + }), + operation = m[1], + args = m.slice(2).map(parseFloat); + + switch (operation) { + case 'translate': + translateMatrix(matrix, args); + break; + case 'rotate': + args[0] = fabric.util.degreesToRadians(args[0]); + rotateMatrix(matrix, args); + break; + case 'scale': + scaleMatrix(matrix, args); + break; + case 'skewX': + skewMatrix(matrix, args, 2); + break; + case 'skewY': + skewMatrix(matrix, args, 1); + break; + case 'matrix': + matrix = args; + break; + } + + // snapshot current matrix into matrices array + matrices.push(matrix.concat()); + // reset + matrix = iMatrix.concat(); + }); + + var combinedMatrix = matrices[0]; + while (matrices.length > 1) { + matrices.shift(); + combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]); + } + return combinedMatrix; + }; + })(); + + /** + * @private + */ + function parseStyleString(style, oStyle) { + var attr, value; + style.replace(/;\s*$/, '').split(';').forEach(function (chunk) { + var pair = chunk.split(':'); + + attr = pair[0].trim().toLowerCase(); + value = pair[1].trim(); + + oStyle[attr] = value; + }); + } + + /** + * @private + */ + function parseStyleObject(style, oStyle) { + var attr, value; + for (var prop in style) { + if (typeof style[prop] === 'undefined') { + continue; + } + + attr = prop.toLowerCase(); + value = style[prop]; + + oStyle[attr] = value; + } + } + + /** + * @private + */ + function getGlobalStylesForElement(element, svgUid) { + var styles = { }; + for (var rule in fabric.cssRules[svgUid]) { + if (elementMatchesRule(element, rule.split(' '))) { + for (var property in fabric.cssRules[svgUid][rule]) { + styles[property] = fabric.cssRules[svgUid][rule][property]; + } + } + } + return styles; + } + + /** + * @private + */ + function elementMatchesRule(element, selectors) { + var firstMatching, parentMatching = true; + //start from rightmost selector. + firstMatching = selectorMatches(element, selectors.pop()); + if (firstMatching && selectors.length) { + parentMatching = doesSomeParentMatch(element, selectors); + } + return firstMatching && parentMatching && (selectors.length === 0); + } + + function doesSomeParentMatch(element, selectors) { + var selector, parentMatching = true; + while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) { + if (parentMatching) { + selector = selectors.pop(); + } + element = element.parentNode; + parentMatching = selectorMatches(element, selector); + } + return selectors.length === 0; + } + + /** + * @private + */ + function selectorMatches(element, selector) { + var nodeName = element.nodeName, + classNames = element.getAttribute('class'), + id = element.getAttribute('id'), matcher, i; + // i check if a selector matches slicing away part from it. + // if i get empty string i should match + matcher = new RegExp('^' + nodeName, 'i'); + selector = selector.replace(matcher, ''); + if (id && selector.length) { + matcher = new RegExp('#' + id + '(?![a-zA-Z\\-]+)', 'i'); + selector = selector.replace(matcher, ''); + } + if (classNames && selector.length) { + classNames = classNames.split(' '); + for (i = classNames.length; i--;) { + matcher = new RegExp('\\.' + classNames[i] + '(?![a-zA-Z\\-]+)', 'i'); + selector = selector.replace(matcher, ''); + } + } + return selector.length === 0; + } + + /** + * @private + * to support IE8 missing getElementById on SVGdocument and on node xmlDOM + */ + function elementById(doc, id) { + var el; + doc.getElementById && (el = doc.getElementById(id)); + if (el) { + return el; + } + var node, i, len, nodelist = doc.getElementsByTagName('*'); + for (i = 0, len = nodelist.length; i < len; i++) { + node = nodelist[i]; + if (id === node.getAttribute('id')) { + return node; + } + } + } + + /** + * @private + */ + function parseUseDirectives(doc) { + var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0; + while (nodelist.length && i < nodelist.length) { + var el = nodelist[i], + xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href'); + + if (xlinkAttribute === null) { + return; + } + + var xlink = xlinkAttribute.slice(1), + x = el.getAttribute('x') || 0, + y = el.getAttribute('y') || 0, + el2 = elementById(doc, xlink).cloneNode(true), + currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')', + parentNode, + oldLength = nodelist.length, attr, + j, + attrs, + len, + namespace = fabric.svgNS; + + applyViewboxTransform(el2); + if (/^svg$/i.test(el2.nodeName)) { + var el3 = el2.ownerDocument.createElementNS(namespace, 'g'); + for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) { + attr = attrs.item(j); + el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue); + } + // el2.firstChild != null + while (el2.firstChild) { + el3.appendChild(el2.firstChild); + } + el2 = el3; + } + + for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) { + attr = attrs.item(j); + if (attr.nodeName === 'x' || attr.nodeName === 'y' || + attr.nodeName === 'xlink:href' || attr.nodeName === 'href') { + continue; + } + + if (attr.nodeName === 'transform') { + currentTrans = attr.nodeValue + ' ' + currentTrans; + } + else { + el2.setAttribute(attr.nodeName, attr.nodeValue); + } + } + + el2.setAttribute('transform', currentTrans); + el2.setAttribute('instantiated_by_use', '1'); + el2.removeAttribute('id'); + parentNode = el.parentNode; + parentNode.replaceChild(el2, el); + // some browsers do not shorten nodelist after replaceChild (IE8) + if (nodelist.length === oldLength) { + i++; + } + } + } + + // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute + // matches, e.g.: +14.56e-12, etc. + var reViewBoxAttrValue = new RegExp( + '^' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*,?' + + '\\s*(' + fabric.reNum + '+)\\s*' + + '$' + ); + + /** + * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements + */ + function applyViewboxTransform(element) { + if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) { + return {}; + } + var viewBoxAttr = element.getAttribute('viewBox'), + scaleX = 1, + scaleY = 1, + minX = 0, + minY = 0, + viewBoxWidth, viewBoxHeight, matrix, el, + widthAttr = element.getAttribute('width'), + heightAttr = element.getAttribute('height'), + x = element.getAttribute('x') || 0, + y = element.getAttribute('y') || 0, + preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '', + missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))), + missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'), + toBeParsed = missingViewBox && missingDimAttr, + parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0; + + parsedDim.width = 0; + parsedDim.height = 0; + parsedDim.toBeParsed = toBeParsed; + + if (missingViewBox) { + if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) { + translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') '; + matrix = (element.getAttribute('transform') || '') + translateMatrix; + element.setAttribute('transform', matrix); + element.removeAttribute('x'); + element.removeAttribute('y'); + } + } + + if (toBeParsed) { + return parsedDim; + } + + if (missingViewBox) { + parsedDim.width = parseUnit(widthAttr); + parsedDim.height = parseUnit(heightAttr); + // set a transform for elements that have x y and are inner(only) SVGs + return parsedDim; + } + minX = -parseFloat(viewBoxAttr[1]); + minY = -parseFloat(viewBoxAttr[2]); + viewBoxWidth = parseFloat(viewBoxAttr[3]); + viewBoxHeight = parseFloat(viewBoxAttr[4]); + parsedDim.minX = minX; + parsedDim.minY = minY; + parsedDim.viewBoxWidth = viewBoxWidth; + parsedDim.viewBoxHeight = viewBoxHeight; + if (!missingDimAttr) { + parsedDim.width = parseUnit(widthAttr); + parsedDim.height = parseUnit(heightAttr); + scaleX = parsedDim.width / viewBoxWidth; + scaleY = parsedDim.height / viewBoxHeight; + } + else { + parsedDim.width = viewBoxWidth; + parsedDim.height = viewBoxHeight; + } + + // default is to preserve aspect ratio + preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio); + if (preserveAspectRatio.alignX !== 'none') { + //translate all container for the effect of Mid, Min, Max + if (preserveAspectRatio.meetOrSlice === 'meet') { + scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX); + // calculate additional translation to move the viewbox + } + if (preserveAspectRatio.meetOrSlice === 'slice') { + scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY); + // calculate additional translation to move the viewbox + } + widthDiff = parsedDim.width - viewBoxWidth * scaleX; + heightDiff = parsedDim.height - viewBoxHeight * scaleX; + if (preserveAspectRatio.alignX === 'Mid') { + widthDiff /= 2; + } + if (preserveAspectRatio.alignY === 'Mid') { + heightDiff /= 2; + } + if (preserveAspectRatio.alignX === 'Min') { + widthDiff = 0; + } + if (preserveAspectRatio.alignY === 'Min') { + heightDiff = 0; + } + } + + if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) { + return parsedDim; + } + if ((x || y) && element.parentNode.nodeName !== '#document') { + translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') '; + } + + matrix = translateMatrix + ' matrix(' + scaleX + + ' 0' + + ' 0 ' + + scaleY + ' ' + + (minX * scaleX + widthDiff) + ' ' + + (minY * scaleY + heightDiff) + ') '; + // seems unused. + // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix); + if (element.nodeName === 'svg') { + el = element.ownerDocument.createElementNS(fabric.svgNS, 'g'); + // element.firstChild != null + while (element.firstChild) { + el.appendChild(element.firstChild); + } + element.appendChild(el); + } + else { + el = element; + el.removeAttribute('x'); + el.removeAttribute('y'); + matrix = el.getAttribute('transform') + matrix; + } + el.setAttribute('transform', matrix); + return parsedDim; + } + + function hasAncestorWithNodeName(element, nodeName) { + while (element && (element = element.parentNode)) { + if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', '')) + && !element.getAttribute('instantiated_by_use')) { + return true; + } + } + return false; + } + + /** + * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @param {Function} callback Callback to call when parsing is finished; + * It's being passed an array of elements (parsed from a document). + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + * @param {Object} [parsingOptions] options for parsing document + * @param {String} [parsingOptions.crossOrigin] crossOrigin settings + */ + fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) { + if (!doc) { + return; + } + + parseUseDirectives(doc); + + var svgUid = fabric.Object.__uid++, i, len, + options = applyViewboxTransform(doc), + descendants = fabric.util.toArray(doc.getElementsByTagName('*')); + options.crossOrigin = parsingOptions && parsingOptions.crossOrigin; + options.svgUid = svgUid; + + if (descendants.length === 0 && fabric.isLikelyNode) { + // we're likely in node, where "o3-xml" library fails to gEBTN("*") + // https://github.com/ajaxorg/node-o3-xml/issues/21 + descendants = doc.selectNodes('//*[name(.)!="svg"]'); + var arr = []; + for (i = 0, len = descendants.length; i < len; i++) { + arr[i] = descendants[i]; + } + descendants = arr; + } + + var elements = descendants.filter(function(el) { + applyViewboxTransform(el); + return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) && + !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement + }); + if (!elements || (elements && !elements.length)) { + callback && callback([], {}); + return; + } + var clipPaths = { }; + descendants.filter(function(el) { + return el.nodeName.replace('svg:', '') === 'clipPath'; + }).forEach(function(el) { + var id = el.getAttribute('id'); + clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) { + return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')); + }); + }); + fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); + fabric.cssRules[svgUid] = fabric.getCSSRules(doc); + fabric.clipPaths[svgUid] = clipPaths; + // Precedence of rules: style > class > attribute + fabric.parseElements(elements, function(instances, elements) { + if (callback) { + callback(instances, options, elements, descendants); + delete fabric.gradientDefs[svgUid]; + delete fabric.cssRules[svgUid]; + delete fabric.clipPaths[svgUid]; + } + }, clone(options), reviver, parsingOptions); + }; + + function recursivelyParseGradientsXlink(doc, gradient) { + var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'], + xlinkAttr = 'xlink:href', + xLink = gradient.getAttribute(xlinkAttr).slice(1), + referencedGradient = elementById(doc, xLink); + if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) { + recursivelyParseGradientsXlink(doc, referencedGradient); + } + gradientsAttrs.forEach(function(attr) { + if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) { + gradient.setAttribute(attr, referencedGradient.getAttribute(attr)); + } + }); + if (!gradient.children.length) { + var referenceClone = referencedGradient.cloneNode(true); + while (referenceClone.firstChild) { + gradient.appendChild(referenceClone.firstChild); + } + } + gradient.removeAttribute(xlinkAttr); + } + + var reFontDeclaration = new RegExp( + '(normal|italic)?\\s*(normal|small-caps)?\\s*' + + '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*(' + + fabric.reNum + + '(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|' + fabric.reNum + '))?\\s+(.*)'); + + extend(fabric, { + /** + * Parses a short font declaration, building adding its properties to a style object + * @static + * @function + * @memberOf fabric + * @param {String} value font declaration + * @param {Object} oStyle definition + */ + parseFontDeclaration: function(value, oStyle) { + var match = value.match(reFontDeclaration); + + if (!match) { + return; + } + var fontStyle = match[1], + // font variant is not used + // fontVariant = match[2], + fontWeight = match[3], + fontSize = match[4], + lineHeight = match[5], + fontFamily = match[6]; + + if (fontStyle) { + oStyle.fontStyle = fontStyle; + } + if (fontWeight) { + oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight); + } + if (fontSize) { + oStyle.fontSize = parseUnit(fontSize); + } + if (fontFamily) { + oStyle.fontFamily = fontFamily; + } + if (lineHeight) { + oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight; + } + }, + + /** + * Parses an SVG document, returning all of the gradient declarations found in it + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element + */ + getGradientDefs: function(doc) { + var tagArray = [ + 'linearGradient', + 'radialGradient', + 'svg:linearGradient', + 'svg:radialGradient'], + elList = _getMultipleNodes(doc, tagArray), + el, j = 0, gradientDefs = { }; + j = elList.length; + while (j--) { + el = elList[j]; + if (el.getAttribute('xlink:href')) { + recursivelyParseGradientsXlink(doc, el); + } + gradientDefs[el.getAttribute('id')] = el; + } + return gradientDefs; + }, + + /** + * Returns an object of attributes' name/value, given element and an array of attribute names; + * Parses parent "g" nodes recursively upwards. + * @static + * @memberOf fabric + * @param {DOMElement} element Element to parse + * @param {Array} attributes Array of attributes to parse + * @return {Object} object containing parsed attributes' names/values + */ + parseAttributes: function(element, attributes, svgUid) { + + if (!element) { + return; + } + + var value, + parentAttributes = { }, + fontSize, parentFontSize; + + if (typeof svgUid === 'undefined') { + svgUid = element.getAttribute('svgUid'); + } + // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards + if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) { + parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid); + } + + var ownAttributes = attributes.reduce(function(memo, attr) { + value = element.getAttribute(attr); + if (value) { // eslint-disable-line + memo[attr] = value; + } + return memo; + }, { }); + // add values parsed from style, which take precedence over attributes + // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) + var cssAttrs = extend( + getGlobalStylesForElement(element, svgUid), + fabric.parseStyleAttribute(element) + ); + ownAttributes = extend( + ownAttributes, + cssAttrs + ); + if (cssAttrs[cPath]) { + element.setAttribute(cPath, cssAttrs[cPath]); + } + fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE; + if (ownAttributes[fSize]) { + // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers. + ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize); + } + + var normalizedAttr, normalizedValue, normalizedStyle = {}; + for (var attr in ownAttributes) { + normalizedAttr = normalizeAttr(attr); + normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize); + normalizedStyle[normalizedAttr] = normalizedValue; + } + if (normalizedStyle && normalizedStyle.font) { + fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle); + } + var mergedAttrs = extend(parentAttributes, normalizedStyle); + return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs); + }, + + /** + * Transforms an array of svg elements to corresponding fabric.* instances + * @static + * @memberOf fabric + * @param {Array} elements Array of elements to parse + * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) + * @param {Object} [options] Options object + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + */ + parseElements: function(elements, callback, options, reviver, parsingOptions) { + new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse(); + }, + + /** + * Parses "style" attribute, retuning an object with values + * @static + * @memberOf fabric + * @param {SVGElement} element Element to parse + * @return {Object} Objects with values parsed from style attribute of an element + */ + parseStyleAttribute: function(element) { + var oStyle = { }, + style = element.getAttribute('style'); + + if (!style) { + return oStyle; + } + + if (typeof style === 'string') { + parseStyleString(style, oStyle); + } + else { + parseStyleObject(style, oStyle); + } + + return oStyle; + }, + + /** + * Parses "points" attribute, returning an array of values + * @static + * @memberOf fabric + * @param {String} points points attribute string + * @return {Array} array of points + */ + parsePointsAttribute: function(points) { + + // points attribute is required and must not be empty + if (!points) { + return null; + } + + // replace commas with whitespace and remove bookending whitespace + points = points.replace(/,/g, ' ').trim(); + + points = points.split(/\s+/); + var parsedPoints = [], i, len; + + for (i = 0, len = points.length; i < len; i += 2) { + parsedPoints.push({ + x: parseFloat(points[i]), + y: parseFloat(points[i + 1]) + }); + } + + // odd number of points is an error + // if (parsedPoints.length % 2 !== 0) { + // return null; + // } + + return parsedPoints; + }, + + /** + * Returns CSS rules for a given SVG document + * @static + * @function + * @memberOf fabric + * @param {SVGDocument} doc SVG document to parse + * @return {Object} CSS rules of this document + */ + getCSSRules: function(doc) { + var styles = doc.getElementsByTagName('style'), i, len, + allRules = { }, rules; + + // very crude parsing of style contents + for (i = 0, len = styles.length; i < len; i++) { + var styleContents = styles[i].textContent; + + // remove comments + styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); + if (styleContents.trim() === '') { + continue; + } + // recovers all the rule in this form `body { style code... }` + // rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); + rules = styleContents.split('}'); + // remove empty rules. + rules = rules.filter(function(rule) { return rule.trim(); }); + // at this point we have hopefully an array of rules `body { style code... ` + // eslint-disable-next-line no-loop-func + rules.forEach(function(rule) { + + var match = rule.split('{'), + ruleObj = { }, declaration = match[1].trim(), + propertyValuePairs = declaration.split(';').filter(function(pair) { return pair.trim(); }); + + for (i = 0, len = propertyValuePairs.length; i < len; i++) { + var pair = propertyValuePairs[i].split(':'), + property = pair[0].trim(), + value = pair[1].trim(); + ruleObj[property] = value; + } + rule = match[0].trim(); + rule.split(',').forEach(function(_rule) { + _rule = _rule.replace(/^svg/i, '').trim(); + if (_rule === '') { + return; + } + if (allRules[_rule]) { + fabric.util.object.extend(allRules[_rule], ruleObj); + } + else { + allRules[_rule] = fabric.util.object.clone(ruleObj); + } + }); + }); + } + return allRules; + }, + + /** + * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. + * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) + * @memberOf fabric + * @param {String} url + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + * @param {Object} [options] Object containing options for parsing + * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources + */ + loadSVGFromURL: function(url, callback, reviver, options) { + + url = url.replace(/^\n\s*/, '').trim(); + new fabric.util.request(url, { + method: 'get', + onComplete: onComplete + }); + + function onComplete(r) { + + var xml = r.responseXML; + if (!xml || !xml.documentElement) { + callback && callback(null); + return false; + } + + fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) { + callback && callback(results, _options, elements, allElements); + }, reviver, options); + } + }, + + /** + * Takes string corresponding to an SVG document, and parses it into a set of fabric objects + * @memberOf fabric + * @param {String} string + * @param {Function} callback + * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. + * @param {Object} [options] Object containing options for parsing + * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources + */ + loadSVGFromString: function(string, callback, reviver, options) { + var parser = new fabric.window.DOMParser(), + doc = parser.parseFromString(string.trim(), 'text/xml'); + fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) { + callback(results, _options, elements, allElements); + }, reviver, options); + } + }); + +})(typeof exports !== 'undefined' ? exports : this); +fabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) { + this.elements = elements; + this.callback = callback; + this.options = options; + this.reviver = reviver; + this.svgUid = (options && options.svgUid) || 0; + this.parsingOptions = parsingOptions; + this.regexUrl = /^url\(['"]?#([^'"]+)['"]?\)/g; + this.doc = doc; +}; + +(function(proto) { + proto.parse = function() { + this.instances = new Array(this.elements.length); + this.numElements = this.elements.length; + this.createObjects(); + }; + + proto.createObjects = function() { + var _this = this; + this.elements.forEach(function(element, i) { + element.setAttribute('svgUid', _this.svgUid); + _this.createObject(element, i); + }); + }; + + proto.findTag = function(el) { + return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))]; + }; + + proto.createObject = function(el, index) { + var klass = this.findTag(el); + if (klass && klass.fromElement) { + try { + klass.fromElement(el, this.createCallback(index, el), this.options); + } + catch (err) { + fabric.log(err); + } + } + else { + this.checkIfDone(); + } + }; + + proto.createCallback = function(index, el) { + var _this = this; + return function(obj) { + var _options; + _this.resolveGradient(obj, el, 'fill'); + _this.resolveGradient(obj, el, 'stroke'); + if (obj instanceof fabric.Image && obj._originalElement) { + _options = obj.parsePreserveAspectRatioAttribute(el); + } + obj._removeTransformMatrix(_options); + _this.resolveClipPath(obj, el); + _this.reviver && _this.reviver(el, obj); + _this.instances[index] = obj; + _this.checkIfDone(); + }; + }; + + proto.extractPropertyDefinition = function(obj, property, storage) { + var value = obj[property], regex = this.regexUrl; + if (!regex.test(value)) { + return; + } + regex.lastIndex = 0; + var id = regex.exec(value)[1]; + regex.lastIndex = 0; + return fabric[storage][this.svgUid][id]; + }; + + proto.resolveGradient = function(obj, el, property) { + var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs'); + if (gradientDef) { + var opacityAttr = el.getAttribute(property + '-opacity'); + var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options); + obj.set(property, gradient); + } + }; + + proto.createClipPathCallback = function(obj, container) { + return function(_newObj) { + _newObj._removeTransformMatrix(); + _newObj.fillRule = _newObj.clipRule; + container.push(_newObj); + }; + }; + + proto.resolveClipPath = function(obj, usingElement) { + var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'), + element, klass, objTransformInv, container, gTransform, options; + if (clipPath) { + container = []; + objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix()); + // move the clipPath tag as sibling to the real element that is using it + var clipPathTag = clipPath[0].parentNode; + var clipPathOwner = usingElement; + while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) { + clipPathOwner = clipPathOwner.parentNode; + } + clipPathOwner.parentNode.appendChild(clipPathTag); + for (var i = 0; i < clipPath.length; i++) { + element = clipPath[i]; + klass = this.findTag(element); + klass.fromElement( + element, + this.createClipPathCallback(obj, container), + this.options + ); + } + if (container.length === 1) { + clipPath = container[0]; + } + else { + clipPath = new fabric.Group(container); + } + gTransform = fabric.util.multiplyTransformMatrices( + objTransformInv, + clipPath.calcTransformMatrix() + ); + if (clipPath.clipPath) { + this.resolveClipPath(clipPath, clipPathOwner); + } + var options = fabric.util.qrDecompose(gTransform); + clipPath.flipX = false; + clipPath.flipY = false; + clipPath.set('scaleX', options.scaleX); + clipPath.set('scaleY', options.scaleY); + clipPath.angle = options.angle; + clipPath.skewX = options.skewX; + clipPath.skewY = 0; + clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center'); + obj.clipPath = clipPath; + } + else { + // if clip-path does not resolve to any element, delete the property. + delete obj.clipPath; + } + }; + + proto.checkIfDone = function() { + if (--this.numElements === 0) { + this.instances = this.instances.filter(function(el) { + // eslint-disable-next-line no-eq-null, eqeqeq + return el != null; + }); + this.callback(this.instances, this.elements); + } + }; +})(fabric.ElementsParser.prototype); +(function(global) { + + 'use strict'; + + /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ + + var fabric = global.fabric || (global.fabric = { }); + + if (fabric.Point) { + fabric.warn('fabric.Point is already defined'); + return; + } + + fabric.Point = Point; + + /** + * Point class + * @class fabric.Point + * @memberOf fabric + * @constructor + * @param {Number} x + * @param {Number} y + * @return {fabric.Point} thisArg + */ + function Point(x, y) { + this.x = x; + this.y = y; + } + + Point.prototype = /** @lends fabric.Point.prototype */ { + + type: 'point', + + constructor: Point, + + /** + * Adds another point to this one and returns another one + * @param {fabric.Point} that + * @return {fabric.Point} new Point instance with added values + */ + add: function (that) { + return new Point(this.x + that.x, this.y + that.y); + }, + + /** + * Adds another point to this one + * @param {fabric.Point} that + * @return {fabric.Point} thisArg + * @chainable + */ + addEquals: function (that) { + this.x += that.x; + this.y += that.y; + return this; + }, + + /** + * Adds value to this point and returns a new one + * @param {Number} scalar + * @return {fabric.Point} new Point with added value + */ + scalarAdd: function (scalar) { + return new Point(this.x + scalar, this.y + scalar); + }, + + /** + * Adds value to this point + * @param {Number} scalar + * @return {fabric.Point} thisArg + * @chainable + */ + scalarAddEquals: function (scalar) { + this.x += scalar; + this.y += scalar; + return this; + }, + + /** + * Subtracts another point from this point and returns a new one + * @param {fabric.Point} that + * @return {fabric.Point} new Point object with subtracted values + */ + subtract: function (that) { + return new Point(this.x - that.x, this.y - that.y); + }, + + /** + * Subtracts another point from this point + * @param {fabric.Point} that + * @return {fabric.Point} thisArg + * @chainable + */ + subtractEquals: function (that) { + this.x -= that.x; + this.y -= that.y; + return this; + }, + + /** + * Subtracts value from this point and returns a new one + * @param {Number} scalar + * @return {fabric.Point} + */ + scalarSubtract: function (scalar) { + return new Point(this.x - scalar, this.y - scalar); + }, + + /** + * Subtracts value from this point + * @param {Number} scalar + * @return {fabric.Point} thisArg + * @chainable + */ + scalarSubtractEquals: function (scalar) { + this.x -= scalar; + this.y -= scalar; + return this; + }, + + /** + * Multiplies this point by a value and returns a new one + * TODO: rename in scalarMultiply in 2.0 + * @param {Number} scalar + * @return {fabric.Point} + */ + multiply: function (scalar) { + return new Point(this.x * scalar, this.y * scalar); + }, + + /** + * Multiplies this point by a value + * TODO: rename in scalarMultiplyEquals in 2.0 + * @param {Number} scalar + * @return {fabric.Point} thisArg + * @chainable + */ + multiplyEquals: function (scalar) { + this.x *= scalar; + this.y *= scalar; + return this; + }, + + /** + * Divides this point by a value and returns a new one + * TODO: rename in scalarDivide in 2.0 + * @param {Number} scalar + * @return {fabric.Point} + */ + divide: function (scalar) { + return new Point(this.x / scalar, this.y / scalar); + }, + + /** + * Divides this point by a value + * TODO: rename in scalarDivideEquals in 2.0 + * @param {Number} scalar + * @return {fabric.Point} thisArg + * @chainable + */ + divideEquals: function (scalar) { + this.x /= scalar; + this.y /= scalar; + return this; + }, + + /** + * Returns true if this point is equal to another one + * @param {fabric.Point} that + * @return {Boolean} + */ + eq: function (that) { + return (this.x === that.x && this.y === that.y); + }, + + /** + * Returns true if this point is less than another one + * @param {fabric.Point} that + * @return {Boolean} + */ + lt: function (that) { + return (this.x < that.x && this.y < that.y); + }, + + /** + * Returns true if this point is less than or equal to another one + * @param {fabric.Point} that + * @return {Boolean} + */ + lte: function (that) { + return (this.x <= that.x && this.y <= that.y); + }, + + /** + + * Returns true if this point is greater another one + * @param {fabric.Point} that + * @return {Boolean} + */ + gt: function (that) { + return (this.x > that.x && this.y > that.y); + }, + + /** + * Returns true if this point is greater than or equal to another one + * @param {fabric.Point} that + * @return {Boolean} + */ + gte: function (that) { + return (this.x >= that.x && this.y >= that.y); + }, + + /** + * Returns new point which is the result of linear interpolation with this one and another one + * @param {fabric.Point} that + * @param {Number} t , position of interpolation, between 0 and 1 default 0.5 + * @return {fabric.Point} + */ + lerp: function (that, t) { + if (typeof t === 'undefined') { + t = 0.5; + } + t = Math.max(Math.min(1, t), 0); + return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t); + }, + + /** + * Returns distance from this point and another one + * @param {fabric.Point} that + * @return {Number} + */ + distanceFrom: function (that) { + var dx = this.x - that.x, + dy = this.y - that.y; + return Math.sqrt(dx * dx + dy * dy); + }, + + /** + * Returns the point between this point and another one + * @param {fabric.Point} that + * @return {fabric.Point} + */ + midPointFrom: function (that) { + return this.lerp(that); + }, + + /** + * Returns a new point which is the min of this and another one + * @param {fabric.Point} that + * @return {fabric.Point} + */ + min: function (that) { + return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y)); + }, + + /** + * Returns a new point which is the max of this and another one + * @param {fabric.Point} that + * @return {fabric.Point} + */ + max: function (that) { + return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y)); + }, + + /** + * Returns string representation of this point + * @return {String} + */ + toString: function () { + return this.x + ',' + this.y; + }, + + /** + * Sets x/y of this point + * @param {Number} x + * @param {Number} y + * @chainable + */ + setXY: function (x, y) { + this.x = x; + this.y = y; + return this; + }, + + /** + * Sets x of this point + * @param {Number} x + * @chainable + */ + setX: function (x) { + this.x = x; + return this; + }, + + /** + * Sets y of this point + * @param {Number} y + * @chainable + */ + setY: function (y) { + this.y = y; + return this; + }, + + /** + * Sets x/y of this point from another point + * @param {fabric.Point} that + * @chainable + */ + setFromPoint: function (that) { + this.x = that.x; + this.y = that.y; + return this; + }, + + /** + * Swaps x/y of this point and another point + * @param {fabric.Point} that + */ + swap: function (that) { + var x = this.x, + y = this.y; + this.x = that.x; + this.y = that.y; + that.x = x; + that.y = y; + }, + + /** + * return a cloned instance of the point + * @return {fabric.Point} + */ + clone: function () { + return new Point(this.x, this.y); + } + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ + var fabric = global.fabric || (global.fabric = { }); + + if (fabric.Intersection) { + fabric.warn('fabric.Intersection is already defined'); + return; + } + + /** + * Intersection class + * @class fabric.Intersection + * @memberOf fabric + * @constructor + */ + function Intersection(status) { + this.status = status; + this.points = []; + } + + fabric.Intersection = Intersection; + + fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ { + + constructor: Intersection, + + /** + * Appends a point to intersection + * @param {fabric.Point} point + * @return {fabric.Intersection} thisArg + * @chainable + */ + appendPoint: function (point) { + this.points.push(point); + return this; + }, + + /** + * Appends points to intersection + * @param {Array} points + * @return {fabric.Intersection} thisArg + * @chainable + */ + appendPoints: function (points) { + this.points = this.points.concat(points); + return this; + } + }; + + /** + * Checks if one line intersects another + * TODO: rename in intersectSegmentSegment + * @static + * @param {fabric.Point} a1 + * @param {fabric.Point} a2 + * @param {fabric.Point} b1 + * @param {fabric.Point} b2 + * @return {fabric.Intersection} + */ + fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) { + var result, + uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x), + ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x), + uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + if (uB !== 0) { + var ua = uaT / uB, + ub = ubT / uB; + if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { + result = new Intersection('Intersection'); + result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); + } + else { + result = new Intersection(); + } + } + else { + if (uaT === 0 || ubT === 0) { + result = new Intersection('Coincident'); + } + else { + result = new Intersection('Parallel'); + } + } + return result; + }; + + /** + * Checks if line intersects polygon + * TODO: rename in intersectSegmentPolygon + * fix detection of coincident + * @static + * @param {fabric.Point} a1 + * @param {fabric.Point} a2 + * @param {Array} points + * @return {fabric.Intersection} + */ + fabric.Intersection.intersectLinePolygon = function(a1, a2, points) { + var result = new Intersection(), + length = points.length, + b1, b2, inter, i; + + for (i = 0; i < length; i++) { + b1 = points[i]; + b2 = points[(i + 1) % length]; + inter = Intersection.intersectLineLine(a1, a2, b1, b2); + + result.appendPoints(inter.points); + } + if (result.points.length > 0) { + result.status = 'Intersection'; + } + return result; + }; + + /** + * Checks if polygon intersects another polygon + * @static + * @param {Array} points1 + * @param {Array} points2 + * @return {fabric.Intersection} + */ + fabric.Intersection.intersectPolygonPolygon = function (points1, points2) { + var result = new Intersection(), + length = points1.length, i; + + for (i = 0; i < length; i++) { + var a1 = points1[i], + a2 = points1[(i + 1) % length], + inter = Intersection.intersectLinePolygon(a1, a2, points2); + + result.appendPoints(inter.points); + } + if (result.points.length > 0) { + result.status = 'Intersection'; + } + return result; + }; + + /** + * Checks if polygon intersects rectangle + * @static + * @param {Array} points + * @param {fabric.Point} r1 + * @param {fabric.Point} r2 + * @return {fabric.Intersection} + */ + fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) { + var min = r1.min(r2), + max = r1.max(r2), + topRight = new fabric.Point(max.x, min.y), + bottomLeft = new fabric.Point(min.x, max.y), + inter1 = Intersection.intersectLinePolygon(min, topRight, points), + inter2 = Intersection.intersectLinePolygon(topRight, max, points), + inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points), + inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points), + result = new Intersection(); + + result.appendPoints(inter1.points); + result.appendPoints(inter2.points); + result.appendPoints(inter3.points); + result.appendPoints(inter4.points); + + if (result.points.length > 0) { + result.status = 'Intersection'; + } + return result; + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }); + + if (fabric.Color) { + fabric.warn('fabric.Color is already defined.'); + return; + } + + /** + * Color class + * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations; + * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects. + * + * @class fabric.Color + * @param {String} color optional in hex or rgb(a) or hsl format or from known color list + * @return {fabric.Color} thisArg + * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors} + */ + function Color(color) { + if (!color) { + this.setSource([0, 0, 0, 1]); + } + else { + this._tryParsingColor(color); + } + } + + fabric.Color = Color; + + fabric.Color.prototype = /** @lends fabric.Color.prototype */ { + + /** + * @private + * @param {String|Array} color Color value to parse + */ + _tryParsingColor: function(color) { + var source; + + if (color in Color.colorNameMap) { + color = Color.colorNameMap[color]; + } + + if (color === 'transparent') { + source = [255, 255, 255, 0]; + } + + if (!source) { + source = Color.sourceFromHex(color); + } + if (!source) { + source = Color.sourceFromRgb(color); + } + if (!source) { + source = Color.sourceFromHsl(color); + } + if (!source) { + //if color is not recognize let's make black as canvas does + source = [0, 0, 0, 1]; + } + if (source) { + this.setSource(source); + } + }, + + /** + * Adapted from https://github.com/mjijackson + * @private + * @param {Number} r Red color value + * @param {Number} g Green color value + * @param {Number} b Blue color value + * @return {Array} Hsl color + */ + _rgbToHsl: function(r, g, b) { + r /= 255; g /= 255; b /= 255; + + var h, s, l, + max = fabric.util.array.max([r, g, b]), + min = fabric.util.array.min([r, g, b]); + + l = (max + min) / 2; + + if (max === min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + + return [ + Math.round(h * 360), + Math.round(s * 100), + Math.round(l * 100) + ]; + }, + + /** + * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1]) + * @return {Array} + */ + getSource: function() { + return this._source; + }, + + /** + * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1]) + * @param {Array} source + */ + setSource: function(source) { + this._source = source; + }, + + /** + * Returns color representation in RGB format + * @return {String} ex: rgb(0-255,0-255,0-255) + */ + toRgb: function() { + var source = this.getSource(); + return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')'; + }, + + /** + * Returns color representation in RGBA format + * @return {String} ex: rgba(0-255,0-255,0-255,0-1) + */ + toRgba: function() { + var source = this.getSource(); + return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')'; + }, + + /** + * Returns color representation in HSL format + * @return {String} ex: hsl(0-360,0%-100%,0%-100%) + */ + toHsl: function() { + var source = this.getSource(), + hsl = this._rgbToHsl(source[0], source[1], source[2]); + + return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)'; + }, + + /** + * Returns color representation in HSLA format + * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1) + */ + toHsla: function() { + var source = this.getSource(), + hsl = this._rgbToHsl(source[0], source[1], source[2]); + + return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')'; + }, + + /** + * Returns color representation in HEX format + * @return {String} ex: FF5555 + */ + toHex: function() { + var source = this.getSource(), r, g, b; + + r = source[0].toString(16); + r = (r.length === 1) ? ('0' + r) : r; + + g = source[1].toString(16); + g = (g.length === 1) ? ('0' + g) : g; + + b = source[2].toString(16); + b = (b.length === 1) ? ('0' + b) : b; + + return r.toUpperCase() + g.toUpperCase() + b.toUpperCase(); + }, + + /** + * Returns color representation in HEXA format + * @return {String} ex: FF5555CC + */ + toHexa: function() { + var source = this.getSource(), a; + + a = Math.round(source[3] * 255); + a = a.toString(16); + a = (a.length === 1) ? ('0' + a) : a; + + return this.toHex() + a.toUpperCase(); + }, + + /** + * Gets value of alpha channel for this color + * @return {Number} 0-1 + */ + getAlpha: function() { + return this.getSource()[3]; + }, + + /** + * Sets value of alpha channel for this color + * @param {Number} alpha Alpha value 0-1 + * @return {fabric.Color} thisArg + */ + setAlpha: function(alpha) { + var source = this.getSource(); + source[3] = alpha; + this.setSource(source); + return this; + }, + + /** + * Transforms color to its grayscale representation + * @return {fabric.Color} thisArg + */ + toGrayscale: function() { + var source = this.getSource(), + average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10), + currentAlpha = source[3]; + this.setSource([average, average, average, currentAlpha]); + return this; + }, + + /** + * Transforms color to its black and white representation + * @param {Number} threshold + * @return {fabric.Color} thisArg + */ + toBlackWhite: function(threshold) { + var source = this.getSource(), + average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), + currentAlpha = source[3]; + + threshold = threshold || 127; + + average = (Number(average) < Number(threshold)) ? 0 : 255; + this.setSource([average, average, average, currentAlpha]); + return this; + }, + + /** + * Overlays color with another color + * @param {String|fabric.Color} otherColor + * @return {fabric.Color} thisArg + */ + overlayWith: function(otherColor) { + if (!(otherColor instanceof Color)) { + otherColor = new Color(otherColor); + } + + var result = [], + alpha = this.getAlpha(), + otherAlpha = 0.5, + source = this.getSource(), + otherSource = otherColor.getSource(), i; + + for (i = 0; i < 3; i++) { + result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha))); + } + + result[3] = alpha; + this.setSource(result); + return this; + } + }; + + /** + * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5)) + * @static + * @field + * @memberOf fabric.Color + */ + // eslint-disable-next-line max-len + fabric.Color.reRGBa = /^rgba?\(\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*(?:\s*,\s*((?:\d*\.?\d+)?)\s*)?\)$/i; + + /** + * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 )) + * @static + * @field + * @memberOf fabric.Color + */ + fabric.Color.reHSLa = /^hsla?\(\s*(\d{1,3})\s*,\s*(\d{1,3}\%)\s*,\s*(\d{1,3}\%)\s*(?:\s*,\s*(\d+(?:\.\d+)?)\s*)?\)$/i; + + /** + * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff) + * @static + * @field + * @memberOf fabric.Color + */ + fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i; + + /** + * Map of the 148 color names with HEX code + * @static + * @field + * @memberOf fabric.Color + * @see: https://www.w3.org/TR/css3-color/#svg-color + */ + fabric.Color.colorNameMap = { + aliceblue: '#F0F8FF', + antiquewhite: '#FAEBD7', + aqua: '#00FFFF', + aquamarine: '#7FFFD4', + azure: '#F0FFFF', + beige: '#F5F5DC', + bisque: '#FFE4C4', + black: '#000000', + blanchedalmond: '#FFEBCD', + blue: '#0000FF', + blueviolet: '#8A2BE2', + brown: '#A52A2A', + burlywood: '#DEB887', + cadetblue: '#5F9EA0', + chartreuse: '#7FFF00', + chocolate: '#D2691E', + coral: '#FF7F50', + cornflowerblue: '#6495ED', + cornsilk: '#FFF8DC', + crimson: '#DC143C', + cyan: '#00FFFF', + darkblue: '#00008B', + darkcyan: '#008B8B', + darkgoldenrod: '#B8860B', + darkgray: '#A9A9A9', + darkgrey: '#A9A9A9', + darkgreen: '#006400', + darkkhaki: '#BDB76B', + darkmagenta: '#8B008B', + darkolivegreen: '#556B2F', + darkorange: '#FF8C00', + darkorchid: '#9932CC', + darkred: '#8B0000', + darksalmon: '#E9967A', + darkseagreen: '#8FBC8F', + darkslateblue: '#483D8B', + darkslategray: '#2F4F4F', + darkslategrey: '#2F4F4F', + darkturquoise: '#00CED1', + darkviolet: '#9400D3', + deeppink: '#FF1493', + deepskyblue: '#00BFFF', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1E90FF', + firebrick: '#B22222', + floralwhite: '#FFFAF0', + forestgreen: '#228B22', + fuchsia: '#FF00FF', + gainsboro: '#DCDCDC', + ghostwhite: '#F8F8FF', + gold: '#FFD700', + goldenrod: '#DAA520', + gray: '#808080', + grey: '#808080', + green: '#008000', + greenyellow: '#ADFF2F', + honeydew: '#F0FFF0', + hotpink: '#FF69B4', + indianred: '#CD5C5C', + indigo: '#4B0082', + ivory: '#FFFFF0', + khaki: '#F0E68C', + lavender: '#E6E6FA', + lavenderblush: '#FFF0F5', + lawngreen: '#7CFC00', + lemonchiffon: '#FFFACD', + lightblue: '#ADD8E6', + lightcoral: '#F08080', + lightcyan: '#E0FFFF', + lightgoldenrodyellow: '#FAFAD2', + lightgray: '#D3D3D3', + lightgrey: '#D3D3D3', + lightgreen: '#90EE90', + lightpink: '#FFB6C1', + lightsalmon: '#FFA07A', + lightseagreen: '#20B2AA', + lightskyblue: '#87CEFA', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#B0C4DE', + lightyellow: '#FFFFE0', + lime: '#00FF00', + limegreen: '#32CD32', + linen: '#FAF0E6', + magenta: '#FF00FF', + maroon: '#800000', + mediumaquamarine: '#66CDAA', + mediumblue: '#0000CD', + mediumorchid: '#BA55D3', + mediumpurple: '#9370DB', + mediumseagreen: '#3CB371', + mediumslateblue: '#7B68EE', + mediumspringgreen: '#00FA9A', + mediumturquoise: '#48D1CC', + mediumvioletred: '#C71585', + midnightblue: '#191970', + mintcream: '#F5FFFA', + mistyrose: '#FFE4E1', + moccasin: '#FFE4B5', + navajowhite: '#FFDEAD', + navy: '#000080', + oldlace: '#FDF5E6', + olive: '#808000', + olivedrab: '#6B8E23', + orange: '#FFA500', + orangered: '#FF4500', + orchid: '#DA70D6', + palegoldenrod: '#EEE8AA', + palegreen: '#98FB98', + paleturquoise: '#AFEEEE', + palevioletred: '#DB7093', + papayawhip: '#FFEFD5', + peachpuff: '#FFDAB9', + peru: '#CD853F', + pink: '#FFC0CB', + plum: '#DDA0DD', + powderblue: '#B0E0E6', + purple: '#800080', + rebeccapurple: '#663399', + red: '#FF0000', + rosybrown: '#BC8F8F', + royalblue: '#4169E1', + saddlebrown: '#8B4513', + salmon: '#FA8072', + sandybrown: '#F4A460', + seagreen: '#2E8B57', + seashell: '#FFF5EE', + sienna: '#A0522D', + silver: '#C0C0C0', + skyblue: '#87CEEB', + slateblue: '#6A5ACD', + slategray: '#708090', + slategrey: '#708090', + snow: '#FFFAFA', + springgreen: '#00FF7F', + steelblue: '#4682B4', + tan: '#D2B48C', + teal: '#008080', + thistle: '#D8BFD8', + tomato: '#FF6347', + turquoise: '#40E0D0', + violet: '#EE82EE', + wheat: '#F5DEB3', + white: '#FFFFFF', + whitesmoke: '#F5F5F5', + yellow: '#FFFF00', + yellowgreen: '#9ACD32' + }; + + /** + * @private + * @param {Number} p + * @param {Number} q + * @param {Number} t + * @return {Number} + */ + function hue2rgb(p, q, t) { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1 / 6) { + return p + (q - p) * 6 * t; + } + if (t < 1 / 2) { + return q; + } + if (t < 2 / 3) { + return p + (q - p) * (2 / 3 - t) * 6; + } + return p; + } + + /** + * Returns new color object, when given a color in RGB format + * @memberOf fabric.Color + * @param {String} color Color value ex: rgb(0-255,0-255,0-255) + * @return {fabric.Color} + */ + fabric.Color.fromRgb = function(color) { + return Color.fromSource(Color.sourceFromRgb(color)); + }; + + /** + * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format + * @memberOf fabric.Color + * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%) + * @return {Array} source + */ + fabric.Color.sourceFromRgb = function(color) { + var match = color.match(Color.reRGBa); + if (match) { + var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1), + g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1), + b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1); + + return [ + parseInt(r, 10), + parseInt(g, 10), + parseInt(b, 10), + match[4] ? parseFloat(match[4]) : 1 + ]; + } + }; + + /** + * Returns new color object, when given a color in RGBA format + * @static + * @function + * @memberOf fabric.Color + * @param {String} color + * @return {fabric.Color} + */ + fabric.Color.fromRgba = Color.fromRgb; + + /** + * Returns new color object, when given a color in HSL format + * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%) + * @memberOf fabric.Color + * @return {fabric.Color} + */ + fabric.Color.fromHsl = function(color) { + return Color.fromSource(Color.sourceFromHsl(color)); + }; + + /** + * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format. + * Adapted from https://github.com/mjijackson + * @memberOf fabric.Color + * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1) + * @return {Array} source + * @see http://http://www.w3.org/TR/css3-color/#hsl-color + */ + fabric.Color.sourceFromHsl = function(color) { + var match = color.match(Color.reHSLa); + if (!match) { + return; + } + + var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360, + s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1), + l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1), + r, g, b; + + if (s === 0) { + r = g = b = l; + } + else { + var q = l <= 0.5 ? l * (s + 1) : l + s - l * s, + p = l * 2 - q; + + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + + return [ + Math.round(r * 255), + Math.round(g * 255), + Math.round(b * 255), + match[4] ? parseFloat(match[4]) : 1 + ]; + }; + + /** + * Returns new color object, when given a color in HSLA format + * @static + * @function + * @memberOf fabric.Color + * @param {String} color + * @return {fabric.Color} + */ + fabric.Color.fromHsla = Color.fromHsl; + + /** + * Returns new color object, when given a color in HEX format + * @static + * @memberOf fabric.Color + * @param {String} color Color value ex: FF5555 + * @return {fabric.Color} + */ + fabric.Color.fromHex = function(color) { + return Color.fromSource(Color.sourceFromHex(color)); + }; + + /** + * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format + * @static + * @memberOf fabric.Color + * @param {String} color ex: FF5555 or FF5544CC (RGBa) + * @return {Array} source + */ + fabric.Color.sourceFromHex = function(color) { + if (color.match(Color.reHex)) { + var value = color.slice(color.indexOf('#') + 1), + isShortNotation = (value.length === 3 || value.length === 4), + isRGBa = (value.length === 8 || value.length === 4), + r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2), + g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4), + b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6), + a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF'; + + return [ + parseInt(r, 16), + parseInt(g, 16), + parseInt(b, 16), + parseFloat((parseInt(a, 16) / 255).toFixed(2)) + ]; + } + }; + + /** + * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5]) + * @static + * @memberOf fabric.Color + * @param {Array} source + * @return {fabric.Color} + */ + fabric.Color.fromSource = function(source) { + var oColor = new Color(); + oColor.setSource(source); + return oColor; + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'], + skewMap = ['ns', 'nesw', 'ew', 'nwse'], + controls = {}, + LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center', + opposite = { + top: BOTTOM, + bottom: TOP, + left: RIGHT, + right: LEFT, + center: CENTER, + }, radiansToDegrees = fabric.util.radiansToDegrees, + sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; }); + + /** + * Combine control position and object angle to find the control direction compared + * to the object center. + * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls + * @param {fabric.Control} control the control class + * @return {Number} 0 - 7 a quadrant number + */ + function findCornerQuadrant(fabricObject, control) { + var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360; + return Math.round((cornerAngle % 360) / 45); + } + + function fireEvent(eventName, options) { + var target = options.transform.target, + canvas = target.canvas, + canvasOptions = fabric.util.object.clone(options); + canvasOptions.target = target; + canvas && canvas.fire('object:' + eventName, canvasOptions); + target.fire(eventName, options); + } + + /** + * Inspect event and fabricObject properties to understand if the scaling action + * @param {Event} eventData from the user action + * @param {fabric.Object} fabricObject the fabric object about to scale + * @return {Boolean} true if scale is proportional + */ + function scaleIsProportional(eventData, fabricObject) { + var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey, + uniformIsToggled = eventData[uniScaleKey]; + return (canvas.uniformScaling && !uniformIsToggled) || + (!canvas.uniformScaling && uniformIsToggled); + } + + /** + * Checks if transform is centered + * @param {Object} transform transform data + * @return {Boolean} true if transform is centered + */ + function isTransformCentered(transform) { + return transform.originX === CENTER && transform.originY === CENTER; + } + + /** + * Inspect fabricObject to understand if the current scaling action is allowed + * @param {fabric.Object} fabricObject the fabric object about to scale + * @param {String} by 'x' or 'y' or '' + * @param {Boolean} scaleProportionally true if we are trying to scale proportionally + * @return {Boolean} true if scaling is not allowed at current conditions + */ + function scalingIsForbidden(fabricObject, by, scaleProportionally) { + var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY; + if (lockX && lockY) { + return true; + } + if (!by && (lockX || lockY) && scaleProportionally) { + return true; + } + if (lockX && by === 'x') { + return true; + } + if (lockY && by === 'y') { + return true; + } + return false; + } + + /** + * return the correct cursor style for the scale action + * @param {Event} eventData the javascript event that is causing the scale + * @param {fabric.Control} control the control that is interested in the action + * @param {fabric.Object} fabricObject the fabric object that is interested in the action + * @return {String} a valid css string for the cursor + */ + function scaleCursorStyleHandler(eventData, control, fabricObject) { + var notAllowed = 'not-allowed', + scaleProportionally = scaleIsProportional(eventData, fabricObject), + by = ''; + if (control.x !== 0 && control.y === 0) { + by = 'x'; + } + else if (control.x === 0 && control.y !== 0) { + by = 'y'; + } + if (scalingIsForbidden(fabricObject, by, scaleProportionally)) { + return notAllowed; + } + var n = findCornerQuadrant(fabricObject, control); + return scaleMap[n] + '-resize'; + } + + /** + * return the correct cursor style for the skew action + * @param {Event} eventData the javascript event that is causing the scale + * @param {fabric.Control} control the control that is interested in the action + * @param {fabric.Object} fabricObject the fabric object that is interested in the action + * @return {String} a valid css string for the cursor + */ + function skewCursorStyleHandler(eventData, control, fabricObject) { + var notAllowed = 'not-allowed'; + if (control.x !== 0 && fabricObject.lockSkewingY) { + return notAllowed; + } + if (control.y !== 0 && fabricObject.lockSkewingX) { + return notAllowed; + } + var n = findCornerQuadrant(fabricObject, control) % 4; + return skewMap[n] + '-resize'; + } + + /** + * Combine skew and scale style handlers to cover fabric standard use case + * @param {Event} eventData the javascript event that is causing the scale + * @param {fabric.Control} control the control that is interested in the action + * @param {fabric.Object} fabricObject the fabric object that is interested in the action + * @return {String} a valid css string for the cursor + */ + function scaleSkewCursorStyleHandler(eventData, control, fabricObject) { + if (eventData[fabricObject.canvas.altActionKey]) { + return controls.skewCursorStyleHandler(eventData, control, fabricObject); + } + return controls.scaleCursorStyleHandler(eventData, control, fabricObject); + } + + /** + * Inspect event, control and fabricObject to return the correct action name + * @param {Event} eventData the javascript event that is causing the scale + * @param {fabric.Control} control the control that is interested in the action + * @param {fabric.Object} fabricObject the fabric object that is interested in the action + * @return {String} an action name + */ + function scaleOrSkewActionName(eventData, control, fabricObject) { + var isAlternative = eventData[fabricObject.canvas.altActionKey]; + if (control.x === 0) { + // then is scaleY or skewX + return isAlternative ? 'skewX' : 'scaleY'; + } + if (control.y === 0) { + // then is scaleY or skewX + return isAlternative ? 'skewY' : 'scaleX'; + } + } + + /** + * Find the correct style for the control that is used for rotation. + * this function is very simple and it just take care of not-allowed or standard cursor + * @param {Event} eventData the javascript event that is causing the scale + * @param {fabric.Control} control the control that is interested in the action + * @param {fabric.Object} fabricObject the fabric object that is interested in the action + * @return {String} a valid css string for the cursor + */ + function rotationStyleHandler(eventData, control, fabricObject) { + if (fabricObject.lockRotation) { + return 'not-allowed'; + } + return control.cursorStyle; + } + + function commonEventInfo(eventData, transform, x, y) { + return { + e: eventData, + transform: transform, + pointer: { + x: x, + y: y, + } + }; + } + + /** + * Wrap an action handler with saving/restoring object position on the transform. + * this is the code that permits to objects to keep their position while transforming. + * @param {Function} actionHandler the function to wrap + * @return {Function} a function with an action handler signature + */ + function wrapWithFixedAnchor(actionHandler) { + return function(eventData, transform, x, y) { + var target = transform.target, centerPoint = target.getCenterPoint(), + constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY), + actionPerformed = actionHandler(eventData, transform, x, y); + target.setPositionByOrigin(constraint, transform.originX, transform.originY); + return actionPerformed; + }; + } + + /** + * Wrap an action handler with firing an event if the action is performed + * @param {Function} actionHandler the function to wrap + * @return {Function} a function with an action handler signature + */ + function wrapWithFireEvent(eventName, actionHandler) { + return function(eventData, transform, x, y) { + var actionPerformed = actionHandler(eventData, transform, x, y); + if (actionPerformed) { + fireEvent(eventName, commonEventInfo(eventData, transform, x, y)); + } + return actionPerformed; + }; + } + + /** + * Transforms a point described by x and y in a distance from the top left corner of the object + * bounding box. + * @param {Object} transform + * @param {String} originX + * @param {String} originY + * @param {number} x + * @param {number} y + * @return {Fabric.Point} the normalized point + */ + function getLocalPoint(transform, originX, originY, x, y) { + var target = transform.target, + control = target.controls[transform.corner], + zoom = target.canvas.getZoom(), + padding = target.padding / zoom, + localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY); + if (localPoint.x >= padding) { + localPoint.x -= padding; + } + if (localPoint.x <= -padding) { + localPoint.x += padding; + } + if (localPoint.y >= padding) { + localPoint.y -= padding; + } + if (localPoint.y <= padding) { + localPoint.y += padding; + } + localPoint.x -= control.offsetX; + localPoint.y -= control.offsetY; + return localPoint; + } + + /** + * Detect if the fabric object is flipped on one side. + * @param {fabric.Object} target + * @return {Boolean} true if one flip, but not two. + */ + function targetHasOneFlip(target) { + return target.flipX !== target.flipY; + } + + /** + * Utility function to compensate the scale factor when skew is applied on both axes + * @private + */ + function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) { + if (target[oppositeSkew] !== 0) { + var newDim = target._getTransformedDimensions()[axis]; + var newValue = reference / newDim * target[scaleToCompensate]; + target.set(scaleToCompensate, newValue); + } + } + + /** + * Action handler for skewing on the X axis + * @private + */ + function skewObjectX(eventData, transform, x, y) { + var target = transform.target, + // find how big the object would be, if there was no skewX. takes in account scaling + dimNoSkew = target._getTransformedDimensions(0, target.skewY), + localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), + // the mouse is in the center of the object, and we want it to stay there. + // so the object will grow twice as much as the mouse. + // this makes the skew growth to localPoint * 2 - dimNoSkew. + totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x, + currentSkew = target.skewX, newSkew; + if (totalSkewSize < 2) { + // let's make it easy to go back to position 0. + newSkew = 0; + } + else { + newSkew = radiansToDegrees( + Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY)) + ); + // now we have to find the sign of the skew. + // it mostly depend on the origin of transformation. + if (transform.originX === LEFT && transform.originY === BOTTOM) { + newSkew = -newSkew; + } + if (transform.originX === RIGHT && transform.originY === TOP) { + newSkew = -newSkew; + } + if (targetHasOneFlip(target)) { + newSkew = -newSkew; + } + } + var hasSkewed = currentSkew !== newSkew; + if (hasSkewed) { + var dimBeforeSkewing = target._getTransformedDimensions().y; + target.set('skewX', newSkew); + compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing); + } + return hasSkewed; + } + + /** + * Action handler for skewing on the Y axis + * @private + */ + function skewObjectY(eventData, transform, x, y) { + var target = transform.target, + // find how big the object would be, if there was no skewX. takes in account scaling + dimNoSkew = target._getTransformedDimensions(target.skewX, 0), + localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), + // the mouse is in the center of the object, and we want it to stay there. + // so the object will grow twice as much as the mouse. + // this makes the skew growth to localPoint * 2 - dimNoSkew. + totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y, + currentSkew = target.skewY, newSkew; + if (totalSkewSize < 2) { + // let's make it easy to go back to position 0. + newSkew = 0; + } + else { + newSkew = radiansToDegrees( + Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX)) + ); + // now we have to find the sign of the skew. + // it mostly depend on the origin of transformation. + if (transform.originX === LEFT && transform.originY === BOTTOM) { + newSkew = -newSkew; + } + if (transform.originX === RIGHT && transform.originY === TOP) { + newSkew = -newSkew; + } + if (targetHasOneFlip(target)) { + newSkew = -newSkew; + } + } + var hasSkewed = currentSkew !== newSkew; + if (hasSkewed) { + var dimBeforeSkewing = target._getTransformedDimensions().x; + target.set('skewY', newSkew); + compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing); + } + return hasSkewed; + } + + /** + * Wrapped Action handler for skewing on the Y axis, takes care of the + * skew direction and determine the correct transform origin for the anchor point + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function skewHandlerX(eventData, transform, x, y) { + // step1 figure out and change transform origin. + // if skewX > 0 and originY bottom we anchor on right + // if skewX > 0 and originY top we anchor on left + // if skewX < 0 and originY bottom we anchor on left + // if skewX < 0 and originY top we anchor on right + // if skewX is 0, we look for mouse position to understand where are we going. + var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY; + if (target.lockSkewingX) { + return false; + } + if (currentSkew === 0) { + var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); + if (localPointFromCenter.x > 0) { + // we are pulling right, anchor left; + originX = LEFT; + } + else { + // we are pulling right, anchor right + originX = RIGHT; + } + } + else { + if (currentSkew > 0) { + originX = originY === TOP ? LEFT : RIGHT; + } + if (currentSkew < 0) { + originX = originY === TOP ? RIGHT : LEFT; + } + // is the object flipped on one side only? swap the origin. + if (targetHasOneFlip(target)) { + originX = originX === LEFT ? RIGHT : LEFT; + } + } + + // once we have the origin, we find the anchor point + transform.originX = originX; + var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX)); + return finalHandler(eventData, transform, x, y); + } + + /** + * Wrapped Action handler for skewing on the Y axis, takes care of the + * skew direction and determine the correct transform origin for the anchor point + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function skewHandlerY(eventData, transform, x, y) { + // step1 figure out and change transform origin. + // if skewY > 0 and originX left we anchor on top + // if skewY > 0 and originX right we anchor on bottom + // if skewY < 0 and originX left we anchor on bottom + // if skewY < 0 and originX right we anchor on top + // if skewY is 0, we look for mouse position to understand where are we going. + var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX; + if (target.lockSkewingY) { + return false; + } + if (currentSkew === 0) { + var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); + if (localPointFromCenter.y > 0) { + // we are pulling down, anchor up; + originY = TOP; + } + else { + // we are pulling up, anchor down + originY = BOTTOM; + } + } + else { + if (currentSkew > 0) { + originY = originX === LEFT ? TOP : BOTTOM; + } + if (currentSkew < 0) { + originY = originX === LEFT ? BOTTOM : TOP; + } + // is the object flipped on one side only? swap the origin. + if (targetHasOneFlip(target)) { + originY = originY === TOP ? BOTTOM : TOP; + } + } + + // once we have the origin, we find the anchor point + transform.originY = originY; + var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY)); + return finalHandler(eventData, transform, x, y); + } + + /** + * Action handler for rotation and snapping, without anchor point. + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + * @private + */ + function rotationWithSnapping(eventData, transform, x, y) { + var t = transform, + target = t.target, + pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY); + + if (target.lockRotation) { + return false; + } + + var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x), + curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x), + angle = radiansToDegrees(curAngle - lastAngle + t.theta), + hasRotated = true; + + if (target.snapAngle > 0) { + var snapAngle = target.snapAngle, + snapThreshold = target.snapThreshold || snapAngle, + rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle, + leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle; + + if (Math.abs(angle - leftAngleLocked) < snapThreshold) { + angle = leftAngleLocked; + } + else if (Math.abs(angle - rightAngleLocked) < snapThreshold) { + angle = rightAngleLocked; + } + } + + // normalize angle to positive value + if (angle < 0) { + angle = 360 + angle; + } + angle %= 360; + + hasRotated = target.angle !== angle; + target.angle = angle; + return hasRotated; + } + + /** + * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally. + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @param {Object} options additional information for scaling + * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling + * @return {Boolean} true if some change happened + * @private + */ + function scaleObject(eventData, transform, x, y, options) { + options = options || {}; + var target = transform.target, + lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY, + by = options.by, newPoint, scaleX, scaleY, dim, + scaleProportionally = scaleIsProportional(eventData, target), + forbidScaling = scalingIsForbidden(target, by, scaleProportionally), + signX, signY, gestureScale = transform.gestureScale; + + if (forbidScaling) { + return false; + } + if (gestureScale) { + scaleX = transform.scaleX * gestureScale; + scaleY = transform.scaleY * gestureScale; + } + else { + newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y); + // use of sign: We use sign to detect change of direction of an action. sign usually change when + // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling + // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily + // cross many time the origin point and flip the object. so we need a way to filter out the noise. + // This ternary here should be ok to filter out X scaling when we want Y only and vice versa. + signX = by !== 'y' ? sign(newPoint.x) : 1; + signY = by !== 'x' ? sign(newPoint.y) : 1; + if (!transform.signX) { + transform.signX = signX; + } + if (!transform.signY) { + transform.signY = signY; + } + + if (target.lockScalingFlip && + (transform.signX !== signX || transform.signY !== signY) + ) { + return false; + } + + dim = target._getTransformedDimensions(); + // missing detection of flip and logic to switch the origin + if (scaleProportionally && !by) { + // uniform scaling + var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y), + original = transform.original, + originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) + + Math.abs(dim.y * original.scaleY / target.scaleY), + scale = distance / originalDistance; + scaleX = original.scaleX * scale; + scaleY = original.scaleY * scale; + } + else { + scaleX = Math.abs(newPoint.x * target.scaleX / dim.x); + scaleY = Math.abs(newPoint.y * target.scaleY / dim.y); + } + // if we are scaling by center, we need to double the scale + if (isTransformCentered(transform)) { + scaleX *= 2; + scaleY *= 2; + } + if (transform.signX !== signX && by !== 'y') { + transform.originX = opposite[transform.originX]; + scaleX *= -1; + transform.signX = signX; + } + if (transform.signY !== signY && by !== 'x') { + transform.originY = opposite[transform.originY]; + scaleY *= -1; + transform.signY = signY; + } + } + // minScale is taken are in the setter. + var oldScaleX = target.scaleX, oldScaleY = target.scaleY; + if (!by) { + !lockScalingX && target.set('scaleX', scaleX); + !lockScalingY && target.set('scaleY', scaleY); + } + else { + // forbidden cases already handled on top here. + by === 'x' && target.set('scaleX', scaleX); + by === 'y' && target.set('scaleY', scaleY); + } + return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY; + } + + /** + * Generic scaling logic, to scale from corners either equally or freely. + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function scaleObjectFromCorner(eventData, transform, x, y) { + return scaleObject(eventData, transform, x, y); + } + + /** + * Scaling logic for the X axis. + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function scaleObjectX(eventData, transform, x, y) { + return scaleObject(eventData, transform, x, y , { by: 'x' }); + } + + /** + * Scaling logic for the Y axis. + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function scaleObjectY(eventData, transform, x, y) { + return scaleObject(eventData, transform, x, y , { by: 'y' }); + } + + /** + * Composed action handler to either scale Y or skew X + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function scalingYOrSkewingX(eventData, transform, x, y) { + // ok some safety needed here. + if (eventData[transform.target.canvas.altActionKey]) { + return controls.skewHandlerX(eventData, transform, x, y); + } + return controls.scalingY(eventData, transform, x, y); + } + + /** + * Composed action handler to either scale X or skew Y + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function scalingXOrSkewingY(eventData, transform, x, y) { + // ok some safety needed here. + if (eventData[transform.target.canvas.altActionKey]) { + return controls.skewHandlerY(eventData, transform, x, y); + } + return controls.scalingX(eventData, transform, x, y); + } + + /** + * Action handler to change textbox width + * Needs to be wrapped with `wrapWithFixedAnchor` to be effective + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if some change happened + */ + function changeWidth(eventData, transform, x, y) { + var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), + strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1), + multiplier = isTransformCentered(transform) ? 2 : 1, + oldWidth = target.width, + newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding; + target.set('width', Math.max(newWidth, 0)); + return oldWidth !== newWidth; + } + + /** + * Action handler + * @private + * @param {Event} eventData javascript event that is doing the transform + * @param {Object} transform javascript object containing a series of information around the current transform + * @param {number} x current mouse x position, canvas normalized + * @param {number} y current mouse y position, canvas normalized + * @return {Boolean} true if the translation occurred + */ + function dragHandler(eventData, transform, x, y) { + var target = transform.target, + newLeft = x - transform.offsetX, + newTop = y - transform.offsetY, + moveX = !target.get('lockMovementX') && target.left !== newLeft, + moveY = !target.get('lockMovementY') && target.top !== newTop; + moveX && target.set('left', newLeft); + moveY && target.set('top', newTop); + if (moveX || moveY) { + fireEvent('moving', commonEventInfo(eventData, transform, x, y)); + } + return moveX || moveY; + } + + controls.scaleCursorStyleHandler = scaleCursorStyleHandler; + controls.skewCursorStyleHandler = skewCursorStyleHandler; + controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler; + controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping)); + controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner)); + controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX)); + controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY)); + controls.scalingYOrSkewingX = scalingYOrSkewingX; + controls.scalingXOrSkewingY = scalingXOrSkewingY; + controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth)); + controls.skewHandlerX = skewHandlerX; + controls.skewHandlerY = skewHandlerY; + controls.dragHandler = dragHandler; + controls.scaleOrSkewActionName = scaleOrSkewActionName; + controls.rotationStyleHandler = rotationStyleHandler; + controls.fireEvent = fireEvent; + controls.wrapWithFixedAnchor = wrapWithFixedAnchor; + controls.wrapWithFireEvent = wrapWithFireEvent; + controls.getLocalPoint = getLocalPoint; + fabric.controlsUtils = controls; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + degreesToRadians = fabric.util.degreesToRadians, + controls = fabric.controlsUtils; + + /** + * Render a round control, as per fabric features. + * This function is written to respect object properties like transparentCorners, cornerSize + * cornerColor, cornerStrokeColor + * plus the addition of offsetY and offsetX. + * @param {CanvasRenderingContext2D} ctx context to render on + * @param {Number} left x coordinate where the control center should be + * @param {Number} top y coordinate where the control center should be + * @param {Object} styleOverride override for fabric.Object controls style + * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls + */ + function renderCircleControl (ctx, left, top, styleOverride, fabricObject) { + styleOverride = styleOverride || {}; + var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize, + ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize, + transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ? + styleOverride.transparentCorners : fabricObject.transparentCorners, + methodName = transparentCorners ? 'stroke' : 'fill', + stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor), + myLeft = left, + myTop = top, size; + ctx.save(); + ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor; + ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor; + // as soon as fabric react v5, remove ie11, use proper ellipse code. + if (xSize > ySize) { + size = xSize; + ctx.scale(1.0, ySize / xSize); + myTop = top * xSize / ySize; + } + else if (ySize > xSize) { + size = ySize; + ctx.scale(xSize / ySize, 1.0); + myLeft = left * ySize / xSize; + } + else { + size = xSize; + } + // this is still wrong + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false); + ctx[methodName](); + if (stroke) { + ctx.stroke(); + } + ctx.restore(); + } + + /** + * Render a square control, as per fabric features. + * This function is written to respect object properties like transparentCorners, cornerSize + * cornerColor, cornerStrokeColor + * plus the addition of offsetY and offsetX. + * @param {CanvasRenderingContext2D} ctx context to render on + * @param {Number} left x coordinate where the control center should be + * @param {Number} top y coordinate where the control center should be + * @param {Object} styleOverride override for fabric.Object controls style + * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls + */ + function renderSquareControl(ctx, left, top, styleOverride, fabricObject) { + styleOverride = styleOverride || {}; + var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize, + ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize, + transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ? + styleOverride.transparentCorners : fabricObject.transparentCorners, + methodName = transparentCorners ? 'stroke' : 'fill', + stroke = !transparentCorners && ( + styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor + ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2; + ctx.save(); + ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor; + ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor; + // this is still wrong + ctx.lineWidth = 1; + ctx.translate(left, top); + ctx.rotate(degreesToRadians(fabricObject.angle)); + // this does not work, and fixed with ( && ) does not make sense. + // to have real transparent corners we need the controls on upperCanvas + // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize); + ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize); + if (stroke) { + ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize); + } + ctx.restore(); + } + + controls.renderCircleControl = renderCircleControl; + controls.renderSquareControl = renderSquareControl; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }); + + function Control(options) { + for (var i in options) { + this[i] = options[i]; + } + } + + fabric.Control = Control; + + fabric.Control.prototype = /** @lends fabric.Control.prototype */ { + + /** + * keep track of control visibility. + * mainly for backward compatibility. + * if you do not want to see a control, you can remove it + * from the controlset. + * @type {Boolean} + * @default true + */ + visible: true, + + /** + * Name of the action that the control will likely execute. + * This is optional. FabricJS uses to identify what the user is doing for some + * extra optimizations. If you are writing a custom control and you want to know + * somewhere else in the code what is going on, you can use this string here. + * you can also provide a custom getActionName if your control run multiple actions + * depending on some external state. + * default to scale since is the most common, used on 4 corners by default + * @type {String} + * @default 'scale' + */ + actionName: 'scale', + + /** + * Drawing angle of the control. + * NOT used for now, but name marked as needed for internal logic + * example: to reuse the same drawing function for different rotated controls + * @type {Number} + * @default 0 + */ + angle: 0, + + /** + * Relative position of the control. X + * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities + * of the bounding box. + * @type {Number} + * @default 0 + */ + x: 0, + + /** + * Relative position of the control. Y + * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities + * of the bounding box. + * @type {Number} + * @default 0 + */ + y: 0, + + /** + * Horizontal offset of the control from the defined position. In pixels + * Positive offset moves the control to the right, negative to the left. + * It used when you want to have position of control that does not scale with + * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on + * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will + * stay 30 pixels no matter how the object is big. Another example is having 2 + * controls in the corner, that stay in the same position when the object scale. + * of the bounding box. + * @type {Number} + * @default 0 + */ + offsetX: 0, + + /** + * Vertical offset of the control from the defined position. In pixels + * Positive offset moves the control to the bottom, negative to the top. + * @type {Number} + * @default 0 + */ + offsetY: 0, + + /** + * Sets the length of the control. If null, defaults to object's cornerSize. + * Expects both sizeX and sizeY to be set when set. + * @type {?Number} + * @default null + */ + sizeX: null, + + /** + * Sets the height of the control. If null, defaults to object's cornerSize. + * Expects both sizeX and sizeY to be set when set. + * @type {?Number} + * @default null + */ + sizeY: null, + + /** + * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize. + * Expects both touchSizeX and touchSizeY to be set when set. + * @type {?Number} + * @default null + */ + touchSizeX: null, + + /** + * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize. + * Expects both touchSizeX and touchSizeY to be set when set. + * @type {?Number} + * @default null + */ + touchSizeY: null, + + /** + * Css cursor style to display when the control is hovered. + * if the method `cursorStyleHandler` is provided, this property is ignored. + * @type {String} + * @default 'crosshair' + */ + cursorStyle: 'crosshair', + + /** + * If controls has an offsetY or offsetX, draw a line that connects + * the control to the bounding box + * @type {Boolean} + * @default false + */ + withConnection: false, + + /** + * The control actionHandler, provide one to handle action ( control being moved ) + * @param {Event} eventData the native mouse event + * @param {Object} transformData properties of the current transform + * @param {Number} x x position of the cursor + * @param {Number} y y position of the cursor + * @return {Boolean} true if the action/event modified the object + */ + actionHandler: function(/* eventData, transformData, x, y */) { }, + + /** + * The control handler for mouse down, provide one to handle mouse down on control + * @param {Event} eventData the native mouse event + * @param {Object} transformData properties of the current transform + * @param {Number} x x position of the cursor + * @param {Number} y y position of the cursor + * @return {Boolean} true if the action/event modified the object + */ + mouseDownHandler: function(/* eventData, transformData, x, y */) { }, + + /** + * The control mouseUpHandler, provide one to handle an effect on mouse up. + * @param {Event} eventData the native mouse event + * @param {Object} transformData properties of the current transform + * @param {Number} x x position of the cursor + * @param {Number} y y position of the cursor + * @return {Boolean} true if the action/event modified the object + */ + mouseUpHandler: function(/* eventData, transformData, x, y */) { }, + + /** + * Returns control actionHandler + * @param {Event} eventData the native mouse event + * @param {fabric.Object} fabricObject on which the control is displayed + * @param {fabric.Control} control control for which the action handler is being asked + * @return {Function} the action handler + */ + getActionHandler: function(/* eventData, fabricObject, control */) { + return this.actionHandler; + }, + + /** + * Returns control mouseDown handler + * @param {Event} eventData the native mouse event + * @param {fabric.Object} fabricObject on which the control is displayed + * @param {fabric.Control} control control for which the action handler is being asked + * @return {Function} the action handler + */ + getMouseDownHandler: function(/* eventData, fabricObject, control */) { + return this.mouseDownHandler; + }, + + /** + * Returns control mouseUp handler + * @param {Event} eventData the native mouse event + * @param {fabric.Object} fabricObject on which the control is displayed + * @param {fabric.Control} control control for which the action handler is being asked + * @return {Function} the action handler + */ + getMouseUpHandler: function(/* eventData, fabricObject, control */) { + return this.mouseUpHandler; + }, + + /** + * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate + * function you can pass one in the constructor + * the cursorStyle property + * @param {Event} eventData the native mouse event + * @param {fabric.Control} control the current control ( likely this) + * @param {fabric.Object} object on which the control is displayed + * @return {String} + */ + cursorStyleHandler: function(eventData, control /* fabricObject */) { + return control.cursorStyle; + }, + + /** + * Returns the action name. The basic implementation just return the actionName property. + * @param {Event} eventData the native mouse event + * @param {fabric.Control} control the current control ( likely this) + * @param {fabric.Object} object on which the control is displayed + * @return {String} + */ + getActionName: function(eventData, control /* fabricObject */) { + return control.actionName; + }, + + /** + * Returns controls visibility + * @param {fabric.Object} object on which the control is displayed + * @param {String} controlKey key where the control is memorized on the + * @return {Boolean} + */ + getVisibility: function(fabricObject, controlKey) { + var objectVisibility = fabricObject._controlsVisibility; + if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') { + return objectVisibility[controlKey]; + } + return this.visible; + }, + + /** + * Sets controls visibility + * @param {Boolean} visibility for the object + * @return {Void} + */ + setVisibility: function(visibility /* name, fabricObject */) { + this.visible = visibility; + }, + + + positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) { + var point = fabric.util.transformPoint({ + x: this.x * dim.x + this.offsetX, + y: this.y * dim.y + this.offsetY }, finalMatrix); + return point; + }, + + /** + * Returns the coords for this control based on object values. + * @param {Number} objectAngle angle from the fabric object holding the control + * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if + * isTouch is true) + * @param {Number} centerX x coordinate where the control center should be + * @param {Number} centerY y coordinate where the control center should be + * @param {boolean} isTouch true if touch corner, false if normal corner + */ + calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) { + var cosHalfOffset, + sinHalfOffset, + cosHalfOffsetComp, + sinHalfOffsetComp, + xSize = (isTouch) ? this.touchSizeX : this.sizeX, + ySize = (isTouch) ? this.touchSizeY : this.sizeY; + if (xSize && ySize && xSize !== ySize) { + // handle rectangular corners + var controlTriangleAngle = Math.atan2(ySize, xSize); + var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2; + var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle); + var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle); + cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta); + sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta); + // use complementary angle for two corners + cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp); + sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp); + } + else { + // handle square corners + // use default object corner size unless size is defined + var cornerSize = (xSize && ySize) ? xSize : objectCornerSize; + /* 0.7071067812 stands for sqrt(2)/2 */ + cornerHypotenuse = cornerSize * 0.7071067812; + // complementary angles are equal since they're both 45 degrees + var newTheta = fabric.util.degreesToRadians(45 - objectAngle); + cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta); + sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta); + } + + return { + tl: { + x: centerX - sinHalfOffsetComp, + y: centerY - cosHalfOffsetComp, + }, + tr: { + x: centerX + cosHalfOffset, + y: centerY - sinHalfOffset, + }, + bl: { + x: centerX - cosHalfOffset, + y: centerY + sinHalfOffset, + }, + br: { + x: centerX + sinHalfOffsetComp, + y: centerY + cosHalfOffsetComp, + }, + }; + }, + + /** + * Render function for the control. + * When this function runs the context is unscaled. unrotate. Just retina scaled. + * all the functions will have to translate to the point left,top before starting Drawing + * if they want to draw a control where the position is detected. + * left and top are the result of the positionHandler function + * @param {RenderingContext2D} ctx the context where the control will be drawn + * @param {Number} left position of the canvas where we are about to render the control. + * @param {Number} top position of the canvas where we are about to render the control. + * @param {Object} styleOverride + * @param {fabric.Object} fabricObject the object where the control is about to be rendered + */ + render: function(ctx, left, top, styleOverride, fabricObject) { + styleOverride = styleOverride || {}; + switch (styleOverride.cornerStyle || fabricObject.cornerStyle) { + case 'circle': + fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject); + break; + default: + fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject); + } + }, + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function() { + + /* _FROM_SVG_START_ */ + function getColorStop(el, multiplier) { + var style = el.getAttribute('style'), + offset = el.getAttribute('offset') || 0, + color, colorAlpha, opacity, i; + + // convert percents to absolute values + offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1); + offset = offset < 0 ? 0 : offset > 1 ? 1 : offset; + if (style) { + var keyValuePairs = style.split(/\s*;\s*/); + + if (keyValuePairs[keyValuePairs.length - 1] === '') { + keyValuePairs.pop(); + } + + for (i = keyValuePairs.length; i--; ) { + + var split = keyValuePairs[i].split(/\s*:\s*/), + key = split[0].trim(), + value = split[1].trim(); + + if (key === 'stop-color') { + color = value; + } + else if (key === 'stop-opacity') { + opacity = value; + } + } + } + + if (!color) { + color = el.getAttribute('stop-color') || 'rgb(0,0,0)'; + } + if (!opacity) { + opacity = el.getAttribute('stop-opacity'); + } + + color = new fabric.Color(color); + colorAlpha = color.getAlpha(); + opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity); + opacity *= colorAlpha * multiplier; + + return { + offset: offset, + color: color.toRgb(), + opacity: opacity + }; + } + + function getLinearCoords(el) { + return { + x1: el.getAttribute('x1') || 0, + y1: el.getAttribute('y1') || 0, + x2: el.getAttribute('x2') || '100%', + y2: el.getAttribute('y2') || 0 + }; + } + + function getRadialCoords(el) { + return { + x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%', + y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%', + r1: 0, + x2: el.getAttribute('cx') || '50%', + y2: el.getAttribute('cy') || '50%', + r2: el.getAttribute('r') || '50%' + }; + } + /* _FROM_SVG_END_ */ + + var clone = fabric.util.object.clone; + + /** + * Gradient class + * @class fabric.Gradient + * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients} + * @see {@link fabric.Gradient#initialize} for constructor definition + */ + fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ { + + /** + * Horizontal offset for aligning gradients coming from SVG when outside pathgroups + * @type Number + * @default 0 + */ + offsetX: 0, + + /** + * Vertical offset for aligning gradients coming from SVG when outside pathgroups + * @type Number + * @default 0 + */ + offsetY: 0, + + /** + * A transform matrix to apply to the gradient before painting. + * Imported from svg gradients, is not applied with the current transform in the center. + * Before this transform is applied, the origin point is at the top left corner of the object + * plus the addition of offsetY and offsetX. + * @type Number[] + * @default null + */ + gradientTransform: null, + + /** + * coordinates units for coords. + * If `pixels`, the number of coords are in the same unit of width / height. + * If set as `percentage` the coords are still a number, but 1 means 100% of width + * for the X and 100% of the height for the y. It can be bigger than 1 and negative. + * allowed values pixels or percentage. + * @type String + * @default 'pixels' + */ + gradientUnits: 'pixels', + + /** + * Gradient type linear or radial + * @type String + * @default 'pixels' + */ + type: 'linear', + + /** + * Constructor + * @param {Object} options Options object with type, coords, gradientUnits and colorStops + * @param {Object} [options.type] gradient type linear or radial + * @param {Object} [options.gradientUnits] gradient units + * @param {Object} [options.offsetX] SVG import compatibility + * @param {Object} [options.offsetY] SVG import compatibility + * @param {Object[]} options.colorStops contains the colorstops. + * @param {Object} options.coords contains the coords of the gradient + * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial + * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial + * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial + * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial + * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle + * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle + * @return {fabric.Gradient} thisArg + */ + initialize: function(options) { + options || (options = { }); + options.coords || (options.coords = { }); + + var coords, _this = this; + + // sets everything, then coords and colorstops get sets again + Object.keys(options).forEach(function(option) { + _this[option] = options[option]; + }); + + if (this.id) { + this.id += '_' + fabric.Object.__uid++; + } + else { + this.id = fabric.Object.__uid++; + } + + coords = { + x1: options.coords.x1 || 0, + y1: options.coords.y1 || 0, + x2: options.coords.x2 || 0, + y2: options.coords.y2 || 0 + }; + + if (this.type === 'radial') { + coords.r1 = options.coords.r1 || 0; + coords.r2 = options.coords.r2 || 0; + } + + this.coords = coords; + this.colorStops = options.colorStops.slice(); + }, + + /** + * Adds another colorStop + * @param {Object} colorStop Object with offset and color + * @return {fabric.Gradient} thisArg + */ + addColorStop: function(colorStops) { + for (var position in colorStops) { + var color = new fabric.Color(colorStops[position]); + this.colorStops.push({ + offset: parseFloat(position), + color: color.toRgb(), + opacity: color.getAlpha() + }); + } + return this; + }, + + /** + * Returns object representation of a gradient + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} + */ + toObject: function(propertiesToInclude) { + var object = { + type: this.type, + coords: this.coords, + colorStops: this.colorStops, + offsetX: this.offsetX, + offsetY: this.offsetY, + gradientUnits: this.gradientUnits, + gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform + }; + fabric.util.populateWithProperties(this, object, propertiesToInclude); + + return object; + }, + + /* _TO_SVG_START_ */ + /** + * Returns SVG representation of an gradient + * @param {Object} object Object to create a gradient for + * @return {String} SVG representation of an gradient (linear/radial) + */ + toSVG: function(object, options) { + var coords = clone(this.coords, true), i, len, options = options || {}, + markup, commonAttributes, colorStops = clone(this.colorStops, true), + needsSwap = coords.r1 > coords.r2, + transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(), + offsetX = -this.offsetX, offsetY = -this.offsetY, + withViewport = !!options.additionalTransform, + gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox'; + // colorStops must be sorted ascending + colorStops.sort(function(a, b) { + return a.offset - b.offset; + }); + + if (gradientUnits === 'objectBoundingBox') { + offsetX /= object.width; + offsetY /= object.height; + } + else { + offsetX += object.width / 2; + offsetY += object.height / 2; + } + if (object.type === 'path' && this.gradientUnits !== 'percentage') { + offsetX -= object.pathOffset.x; + offsetY -= object.pathOffset.y; + } + + + transform[4] -= offsetX; + transform[5] -= offsetY; + + commonAttributes = 'id="SVGID_' + this.id + + '" gradientUnits="' + gradientUnits + '"'; + commonAttributes += ' gradientTransform="' + (withViewport ? + options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '" '; + + if (this.type === 'linear') { + markup = [ + '\n' + ]; + } + else if (this.type === 'radial') { + // svg radial gradient has just 1 radius. the biggest. + markup = [ + '\n' + ]; + } + + if (this.type === 'radial') { + if (needsSwap) { + // svg goes from internal to external radius. if radius are inverted, swap color stops. + colorStops = colorStops.concat(); + colorStops.reverse(); + for (i = 0, len = colorStops.length; i < len; i++) { + colorStops[i].offset = 1 - colorStops[i].offset; + } + } + var minRadius = Math.min(coords.r1, coords.r2); + if (minRadius > 0) { + // i have to shift all colorStops and add new one in 0. + var maxRadius = Math.max(coords.r1, coords.r2), + percentageShift = minRadius / maxRadius; + for (i = 0, len = colorStops.length; i < len; i++) { + colorStops[i].offset += percentageShift * (1 - colorStops[i].offset); + } + } + } + + for (i = 0, len = colorStops.length; i < len; i++) { + var colorStop = colorStops[i]; + markup.push( + '\n' + ); + } + + markup.push((this.type === 'linear' ? '\n' : '\n')); + + return markup.join(''); + }, + /* _TO_SVG_END_ */ + + /** + * Returns an instance of CanvasGradient + * @param {CanvasRenderingContext2D} ctx Context to render on + * @return {CanvasGradient} + */ + toLive: function(ctx) { + var gradient, coords = fabric.util.object.clone(this.coords), i, len; + + if (!this.type) { + return; + } + + if (this.type === 'linear') { + gradient = ctx.createLinearGradient( + coords.x1, coords.y1, coords.x2, coords.y2); + } + else if (this.type === 'radial') { + gradient = ctx.createRadialGradient( + coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2); + } + + for (i = 0, len = this.colorStops.length; i < len; i++) { + var color = this.colorStops[i].color, + opacity = this.colorStops[i].opacity, + offset = this.colorStops[i].offset; + + if (typeof opacity !== 'undefined') { + color = new fabric.Color(color).setAlpha(opacity).toRgba(); + } + gradient.addColorStop(offset, color); + } + + return gradient; + } + }); + + fabric.util.object.extend(fabric.Gradient, { + + /* _FROM_SVG_START_ */ + /** + * Returns {@link fabric.Gradient} instance from an SVG element + * @static + * @memberOf fabric.Gradient + * @param {SVGGradientElement} el SVG gradient element + * @param {fabric.Object} instance + * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity. + * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients + * that uses gradientUnits as 'userSpaceOnUse' and percentages. + * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg + * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg + * @param {Object.number} width width part of the svg tag if viewBox is not specified + * @param {Object.number} height height part of the svg tag if viewBox is not specified + * @return {fabric.Gradient} Gradient instance + * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement + * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement + */ + fromElement: function(el, instance, opacityAttr, svgOptions) { + /** + * @example: + * + * + * + * + * + * + * OR + * + * + * + * + * + * + * OR + * + * + * + * + * + * + * + * OR + * + * + * + * + * + * + * + */ + + var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1); + multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier; + if (isNaN(multiplier)) { + multiplier = 1; + } + + var colorStopEls = el.getElementsByTagName('stop'), + type, + gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ? + 'pixels' : 'percentage', + gradientTransform = el.getAttribute('gradientTransform') || '', + colorStops = [], + coords, i, offsetX = 0, offsetY = 0, + transformMatrix; + if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') { + type = 'linear'; + coords = getLinearCoords(el); + } + else { + type = 'radial'; + coords = getRadialCoords(el); + } + + for (i = colorStopEls.length; i--; ) { + colorStops.push(getColorStop(colorStopEls[i], multiplier)); + } + + transformMatrix = fabric.parseTransformAttribute(gradientTransform); + + __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits); + + if (gradientUnits === 'pixels') { + offsetX = -instance.left; + offsetY = -instance.top; + } + + var gradient = new fabric.Gradient({ + id: el.getAttribute('id'), + type: type, + coords: coords, + colorStops: colorStops, + gradientUnits: gradientUnits, + gradientTransform: transformMatrix, + offsetX: offsetX, + offsetY: offsetY, + }); + + return gradient; + } + /* _FROM_SVG_END_ */ + }); + + /** + * @private + */ + function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) { + var propValue, finalValue; + Object.keys(options).forEach(function(prop) { + propValue = options[prop]; + if (propValue === 'Infinity') { + finalValue = 1; + } + else if (propValue === '-Infinity') { + finalValue = 0; + } + else { + finalValue = parseFloat(options[prop], 10); + if (typeof propValue === 'string' && /^(\d+\.\d+)%|(\d+)%$/.test(propValue)) { + finalValue *= 0.01; + if (gradientUnits === 'pixels') { + // then we need to fix those percentages here in svg parsing + if (prop === 'x1' || prop === 'x2' || prop === 'r2') { + finalValue *= svgOptions.viewBoxWidth || svgOptions.width; + } + if (prop === 'y1' || prop === 'y2') { + finalValue *= svgOptions.viewBoxHeight || svgOptions.height; + } + } + } + } + options[prop] = finalValue; + }); + } +})(); +(function() { + + 'use strict'; + + var toFixed = fabric.util.toFixed; + + /** + * Pattern class + * @class fabric.Pattern + * @see {@link http://fabricjs.com/patterns|Pattern demo} + * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo} + * @see {@link fabric.Pattern#initialize} for constructor definition + */ + + + fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ { + + /** + * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat) + * @type String + * @default + */ + repeat: 'repeat', + + /** + * Pattern horizontal offset from object's left/top corner + * @type Number + * @default + */ + offsetX: 0, + + /** + * Pattern vertical offset from object's left/top corner + * @type Number + * @default + */ + offsetY: 0, + + /** + * crossOrigin value (one of "", "anonymous", "use-credentials") + * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes + * @type String + * @default + */ + crossOrigin: '', + + /** + * transform matrix to change the pattern, imported from svgs. + * @type Array + * @default + */ + patternTransform: null, + + /** + * Constructor + * @param {Object} [options] Options object + * @param {Function} [callback] function to invoke after callback init. + * @return {fabric.Pattern} thisArg + */ + initialize: function(options, callback) { + options || (options = { }); + + this.id = fabric.Object.__uid++; + this.setOptions(options); + if (!options.source || (options.source && typeof options.source !== 'string')) { + callback && callback(this); + return; + } + else { + // img src string + var _this = this; + this.source = fabric.util.createImage(); + fabric.util.loadImage(options.source, function(img, isError) { + _this.source = img; + callback && callback(_this, isError); + }, null, this.crossOrigin); + } + }, + + /** + * Returns object representation of a pattern + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of a pattern instance + */ + toObject: function(propertiesToInclude) { + var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, + source, object; + + // element + if (typeof this.source.src === 'string') { + source = this.source.src; + } + // element + else if (typeof this.source === 'object' && this.source.toDataURL) { + source = this.source.toDataURL(); + } + + object = { + type: 'pattern', + source: source, + repeat: this.repeat, + crossOrigin: this.crossOrigin, + offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS), + offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS), + patternTransform: this.patternTransform ? this.patternTransform.concat() : null + }; + fabric.util.populateWithProperties(this, object, propertiesToInclude); + + return object; + }, + + /* _TO_SVG_START_ */ + /** + * Returns SVG representation of a pattern + * @param {fabric.Object} object + * @return {String} SVG representation of a pattern + */ + toSVG: function(object) { + var patternSource = typeof this.source === 'function' ? this.source() : this.source, + patternWidth = patternSource.width / object.width, + patternHeight = patternSource.height / object.height, + patternOffsetX = this.offsetX / object.width, + patternOffsetY = this.offsetY / object.height, + patternImgSrc = ''; + if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') { + patternHeight = 1; + if (patternOffsetY) { + patternHeight += Math.abs(patternOffsetY); + } + } + if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') { + patternWidth = 1; + if (patternOffsetX) { + patternWidth += Math.abs(patternOffsetX); + } + + } + if (patternSource.src) { + patternImgSrc = patternSource.src; + } + else if (patternSource.toDataURL) { + patternImgSrc = patternSource.toDataURL(); + } + + return '\n' + + '\n' + + '\n'; + }, + /* _TO_SVG_END_ */ + + setOptions: function(options) { + for (var prop in options) { + this[prop] = options[prop]; + } + }, + + /** + * Returns an instance of CanvasPattern + * @param {CanvasRenderingContext2D} ctx Context to create pattern + * @return {CanvasPattern} + */ + toLive: function(ctx) { + var source = this.source; + // if the image failed to load, return, and allow rest to continue loading + if (!source) { + return ''; + } + + // if an image + if (typeof source.src !== 'undefined') { + if (!source.complete) { + return ''; + } + if (source.naturalWidth === 0 || source.naturalHeight === 0) { + return ''; + } + } + return ctx.createPattern(source, this.repeat); + } + }); +})(); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + toFixed = fabric.util.toFixed; + + if (fabric.Shadow) { + fabric.warn('fabric.Shadow is already defined.'); + return; + } + + /** + * Shadow class + * @class fabric.Shadow + * @see {@link http://fabricjs.com/shadows|Shadow demo} + * @see {@link fabric.Shadow#initialize} for constructor definition + */ + fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ { + + /** + * Shadow color + * @type String + * @default + */ + color: 'rgb(0,0,0)', + + /** + * Shadow blur + * @type Number + */ + blur: 0, + + /** + * Shadow horizontal offset + * @type Number + * @default + */ + offsetX: 0, + + /** + * Shadow vertical offset + * @type Number + * @default + */ + offsetY: 0, + + /** + * Whether the shadow should affect stroke operations + * @type Boolean + * @default + */ + affectStroke: false, + + /** + * Indicates whether toObject should include default values + * @type Boolean + * @default + */ + includeDefaultValues: true, + + /** + * When `false`, the shadow will scale with the object. + * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale. + * default to false + * @type Boolean + * @default + */ + nonScaling: false, + + /** + * Constructor + * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. "rgba(0,0,0,0.2) 2px 2px 10px") + * @return {fabric.Shadow} thisArg + */ + initialize: function(options) { + + if (typeof options === 'string') { + options = this._parseShadow(options); + } + + for (var prop in options) { + this[prop] = options[prop]; + } + + this.id = fabric.Object.__uid++; + }, + + /** + * @private + * @param {String} shadow Shadow value to parse + * @return {Object} Shadow object with color, offsetX, offsetY and blur + */ + _parseShadow: function(shadow) { + var shadowStr = shadow.trim(), + offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [], + color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)'; + + return { + color: color.trim(), + offsetX: parseFloat(offsetsAndBlur[1], 10) || 0, + offsetY: parseFloat(offsetsAndBlur[2], 10) || 0, + blur: parseFloat(offsetsAndBlur[3], 10) || 0 + }; + }, + + /** + * Returns a string representation of an instance + * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow + * @return {String} Returns CSS3 text-shadow declaration + */ + toString: function() { + return [this.offsetX, this.offsetY, this.blur, this.color].join('px '); + }, + + /* _TO_SVG_START_ */ + /** + * Returns SVG representation of a shadow + * @param {fabric.Object} object + * @return {String} SVG representation of a shadow + */ + toSVG: function(object) { + var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, + offset = fabric.util.rotateVector( + { x: this.offsetX, y: this.offsetY }, + fabric.util.degreesToRadians(-object.angle)), + BLUR_BOX = 20, color = new fabric.Color(this.color); + + if (object.width && object.height) { + //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion + // we add some extra space to filter box to contain the blur ( 20 ) + fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX; + fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX; + } + if (object.flipX) { + offset.x *= -1; + } + if (object.flipY) { + offset.y *= -1; + } + + return ( + '\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\t\n' + + '\t\t\n' + + '\t\t\n' + + '\t\n' + + '\n'); + }, + /* _TO_SVG_END_ */ + + /** + * Returns object representation of a shadow + * @return {Object} Object representation of a shadow instance + */ + toObject: function() { + if (this.includeDefaultValues) { + return { + color: this.color, + blur: this.blur, + offsetX: this.offsetX, + offsetY: this.offsetY, + affectStroke: this.affectStroke, + nonScaling: this.nonScaling + }; + } + var obj = { }, proto = fabric.Shadow.prototype; + + ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) { + if (this[prop] !== proto[prop]) { + obj[prop] = this[prop]; + } + }, this); + + return obj; + } + }); + + /** + * Regex matching shadow offsetX, offsetY and blur (ex: "2px 2px 10px rgba(0,0,0,0.2)", "rgb(0,255,0) 2px 2px") + * @static + * @field + * @memberOf fabric.Shadow + */ + // eslint-disable-next-line max-len + fabric.Shadow.reOffsetsAndBlur = /(?:\s|^)(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(\d+(?:\.\d*)?(?:px)?)?(?:\s?|$)(?:$|\s)/; + +})(typeof exports !== 'undefined' ? exports : this); +(function () { + + 'use strict'; + + if (fabric.StaticCanvas) { + fabric.warn('fabric.StaticCanvas is already defined.'); + return; + } + + // aliases for faster resolution + var extend = fabric.util.object.extend, + getElementOffset = fabric.util.getElementOffset, + removeFromArray = fabric.util.removeFromArray, + toFixed = fabric.util.toFixed, + transformPoint = fabric.util.transformPoint, + invertTransform = fabric.util.invertTransform, + getNodeCanvas = fabric.util.getNodeCanvas, + createCanvasElement = fabric.util.createCanvasElement, + + CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element'); + + /** + * Static canvas class + * @class fabric.StaticCanvas + * @mixes fabric.Collection + * @mixes fabric.Observable + * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo} + * @see {@link fabric.StaticCanvas#initialize} for constructor definition + * @fires before:render + * @fires after:render + * @fires canvas:cleared + * @fires object:added + * @fires object:removed + */ + fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ { + + /** + * Constructor + * @param {HTMLElement | String} el <canvas> element to initialize instance on + * @param {Object} [options] Options object + * @return {Object} thisArg + */ + initialize: function(el, options) { + options || (options = { }); + this.renderAndResetBound = this.renderAndReset.bind(this); + this.requestRenderAllBound = this.requestRenderAll.bind(this); + this._initStatic(el, options); + }, + + /** + * Background color of canvas instance. + * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}. + * @type {(String|fabric.Pattern)} + * @default + */ + backgroundColor: '', + + /** + * Background image of canvas instance. + * since 2.4.0 image caching is active, please when putting an image as background, add to the + * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom + * vale. As an alternative you can disable image objectCaching + * @type fabric.Image + * @default + */ + backgroundImage: null, + + /** + * Overlay color of canvas instance. + * Should be set via {@link fabric.StaticCanvas#setOverlayColor} + * @since 1.3.9 + * @type {(String|fabric.Pattern)} + * @default + */ + overlayColor: '', + + /** + * Overlay image of canvas instance. + * since 2.4.0 image caching is active, please when putting an image as overlay, add to the + * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom + * vale. As an alternative you can disable image objectCaching + * @type fabric.Image + * @default + */ + overlayImage: null, + + /** + * Indicates whether toObject/toDatalessObject should include default values + * if set to false, takes precedence over the object value. + * @type Boolean + * @default + */ + includeDefaultValues: true, + + /** + * Indicates whether objects' state should be saved + * @type Boolean + * @default + */ + stateful: false, + + /** + * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove}, + * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas. + * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once + * since the renders are quequed and executed one per frame. + * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() ) + * Left default to true to do not break documentation and old app, fiddles. + * @type Boolean + * @default + */ + renderOnAddRemove: true, + + /** + * Indicates whether object controls (borders/controls) are rendered above overlay image + * @type Boolean + * @default + */ + controlsAboveOverlay: false, + + /** + * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas + * @type Boolean + * @default + */ + allowTouchScrolling: false, + + /** + * Indicates whether this canvas will use image smoothing, this is on by default in browsers + * @type Boolean + * @default + */ + imageSmoothingEnabled: true, + + /** + * The transformation (a Canvas 2D API transform matrix) which focuses the viewport + * @type Array + * @example Default transform + * canvas.viewportTransform = [1, 0, 0, 1, 0, 0]; + * @example Scale by 70% and translate toward bottom-right by 50, without skewing + * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50]; + * @default + */ + viewportTransform: fabric.iMatrix.concat(), + + /** + * if set to false background image is not affected by viewport transform + * @since 1.6.3 + * @type Boolean + * @default + */ + backgroundVpt: true, + + /** + * if set to false overlya image is not affected by viewport transform + * @since 1.6.3 + * @type Boolean + * @default + */ + overlayVpt: true, + + /** + * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens + * @type Boolean + * @default + */ + enableRetinaScaling: true, + + /** + * Describe canvas element extension over design + * properties are tl,tr,bl,br. + * if canvas is not zoomed/panned those points are the four corner of canvas + * if canvas is viewportTransformed you those points indicate the extension + * of canvas element in plain untrasformed coordinates + * The coordinates get updated with @method calcViewportBoundaries. + * @memberOf fabric.StaticCanvas.prototype + */ + vptCoords: { }, + + /** + * Based on vptCoords and object.aCoords, skip rendering of objects that + * are not included in current viewport. + * May greatly help in applications with crowded canvas and use of zoom/pan + * If One of the corner of the bounding box of the object is on the canvas + * the objects get rendered. + * @memberOf fabric.StaticCanvas.prototype + * @type Boolean + * @default + */ + skipOffscreen: true, + + /** + * a fabricObject that, without stroke define a clipping area with their shape. filled in black + * the clipPath object gets used when the canvas has rendered, and the context is placed in the + * top left corner of the canvas. + * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true + * @type fabric.Object + */ + clipPath: undefined, + + /** + * @private + * @param {HTMLElement | String} el <canvas> element to initialize instance on + * @param {Object} [options] Options object + */ + _initStatic: function(el, options) { + var cb = this.requestRenderAllBound; + this._objects = []; + this._createLowerCanvas(el); + this._initOptions(options); + // only initialize retina scaling once + if (!this.interactive) { + this._initRetinaScaling(); + } + + if (options.overlayImage) { + this.setOverlayImage(options.overlayImage, cb); + } + if (options.backgroundImage) { + this.setBackgroundImage(options.backgroundImage, cb); + } + if (options.backgroundColor) { + this.setBackgroundColor(options.backgroundColor, cb); + } + if (options.overlayColor) { + this.setOverlayColor(options.overlayColor, cb); + } + this.calcOffset(); + }, + + /** + * @private + */ + _isRetinaScaling: function() { + return (fabric.devicePixelRatio > 1 && this.enableRetinaScaling); + }, + + /** + * @private + * @return {Number} retinaScaling if applied, otherwise 1; + */ + getRetinaScaling: function() { + return this._isRetinaScaling() ? Math.max(1, fabric.devicePixelRatio) : 1; + }, + + /** + * @private + */ + _initRetinaScaling: function() { + if (!this._isRetinaScaling()) { + return; + } + var scaleRatio = fabric.devicePixelRatio; + this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer); + if (this.upperCanvasEl) { + this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop); + } + }, + + __initRetinaScaling: function(scaleRatio, canvas, context) { + canvas.setAttribute('width', this.width * scaleRatio); + canvas.setAttribute('height', this.height * scaleRatio); + context.scale(scaleRatio, scaleRatio); + }, + + + /** + * Calculates canvas element offset relative to the document + * This method is also attached as "resize" event handler of window + * @return {fabric.Canvas} instance + * @chainable + */ + calcOffset: function () { + this._offset = getElementOffset(this.lowerCanvasEl); + return this; + }, + + /** + * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas + * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to + * @param {Function} callback callback to invoke when image is loaded and set as an overlay + * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}. + * @return {fabric.Canvas} thisArg + * @chainable + * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo} + * @example Normal overlayImage with left/top = 0 + * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { + * // Needed to position overlayImage at 0/0 + * originX: 'left', + * originY: 'top' + * }); + * @example overlayImage with different properties + * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top' + * }); + * @example Stretched overlayImage #1 - width/height correspond to canvas width/height + * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) { + * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'}); + * canvas.setOverlayImage(img, canvas.renderAll.bind(canvas)); + * }); + * @example Stretched overlayImage #2 - width/height correspond to canvas width/height + * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { + * width: canvas.width, + * height: canvas.height, + * // Needed to position overlayImage at 0/0 + * originX: 'left', + * originY: 'top' + * }); + * @example overlayImage loaded from cross-origin + * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top', + * crossOrigin: 'anonymous' + * }); + */ + setOverlayImage: function (image, callback, options) { + return this.__setBgOverlayImage('overlayImage', image, callback, options); + }, + + /** + * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas + * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to + * @param {Function} callback Callback to invoke when image is loaded and set as background + * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}. + * @return {fabric.Canvas} thisArg + * @chainable + * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo} + * @example Normal backgroundImage with left/top = 0 + * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { + * // Needed to position backgroundImage at 0/0 + * originX: 'left', + * originY: 'top' + * }); + * @example backgroundImage with different properties + * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top' + * }); + * @example Stretched backgroundImage #1 - width/height correspond to canvas width/height + * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) { + * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'}); + * canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas)); + * }); + * @example Stretched backgroundImage #2 - width/height correspond to canvas width/height + * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { + * width: canvas.width, + * height: canvas.height, + * // Needed to position backgroundImage at 0/0 + * originX: 'left', + * originY: 'top' + * }); + * @example backgroundImage loaded from cross-origin + * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { + * opacity: 0.5, + * angle: 45, + * left: 400, + * top: 400, + * originX: 'left', + * originY: 'top', + * crossOrigin: 'anonymous' + * }); + */ + // TODO: fix stretched examples + setBackgroundImage: function (image, callback, options) { + return this.__setBgOverlayImage('backgroundImage', image, callback, options); + }, + + /** + * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas + * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to + * @param {Function} callback Callback to invoke when foreground color is set + * @return {fabric.Canvas} thisArg + * @chainable + * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo} + * @example Normal overlayColor - color value + * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas)); + * @example fabric.Pattern used as overlayColor + * canvas.setOverlayColor({ + * source: 'http://fabricjs.com/assets/escheresque_ste.png' + * }, canvas.renderAll.bind(canvas)); + * @example fabric.Pattern used as overlayColor with repeat and offset + * canvas.setOverlayColor({ + * source: 'http://fabricjs.com/assets/escheresque_ste.png', + * repeat: 'repeat', + * offsetX: 200, + * offsetY: 100 + * }, canvas.renderAll.bind(canvas)); + */ + setOverlayColor: function(overlayColor, callback) { + return this.__setBgOverlayColor('overlayColor', overlayColor, callback); + }, + + /** + * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas + * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to + * @param {Function} callback Callback to invoke when background color is set + * @return {fabric.Canvas} thisArg + * @chainable + * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo} + * @example Normal backgroundColor - color value + * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas)); + * @example fabric.Pattern used as backgroundColor + * canvas.setBackgroundColor({ + * source: 'http://fabricjs.com/assets/escheresque_ste.png' + * }, canvas.renderAll.bind(canvas)); + * @example fabric.Pattern used as backgroundColor with repeat and offset + * canvas.setBackgroundColor({ + * source: 'http://fabricjs.com/assets/escheresque_ste.png', + * repeat: 'repeat', + * offsetX: 200, + * offsetY: 100 + * }, canvas.renderAll.bind(canvas)); + */ + setBackgroundColor: function(backgroundColor, callback) { + return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback); + }, + + /** + * @private + * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage} + * or {@link fabric.StaticCanvas#overlayImage|overlayImage}) + * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to + * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not. + * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}. + */ + __setBgOverlayImage: function(property, image, callback, options) { + if (typeof image === 'string') { + fabric.util.loadImage(image, function(img, isError) { + if (img) { + var instance = new fabric.Image(img, options); + this[property] = instance; + instance.canvas = this; + } + callback && callback(img, isError); + }, this, options && options.crossOrigin); + } + else { + options && image.setOptions(options); + this[property] = image; + image && (image.canvas = this); + callback && callback(image, false); + } + + return this; + }, + + /** + * @private + * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor} + * or {@link fabric.StaticCanvas#overlayColor|overlayColor}) + * @param {(Object|String|null)} color Object with pattern information, color value or null + * @param {Function} [callback] Callback is invoked when color is set + */ + __setBgOverlayColor: function(property, color, callback) { + this[property] = color; + this._initGradient(color, property); + this._initPattern(color, property, callback); + return this; + }, + + /** + * @private + */ + _createCanvasElement: function() { + var element = createCanvasElement(); + if (!element) { + throw CANVAS_INIT_ERROR; + } + if (!element.style) { + element.style = { }; + } + if (typeof element.getContext === 'undefined') { + throw CANVAS_INIT_ERROR; + } + return element; + }, + + /** + * @private + * @param {Object} [options] Options object + */ + _initOptions: function (options) { + var lowerCanvasEl = this.lowerCanvasEl; + this._setOptions(options); + + this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0; + this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0; + + if (!this.lowerCanvasEl.style) { + return; + } + + lowerCanvasEl.width = this.width; + lowerCanvasEl.height = this.height; + + lowerCanvasEl.style.width = this.width + 'px'; + lowerCanvasEl.style.height = this.height + 'px'; + + this.viewportTransform = this.viewportTransform.slice(); + }, + + /** + * Creates a bottom canvas + * @private + * @param {HTMLElement} [canvasEl] + */ + _createLowerCanvas: function (canvasEl) { + // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node + if (canvasEl && canvasEl.getContext) { + this.lowerCanvasEl = canvasEl; + } + else { + this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement(); + } + + fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas'); + this._originalCanvasStyle = this.lowerCanvasEl.style; + if (this.interactive) { + this._applyCanvasStyle(this.lowerCanvasEl); + } + + this.contextContainer = this.lowerCanvasEl.getContext('2d'); + }, + + /** + * Returns canvas width (in px) + * @return {Number} + */ + getWidth: function () { + return this.width; + }, + + /** + * Returns canvas height (in px) + * @return {Number} + */ + getHeight: function () { + return this.height; + }, + + /** + * Sets width of this canvas instance + * @param {Number|String} value Value to set width to + * @param {Object} [options] Options object + * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions + * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions + * @return {fabric.Canvas} instance + * @chainable true + */ + setWidth: function (value, options) { + return this.setDimensions({ width: value }, options); + }, + + /** + * Sets height of this canvas instance + * @param {Number|String} value Value to set height to + * @param {Object} [options] Options object + * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions + * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions + * @return {fabric.Canvas} instance + * @chainable true + */ + setHeight: function (value, options) { + return this.setDimensions({ height: value }, options); + }, + + /** + * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em) + * @param {Object} dimensions Object with width/height properties + * @param {Number|String} [dimensions.width] Width of canvas element + * @param {Number|String} [dimensions.height] Height of canvas element + * @param {Object} [options] Options object + * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions + * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions + * @return {fabric.Canvas} thisArg + * @chainable + */ + setDimensions: function (dimensions, options) { + var cssValue; + + options = options || {}; + + for (var prop in dimensions) { + cssValue = dimensions[prop]; + + if (!options.cssOnly) { + this._setBackstoreDimension(prop, dimensions[prop]); + cssValue += 'px'; + this.hasLostContext = true; + } + + if (!options.backstoreOnly) { + this._setCssDimension(prop, cssValue); + } + } + if (this._isCurrentlyDrawing) { + this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles(this.contextTop); + } + this._initRetinaScaling(); + this.calcOffset(); + + if (!options.cssOnly) { + this.requestRenderAll(); + } + + return this; + }, + + /** + * Helper for setting width/height + * @private + * @param {String} prop property (width|height) + * @param {Number} value value to set property to + * @return {fabric.Canvas} instance + * @chainable true + */ + _setBackstoreDimension: function (prop, value) { + this.lowerCanvasEl[prop] = value; + + if (this.upperCanvasEl) { + this.upperCanvasEl[prop] = value; + } + + if (this.cacheCanvasEl) { + this.cacheCanvasEl[prop] = value; + } + + this[prop] = value; + + return this; + }, + + /** + * Helper for setting css width/height + * @private + * @param {String} prop property (width|height) + * @param {String} value value to set property to + * @return {fabric.Canvas} instance + * @chainable true + */ + _setCssDimension: function (prop, value) { + this.lowerCanvasEl.style[prop] = value; + + if (this.upperCanvasEl) { + this.upperCanvasEl.style[prop] = value; + } + + if (this.wrapperEl) { + this.wrapperEl.style[prop] = value; + } + + return this; + }, + + /** + * Returns canvas zoom level + * @return {Number} + */ + getZoom: function () { + return this.viewportTransform[0]; + }, + + /** + * Sets viewport transformation of this canvas instance + * @param {Array} vpt a Canvas 2D API transform matrix + * @return {fabric.Canvas} instance + * @chainable true + */ + setViewportTransform: function (vpt) { + var activeObject = this._activeObject, + backgroundObject = this.backgroundImage, + overlayObject = this.overlayImage, + object, i, len; + this.viewportTransform = vpt; + for (i = 0, len = this._objects.length; i < len; i++) { + object = this._objects[i]; + object.group || object.setCoords(true); + } + if (activeObject) { + activeObject.setCoords(); + } + if (backgroundObject) { + backgroundObject.setCoords(true); + } + if (overlayObject) { + overlayObject.setCoords(true); + } + this.calcViewportBoundaries(); + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * Sets zoom level of this canvas instance, the zoom centered around point + * meaning that following zoom to point with the same point will have the visual + * effect of the zoom originating from that point. The point won't move. + * It has nothing to do with canvas center or visual center of the viewport. + * @param {fabric.Point} point to zoom with respect to + * @param {Number} value to set zoom to, less than 1 zooms out + * @return {fabric.Canvas} instance + * @chainable true + */ + zoomToPoint: function (point, value) { + // TODO: just change the scale, preserve other transformations + var before = point, vpt = this.viewportTransform.slice(0); + point = transformPoint(point, invertTransform(this.viewportTransform)); + vpt[0] = value; + vpt[3] = value; + var after = transformPoint(point, vpt); + vpt[4] += before.x - after.x; + vpt[5] += before.y - after.y; + return this.setViewportTransform(vpt); + }, + + /** + * Sets zoom level of this canvas instance + * @param {Number} value to set zoom to, less than 1 zooms out + * @return {fabric.Canvas} instance + * @chainable true + */ + setZoom: function (value) { + this.zoomToPoint(new fabric.Point(0, 0), value); + return this; + }, + + /** + * Pan viewport so as to place point at top left corner of canvas + * @param {fabric.Point} point to move to + * @return {fabric.Canvas} instance + * @chainable true + */ + absolutePan: function (point) { + var vpt = this.viewportTransform.slice(0); + vpt[4] = -point.x; + vpt[5] = -point.y; + return this.setViewportTransform(vpt); + }, + + /** + * Pans viewpoint relatively + * @param {fabric.Point} point (position vector) to move by + * @return {fabric.Canvas} instance + * @chainable true + */ + relativePan: function (point) { + return this.absolutePan(new fabric.Point( + -point.x - this.viewportTransform[4], + -point.y - this.viewportTransform[5] + )); + }, + + /** + * Returns <canvas> element corresponding to this instance + * @return {HTMLCanvasElement} + */ + getElement: function () { + return this.lowerCanvasEl; + }, + + /** + * @private + * @param {fabric.Object} obj Object that was added + */ + _onObjectAdded: function(obj) { + this.stateful && obj.setupState(); + obj._set('canvas', this); + obj.setCoords(); + this.fire('object:added', { target: obj }); + obj.fire('added'); + }, + + /** + * @private + * @param {fabric.Object} obj Object that was removed + */ + _onObjectRemoved: function(obj) { + this.fire('object:removed', { target: obj }); + obj.fire('removed'); + delete obj.canvas; + }, + + /** + * Clears specified context of canvas element + * @param {CanvasRenderingContext2D} ctx Context to clear + * @return {fabric.Canvas} thisArg + * @chainable + */ + clearContext: function(ctx) { + ctx.clearRect(0, 0, this.width, this.height); + return this; + }, + + /** + * Returns context of canvas where objects are drawn + * @return {CanvasRenderingContext2D} + */ + getContext: function () { + return this.contextContainer; + }, + + /** + * Clears all contexts (background, main, top) of an instance + * @return {fabric.Canvas} thisArg + * @chainable + */ + clear: function () { + this.remove.apply(this, this.getObjects()); + this.backgroundImage = null; + this.overlayImage = null; + this.backgroundColor = ''; + this.overlayColor = ''; + if (this._hasITextHandlers) { + this.off('mouse:up', this._mouseUpITextHandler); + this._iTextInstances = null; + this._hasITextHandlers = false; + } + this.clearContext(this.contextContainer); + this.fire('canvas:cleared'); + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * Renders the canvas + * @return {fabric.Canvas} instance + * @chainable + */ + renderAll: function () { + var canvasToDrawOn = this.contextContainer; + this.renderCanvas(canvasToDrawOn, this._objects); + return this; + }, + + /** + * Function created to be instance bound at initialization + * used in requestAnimationFrame rendering + * Let the fabricJS call it. If you call it manually you could have more + * animationFrame stacking on to of each other + * for an imperative rendering, use canvas.renderAll + * @private + * @return {fabric.Canvas} instance + * @chainable + */ + renderAndReset: function() { + this.isRendering = 0; + this.renderAll(); + }, + + /** + * Append a renderAll request to next animation frame. + * unless one is already in progress, in that case nothing is done + * a boolean flag will avoid appending more. + * @return {fabric.Canvas} instance + * @chainable + */ + requestRenderAll: function () { + if (!this.isRendering) { + this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound); + } + return this; + }, + + /** + * Calculate the position of the 4 corner of canvas with current viewportTransform. + * helps to determinate when an object is in the current rendering viewport using + * object absolute coordinates ( aCoords ) + * @return {Object} points.tl + * @chainable + */ + calcViewportBoundaries: function() { + var points = { }, width = this.width, height = this.height, + iVpt = invertTransform(this.viewportTransform); + points.tl = transformPoint({ x: 0, y: 0 }, iVpt); + points.br = transformPoint({ x: width, y: height }, iVpt); + points.tr = new fabric.Point(points.br.x, points.tl.y); + points.bl = new fabric.Point(points.tl.x, points.br.y); + this.vptCoords = points; + return points; + }, + + cancelRequestedRender: function() { + if (this.isRendering) { + fabric.util.cancelAnimFrame(this.isRendering); + this.isRendering = 0; + } + }, + + /** + * Renders background, objects, overlay and controls. + * @param {CanvasRenderingContext2D} ctx + * @param {Array} objects to render + * @return {fabric.Canvas} instance + * @chainable + */ + renderCanvas: function(ctx, objects) { + var v = this.viewportTransform, path = this.clipPath; + this.cancelRequestedRender(); + this.calcViewportBoundaries(); + this.clearContext(ctx); + fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled); + this.fire('before:render', { ctx: ctx, }); + this._renderBackground(ctx); + + ctx.save(); + //apply viewport transform once for all rendering process + ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); + this._renderObjects(ctx, objects); + ctx.restore(); + if (!this.controlsAboveOverlay && this.interactive) { + this.drawControls(ctx); + } + if (path) { + path.canvas = this; + // needed to setup a couple of variables + path.shouldCache(); + path._transformDone = true; + path.renderCache({ forClipping: true }); + this.drawClipPathOnCanvas(ctx); + } + this._renderOverlay(ctx); + if (this.controlsAboveOverlay && this.interactive) { + this.drawControls(ctx); + } + this.fire('after:render', { ctx: ctx, }); + }, + + /** + * Paint the cached clipPath on the lowerCanvasEl + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + drawClipPathOnCanvas: function(ctx) { + var v = this.viewportTransform, path = this.clipPath; + ctx.save(); + ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); + // DEBUG: uncomment this line, comment the following + // ctx.globalAlpha = 0.4; + ctx.globalCompositeOperation = 'destination-in'; + path.transform(ctx); + ctx.scale(1 / path.zoomX, 1 / path.zoomY); + ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY); + ctx.restore(); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Array} objects to render + */ + _renderObjects: function(ctx, objects) { + var i, len; + for (i = 0, len = objects.length; i < len; ++i) { + objects[i] && objects[i].render(ctx); + } + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {string} property 'background' or 'overlay' + */ + _renderBackgroundOrOverlay: function(ctx, property) { + var fill = this[property + 'Color'], object = this[property + 'Image'], + v = this.viewportTransform, needsVpt = this[property + 'Vpt']; + if (!fill && !object) { + return; + } + if (fill) { + ctx.save(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(this.width, 0); + ctx.lineTo(this.width, this.height); + ctx.lineTo(0, this.height); + ctx.closePath(); + ctx.fillStyle = fill.toLive + ? fill.toLive(ctx, this) + : fill; + if (needsVpt) { + ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); + } + ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0); + var m = fill.gradientTransform || fill.patternTransform; + m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + ctx.fill(); + ctx.restore(); + } + if (object) { + ctx.save(); + if (needsVpt) { + ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); + } + object.render(ctx); + ctx.restore(); + } + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderBackground: function(ctx) { + this._renderBackgroundOrOverlay(ctx, 'background'); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderOverlay: function(ctx) { + this._renderBackgroundOrOverlay(ctx, 'overlay'); + }, + + /** + * Returns coordinates of a center of canvas. + * Returned value is an object with top and left properties + * @return {Object} object with "top" and "left" number values + * @deprecated migrate to `getCenterPoint` + */ + getCenter: function () { + return { + top: this.height / 2, + left: this.width / 2 + }; + }, + + /** + * Returns coordinates of a center of canvas. + * @return {fabric.Point} + */ + getCenterPoint: function () { + return new fabric.Point(this.width / 2, this.height / 2); + }, + + /** + * Centers object horizontally in the canvas + * @param {fabric.Object} object Object to center horizontally + * @return {fabric.Canvas} thisArg + */ + centerObjectH: function (object) { + return this._centerObject(object, new fabric.Point(this.getCenterPoint().x, object.getCenterPoint().y)); + }, + + /** + * Centers object vertically in the canvas + * @param {fabric.Object} object Object to center vertically + * @return {fabric.Canvas} thisArg + * @chainable + */ + centerObjectV: function (object) { + return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenterPoint().y)); + }, + + /** + * Centers object vertically and horizontally in the canvas + * @param {fabric.Object} object Object to center vertically and horizontally + * @return {fabric.Canvas} thisArg + * @chainable + */ + centerObject: function(object) { + var center = this.getCenterPoint(); + return this._centerObject(object, center); + }, + + /** + * Centers object vertically and horizontally in the viewport + * @param {fabric.Object} object Object to center vertically and horizontally + * @return {fabric.Canvas} thisArg + * @chainable + */ + viewportCenterObject: function(object) { + var vpCenter = this.getVpCenter(); + return this._centerObject(object, vpCenter); + }, + + /** + * Centers object horizontally in the viewport, object.top is unchanged + * @param {fabric.Object} object Object to center vertically and horizontally + * @return {fabric.Canvas} thisArg + * @chainable + */ + viewportCenterObjectH: function(object) { + var vpCenter = this.getVpCenter(); + this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y)); + return this; + }, + + /** + * Centers object Vertically in the viewport, object.top is unchanged + * @param {fabric.Object} object Object to center vertically and horizontally + * @return {fabric.Canvas} thisArg + * @chainable + */ + viewportCenterObjectV: function(object) { + var vpCenter = this.getVpCenter(); + + return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y)); + }, + + /** + * Calculate the point in canvas that correspond to the center of actual viewport. + * @return {fabric.Point} vpCenter, viewport center + * @chainable + */ + getVpCenter: function() { + var center = this.getCenterPoint(), + iVpt = invertTransform(this.viewportTransform); + return transformPoint(center, iVpt); + }, + + /** + * @private + * @param {fabric.Object} object Object to center + * @param {fabric.Point} center Center point + * @return {fabric.Canvas} thisArg + * @chainable + */ + _centerObject: function(object, center) { + object.setPositionByOrigin(center, 'center', 'center'); + object.setCoords(); + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * Returns dataless JSON representation of canvas + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {String} json string + */ + toDatalessJSON: function (propertiesToInclude) { + return this.toDatalessObject(propertiesToInclude); + }, + + /** + * Returns object representation of canvas + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function (propertiesToInclude) { + return this._toObjectMethod('toObject', propertiesToInclude); + }, + + /** + * Returns dataless object representation of canvas + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toDatalessObject: function (propertiesToInclude) { + return this._toObjectMethod('toDatalessObject', propertiesToInclude); + }, + + /** + * @private + */ + _toObjectMethod: function (methodName, propertiesToInclude) { + + var clipPath = this.clipPath, data = { + version: fabric.version, + objects: this._toObjects(methodName, propertiesToInclude), + }; + if (clipPath && !clipPath.excludeFromExport) { + data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude); + } + extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude)); + + fabric.util.populateWithProperties(this, data, propertiesToInclude); + + return data; + }, + + /** + * @private + */ + _toObjects: function(methodName, propertiesToInclude) { + return this._objects.filter(function(object) { + return !object.excludeFromExport; + }).map(function(instance) { + return this._toObject(instance, methodName, propertiesToInclude); + }, this); + }, + + /** + * @private + */ + _toObject: function(instance, methodName, propertiesToInclude) { + var originalValue; + + if (!this.includeDefaultValues) { + originalValue = instance.includeDefaultValues; + instance.includeDefaultValues = false; + } + + var object = instance[methodName](propertiesToInclude); + if (!this.includeDefaultValues) { + instance.includeDefaultValues = originalValue; + } + return object; + }, + + /** + * @private + */ + __serializeBgOverlay: function(methodName, propertiesToInclude) { + var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage, + bgColor = this.backgroundColor, overlayColor = this.overlayColor; + + if (bgColor && bgColor.toObject) { + if (!bgColor.excludeFromExport) { + data.background = bgColor.toObject(propertiesToInclude); + } + } + else if (bgColor) { + data.background = bgColor; + } + + if (overlayColor && overlayColor.toObject) { + if (!overlayColor.excludeFromExport) { + data.overlay = overlayColor.toObject(propertiesToInclude); + } + } + else if (overlayColor) { + data.overlay = overlayColor; + } + + if (bgImage && !bgImage.excludeFromExport) { + data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude); + } + if (overlayImage && !overlayImage.excludeFromExport) { + data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude); + } + + return data; + }, + + /* _TO_SVG_START_ */ + /** + * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true, + * a zoomed canvas will then produce zoomed SVG output. + * @type Boolean + * @default + */ + svgViewportTransformation: true, + + /** + * Returns SVG representation of canvas + * @function + * @param {Object} [options] Options object for SVG output + * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included + * @param {Object} [options.viewBox] SVG viewbox object + * @param {Number} [options.viewBox.x] x-coordinate of viewbox + * @param {Number} [options.viewBox.y] y-coordinate of viewbox + * @param {Number} [options.viewBox.width] Width of viewbox + * @param {Number} [options.viewBox.height] Height of viewbox + * @param {String} [options.encoding=UTF-8] Encoding of SVG output + * @param {String} [options.width] desired width of svg with or without units + * @param {String} [options.height] desired height of svg with or without units + * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation. + * @return {String} SVG string + * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} + * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo} + * @example Normal SVG output + * var svg = canvas.toSVG(); + * @example SVG output without preamble (without <?xml ../>) + * var svg = canvas.toSVG({suppressPreamble: true}); + * @example SVG output with viewBox attribute + * var svg = canvas.toSVG({ + * viewBox: { + * x: 100, + * y: 100, + * width: 200, + * height: 300 + * } + * }); + * @example SVG output with different encoding (default: UTF-8) + * var svg = canvas.toSVG({encoding: 'ISO-8859-1'}); + * @example Modify SVG output with reviver function + * var svg = canvas.toSVG(null, function(svg) { + * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', ''); + * }); + */ + toSVG: function(options, reviver) { + options || (options = { }); + options.reviver = reviver; + var markup = []; + + this._setSVGPreamble(markup, options); + this._setSVGHeader(markup, options); + if (this.clipPath) { + markup.push('\n'); + } + this._setSVGBgOverlayColor(markup, 'background'); + this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver); + this._setSVGObjects(markup, reviver); + if (this.clipPath) { + markup.push('\n'); + } + this._setSVGBgOverlayColor(markup, 'overlay'); + this._setSVGBgOverlayImage(markup, 'overlayImage', reviver); + + markup.push(''); + + return markup.join(''); + }, + + /** + * @private + */ + _setSVGPreamble: function(markup, options) { + if (options.suppressPreamble) { + return; + } + markup.push( + '\n', + '\n' + ); + }, + + /** + * @private + */ + _setSVGHeader: function(markup, options) { + var width = options.width || this.width, + height = options.height || this.height, + vpt, viewBox = 'viewBox="0 0 ' + this.width + ' ' + this.height + '" ', + NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; + + if (options.viewBox) { + viewBox = 'viewBox="' + + options.viewBox.x + ' ' + + options.viewBox.y + ' ' + + options.viewBox.width + ' ' + + options.viewBox.height + '" '; + } + else { + if (this.svgViewportTransformation) { + vpt = this.viewportTransform; + viewBox = 'viewBox="' + + toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' + + toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' + + toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' + + toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '" '; + } + } + + markup.push( + '\n', + 'Created with Fabric.js ', fabric.version, '\n', + '\n', + this.createSVGFontFacesMarkup(), + this.createSVGRefElementsMarkup(), + this.createSVGClipPathMarkup(options), + '\n' + ); + }, + + createSVGClipPathMarkup: function(options) { + var clipPath = this.clipPath; + if (clipPath) { + clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++; + return '\n' + + this.clipPath.toClipPathSVG(options.reviver) + + '\n'; + } + return ''; + }, + + /** + * Creates markup containing SVG referenced elements like patterns, gradients etc. + * @return {String} + */ + createSVGRefElementsMarkup: function() { + var _this = this, + markup = ['background', 'overlay'].map(function(prop) { + var fill = _this[prop + 'Color']; + if (fill && fill.toLive) { + var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform, + object = { + width: _this.width / (shouldTransform ? vpt[0] : 1), + height: _this.height / (shouldTransform ? vpt[3] : 1) + }; + return fill.toSVG( + object, + { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' } + ); + } + }); + return markup.join(''); + }, + + /** + * Creates markup containing SVG font faces, + * font URLs for font faces must be collected by developers + * and are not extracted from the DOM by fabricjs + * @param {Array} objects Array of fabric objects + * @return {String} + */ + createSVGFontFacesMarkup: function() { + var markup = '', fontList = { }, obj, fontFamily, + style, row, rowIndex, _char, charIndex, i, len, + fontPaths = fabric.fontPaths, objects = []; + + this._objects.forEach(function add(object) { + objects.push(object); + if (object._objects) { + object._objects.forEach(add); + } + }); + + for (i = 0, len = objects.length; i < len; i++) { + obj = objects[i]; + fontFamily = obj.fontFamily; + if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) { + continue; + } + fontList[fontFamily] = true; + if (!obj.styles) { + continue; + } + style = obj.styles; + for (rowIndex in style) { + row = style[rowIndex]; + for (charIndex in row) { + _char = row[charIndex]; + fontFamily = _char.fontFamily; + if (!fontList[fontFamily] && fontPaths[fontFamily]) { + fontList[fontFamily] = true; + } + } + } + } + + for (var j in fontList) { + markup += [ + '\t\t@font-face {\n', + '\t\t\tfont-family: \'', j, '\';\n', + '\t\t\tsrc: url(\'', fontPaths[j], '\');\n', + '\t\t}\n' + ].join(''); + } + + if (markup) { + markup = [ + '\t\n' + ].join(''); + } + + return markup; + }, + + /** + * @private + */ + _setSVGObjects: function(markup, reviver) { + var instance, i, len, objects = this._objects; + for (i = 0, len = objects.length; i < len; i++) { + instance = objects[i]; + if (instance.excludeFromExport) { + continue; + } + this._setSVGObject(markup, instance, reviver); + } + }, + + /** + * @private + */ + _setSVGObject: function(markup, instance, reviver) { + markup.push(instance.toSVG(reviver)); + }, + + /** + * @private + */ + _setSVGBgOverlayImage: function(markup, property, reviver) { + if (this[property] && !this[property].excludeFromExport && this[property].toSVG) { + markup.push(this[property].toSVG(reviver)); + } + }, + + /** + * @private + */ + _setSVGBgOverlayColor: function(markup, property) { + var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width, + finalHeight = this.height; + if (!filler) { + return; + } + if (filler.toLive) { + var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'], + additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : ''; + markup.push( + '\n' + ); + } + else { + markup.push( + '\n' + ); + } + }, + /* _TO_SVG_END_ */ + + /** + * Moves an object or the objects of a multiple selection + * to the bottom of the stack of drawn objects + * @param {fabric.Object} object Object to send to back + * @return {fabric.Canvas} thisArg + * @chainable + */ + sendToBack: function (object) { + if (!object) { + return this; + } + var activeSelection = this._activeObject, + i, obj, objs; + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; + for (i = objs.length; i--;) { + obj = objs[i]; + removeFromArray(this._objects, obj); + this._objects.unshift(obj); + } + } + else { + removeFromArray(this._objects, object); + this._objects.unshift(object); + } + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * Moves an object or the objects of a multiple selection + * to the top of the stack of drawn objects + * @param {fabric.Object} object Object to send + * @return {fabric.Canvas} thisArg + * @chainable + */ + bringToFront: function (object) { + if (!object) { + return this; + } + var activeSelection = this._activeObject, + i, obj, objs; + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; + for (i = 0; i < objs.length; i++) { + obj = objs[i]; + removeFromArray(this._objects, obj); + this._objects.push(obj); + } + } + else { + removeFromArray(this._objects, object); + this._objects.push(object); + } + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * Moves an object or a selection down in stack of drawn objects + * An optional parameter, intersecting allows to move the object in behind + * the first intersecting object. Where intersection is calculated with + * bounding box. If no intersection is found, there will not be change in the + * stack. + * @param {fabric.Object} object Object to send + * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object + * @return {fabric.Canvas} thisArg + * @chainable + */ + sendBackwards: function (object, intersecting) { + if (!object) { + return this; + } + var activeSelection = this._activeObject, + i, obj, idx, newIdx, objs, objsMoved = 0; + + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; + for (i = 0; i < objs.length; i++) { + obj = objs[i]; + idx = this._objects.indexOf(obj); + if (idx > 0 + objsMoved) { + newIdx = idx - 1; + removeFromArray(this._objects, obj); + this._objects.splice(newIdx, 0, obj); + } + objsMoved++; + } + } + else { + idx = this._objects.indexOf(object); + if (idx !== 0) { + // if object is not on the bottom of stack + newIdx = this._findNewLowerIndex(object, idx, intersecting); + removeFromArray(this._objects, object); + this._objects.splice(newIdx, 0, object); + } + } + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * @private + */ + _findNewLowerIndex: function(object, idx, intersecting) { + var newIdx, i; + + if (intersecting) { + newIdx = idx; + + // traverse down the stack looking for the nearest intersecting object + for (i = idx - 1; i >= 0; --i) { + + var isIntersecting = object.intersectsWithObject(this._objects[i]) || + object.isContainedWithinObject(this._objects[i]) || + this._objects[i].isContainedWithinObject(object); + + if (isIntersecting) { + newIdx = i; + break; + } + } + } + else { + newIdx = idx - 1; + } + + return newIdx; + }, + + /** + * Moves an object or a selection up in stack of drawn objects + * An optional parameter, intersecting allows to move the object in front + * of the first intersecting object. Where intersection is calculated with + * bounding box. If no intersection is found, there will not be change in the + * stack. + * @param {fabric.Object} object Object to send + * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object + * @return {fabric.Canvas} thisArg + * @chainable + */ + bringForward: function (object, intersecting) { + if (!object) { + return this; + } + var activeSelection = this._activeObject, + i, obj, idx, newIdx, objs, objsMoved = 0; + + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; + for (i = objs.length; i--;) { + obj = objs[i]; + idx = this._objects.indexOf(obj); + if (idx < this._objects.length - 1 - objsMoved) { + newIdx = idx + 1; + removeFromArray(this._objects, obj); + this._objects.splice(newIdx, 0, obj); + } + objsMoved++; + } + } + else { + idx = this._objects.indexOf(object); + if (idx !== this._objects.length - 1) { + // if object is not on top of stack (last item in an array) + newIdx = this._findNewUpperIndex(object, idx, intersecting); + removeFromArray(this._objects, object); + this._objects.splice(newIdx, 0, object); + } + } + this.renderOnAddRemove && this.requestRenderAll(); + return this; + }, + + /** + * @private + */ + _findNewUpperIndex: function(object, idx, intersecting) { + var newIdx, i, len; + + if (intersecting) { + newIdx = idx; + + // traverse up the stack looking for the nearest intersecting object + for (i = idx + 1, len = this._objects.length; i < len; ++i) { + + var isIntersecting = object.intersectsWithObject(this._objects[i]) || + object.isContainedWithinObject(this._objects[i]) || + this._objects[i].isContainedWithinObject(object); + + if (isIntersecting) { + newIdx = i; + break; + } + } + } + else { + newIdx = idx + 1; + } + + return newIdx; + }, + + /** + * Moves an object to specified level in stack of drawn objects + * @param {fabric.Object} object Object to send + * @param {Number} index Position to move to + * @return {fabric.Canvas} thisArg + * @chainable + */ + moveTo: function (object, index) { + removeFromArray(this._objects, object); + this._objects.splice(index, 0, object); + return this.renderOnAddRemove && this.requestRenderAll(); + }, + + /** + * Clears a canvas element and dispose objects + * @return {fabric.Canvas} thisArg + * @chainable + */ + dispose: function () { + // cancel eventually ongoing renders + if (this.isRendering) { + fabric.util.cancelAnimFrame(this.isRendering); + this.isRendering = 0; + } + this.forEachObject(function(object) { + object.dispose && object.dispose(); + }); + this._objects = []; + if (this.backgroundImage && this.backgroundImage.dispose) { + this.backgroundImage.dispose(); + } + this.backgroundImage = null; + if (this.overlayImage && this.overlayImage.dispose) { + this.overlayImage.dispose(); + } + this.overlayImage = null; + this._iTextInstances = null; + this.contextContainer = null; + // restore canvas style + this.lowerCanvasEl.classList.remove('lower-canvas'); + fabric.util.setStyle(this.lowerCanvasEl, this._originalCanvasStyle); + delete this._originalCanvasStyle; + // restore canvas size to original size in case retina scaling was applied + this.lowerCanvasEl.setAttribute('width', this.width); + this.lowerCanvasEl.setAttribute('height', this.height); + fabric.util.cleanUpJsdomNode(this.lowerCanvasEl); + this.lowerCanvasEl = undefined; + return this; + }, + + /** + * Returns a string representation of an instance + * @return {String} string representation of an instance + */ + toString: function () { + return '#'; + } + }); + + extend(fabric.StaticCanvas.prototype, fabric.Observable); + extend(fabric.StaticCanvas.prototype, fabric.Collection); + extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter); + + extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ { + + /** + * @static + * @type String + * @default + */ + EMPTY_JSON: '{"objects": [], "background": "white"}', + + /** + * Provides a way to check support of some of the canvas methods + * (either those of HTMLCanvasElement itself, or rendering context) + * + * @param {String} methodName Method to check support for; + * Could be one of "setLineDash" + * @return {Boolean | null} `true` if method is supported (or at least exists), + * `null` if canvas element or context can not be initialized + */ + supports: function (methodName) { + var el = createCanvasElement(); + + if (!el || !el.getContext) { + return null; + } + + var ctx = el.getContext('2d'); + if (!ctx) { + return null; + } + + switch (methodName) { + + case 'setLineDash': + return typeof ctx.setLineDash !== 'undefined'; + + default: + return null; + } + } + }); + + /** + * Returns Object representation of canvas + * this alias is provided because if you call JSON.stringify on an instance, + * the toJSON object will be invoked if it exists. + * Having a toJSON method means you can do JSON.stringify(myCanvas) + * @function + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} JSON compatible object + * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} + * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo} + * @example JSON without additional properties + * var json = canvas.toJSON(); + * @example JSON with additional properties included + * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']); + * @example JSON without default values + * canvas.includeDefaultValues = false; + * var json = canvas.toJSON(); + */ + fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject; + + if (fabric.isLikelyNode) { + fabric.StaticCanvas.prototype.createPNGStream = function() { + var impl = getNodeCanvas(this.lowerCanvasEl); + return impl && impl.createPNGStream(); + }; + fabric.StaticCanvas.prototype.createJPEGStream = function(opts) { + var impl = getNodeCanvas(this.lowerCanvasEl); + return impl && impl.createJPEGStream(opts); + }; + } +})(); +/** + * BaseBrush class + * @class fabric.BaseBrush + * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo} + */ +fabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ { + + /** + * Color of a brush + * @type String + * @default + */ + color: 'rgb(0, 0, 0)', + + /** + * Width of a brush, has to be a Number, no string literals + * @type Number + * @default + */ + width: 1, + + /** + * Shadow object representing shadow of this shape. + * Backwards incompatibility note: This property replaces "shadowColor" (String), "shadowOffsetX" (Number), + * "shadowOffsetY" (Number) and "shadowBlur" (Number) since v1.2.12 + * @type fabric.Shadow + * @default + */ + shadow: null, + + /** + * Line endings style of a brush (one of "butt", "round", "square") + * @type String + * @default + */ + strokeLineCap: 'round', + + /** + * Corner style of a brush (one of "bevel", "round", "miter") + * @type String + * @default + */ + strokeLineJoin: 'round', + + /** + * Maximum miter length (used for strokeLineJoin = "miter") of a brush's + * @type Number + * @default + */ + strokeMiterLimit: 10, + + /** + * Stroke Dash Array. + * @type Array + * @default + */ + strokeDashArray: null, + + /** + * When `true`, the free drawing is limited to the whiteboard size. Default to false. + * @type Boolean + * @default false + */ + + limitedToCanvasSize: false, + + + /** + * Sets brush styles + * @private + * @param {CanvasRenderingContext2D} ctx + */ + _setBrushStyles: function (ctx) { + ctx.strokeStyle = this.color; + ctx.lineWidth = this.width; + ctx.lineCap = this.strokeLineCap; + ctx.miterLimit = this.strokeMiterLimit; + ctx.lineJoin = this.strokeLineJoin; + ctx.setLineDash(this.strokeDashArray || []); + }, + + /** + * Sets the transformation on given context + * @param {RenderingContext2d} ctx context to render on + * @private + */ + _saveAndTransform: function(ctx) { + var v = this.canvas.viewportTransform; + ctx.save(); + ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); + }, + + /** + * Sets brush shadow styles + * @private + */ + _setShadow: function() { + if (!this.shadow) { + return; + } + + var canvas = this.canvas, + shadow = this.shadow, + ctx = canvas.contextTop, + zoom = canvas.getZoom(); + if (canvas && canvas._isRetinaScaling()) { + zoom *= fabric.devicePixelRatio; + } + + ctx.shadowColor = shadow.color; + ctx.shadowBlur = shadow.blur * zoom; + ctx.shadowOffsetX = shadow.offsetX * zoom; + ctx.shadowOffsetY = shadow.offsetY * zoom; + }, + + needsFullRender: function() { + var color = new fabric.Color(this.color); + return color.getAlpha() < 1 || !!this.shadow; + }, + + /** + * Removes brush shadow styles + * @private + */ + _resetShadow: function() { + var ctx = this.canvas.contextTop; + + ctx.shadowColor = ''; + ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; + }, + + /** + * Check is pointer is outside canvas boundaries + * @param {Object} pointer + * @private + */ + _isOutSideCanvas: function(pointer) { + return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight(); + } +}); +(function() { + /** + * PencilBrush class + * @class fabric.PencilBrush + * @extends fabric.BaseBrush + */ + fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ { + + /** + * Discard points that are less than `decimate` pixel distant from each other + * @type Number + * @default 0.4 + */ + decimate: 0.4, + + /** + * Draws a straight line between last recorded point to current pointer + * Used for `shift` functionality + * + * @type boolean + * @default false + */ + drawStraightLine: false, + + /** + * The event modifier key that makes the brush draw a straight line. + * If `null` or 'none' or any other string that is not a modifier key the feature is disabled. + * @type {'altKey' | 'shiftKey' | 'ctrlKey' | 'none' | undefined | null} + */ + straightLineKey: 'shiftKey', + + /** + * Constructor + * @param {fabric.Canvas} canvas + * @return {fabric.PencilBrush} Instance of a pencil brush + */ + initialize: function(canvas) { + this.canvas = canvas; + this._points = []; + }, + + needsFullRender: function () { + return this.callSuper('needsFullRender') || this._hasStraightLine; + }, + + /** + * Invoked inside on mouse down and mouse move + * @param {Object} pointer + */ + _drawSegment: function (ctx, p1, p2) { + var midPoint = p1.midPointFrom(p2); + ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y); + return midPoint; + }, + + /** + * Invoked on mouse down + * @param {Object} pointer + */ + onMouseDown: function(pointer, options) { + if (!this.canvas._isMainEvent(options.e)) { + return; + } + this.drawStraightLine = options.e[this.straightLineKey]; + this._prepareForDrawing(pointer); + // capture coordinates immediately + // this allows to draw dots (when movement never occurs) + this._captureDrawingPath(pointer); + this._render(); + }, + + /** + * Invoked on mouse move + * @param {Object} pointer + */ + onMouseMove: function(pointer, options) { + if (!this.canvas._isMainEvent(options.e)) { + return; + } + this.drawStraightLine = options.e[this.straightLineKey]; + if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { + return; + } + if (this._captureDrawingPath(pointer) && this._points.length > 1) { + if (this.needsFullRender()) { + // redraw curve + // clear top canvas + this.canvas.clearContext(this.canvas.contextTop); + this._render(); + } + else { + var points = this._points, length = points.length, ctx = this.canvas.contextTop; + // draw the curve update + this._saveAndTransform(ctx); + if (this.oldEnd) { + ctx.beginPath(); + ctx.moveTo(this.oldEnd.x, this.oldEnd.y); + } + this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true); + ctx.stroke(); + ctx.restore(); + } + } + }, + + /** + * Invoked on mouse up + */ + onMouseUp: function(options) { + if (!this.canvas._isMainEvent(options.e)) { + return true; + } + this.drawStraightLine = false; + this.oldEnd = undefined; + this._finalizeAndAddPath(); + return false; + }, + + /** + * @private + * @param {Object} pointer Actual mouse position related to the canvas. + */ + _prepareForDrawing: function(pointer) { + + var p = new fabric.Point(pointer.x, pointer.y); + + this._reset(); + this._addPoint(p); + this.canvas.contextTop.moveTo(p.x, p.y); + }, + + /** + * @private + * @param {fabric.Point} point Point to be added to points array + */ + _addPoint: function(point) { + if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) { + return false; + } + if (this.drawStraightLine && this._points.length > 1) { + this._hasStraightLine = true; + this._points.pop(); + } + this._points.push(point); + return true; + }, + + /** + * Clear points array and set contextTop canvas style. + * @private + */ + _reset: function() { + this._points = []; + this._setBrushStyles(this.canvas.contextTop); + this._setShadow(); + this._hasStraightLine = false; + }, + + /** + * @private + * @param {Object} pointer Actual mouse position related to the canvas. + */ + _captureDrawingPath: function(pointer) { + var pointerPoint = new fabric.Point(pointer.x, pointer.y); + return this._addPoint(pointerPoint); + }, + + /** + * Draw a smooth path on the topCanvas using quadraticCurveTo + * @private + * @param {CanvasRenderingContext2D} [ctx] + */ + _render: function(ctx) { + var i, len, + p1 = this._points[0], + p2 = this._points[1]; + ctx = ctx || this.canvas.contextTop; + this._saveAndTransform(ctx); + ctx.beginPath(); + //if we only have 2 points in the path and they are the same + //it means that the user only clicked the canvas without moving the mouse + //then we should be drawing a dot. A path isn't drawn between two identical dots + //that's why we set them apart a bit + if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) { + var width = this.width / 1000; + p1 = new fabric.Point(p1.x, p1.y); + p2 = new fabric.Point(p2.x, p2.y); + p1.x -= width; + p2.x += width; + } + ctx.moveTo(p1.x, p1.y); + + for (i = 1, len = this._points.length; i < len; i++) { + // we pick the point between pi + 1 & pi + 2 as the + // end point and p1 as our control point. + this._drawSegment(ctx, p1, p2); + p1 = this._points[i]; + p2 = this._points[i + 1]; + } + // Draw last line as a straight line while + // we wait for the next point to be able to calculate + // the bezier control point + ctx.lineTo(p1.x, p1.y); + ctx.stroke(); + ctx.restore(); + }, + + /** + * Converts points to SVG path + * @param {Array} points Array of points + * @return {(string|number)[][]} SVG path commands + */ + convertPointsToSVGPath: function (points) { + var correction = this.width / 1000; + return fabric.util.getSmoothPathFromPoints(points, correction); + }, + + /** + * @private + * @param {(string|number)[][]} pathData SVG path commands + * @returns {boolean} + */ + _isEmptySVGPath: function (pathData) { + var pathString = fabric.util.joinPath(pathData); + return pathString === 'M 0 0 Q 0 0 0 0 L 0 0'; + }, + + /** + * Creates fabric.Path object to add on canvas + * @param {(string|number)[][]} pathData Path data + * @return {fabric.Path} Path to add on canvas + */ + createPath: function(pathData) { + var path = new fabric.Path(pathData, { + fill: null, + stroke: this.color, + strokeWidth: this.width, + strokeLineCap: this.strokeLineCap, + strokeMiterLimit: this.strokeMiterLimit, + strokeLineJoin: this.strokeLineJoin, + strokeDashArray: this.strokeDashArray, + }); + if (this.shadow) { + this.shadow.affectStroke = true; + path.shadow = new fabric.Shadow(this.shadow); + } + + return path; + }, + + /** + * Decimate points array with the decimate value + */ + decimatePoints: function(points, distance) { + if (points.length <= 2) { + return points; + } + var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2), + i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint], + cDistance; + for (i = 1; i < l - 1; i++) { + cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2); + if (cDistance >= adjustedDistance) { + lastPoint = points[i]; + newPoints.push(lastPoint); + } + } + /** + * Add the last point from the original line to the end of the array. + * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point. + */ + newPoints.push(points[l]); + return newPoints; + }, + + /** + * On mouseup after drawing the path on contextTop canvas + * we use the points captured to create an new fabric path object + * and add it to the fabric canvas. + */ + _finalizeAndAddPath: function() { + var ctx = this.canvas.contextTop; + ctx.closePath(); + if (this.decimate) { + this._points = this.decimatePoints(this._points, this.decimate); + } + var pathData = this.convertPointsToSVGPath(this._points); + if (this._isEmptySVGPath(pathData)) { + // do not create 0 width/height paths, as they are + // rendered inconsistently across browsers + // Firefox 4, for example, renders a dot, + // whereas Chrome 10 renders nothing + this.canvas.requestRenderAll(); + return; + } + + var path = this.createPath(pathData); + this.canvas.clearContext(this.canvas.contextTop); + this.canvas.fire('before:path:created', { path: path }); + this.canvas.add(path); + this.canvas.requestRenderAll(); + path.setCoords(); + this._resetShadow(); + + + // fire event 'path' created + this.canvas.fire('path:created', { path: path }); + } + }); +})(); +/** + * CircleBrush class + * @class fabric.CircleBrush + */ +fabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ { + + /** + * Width of a brush + * @type Number + * @default + */ + width: 10, + + /** + * Constructor + * @param {fabric.Canvas} canvas + * @return {fabric.CircleBrush} Instance of a circle brush + */ + initialize: function(canvas) { + this.canvas = canvas; + this.points = []; + }, + + /** + * Invoked inside on mouse down and mouse move + * @param {Object} pointer + */ + drawDot: function(pointer) { + var point = this.addPoint(pointer), + ctx = this.canvas.contextTop; + this._saveAndTransform(ctx); + this.dot(ctx, point); + ctx.restore(); + }, + + dot: function(ctx, point) { + ctx.fillStyle = point.fill; + ctx.beginPath(); + ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false); + ctx.closePath(); + ctx.fill(); + }, + + /** + * Invoked on mouse down + */ + onMouseDown: function(pointer) { + this.points.length = 0; + this.canvas.clearContext(this.canvas.contextTop); + this._setShadow(); + this.drawDot(pointer); + }, + + /** + * Render the full state of the brush + * @private + */ + _render: function() { + var ctx = this.canvas.contextTop, i, len, + points = this.points; + this._saveAndTransform(ctx); + for (i = 0, len = points.length; i < len; i++) { + this.dot(ctx, points[i]); + } + ctx.restore(); + }, + + /** + * Invoked on mouse move + * @param {Object} pointer + */ + onMouseMove: function(pointer) { + if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { + return; + } + if (this.needsFullRender()) { + this.canvas.clearContext(this.canvas.contextTop); + this.addPoint(pointer); + this._render(); + } + else { + this.drawDot(pointer); + } + }, + + /** + * Invoked on mouse up + */ + onMouseUp: function() { + var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len; + this.canvas.renderOnAddRemove = false; + + var circles = []; + + for (i = 0, len = this.points.length; i < len; i++) { + var point = this.points[i], + circle = new fabric.Circle({ + radius: point.radius, + left: point.x, + top: point.y, + originX: 'center', + originY: 'center', + fill: point.fill + }); + + this.shadow && (circle.shadow = new fabric.Shadow(this.shadow)); + + circles.push(circle); + } + var group = new fabric.Group(circles); + group.canvas = this.canvas; + + this.canvas.fire('before:path:created', { path: group }); + this.canvas.add(group); + this.canvas.fire('path:created', { path: group }); + + this.canvas.clearContext(this.canvas.contextTop); + this._resetShadow(); + this.canvas.renderOnAddRemove = originalRenderOnAddRemove; + this.canvas.requestRenderAll(); + }, + + /** + * @param {Object} pointer + * @return {fabric.Point} Just added pointer point + */ + addPoint: function(pointer) { + var pointerPoint = new fabric.Point(pointer.x, pointer.y), + + circleRadius = fabric.util.getRandomInt( + Math.max(0, this.width - 20), this.width + 20) / 2, + + circleColor = new fabric.Color(this.color) + .setAlpha(fabric.util.getRandomInt(0, 100) / 100) + .toRgba(); + + pointerPoint.radius = circleRadius; + pointerPoint.fill = circleColor; + + this.points.push(pointerPoint); + + return pointerPoint; + } +}); +/** + * SprayBrush class + * @class fabric.SprayBrush + */ +fabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ { + + /** + * Width of a spray + * @type Number + * @default + */ + width: 10, + + /** + * Density of a spray (number of dots per chunk) + * @type Number + * @default + */ + density: 20, + + /** + * Width of spray dots + * @type Number + * @default + */ + dotWidth: 1, + + /** + * Width variance of spray dots + * @type Number + * @default + */ + dotWidthVariance: 1, + + /** + * Whether opacity of a dot should be random + * @type Boolean + * @default + */ + randomOpacity: false, + + /** + * Whether overlapping dots (rectangles) should be removed (for performance reasons) + * @type Boolean + * @default + */ + optimizeOverlapping: true, + + /** + * Constructor + * @param {fabric.Canvas} canvas + * @return {fabric.SprayBrush} Instance of a spray brush + */ + initialize: function(canvas) { + this.canvas = canvas; + this.sprayChunks = []; + }, + + /** + * Invoked on mouse down + * @param {Object} pointer + */ + onMouseDown: function(pointer) { + this.sprayChunks.length = 0; + this.canvas.clearContext(this.canvas.contextTop); + this._setShadow(); + + this.addSprayChunk(pointer); + this.render(this.sprayChunkPoints); + }, + + /** + * Invoked on mouse move + * @param {Object} pointer + */ + onMouseMove: function(pointer) { + if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { + return; + } + this.addSprayChunk(pointer); + this.render(this.sprayChunkPoints); + }, + + /** + * Invoked on mouse up + */ + onMouseUp: function() { + var originalRenderOnAddRemove = this.canvas.renderOnAddRemove; + this.canvas.renderOnAddRemove = false; + + var rects = []; + + for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { + var sprayChunk = this.sprayChunks[i]; + + for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) { + + var rect = new fabric.Rect({ + width: sprayChunk[j].width, + height: sprayChunk[j].width, + left: sprayChunk[j].x + 1, + top: sprayChunk[j].y + 1, + originX: 'center', + originY: 'center', + fill: this.color + }); + rects.push(rect); + } + } + + if (this.optimizeOverlapping) { + rects = this._getOptimizedRects(rects); + } + + var group = new fabric.Group(rects); + this.shadow && group.set('shadow', new fabric.Shadow(this.shadow)); + this.canvas.fire('before:path:created', { path: group }); + this.canvas.add(group); + this.canvas.fire('path:created', { path: group }); + + this.canvas.clearContext(this.canvas.contextTop); + this._resetShadow(); + this.canvas.renderOnAddRemove = originalRenderOnAddRemove; + this.canvas.requestRenderAll(); + }, + + /** + * @private + * @param {Array} rects + */ + _getOptimizedRects: function(rects) { + + // avoid creating duplicate rects at the same coordinates + var uniqueRects = { }, key, i, len; + + for (i = 0, len = rects.length; i < len; i++) { + key = rects[i].left + '' + rects[i].top; + if (!uniqueRects[key]) { + uniqueRects[key] = rects[i]; + } + } + var uniqueRectsArray = []; + for (key in uniqueRects) { + uniqueRectsArray.push(uniqueRects[key]); + } + + return uniqueRectsArray; + }, + + /** + * Render new chunk of spray brush + */ + render: function(sprayChunk) { + var ctx = this.canvas.contextTop, i, len; + ctx.fillStyle = this.color; + + this._saveAndTransform(ctx); + + for (i = 0, len = sprayChunk.length; i < len; i++) { + var point = sprayChunk[i]; + if (typeof point.opacity !== 'undefined') { + ctx.globalAlpha = point.opacity; + } + ctx.fillRect(point.x, point.y, point.width, point.width); + } + ctx.restore(); + }, + + /** + * Render all spray chunks + */ + _render: function() { + var ctx = this.canvas.contextTop, i, ilen; + ctx.fillStyle = this.color; + + this._saveAndTransform(ctx); + + for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { + this.render(this.sprayChunks[i]); + } + ctx.restore(); + }, + + /** + * @param {Object} pointer + */ + addSprayChunk: function(pointer) { + this.sprayChunkPoints = []; + + var x, y, width, radius = this.width / 2, i; + + for (i = 0; i < this.density; i++) { + + x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius); + y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius); + + if (this.dotWidthVariance) { + width = fabric.util.getRandomInt( + // bottom clamp width to 1 + Math.max(1, this.dotWidth - this.dotWidthVariance), + this.dotWidth + this.dotWidthVariance); + } + else { + width = this.dotWidth; + } + + var point = new fabric.Point(x, y); + point.width = width; + + if (this.randomOpacity) { + point.opacity = fabric.util.getRandomInt(0, 100) / 100; + } + + this.sprayChunkPoints.push(point); + } + + this.sprayChunks.push(this.sprayChunkPoints); + } +}); +/** + * PatternBrush class + * @class fabric.PatternBrush + * @extends fabric.BaseBrush + */ +fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ { + + getPatternSrc: function() { + + var dotWidth = 20, + dotDistance = 5, + patternCanvas = fabric.util.createCanvasElement(), + patternCtx = patternCanvas.getContext('2d'); + + patternCanvas.width = patternCanvas.height = dotWidth + dotDistance; + + patternCtx.fillStyle = this.color; + patternCtx.beginPath(); + patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false); + patternCtx.closePath(); + patternCtx.fill(); + + return patternCanvas; + }, + + getPatternSrcFunction: function() { + return String(this.getPatternSrc).replace('this.color', '"' + this.color + '"'); + }, + + /** + * Creates "pattern" instance property + * @param {CanvasRenderingContext2D} ctx + */ + getPattern: function(ctx) { + return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat'); + }, + + /** + * Sets brush styles + * @param {CanvasRenderingContext2D} ctx + */ + _setBrushStyles: function(ctx) { + this.callSuper('_setBrushStyles', ctx); + ctx.strokeStyle = this.getPattern(ctx); + }, + + /** + * Creates path + */ + createPath: function(pathData) { + var path = this.callSuper('createPath', pathData), + topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2); + + path.stroke = new fabric.Pattern({ + source: this.source || this.getPatternSrcFunction(), + offsetX: -topLeft.x, + offsetY: -topLeft.y + }); + return path; + } +}); +(function() { + + var getPointer = fabric.util.getPointer, + degreesToRadians = fabric.util.degreesToRadians, + isTouchEvent = fabric.util.isTouchEvent; + + /** + * Canvas class + * @class fabric.Canvas + * @extends fabric.StaticCanvas + * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas} + * @see {@link fabric.Canvas#initialize} for constructor definition + * + * @fires object:modified at the end of a transform or any change when statefull is true + * @fires object:rotating while an object is being rotated from the control + * @fires object:scaling while an object is being scaled by controls + * @fires object:moving while an object is being dragged + * @fires object:skewing while an object is being skewed from the controls + * + * @fires before:transform before a transform is is started + * @fires before:selection:cleared + * @fires selection:cleared + * @fires selection:updated + * @fires selection:created + * + * @fires path:created after a drawing operation ends and the path is added + * @fires mouse:down + * @fires mouse:move + * @fires mouse:up + * @fires mouse:down:before on mouse down, before the inner fabric logic runs + * @fires mouse:move:before on mouse move, before the inner fabric logic runs + * @fires mouse:up:before on mouse up, before the inner fabric logic runs + * @fires mouse:over + * @fires mouse:out + * @fires mouse:dblclick whenever a native dbl click event fires on the canvas. + * + * @fires dragover + * @fires dragenter + * @fires dragleave + * @fires drop:before before drop event. same native event. This is added to handle edge cases + * @fires drop + * @fires after:render at the end of the render process, receives the context in the callback + * @fires before:render at start the render process, receives the context in the callback + * + */ + fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ { + + /** + * Constructor + * @param {HTMLElement | String} el <canvas> element to initialize instance on + * @param {Object} [options] Options object + * @return {Object} thisArg + */ + initialize: function(el, options) { + options || (options = { }); + this.renderAndResetBound = this.renderAndReset.bind(this); + this.requestRenderAllBound = this.requestRenderAll.bind(this); + this._initStatic(el, options); + this._initInteractive(); + this._createCacheCanvas(); + }, + + /** + * When true, objects can be transformed by one side (unproportionally) + * when dragged on the corners that normally would not do that. + * @type Boolean + * @default + * @since fabric 4.0 // changed name and default value + */ + uniformScaling: true, + + /** + * Indicates which key switches uniform scaling. + * values: 'altKey', 'shiftKey', 'ctrlKey'. + * If `null` or 'none' or any other string that is not a modifier key + * feature is disabled. + * totally wrong named. this sounds like `uniform scaling` + * if Canvas.uniformScaling is true, pressing this will set it to false + * and viceversa. + * @since 1.6.2 + * @type String + * @default + */ + uniScaleKey: 'shiftKey', + + /** + * When true, objects use center point as the origin of scale transformation. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredScaling: false, + + /** + * When true, objects use center point as the origin of rotate transformation. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredRotation: false, + + /** + * Indicates which key enable centered Transform + * values: 'altKey', 'shiftKey', 'ctrlKey'. + * If `null` or 'none' or any other string that is not a modifier key + * feature is disabled feature disabled. + * @since 1.6.2 + * @type String + * @default + */ + centeredKey: 'altKey', + + /** + * Indicates which key enable alternate action on corner + * values: 'altKey', 'shiftKey', 'ctrlKey'. + * If `null` or 'none' or any other string that is not a modifier key + * feature is disabled feature disabled. + * @since 1.6.2 + * @type String + * @default + */ + altActionKey: 'shiftKey', + + /** + * Indicates that canvas is interactive. This property should not be changed. + * @type Boolean + * @default + */ + interactive: true, + + /** + * Indicates whether group selection should be enabled + * @type Boolean + * @default + */ + selection: true, + + /** + * Indicates which key or keys enable multiple click selection + * Pass value as a string or array of strings + * values: 'altKey', 'shiftKey', 'ctrlKey'. + * If `null` or empty or containing any other string that is not a modifier key + * feature is disabled. + * @since 1.6.2 + * @type String|Array + * @default + */ + selectionKey: 'shiftKey', + + /** + * Indicates which key enable alternative selection + * in case of target overlapping with active object + * values: 'altKey', 'shiftKey', 'ctrlKey'. + * For a series of reason that come from the general expectations on how + * things should work, this feature works only for preserveObjectStacking true. + * If `null` or 'none' or any other string that is not a modifier key + * feature is disabled. + * @since 1.6.5 + * @type null|String + * @default + */ + altSelectionKey: null, + + /** + * Color of selection + * @type String + * @default + */ + selectionColor: 'rgba(100, 100, 255, 0.3)', // blue + + /** + * Default dash array pattern + * If not empty the selection border is dashed + * @type Array + */ + selectionDashArray: [], + + /** + * Color of the border of selection (usually slightly darker than color of selection itself) + * @type String + * @default + */ + selectionBorderColor: 'rgba(255, 255, 255, 0.3)', + + /** + * Width of a line used in object/group selection + * @type Number + * @default + */ + selectionLineWidth: 1, + + /** + * Select only shapes that are fully contained in the dragged selection rectangle. + * @type Boolean + * @default + */ + selectionFullyContained: false, + + /** + * Default cursor value used when hovering over an object on canvas + * @type String + * @default + */ + hoverCursor: 'move', + + /** + * Default cursor value used when moving an object on canvas + * @type String + * @default + */ + moveCursor: 'move', + + /** + * Default cursor value used for the entire canvas + * @type String + * @default + */ + defaultCursor: 'default', + + /** + * Cursor value used during free drawing + * @type String + * @default + */ + freeDrawingCursor: 'crosshair', + + /** + * Cursor value used for disabled elements ( corners with disabled action ) + * @type String + * @since 2.0.0 + * @default + */ + notAllowedCursor: 'not-allowed', + + /** + * Default element class that's given to wrapper (div) element of canvas + * @type String + * @default + */ + containerClass: 'canvas-container', + + /** + * When true, object detection happens on per-pixel basis rather than on per-bounding-box + * @type Boolean + * @default + */ + perPixelTargetFind: false, + + /** + * Number of pixels around target pixel to tolerate (consider active) during object detection + * @type Number + * @default + */ + targetFindTolerance: 0, + + /** + * When true, target detection is skipped. Target detection will return always undefined. + * click selection won't work anymore, events will fire with no targets. + * if something is selected before setting it to true, it will be deselected at the first click. + * area selection will still work. check the `selection` property too. + * if you deactivate both, you should look into staticCanvas. + * @type Boolean + * @default + */ + skipTargetFind: false, + + /** + * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing. + * After mousedown, mousemove creates a shape, + * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas. + * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing} + * @type Boolean + * @default + */ + isDrawingMode: false, + + /** + * Indicates whether objects should remain in current stack position when selected. + * When false objects are brought to top and rendered as part of the selection group + * @type Boolean + * @default + */ + preserveObjectStacking: false, + + /** + * Indicates the angle that an object will lock to while rotating. + * @type Number + * @since 1.6.7 + * @default + */ + snapAngle: 0, + + /** + * Indicates the distance from the snapAngle the rotation will lock to the snapAngle. + * When `null`, the snapThreshold will default to the snapAngle. + * @type null|Number + * @since 1.6.7 + * @default + */ + snapThreshold: null, + + /** + * Indicates if the right click on canvas can output the context menu or not + * @type Boolean + * @since 1.6.5 + * @default + */ + stopContextMenu: false, + + /** + * Indicates if the canvas can fire right click events + * @type Boolean + * @since 1.6.5 + * @default + */ + fireRightClick: false, + + /** + * Indicates if the canvas can fire middle click events + * @type Boolean + * @since 1.7.8 + * @default + */ + fireMiddleClick: false, + + /** + * Keep track of the subTargets for Mouse Events + * @type fabric.Object[] + */ + targets: [], + + /** + * When the option is enabled, PointerEvent is used instead of MouseEvent. + * @type Boolean + * @default + */ + enablePointerEvents: false, + + /** + * Keep track of the hovered target + * @type fabric.Object + * @private + */ + _hoveredTarget: null, + + /** + * hold the list of nested targets hovered + * @type fabric.Object[] + * @private + */ + _hoveredTargets: [], + + /** + * @private + */ + _initInteractive: function() { + this._currentTransform = null; + this._groupSelector = null; + this._initWrapperElement(); + this._createUpperCanvas(); + this._initEventListeners(); + + this._initRetinaScaling(); + + this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this); + + this.calcOffset(); + }, + + /** + * Divides objects in two groups, one to render immediately + * and one to render as activeGroup. + * @return {Array} objects to render immediately and pushes the other in the activeGroup. + */ + _chooseObjectsToRender: function() { + var activeObjects = this.getActiveObjects(), + object, objsToRender, activeGroupObjects; + + if (activeObjects.length > 0 && !this.preserveObjectStacking) { + objsToRender = []; + activeGroupObjects = []; + for (var i = 0, length = this._objects.length; i < length; i++) { + object = this._objects[i]; + if (activeObjects.indexOf(object) === -1 ) { + objsToRender.push(object); + } + else { + activeGroupObjects.push(object); + } + } + if (activeObjects.length > 1) { + this._activeObject._objects = activeGroupObjects; + } + objsToRender.push.apply(objsToRender, activeGroupObjects); + } + else { + objsToRender = this._objects; + } + return objsToRender; + }, + + /** + * Renders both the top canvas and the secondary container canvas. + * @return {fabric.Canvas} instance + * @chainable + */ + renderAll: function () { + if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) { + this.clearContext(this.contextTop); + this.contextTopDirty = false; + } + if (this.hasLostContext) { + this.renderTopLayer(this.contextTop); + this.hasLostContext = false; + } + var canvasToDrawOn = this.contextContainer; + this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender()); + return this; + }, + + renderTopLayer: function(ctx) { + ctx.save(); + if (this.isDrawingMode && this._isCurrentlyDrawing) { + this.freeDrawingBrush && this.freeDrawingBrush._render(); + this.contextTopDirty = true; + } + // we render the top context - last object + if (this.selection && this._groupSelector) { + this._drawSelection(ctx); + this.contextTopDirty = true; + } + ctx.restore(); + }, + + /** + * Method to render only the top canvas. + * Also used to render the group selection box. + * @return {fabric.Canvas} thisArg + * @chainable + */ + renderTop: function () { + var ctx = this.contextTop; + this.clearContext(ctx); + this.renderTopLayer(ctx); + this.fire('after:render'); + return this; + }, + + /** + * @private + */ + _normalizePointer: function (object, pointer) { + var m = object.calcTransformMatrix(), + invertedM = fabric.util.invertTransform(m), + vptPointer = this.restorePointerVpt(pointer); + return fabric.util.transformPoint(vptPointer, invertedM); + }, + + /** + * Returns true if object is transparent at a certain location + * @param {fabric.Object} target Object to check + * @param {Number} x Left coordinate + * @param {Number} y Top coordinate + * @return {Boolean} + */ + isTargetTransparent: function (target, x, y) { + // in case the target is the activeObject, we cannot execute this optimization + // because we need to draw controls too. + if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) { + var normalizedPointer = this._normalizePointer(target, {x: x, y: y}), + targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0), + targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0); + + var isTransparent = fabric.util.isTransparent( + target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance); + + return isTransparent; + } + + var ctx = this.contextCache, + originalColor = target.selectionBackgroundColor, v = this.viewportTransform; + + target.selectionBackgroundColor = ''; + + this.clearContext(ctx); + + ctx.save(); + ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); + target.render(ctx); + ctx.restore(); + + target.selectionBackgroundColor = originalColor; + + var isTransparent = fabric.util.isTransparent( + ctx, x, y, this.targetFindTolerance); + + return isTransparent; + }, + + /** + * takes an event and determines if selection key has been pressed + * @private + * @param {Event} e Event object + */ + _isSelectionKeyPressed: function(e) { + var selectionKeyPressed = false; + + if (Array.isArray(this.selectionKey)) { + selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; }); + } + else { + selectionKeyPressed = e[this.selectionKey]; + } + + return selectionKeyPressed; + }, + + /** + * @private + * @param {Event} e Event object + * @param {fabric.Object} target + */ + _shouldClearSelection: function (e, target) { + var activeObjects = this.getActiveObjects(), + activeObject = this._activeObject; + + return ( + !target + || + (target && + activeObject && + activeObjects.length > 1 && + activeObjects.indexOf(target) === -1 && + activeObject !== target && + !this._isSelectionKeyPressed(e)) + || + (target && !target.evented) + || + (target && + !target.selectable && + activeObject && + activeObject !== target) + ); + }, + + /** + * centeredScaling from object can't override centeredScaling from canvas. + * this should be fixed, since object setting should take precedence over canvas. + * also this should be something that will be migrated in the control properties. + * as ability to define the origin of the transformation that the control provide. + * @private + * @param {fabric.Object} target + * @param {String} action + * @param {Boolean} altKey + */ + _shouldCenterTransform: function (target, action, altKey) { + if (!target) { + return; + } + + var centerTransform; + + if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') { + centerTransform = this.centeredScaling || target.centeredScaling; + } + else if (action === 'rotate') { + centerTransform = this.centeredRotation || target.centeredRotation; + } + + return centerTransform ? !altKey : altKey; + }, + + /** + * should disappear before release 4.0 + * @private + */ + _getOriginFromCorner: function(target, corner) { + var origin = { + x: target.originX, + y: target.originY + }; + + if (corner === 'ml' || corner === 'tl' || corner === 'bl') { + origin.x = 'right'; + } + else if (corner === 'mr' || corner === 'tr' || corner === 'br') { + origin.x = 'left'; + } + + if (corner === 'tl' || corner === 'mt' || corner === 'tr') { + origin.y = 'bottom'; + } + else if (corner === 'bl' || corner === 'mb' || corner === 'br') { + origin.y = 'top'; + } + return origin; + }, + + /** + * @private + * @param {Boolean} alreadySelected true if target is already selected + * @param {String} corner a string representing the corner ml, mr, tl ... + * @param {Event} e Event object + * @param {fabric.Object} [target] inserted back to help overriding. Unused + */ + _getActionFromCorner: function(alreadySelected, corner, e, target) { + if (!corner || !alreadySelected) { + return 'drag'; + } + var control = target.controls[corner]; + return control.getActionName(e, control, target); + }, + + /** + * @private + * @param {Event} e Event object + * @param {fabric.Object} target + */ + _setupCurrentTransform: function (e, target, alreadySelected) { + if (!target) { + return; + } + + var pointer = this.getPointer(e), corner = target.__corner, + control = target.controls[corner], + actionHandler = (alreadySelected && corner) ? + control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler, + action = this._getActionFromCorner(alreadySelected, corner, e, target), + origin = this._getOriginFromCorner(target, corner), + altKey = e[this.centeredKey], + transform = { + target: target, + action: action, + actionHandler: actionHandler, + corner: corner, + scaleX: target.scaleX, + scaleY: target.scaleY, + skewX: target.skewX, + skewY: target.skewY, + // used by transation + offsetX: pointer.x - target.left, + offsetY: pointer.y - target.top, + originX: origin.x, + originY: origin.y, + ex: pointer.x, + ey: pointer.y, + lastX: pointer.x, + lastY: pointer.y, + // unsure they are useful anymore. + // left: target.left, + // top: target.top, + theta: degreesToRadians(target.angle), + // end of unsure + width: target.width * target.scaleX, + shiftKey: e.shiftKey, + altKey: altKey, + original: fabric.util.saveObjectTransform(target), + }; + + if (this._shouldCenterTransform(target, action, altKey)) { + transform.originX = 'center'; + transform.originY = 'center'; + } + transform.original.originX = origin.x; + transform.original.originY = origin.y; + this._currentTransform = transform; + this._beforeTransform(e); + }, + + /** + * Set the cursor type of the canvas element + * @param {String} value Cursor type of the canvas element. + * @see http://www.w3.org/TR/css3-ui/#cursor + */ + setCursor: function (value) { + this.upperCanvasEl.style.cursor = value; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx to draw the selection on + */ + _drawSelection: function (ctx) { + var selector = this._groupSelector, + viewportStart = new fabric.Point(selector.ex, selector.ey), + start = fabric.util.transformPoint(viewportStart, this.viewportTransform), + viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top), + extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform), + minX = Math.min(start.x, extent.x), + minY = Math.min(start.y, extent.y), + maxX = Math.max(start.x, extent.x), + maxY = Math.max(start.y, extent.y), + strokeOffset = this.selectionLineWidth / 2; + + if (this.selectionColor) { + ctx.fillStyle = this.selectionColor; + ctx.fillRect(minX, minY, maxX - minX, maxY - minY); + } + + if (!this.selectionLineWidth || !this.selectionBorderColor) { + return; + } + ctx.lineWidth = this.selectionLineWidth; + ctx.strokeStyle = this.selectionBorderColor; + + minX += strokeOffset; + minY += strokeOffset; + maxX -= strokeOffset; + maxY -= strokeOffset; + // selection border + fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray); + ctx.strokeRect(minX, minY, maxX - minX, maxY - minY); + }, + + /** + * Method that determines what object we are clicking on + * the skipGroup parameter is for internal use, is needed for shift+click action + * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target + * or the outside part of the corner. + * @param {Event} e mouse event + * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through + * @return {fabric.Object} the target found + */ + findTarget: function (e, skipGroup) { + if (this.skipTargetFind) { + return; + } + + var ignoreZoom = true, + pointer = this.getPointer(e, ignoreZoom), + activeObject = this._activeObject, + aObjects = this.getActiveObjects(), + activeTarget, activeTargetSubs, + isTouch = isTouchEvent(e), + shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1; + + // first check current group (if one exists) + // active group does not check sub targets like normal groups. + // if active group just exits. + this.targets = []; + + // if we hit the corner of an activeObject, let's return that. + if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) { + return activeObject; + } + if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) { + return activeObject; + } + if (aObjects.length === 1 && + activeObject === this._searchPossibleTargets([activeObject], pointer)) { + if (!this.preserveObjectStacking) { + return activeObject; + } + else { + activeTarget = activeObject; + activeTargetSubs = this.targets; + this.targets = []; + } + } + var target = this._searchPossibleTargets(this._objects, pointer); + if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) { + target = activeTarget; + this.targets = activeTargetSubs; + } + return target; + }, + + /** + * Checks point is inside the object. + * @param {Object} [pointer] x,y object of point coordinates we want to check. + * @param {fabric.Object} obj Object to test against + * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target. + * @return {Boolean} true if point is contained within an area of given object + * @private + */ + _checkTarget: function(pointer, obj, globalPointer) { + if (obj && + obj.visible && + obj.evented && + // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html + // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html + obj.containsPoint(pointer) + ) { + if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) { + var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y); + if (!isTransparent) { + return true; + } + } + else { + return true; + } + } + }, + + /** + * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted + * @param {Array} [objects] objects array to look into + * @param {Object} [pointer] x,y object of point coordinates we want to check. + * @return {fabric.Object} object that contains pointer + * @private + */ + _searchPossibleTargets: function(objects, pointer) { + // Cache all targets where their bounding box contains point. + var target, i = objects.length, subTarget; + // Do not check for currently grouped objects, since we check the parent group itself. + // until we call this function specifically to search inside the activeGroup + while (i--) { + var objToCheck = objects[i]; + var pointerToUse = objToCheck.group ? + this._normalizePointer(objToCheck.group, pointer) : pointer; + if (this._checkTarget(pointerToUse, objToCheck, pointer)) { + target = objects[i]; + if (target.subTargetCheck && target instanceof fabric.Group) { + subTarget = this._searchPossibleTargets(target._objects, pointer); + subTarget && this.targets.push(subTarget); + } + break; + } + } + return target; + }, + + /** + * Returns pointer coordinates without the effect of the viewport + * @param {Object} pointer with "x" and "y" number values + * @return {Object} object with "x" and "y" number values + */ + restorePointerVpt: function(pointer) { + return fabric.util.transformPoint( + pointer, + fabric.util.invertTransform(this.viewportTransform) + ); + }, + + /** + * Returns pointer coordinates relative to canvas. + * Can return coordinates with or without viewportTransform. + * ignoreZoom false gives back coordinates that represent + * the point clicked on canvas element. + * ignoreZoom true gives back coordinates after being processed + * by the viewportTransform ( sort of coordinates of what is displayed + * on the canvas where you are clicking. + * ignoreZoom true = HTMLElement coordinates relative to top,left + * ignoreZoom false, default = fabric space coordinates, the same used for shape position + * To interact with your shapes top and left you want to use ignoreZoom true + * most of the time, while ignoreZoom false will give you coordinates + * compatible with the object.oCoords system. + * of the time. + * @param {Event} e + * @param {Boolean} ignoreZoom + * @return {Object} object with "x" and "y" number values + */ + getPointer: function (e, ignoreZoom) { + // return cached values if we are in the event processing chain + if (this._absolutePointer && !ignoreZoom) { + return this._absolutePointer; + } + if (this._pointer && ignoreZoom) { + return this._pointer; + } + + var pointer = getPointer(e), + upperCanvasEl = this.upperCanvasEl, + bounds = upperCanvasEl.getBoundingClientRect(), + boundsWidth = bounds.width || 0, + boundsHeight = bounds.height || 0, + cssScale; + + if (!boundsWidth || !boundsHeight ) { + if ('top' in bounds && 'bottom' in bounds) { + boundsHeight = Math.abs( bounds.top - bounds.bottom ); + } + if ('right' in bounds && 'left' in bounds) { + boundsWidth = Math.abs( bounds.right - bounds.left ); + } + } + + this.calcOffset(); + pointer.x = pointer.x - this._offset.left; + pointer.y = pointer.y - this._offset.top; + if (!ignoreZoom) { + pointer = this.restorePointerVpt(pointer); + } + + var retinaScaling = this.getRetinaScaling(); + if (retinaScaling !== 1) { + pointer.x /= retinaScaling; + pointer.y /= retinaScaling; + } + + if (boundsWidth === 0 || boundsHeight === 0) { + // If bounds are not available (i.e. not visible), do not apply scale. + cssScale = { width: 1, height: 1 }; + } + else { + cssScale = { + width: upperCanvasEl.width / boundsWidth, + height: upperCanvasEl.height / boundsHeight + }; + } + + return { + x: pointer.x * cssScale.width, + y: pointer.y * cssScale.height + }; + }, + + /** + * @private + * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized + */ + _createUpperCanvas: function () { + var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/, ''), + lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl; + + // there is no need to create a new upperCanvas element if we have already one. + if (upperCanvasEl) { + upperCanvasEl.className = ''; + } + else { + upperCanvasEl = this._createCanvasElement(); + this.upperCanvasEl = upperCanvasEl; + } + fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass); + + this.wrapperEl.appendChild(upperCanvasEl); + + this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl); + this._applyCanvasStyle(upperCanvasEl); + this.contextTop = upperCanvasEl.getContext('2d'); + }, + + /** + * Returns context of top canvas where interactions are drawn + * @returns {CanvasRenderingContext2D} + */ + getTopContext: function () { + return this.contextTop; + }, + + /** + * @private + */ + _createCacheCanvas: function () { + this.cacheCanvasEl = this._createCanvasElement(); + this.cacheCanvasEl.setAttribute('width', this.width); + this.cacheCanvasEl.setAttribute('height', this.height); + this.contextCache = this.cacheCanvasEl.getContext('2d'); + }, + + /** + * @private + */ + _initWrapperElement: function () { + this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { + 'class': this.containerClass + }); + fabric.util.setStyle(this.wrapperEl, { + width: this.width + 'px', + height: this.height + 'px', + position: 'relative' + }); + fabric.util.makeElementUnselectable(this.wrapperEl); + }, + + /** + * @private + * @param {HTMLElement} element canvas element to apply styles on + */ + _applyCanvasStyle: function (element) { + var width = this.width || element.width, + height = this.height || element.height; + + fabric.util.setStyle(element, { + position: 'absolute', + width: width + 'px', + height: height + 'px', + left: 0, + top: 0, + 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none', + '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none' + }); + element.width = width; + element.height = height; + fabric.util.makeElementUnselectable(element); + }, + + /** + * Copy the entire inline style from one element (fromEl) to another (toEl) + * @private + * @param {Element} fromEl Element style is copied from + * @param {Element} toEl Element copied style is applied to + */ + _copyCanvasStyle: function (fromEl, toEl) { + toEl.style.cssText = fromEl.style.cssText; + }, + + /** + * Returns context of canvas where object selection is drawn + * @return {CanvasRenderingContext2D} + */ + getSelectionContext: function() { + return this.contextTop; + }, + + /** + * Returns <canvas> element on which object selection is drawn + * @return {HTMLCanvasElement} + */ + getSelectionElement: function () { + return this.upperCanvasEl; + }, + + /** + * Returns currently active object + * @return {fabric.Object} active object + */ + getActiveObject: function () { + return this._activeObject; + }, + + /** + * Returns an array with the current selected objects + * @return {fabric.Object} active object + */ + getActiveObjects: function () { + var active = this._activeObject; + if (active) { + if (active.type === 'activeSelection' && active._objects) { + return active._objects.slice(0); + } + else { + return [active]; + } + } + return []; + }, + + /** + * @private + * @param {fabric.Object} obj Object that was removed + */ + _onObjectRemoved: function(obj) { + // removing active object should fire "selection:cleared" events + if (obj === this._activeObject) { + this.fire('before:selection:cleared', { target: obj }); + this._discardActiveObject(); + this.fire('selection:cleared', { target: obj }); + obj.fire('deselected'); + } + if (obj === this._hoveredTarget){ + this._hoveredTarget = null; + this._hoveredTargets = []; + } + this.callSuper('_onObjectRemoved', obj); + }, + + /** + * @private + * Compares the old activeObject with the current one and fires correct events + * @param {fabric.Object} obj old activeObject + */ + _fireSelectionEvents: function(oldObjects, e) { + var somethingChanged = false, objects = this.getActiveObjects(), + added = [], removed = []; + oldObjects.forEach(function(oldObject) { + if (objects.indexOf(oldObject) === -1) { + somethingChanged = true; + oldObject.fire('deselected', { + e: e, + target: oldObject + }); + removed.push(oldObject); + } + }); + objects.forEach(function(object) { + if (oldObjects.indexOf(object) === -1) { + somethingChanged = true; + object.fire('selected', { + e: e, + target: object + }); + added.push(object); + } + }); + if (oldObjects.length > 0 && objects.length > 0) { + somethingChanged && this.fire('selection:updated', { + e: e, + selected: added, + deselected: removed, + }); + } + else if (objects.length > 0) { + this.fire('selection:created', { + e: e, + selected: added, + }); + } + else if (oldObjects.length > 0) { + this.fire('selection:cleared', { + e: e, + deselected: removed, + }); + } + }, + + /** + * Sets given object as the only active object on canvas + * @param {fabric.Object} object Object to set as an active one + * @param {Event} [e] Event (passed along when firing "object:selected") + * @return {fabric.Canvas} thisArg + * @chainable + */ + setActiveObject: function (object, e) { + var currentActives = this.getActiveObjects(); + this._setActiveObject(object, e); + this._fireSelectionEvents(currentActives, e); + return this; + }, + + /** + * This is a private method for now. + * This is supposed to be equivalent to setActiveObject but without firing + * any event. There is commitment to have this stay this way. + * This is the functional part of setActiveObject. + * @private + * @param {Object} object to set as active + * @param {Event} [e] Event (passed along when firing "object:selected") + * @return {Boolean} true if the selection happened + */ + _setActiveObject: function(object, e) { + if (this._activeObject === object) { + return false; + } + if (!this._discardActiveObject(e, object)) { + return false; + } + if (object.onSelect({ e: e })) { + return false; + } + this._activeObject = object; + return true; + }, + + /** + * This is a private method for now. + * This is supposed to be equivalent to discardActiveObject but without firing + * any events. There is commitment to have this stay this way. + * This is the functional part of discardActiveObject. + * @param {Event} [e] Event (passed along when firing "object:deselected") + * @param {Object} object to set as active + * @return {Boolean} true if the selection happened + * @private + */ + _discardActiveObject: function(e, object) { + var obj = this._activeObject; + if (obj) { + // onDeselect return TRUE to cancel selection; + if (obj.onDeselect({ e: e, object: object })) { + return false; + } + this._activeObject = null; + } + return true; + }, + + /** + * Discards currently active object and fire events. If the function is called by fabric + * as a consequence of a mouse event, the event is passed as a parameter and + * sent to the fire function for the custom events. When used as a method the + * e param does not have any application. + * @param {event} e + * @return {fabric.Canvas} thisArg + * @chainable + */ + discardActiveObject: function (e) { + var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject(); + if (currentActives.length) { + this.fire('before:selection:cleared', { target: activeObject, e: e }); + } + this._discardActiveObject(e); + this._fireSelectionEvents(currentActives, e); + return this; + }, + + /** + * Clears a canvas element and removes all event listeners + * @return {fabric.Canvas} thisArg + * @chainable + */ + dispose: function () { + var wrapper = this.wrapperEl; + this.removeListeners(); + wrapper.removeChild(this.upperCanvasEl); + wrapper.removeChild(this.lowerCanvasEl); + this.contextCache = null; + this.contextTop = null; + ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) { + fabric.util.cleanUpJsdomNode(this[element]); + this[element] = undefined; + }).bind(this)); + if (wrapper.parentNode) { + wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl); + } + delete this.wrapperEl; + fabric.StaticCanvas.prototype.dispose.call(this); + return this; + }, + + /** + * Clears all contexts (background, main, top) of an instance + * @return {fabric.Canvas} thisArg + * @chainable + */ + clear: function () { + // this.discardActiveGroup(); + this.discardActiveObject(); + this.clearContext(this.contextTop); + return this.callSuper('clear'); + }, + + /** + * Draws objects' controls (borders/controls) + * @param {CanvasRenderingContext2D} ctx Context to render controls on + */ + drawControls: function(ctx) { + var activeObject = this._activeObject; + + if (activeObject) { + activeObject._renderControls(ctx); + } + }, + + /** + * @private + */ + _toObject: function(instance, methodName, propertiesToInclude) { + //If the object is part of the current selection group, it should + //be transformed appropriately + //i.e. it should be serialised as it would appear if the selection group + //were to be destroyed. + var originalProperties = this._realizeGroupTransformOnObject(instance), + object = this.callSuper('_toObject', instance, methodName, propertiesToInclude); + //Undo the damage we did by changing all of its properties + this._unwindGroupTransformOnObject(instance, originalProperties); + return object; + }, + + /** + * Realises an object's group transformation on it + * @private + * @param {fabric.Object} [instance] the object to transform (gets mutated) + * @returns the original values of instance which were changed + */ + _realizeGroupTransformOnObject: function(instance) { + if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) { + var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top']; + //Copy all the positionally relevant properties across now + var originalValues = {}; + layoutProps.forEach(function(prop) { + originalValues[prop] = instance[prop]; + }); + fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix()); + return originalValues; + } + else { + return null; + } + }, + + /** + * Restores the changed properties of instance + * @private + * @param {fabric.Object} [instance] the object to un-transform (gets mutated) + * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject + */ + _unwindGroupTransformOnObject: function(instance, originalValues) { + if (originalValues) { + instance.set(originalValues); + } + }, + + /** + * @private + */ + _setSVGObject: function(markup, instance, reviver) { + //If the object is in a selection group, simulate what would happen to that + //object when the group is deselected + var originalProperties = this._realizeGroupTransformOnObject(instance); + this.callSuper('_setSVGObject', markup, instance, reviver); + this._unwindGroupTransformOnObject(instance, originalProperties); + }, + + setViewportTransform: function (vpt) { + if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) { + this._activeObject.clearContextTop(); + } + fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt); + } + }); + + // copying static properties manually to work around Opera's bug, + // where "prototype" property is enumerable and overrides existing prototype + for (var prop in fabric.StaticCanvas) { + if (prop !== 'prototype') { + fabric.Canvas[prop] = fabric.StaticCanvas[prop]; + } + } +})(); +(function() { + + var addListener = fabric.util.addListener, + removeListener = fabric.util.removeListener, + RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1, + addEventOptions = { passive: false }; + + function checkClick(e, value) { + return e.button && (e.button === value - 1); + } + + fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { + + /** + * Contains the id of the touch event that owns the fabric transform + * @type Number + * @private + */ + mainTouchId: null, + + /** + * Adds mouse listeners to canvas + * @private + */ + _initEventListeners: function () { + // in case we initialized the class twice. This should not happen normally + // but in some kind of applications where the canvas element may be changed + // this is a workaround to having double listeners. + this.removeListeners(); + this._bindEvents(); + this.addOrRemove(addListener, 'add'); + }, + + /** + * return an event prefix pointer or mouse. + * @private + */ + _getEventPrefix: function () { + return this.enablePointerEvents ? 'pointer' : 'mouse'; + }, + + addOrRemove: function(functor, eventjsFunctor) { + var canvasElement = this.upperCanvasEl, + eventTypePrefix = this._getEventPrefix(); + functor(fabric.window, 'resize', this._onResize); + functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown); + functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); + functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut); + functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter); + functor(canvasElement, 'wheel', this._onMouseWheel); + functor(canvasElement, 'contextmenu', this._onContextMenu); + functor(canvasElement, 'dblclick', this._onDoubleClick); + functor(canvasElement, 'dragover', this._onDragOver); + functor(canvasElement, 'dragenter', this._onDragEnter); + functor(canvasElement, 'dragleave', this._onDragLeave); + functor(canvasElement, 'drop', this._onDrop); + if (!this.enablePointerEvents) { + functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions); + } + if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) { + eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture); + eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag); + eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange); + eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake); + eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress); + } + }, + + /** + * Removes all event listeners + */ + removeListeners: function() { + this.addOrRemove(removeListener, 'remove'); + // if you dispose on a mouseDown, before mouse up, you need to clean document to... + var eventTypePrefix = this._getEventPrefix(); + removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); + removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); + removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); + removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); + }, + + /** + * @private + */ + _bindEvents: function() { + if (this.eventsBound) { + // for any reason we pass here twice we do not want to bind events twice. + return; + } + this._onMouseDown = this._onMouseDown.bind(this); + this._onTouchStart = this._onTouchStart.bind(this); + this._onMouseMove = this._onMouseMove.bind(this); + this._onMouseUp = this._onMouseUp.bind(this); + this._onTouchEnd = this._onTouchEnd.bind(this); + this._onResize = this._onResize.bind(this); + this._onGesture = this._onGesture.bind(this); + this._onDrag = this._onDrag.bind(this); + this._onShake = this._onShake.bind(this); + this._onLongPress = this._onLongPress.bind(this); + this._onOrientationChange = this._onOrientationChange.bind(this); + this._onMouseWheel = this._onMouseWheel.bind(this); + this._onMouseOut = this._onMouseOut.bind(this); + this._onMouseEnter = this._onMouseEnter.bind(this); + this._onContextMenu = this._onContextMenu.bind(this); + this._onDoubleClick = this._onDoubleClick.bind(this); + this._onDragOver = this._onDragOver.bind(this); + this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter'); + this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave'); + this._onDrop = this._onDrop.bind(this); + this.eventsBound = true; + }, + + /** + * @private + * @param {Event} [e] Event object fired on Event.js gesture + * @param {Event} [self] Inner Event object + */ + _onGesture: function(e, self) { + this.__onTransformGesture && this.__onTransformGesture(e, self); + }, + + /** + * @private + * @param {Event} [e] Event object fired on Event.js drag + * @param {Event} [self] Inner Event object + */ + _onDrag: function(e, self) { + this.__onDrag && this.__onDrag(e, self); + }, + + /** + * @private + * @param {Event} [e] Event object fired on wheel event + */ + _onMouseWheel: function(e) { + this.__onMouseWheel(e); + }, + + /** + * @private + * @param {Event} e Event object fired on mousedown + */ + _onMouseOut: function(e) { + var target = this._hoveredTarget; + this.fire('mouse:out', { target: target, e: e }); + this._hoveredTarget = null; + target && target.fire('mouseout', { e: e }); + + var _this = this; + this._hoveredTargets.forEach(function(_target){ + _this.fire('mouse:out', { target: target, e: e }); + _target && target.fire('mouseout', { e: e }); + }); + this._hoveredTargets = []; + + if (this._iTextInstances) { + this._iTextInstances.forEach(function(obj) { + if (obj.isEditing) { + obj.hiddenTextarea.focus(); + } + }); + } + }, + + /** + * @private + * @param {Event} e Event object fired on mouseenter + */ + _onMouseEnter: function(e) { + // This find target and consequent 'mouse:over' is used to + // clear old instances on hovered target. + // calling findTarget has the side effect of killing target.__corner. + // as a short term fix we are not firing this if we are currently transforming. + // as a long term fix we need to separate the action of finding a target with the + // side effects we added to it. + if (!this._currentTransform && !this.findTarget(e)) { + this.fire('mouse:over', { target: null, e: e }); + this._hoveredTarget = null; + this._hoveredTargets = []; + } + }, + + /** + * @private + * @param {Event} [e] Event object fired on Event.js orientation change + * @param {Event} [self] Inner Event object + */ + _onOrientationChange: function(e, self) { + this.__onOrientationChange && this.__onOrientationChange(e, self); + }, + + /** + * @private + * @param {Event} [e] Event object fired on Event.js shake + * @param {Event} [self] Inner Event object + */ + _onShake: function(e, self) { + this.__onShake && this.__onShake(e, self); + }, + + /** + * @private + * @param {Event} [e] Event object fired on Event.js shake + * @param {Event} [self] Inner Event object + */ + _onLongPress: function(e, self) { + this.__onLongPress && this.__onLongPress(e, self); + }, + + /** + * prevent default to allow drop event to be fired + * @private + * @param {Event} [e] Event object fired on Event.js shake + */ + _onDragOver: function(e) { + e.preventDefault(); + var target = this._simpleEventHandler('dragover', e); + this._fireEnterLeaveEvents(target, e); + }, + + /** + * `drop:before` is a an event that allow you to schedule logic + * before the `drop` event. Prefer `drop` event always, but if you need + * to run some drop-disabling logic on an event, since there is no way + * to handle event handlers ordering, use `drop:before` + * @param {Event} e + */ + _onDrop: function (e) { + this._simpleEventHandler('drop:before', e); + return this._simpleEventHandler('drop', e); + }, + + /** + * @private + * @param {Event} e Event object fired on mousedown + */ + _onContextMenu: function (e) { + if (this.stopContextMenu) { + e.stopPropagation(); + e.preventDefault(); + } + return false; + }, + + /** + * @private + * @param {Event} e Event object fired on mousedown + */ + _onDoubleClick: function (e) { + this._cacheTransformEventData(e); + this._handleEvent(e, 'dblclick'); + this._resetTransformEventData(e); + }, + + /** + * Return a the id of an event. + * returns either the pointerId or the identifier or 0 for the mouse event + * @private + * @param {Event} evt Event object + */ + getPointerId: function(evt) { + var changedTouches = evt.changedTouches; + + if (changedTouches) { + return changedTouches[0] && changedTouches[0].identifier; + } + + if (this.enablePointerEvents) { + return evt.pointerId; + } + + return -1; + }, + + /** + * Determines if an event has the id of the event that is considered main + * @private + * @param {evt} event Event object + */ + _isMainEvent: function(evt) { + if (evt.isPrimary === true) { + return true; + } + if (evt.isPrimary === false) { + return false; + } + if (evt.type === 'touchend' && evt.touches.length === 0) { + return true; + } + if (evt.changedTouches) { + return evt.changedTouches[0].identifier === this.mainTouchId; + } + return true; + }, + + /** + * @private + * @param {Event} e Event object fired on mousedown + */ + _onTouchStart: function(e) { + e.preventDefault(); + if (this.mainTouchId === null) { + this.mainTouchId = this.getPointerId(e); + } + this.__onMouseDown(e); + this._resetTransformEventData(); + var canvasElement = this.upperCanvasEl, + eventTypePrefix = this._getEventPrefix(); + addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); + addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); + // Unbind mousedown to prevent double triggers from touch devices + removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown); + }, + + /** + * @private + * @param {Event} e Event object fired on mousedown + */ + _onMouseDown: function (e) { + this.__onMouseDown(e); + this._resetTransformEventData(); + var canvasElement = this.upperCanvasEl, + eventTypePrefix = this._getEventPrefix(); + removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); + addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); + addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); + }, + + /** + * @private + * @param {Event} e Event object fired on mousedown + */ + _onTouchEnd: function(e) { + if (e.touches.length > 0) { + // if there are still touches stop here + return; + } + this.__onMouseUp(e); + this._resetTransformEventData(); + this.mainTouchId = null; + var eventTypePrefix = this._getEventPrefix(); + removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); + removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); + var _this = this; + if (this._willAddMouseDown) { + clearTimeout(this._willAddMouseDown); + } + this._willAddMouseDown = setTimeout(function() { + // Wait 400ms before rebinding mousedown to prevent double triggers + // from touch devices + addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown); + _this._willAddMouseDown = 0; + }, 400); + }, + + /** + * @private + * @param {Event} e Event object fired on mouseup + */ + _onMouseUp: function (e) { + this.__onMouseUp(e); + this._resetTransformEventData(); + var canvasElement = this.upperCanvasEl, + eventTypePrefix = this._getEventPrefix(); + if (this._isMainEvent(e)) { + removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); + removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); + addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); + } + }, + + /** + * @private + * @param {Event} e Event object fired on mousemove + */ + _onMouseMove: function (e) { + !this.allowTouchScrolling && e.preventDefault && e.preventDefault(); + this.__onMouseMove(e); + }, + + /** + * @private + */ + _onResize: function () { + this.calcOffset(); + }, + + /** + * Decides whether the canvas should be redrawn in mouseup and mousedown events. + * @private + * @param {Object} target + */ + _shouldRender: function(target) { + var activeObject = this._activeObject; + + if ( + !!activeObject !== !!target || + (activeObject && target && (activeObject !== target)) + ) { + // this covers: switch of target, from target to no target, selection of target + // multiSelection with key and mouse + return true; + } + else if (activeObject && activeObject.isEditing) { + // if we mouse up/down over a editing textbox a cursor change, + // there is no need to re render + return false; + } + return false; + }, + + /** + * Method that defines the actions when mouse is released on canvas. + * The method resets the currentTransform parameters, store the image corner + * position in the image object and render the canvas on top. + * @private + * @param {Event} e Event object fired on mouseup + */ + __onMouseUp: function (e) { + var target, transform = this._currentTransform, + groupSelector = this._groupSelector, shouldRender = false, + isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0)); + this._cacheTransformEventData(e); + target = this._target; + this._handleEvent(e, 'up:before'); + // if right/middle click just fire events and return + // target undefined will make the _handleEvent search the target + if (checkClick(e, RIGHT_CLICK)) { + if (this.fireRightClick) { + this._handleEvent(e, 'up', RIGHT_CLICK, isClick); + } + return; + } + + if (checkClick(e, MIDDLE_CLICK)) { + if (this.fireMiddleClick) { + this._handleEvent(e, 'up', MIDDLE_CLICK, isClick); + } + this._resetTransformEventData(); + return; + } + + if (this.isDrawingMode && this._isCurrentlyDrawing) { + this._onMouseUpInDrawingMode(e); + return; + } + + if (!this._isMainEvent(e)) { + return; + } + if (transform) { + this._finalizeCurrentTransform(e); + shouldRender = transform.actionPerformed; + } + if (!isClick) { + var targetWasActive = target === this._activeObject; + this._maybeGroupObjects(e); + if (!shouldRender) { + shouldRender = ( + this._shouldRender(target) || + (!targetWasActive && target === this._activeObject) + ); + } + } + var corner, pointer; + if (target) { + corner = target._findTargetCorner( + this.getPointer(e, true), + fabric.util.isTouchEvent(e) + ); + if (target.selectable && target !== this._activeObject && target.activeOn === 'up') { + this.setActiveObject(target, e); + shouldRender = true; + } + else { + var control = target.controls[corner], + mouseUpHandler = control && control.getMouseUpHandler(e, target, control); + if (mouseUpHandler) { + pointer = this.getPointer(e); + mouseUpHandler(e, transform, pointer.x, pointer.y); + } + } + target.isMoving = false; + } + // if we are ending up a transform on a different control or a new object + // fire the original mouse up from the corner that started the transform + if (transform && (transform.target !== target || transform.corner !== corner)) { + var originalControl = transform.target && transform.target.controls[transform.corner], + originalMouseUpHandler = originalControl && originalControl.getMouseUpHandler(e, target, control); + pointer = pointer || this.getPointer(e); + originalMouseUpHandler && originalMouseUpHandler(e, transform, pointer.x, pointer.y); + } + this._setCursorFromEvent(e, target); + this._handleEvent(e, 'up', LEFT_CLICK, isClick); + this._groupSelector = null; + this._currentTransform = null; + // reset the target information about which corner is selected + target && (target.__corner = 0); + if (shouldRender) { + this.requestRenderAll(); + } + else if (!isClick) { + this.renderTop(); + } + }, + + /** + * @private + * Handle event firing for target and subtargets + * @param {Event} e event from mouse + * @param {String} eventType event to fire (up, down or move) + * @return {Fabric.Object} target return the the target found, for internal reasons. + */ + _simpleEventHandler: function(eventType, e) { + var target = this.findTarget(e), + targets = this.targets, + options = { + e: e, + target: target, + subTargets: targets, + }; + this.fire(eventType, options); + target && target.fire(eventType, options); + if (!targets) { + return target; + } + for (var i = 0; i < targets.length; i++) { + targets[i].fire(eventType, options); + } + return target; + }, + + /** + * @private + * Handle event firing for target and subtargets + * @param {Event} e event from mouse + * @param {String} eventType event to fire (up, down or move) + * @param {fabric.Object} targetObj receiving event + * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right + * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move. + */ + _handleEvent: function(e, eventType, button, isClick) { + var target = this._target, + targets = this.targets || [], + options = { + e: e, + target: target, + subTargets: targets, + button: button || LEFT_CLICK, + isClick: isClick || false, + pointer: this._pointer, + absolutePointer: this._absolutePointer, + transform: this._currentTransform + }; + if (eventType === 'up') { + options.currentTarget = this.findTarget(e); + options.currentSubTargets = this.targets; + } + this.fire('mouse:' + eventType, options); + target && target.fire('mouse' + eventType, options); + for (var i = 0; i < targets.length; i++) { + targets[i].fire('mouse' + eventType, options); + } + }, + + /** + * @private + * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event + */ + _finalizeCurrentTransform: function(e) { + + var transform = this._currentTransform, + target = transform.target, + options = { + e: e, + target: target, + transform: transform, + action: transform.action, + }; + + if (target._scaling) { + target._scaling = false; + } + + target.setCoords(); + + if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) { + this._fire('modified', options); + } + }, + + /** + * @private + * @param {Event} e Event object fired on mousedown + */ + _onMouseDownInDrawingMode: function(e) { + this._isCurrentlyDrawing = true; + if (this.getActiveObject()) { + this.discardActiveObject(e).requestRenderAll(); + } + var pointer = this.getPointer(e); + this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer }); + this._handleEvent(e, 'down'); + }, + + /** + * @private + * @param {Event} e Event object fired on mousemove + */ + _onMouseMoveInDrawingMode: function(e) { + if (this._isCurrentlyDrawing) { + var pointer = this.getPointer(e); + this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer }); + } + this.setCursor(this.freeDrawingCursor); + this._handleEvent(e, 'move'); + }, + + /** + * @private + * @param {Event} e Event object fired on mouseup + */ + _onMouseUpInDrawingMode: function(e) { + var pointer = this.getPointer(e); + this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer }); + this._handleEvent(e, 'up'); + }, + + /** + * Method that defines the actions when mouse is clicked on canvas. + * The method inits the currentTransform parameters and renders all the + * canvas so the current image can be placed on the top canvas and the rest + * in on the container one. + * @private + * @param {Event} e Event object fired on mousedown + */ + __onMouseDown: function (e) { + this._cacheTransformEventData(e); + this._handleEvent(e, 'down:before'); + var target = this._target; + // if right click just fire events + if (checkClick(e, RIGHT_CLICK)) { + if (this.fireRightClick) { + this._handleEvent(e, 'down', RIGHT_CLICK); + } + return; + } + + if (checkClick(e, MIDDLE_CLICK)) { + if (this.fireMiddleClick) { + this._handleEvent(e, 'down', MIDDLE_CLICK); + } + return; + } + + if (this.isDrawingMode) { + this._onMouseDownInDrawingMode(e); + return; + } + + if (!this._isMainEvent(e)) { + return; + } + + // ignore if some object is being transformed at this moment + if (this._currentTransform) { + return; + } + + var pointer = this._pointer; + // save pointer for check in __onMouseUp event + this._previousPointer = pointer; + var shouldRender = this._shouldRender(target), + shouldGroup = this._shouldGroup(e, target); + if (this._shouldClearSelection(e, target)) { + this.discardActiveObject(e); + } + else if (shouldGroup) { + this._handleGrouping(e, target); + target = this._activeObject; + } + + if (this.selection && (!target || + (!target.selectable && !target.isEditing && target !== this._activeObject))) { + this._groupSelector = { + ex: this._absolutePointer.x, + ey: this._absolutePointer.y, + top: 0, + left: 0 + }; + } + + if (target) { + var alreadySelected = target === this._activeObject; + if (target.selectable && target.activeOn === 'down') { + this.setActiveObject(target, e); + } + var corner = target._findTargetCorner( + this.getPointer(e, true), + fabric.util.isTouchEvent(e) + ); + target.__corner = corner; + if (target === this._activeObject && (corner || !shouldGroup)) { + this._setupCurrentTransform(e, target, alreadySelected); + var control = target.controls[corner], + pointer = this.getPointer(e), + mouseDownHandler = control && control.getMouseDownHandler(e, target, control); + if (mouseDownHandler) { + mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y); + } + } + } + this._handleEvent(e, 'down'); + // we must renderAll so that we update the visuals + (shouldRender || shouldGroup) && this.requestRenderAll(); + }, + + /** + * reset cache form common information needed during event processing + * @private + */ + _resetTransformEventData: function() { + this._target = null; + this._pointer = null; + this._absolutePointer = null; + }, + + /** + * Cache common information needed during event processing + * @private + * @param {Event} e Event object fired on event + */ + _cacheTransformEventData: function(e) { + // reset in order to avoid stale caching + this._resetTransformEventData(); + this._pointer = this.getPointer(e, true); + this._absolutePointer = this.restorePointerVpt(this._pointer); + this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null; + }, + + /** + * @private + */ + _beforeTransform: function(e) { + var t = this._currentTransform; + this.stateful && t.target.saveState(); + this.fire('before:transform', { + e: e, + transform: t, + }); + }, + + /** + * Method that defines the actions when mouse is hovering the canvas. + * The currentTransform parameter will define whether the user is rotating/scaling/translating + * an image or neither of them (only hovering). A group selection is also possible and would cancel + * all any other type of action. + * In case of an image transformation only the top canvas will be rendered. + * @private + * @param {Event} e Event object fired on mousemove + */ + __onMouseMove: function (e) { + this._handleEvent(e, 'move:before'); + this._cacheTransformEventData(e); + var target, pointer; + + if (this.isDrawingMode) { + this._onMouseMoveInDrawingMode(e); + return; + } + + if (!this._isMainEvent(e)) { + return; + } + + var groupSelector = this._groupSelector; + + // We initially clicked in an empty area, so we draw a box for multiple selection + if (groupSelector) { + pointer = this._absolutePointer; + + groupSelector.left = pointer.x - groupSelector.ex; + groupSelector.top = pointer.y - groupSelector.ey; + + this.renderTop(); + } + else if (!this._currentTransform) { + target = this.findTarget(e) || null; + this._setCursorFromEvent(e, target); + this._fireOverOutEvents(target, e); + } + else { + this._transformObject(e); + } + this._handleEvent(e, 'move'); + this._resetTransformEventData(); + }, + + /** + * Manage the mouseout, mouseover events for the fabric object on the canvas + * @param {Fabric.Object} target the target where the target from the mousemove event + * @param {Event} e Event object fired on mousemove + * @private + */ + _fireOverOutEvents: function(target, e) { + var _hoveredTarget = this._hoveredTarget, + _hoveredTargets = this._hoveredTargets, targets = this.targets, + length = Math.max(_hoveredTargets.length, targets.length); + + this.fireSyntheticInOutEvents(target, e, { + oldTarget: _hoveredTarget, + evtOut: 'mouseout', + canvasEvtOut: 'mouse:out', + evtIn: 'mouseover', + canvasEvtIn: 'mouse:over', + }); + for (var i = 0; i < length; i++){ + this.fireSyntheticInOutEvents(targets[i], e, { + oldTarget: _hoveredTargets[i], + evtOut: 'mouseout', + evtIn: 'mouseover', + }); + } + this._hoveredTarget = target; + this._hoveredTargets = this.targets.concat(); + }, + + /** + * Manage the dragEnter, dragLeave events for the fabric objects on the canvas + * @param {Fabric.Object} target the target where the target from the onDrag event + * @param {Event} e Event object fired on ondrag + * @private + */ + _fireEnterLeaveEvents: function(target, e) { + var _draggedoverTarget = this._draggedoverTarget, + _hoveredTargets = this._hoveredTargets, targets = this.targets, + length = Math.max(_hoveredTargets.length, targets.length); + + this.fireSyntheticInOutEvents(target, e, { + oldTarget: _draggedoverTarget, + evtOut: 'dragleave', + evtIn: 'dragenter', + }); + for (var i = 0; i < length; i++) { + this.fireSyntheticInOutEvents(targets[i], e, { + oldTarget: _hoveredTargets[i], + evtOut: 'dragleave', + evtIn: 'dragenter', + }); + } + this._draggedoverTarget = target; + }, + + /** + * Manage the synthetic in/out events for the fabric objects on the canvas + * @param {Fabric.Object} target the target where the target from the supported events + * @param {Event} e Event object fired + * @param {Object} config configuration for the function to work + * @param {String} config.targetName property on the canvas where the old target is stored + * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out + * @param {String} config.evtOut name of the event to fire for out + * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in + * @param {String} config.evtIn name of the event to fire for in + * @private + */ + fireSyntheticInOutEvents: function(target, e, config) { + var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires, + targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut; + if (targetChanged) { + inOpt = { e: e, target: target, previousTarget: oldTarget }; + outOpt = { e: e, target: oldTarget, nextTarget: target }; + } + inFires = target && targetChanged; + outFires = oldTarget && targetChanged; + if (outFires) { + canvasEvtOut && this.fire(canvasEvtOut, outOpt); + oldTarget.fire(config.evtOut, outOpt); + } + if (inFires) { + canvasEvtIn && this.fire(canvasEvtIn, inOpt); + target.fire(config.evtIn, inOpt); + } + }, + + /** + * Method that defines actions when an Event Mouse Wheel + * @param {Event} e Event object fired on mouseup + */ + __onMouseWheel: function(e) { + this._cacheTransformEventData(e); + this._handleEvent(e, 'wheel'); + this._resetTransformEventData(); + }, + + /** + * @private + * @param {Event} e Event fired on mousemove + */ + _transformObject: function(e) { + var pointer = this.getPointer(e), + transform = this._currentTransform; + + transform.reset = false; + transform.shiftKey = e.shiftKey; + transform.altKey = e[this.centeredKey]; + + this._performTransformAction(e, transform, pointer); + transform.actionPerformed && this.requestRenderAll(); + }, + + /** + * @private + */ + _performTransformAction: function(e, transform, pointer) { + var x = pointer.x, + y = pointer.y, + action = transform.action, + actionPerformed = false, + actionHandler = transform.actionHandler; + // this object could be created from the function in the control handlers + + + if (actionHandler) { + actionPerformed = actionHandler(e, transform, x, y); + } + if (action === 'drag' && actionPerformed) { + transform.target.isMoving = true; + this.setCursor(transform.target.moveCursor || this.moveCursor); + } + transform.actionPerformed = transform.actionPerformed || actionPerformed; + }, + + /** + * @private + */ + _fire: fabric.controlsUtils.fireEvent, + + /** + * Sets the cursor depending on where the canvas is being hovered. + * Note: very buggy in Opera + * @param {Event} e Event object + * @param {Object} target Object that the mouse is hovering, if so. + */ + _setCursorFromEvent: function (e, target) { + if (!target) { + this.setCursor(this.defaultCursor); + return false; + } + var hoverCursor = target.hoverCursor || this.hoverCursor, + activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ? + this._activeObject : null, + // only show proper corner when group selection is not active + corner = (!activeSelection || !activeSelection.contains(target)) + // here we call findTargetCorner always with undefined for the touch parameter. + // we assume that if you are using a cursor you do not need to interact with + // the bigger touch area. + && target._findTargetCorner(this.getPointer(e, true)); + + if (!corner) { + if (target.subTargetCheck){ + // hoverCursor should come from top-most subTarget, + // so we walk the array backwards + this.targets.concat().reverse().map(function(_target){ + hoverCursor = _target.hoverCursor || hoverCursor; + }); + } + this.setCursor(hoverCursor); + } + else { + this.setCursor(this.getCornerCursor(corner, target, e)); + } + }, + + /** + * @private + */ + getCornerCursor: function(corner, target, e) { + var control = target.controls[corner]; + return control.cursorStyleHandler(e, control, target); + } + }); +})(); +(function() { + + var min = Math.min, + max = Math.max; + + fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { + + /** + * @private + * @param {Event} e Event object + * @param {fabric.Object} target + * @return {Boolean} + */ + _shouldGroup: function(e, target) { + var activeObject = this._activeObject; + return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection && + (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e }); + }, + + /** + * @private + * @param {Event} e Event object + * @param {fabric.Object} target + */ + _handleGrouping: function (e, target) { + var activeObject = this._activeObject; + // avoid multi select when shift click on a corner + if (activeObject.__corner) { + return; + } + if (target === activeObject) { + // if it's a group, find target again, using activeGroup objects + target = this.findTarget(e, true); + // if even object is not found or we are on activeObjectCorner, bail out + if (!target || !target.selectable) { + return; + } + } + if (activeObject && activeObject.type === 'activeSelection') { + this._updateActiveSelection(target, e); + } + else { + this._createActiveSelection(target, e); + } + }, + + /** + * @private + */ + _updateActiveSelection: function(target, e) { + var activeSelection = this._activeObject, + currentActiveObjects = activeSelection._objects.slice(0); + if (activeSelection.contains(target)) { + activeSelection.removeWithUpdate(target); + this._hoveredTarget = target; + this._hoveredTargets = this.targets.concat(); + if (activeSelection.size() === 1) { + // activate last remaining object + this._setActiveObject(activeSelection.item(0), e); + } + } + else { + activeSelection.addWithUpdate(target); + this._hoveredTarget = activeSelection; + this._hoveredTargets = this.targets.concat(); + } + this._fireSelectionEvents(currentActiveObjects, e); + }, + + /** + * @private + */ + _createActiveSelection: function(target, e) { + var currentActives = this.getActiveObjects(), group = this._createGroup(target); + this._hoveredTarget = group; + // ISSUE 4115: should we consider subTargets here? + // this._hoveredTargets = []; + // this._hoveredTargets = this.targets.concat(); + this._setActiveObject(group, e); + this._fireSelectionEvents(currentActives, e); + }, + + /** + * @private + * @param {Object} target + */ + _createGroup: function(target) { + var objects = this._objects, + isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target), + groupObjects = isActiveLower + ? [this._activeObject, target] + : [target, this._activeObject]; + this._activeObject.isEditing && this._activeObject.exitEditing(); + return new fabric.ActiveSelection(groupObjects, { + canvas: this + }); + }, + + /** + * @private + * @param {Event} e mouse event + */ + _groupSelectedObjects: function (e) { + + var group = this._collectObjects(e), + aGroup; + + // do not create group for 1 element only + if (group.length === 1) { + this.setActiveObject(group[0], e); + } + else if (group.length > 1) { + aGroup = new fabric.ActiveSelection(group.reverse(), { + canvas: this + }); + this.setActiveObject(aGroup, e); + } + }, + + /** + * @private + */ + _collectObjects: function(e) { + var group = [], + currentObject, + x1 = this._groupSelector.ex, + y1 = this._groupSelector.ey, + x2 = x1 + this._groupSelector.left, + y2 = y1 + this._groupSelector.top, + selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)), + selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)), + allowIntersect = !this.selectionFullyContained, + isClick = x1 === x2 && y1 === y2; + // we iterate reverse order to collect top first in case of click. + for (var i = this._objects.length; i--; ) { + currentObject = this._objects[i]; + + if (!currentObject || !currentObject.selectable || !currentObject.visible) { + continue; + } + + if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) || + currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) || + (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) || + (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true)) + ) { + group.push(currentObject); + // only add one object if it's a click + if (isClick) { + break; + } + } + } + + if (group.length > 1) { + group = group.filter(function(object) { + return !object.onSelect({ e: e }); + }); + } + + return group; + }, + + /** + * @private + */ + _maybeGroupObjects: function(e) { + if (this.selection && this._groupSelector) { + this._groupSelectedObjects(e); + } + this.setCursor(this.defaultCursor); + // clear selection and current transformation + this._groupSelector = null; + } + }); + +})(); +(function () { + fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { + + /** + * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately + * @param {Object} [options] Options object + * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" + * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. + * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent + * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 + * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 + * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 + * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 + * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0 + * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format + * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo} + * @example Generate jpeg dataURL with lower quality + * var dataURL = canvas.toDataURL({ + * format: 'jpeg', + * quality: 0.8 + * }); + * @example Generate cropped png dataURL (clipping of canvas) + * var dataURL = canvas.toDataURL({ + * format: 'png', + * left: 100, + * top: 100, + * width: 200, + * height: 200 + * }); + * @example Generate double scaled png dataURL + * var dataURL = canvas.toDataURL({ + * format: 'png', + * multiplier: 2 + * }); + */ + toDataURL: function (options) { + options || (options = { }); + + var format = options.format || 'png', + quality = options.quality || 1, + multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1), + canvasEl = this.toCanvasElement(multiplier, options); + return fabric.util.toDataURL(canvasEl, format, quality); + }, + + /** + * Create a new HTMLCanvas element painted with the current canvas content. + * No need to resize the actual one or repaint it. + * Will transfer object ownership to a new canvas, paint it, and set everything back. + * This is an intermediary step used to get to a dataUrl but also it is useful to + * create quick image copies of a canvas without passing for the dataUrl string + * @param {Number} [multiplier] a zoom factor. + * @param {Object} [cropping] Cropping informations + * @param {Number} [cropping.left] Cropping left offset. + * @param {Number} [cropping.top] Cropping top offset. + * @param {Number} [cropping.width] Cropping width. + * @param {Number} [cropping.height] Cropping height. + */ + toCanvasElement: function(multiplier, cropping) { + multiplier = multiplier || 1; + cropping = cropping || { }; + var scaledWidth = (cropping.width || this.width) * multiplier, + scaledHeight = (cropping.height || this.height) * multiplier, + zoom = this.getZoom(), + originalWidth = this.width, + originalHeight = this.height, + newZoom = zoom * multiplier, + vp = this.viewportTransform, + translateX = (vp[4] - (cropping.left || 0)) * multiplier, + translateY = (vp[5] - (cropping.top || 0)) * multiplier, + originalInteractive = this.interactive, + newVp = [newZoom, 0, 0, newZoom, translateX, translateY], + originalRetina = this.enableRetinaScaling, + canvasEl = fabric.util.createCanvasElement(), + originalContextTop = this.contextTop; + canvasEl.width = scaledWidth; + canvasEl.height = scaledHeight; + this.contextTop = null; + this.enableRetinaScaling = false; + this.interactive = false; + this.viewportTransform = newVp; + this.width = scaledWidth; + this.height = scaledHeight; + this.calcViewportBoundaries(); + this.renderCanvas(canvasEl.getContext('2d'), this._objects); + this.viewportTransform = vp; + this.width = originalWidth; + this.height = originalHeight; + this.calcViewportBoundaries(); + this.interactive = originalInteractive; + this.enableRetinaScaling = originalRetina; + this.contextTop = originalContextTop; + return canvasEl; + }, + }); + +})(); +fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { + /** + * Populates canvas with data from the specified JSON. + * JSON format must conform to the one of {@link fabric.Canvas#toJSON} + * @param {String|Object} json JSON string or object + * @param {Function} callback Callback, invoked when json is parsed + * and corresponding objects (e.g: {@link fabric.Image}) + * are initialized + * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created. + * @return {fabric.Canvas} instance + * @chainable + * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization} + * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo} + * @example loadFromJSON + * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas)); + * @example loadFromJSON with reviver + * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) { + * // `o` = json object + * // `object` = fabric.Object instance + * // ... do some stuff ... + * }); + */ + loadFromJSON: function (json, callback, reviver) { + if (!json) { + return; + } + + // serialize if it wasn't already + var serialized = (typeof json === 'string') + ? JSON.parse(json) + : fabric.util.object.clone(json); + + var _this = this, + clipPath = serialized.clipPath, + renderOnAddRemove = this.renderOnAddRemove; + + this.renderOnAddRemove = false; + + delete serialized.clipPath; + + this._enlivenObjects(serialized.objects, function (enlivenedObjects) { + _this.clear(); + _this._setBgOverlay(serialized, function () { + if (clipPath) { + _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) { + _this.clipPath = enlivenedCanvasClip[0]; + _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); + }); + } + else { + _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); + } + }); + }, reviver); + return this; + }, + + /** + * @private + * @param {Object} serialized Object with background and overlay information + * @param {Array} restored canvas objects + * @param {Function} cached renderOnAddRemove callback + * @param {Function} callback Invoked after all background and overlay images/patterns loaded + */ + __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) { + var _this = this; + enlivenedObjects.forEach(function(obj, index) { + // we splice the array just in case some custom classes restored from JSON + // will add more object to canvas at canvas init. + _this.insertAt(obj, index); + }); + this.renderOnAddRemove = renderOnAddRemove; + // remove parts i cannot set as options + delete serialized.objects; + delete serialized.backgroundImage; + delete serialized.overlayImage; + delete serialized.background; + delete serialized.overlay; + // this._initOptions does too many things to just + // call it. Normally loading an Object from JSON + // create the Object instance. Here the Canvas is + // already an instance and we are just loading things over it + this._setOptions(serialized); + this.renderAll(); + callback && callback(); + }, + + /** + * @private + * @param {Object} serialized Object with background and overlay information + * @param {Function} callback Invoked after all background and overlay images/patterns loaded + */ + _setBgOverlay: function(serialized, callback) { + var loaded = { + backgroundColor: false, + overlayColor: false, + backgroundImage: false, + overlayImage: false + }; + + if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) { + callback && callback(); + return; + } + + var cbIfLoaded = function () { + if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) { + callback && callback(); + } + }; + + this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded); + this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded); + this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded); + this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded); + }, + + /** + * @private + * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor) + * @param {(Object|String)} value Value to set + * @param {Object} loaded Set loaded property to true if property is set + * @param {Object} callback Callback function to invoke after property is set + */ + __setBgOverlay: function(property, value, loaded, callback) { + var _this = this; + + if (!value) { + loaded[property] = true; + callback && callback(); + return; + } + + if (property === 'backgroundImage' || property === 'overlayImage') { + fabric.util.enlivenObjects([value], function(enlivedObject){ + _this[property] = enlivedObject[0]; + loaded[property] = true; + callback && callback(); + }); + } + else { + this['set' + fabric.util.string.capitalize(property, true)](value, function() { + loaded[property] = true; + callback && callback(); + }); + } + }, + + /** + * @private + * @param {Array} objects + * @param {Function} callback + * @param {Function} [reviver] + */ + _enlivenObjects: function (objects, callback, reviver) { + if (!objects || objects.length === 0) { + callback && callback([]); + return; + } + + fabric.util.enlivenObjects(objects, function(enlivenedObjects) { + callback && callback(enlivenedObjects); + }, null, reviver); + }, + + /** + * @private + * @param {String} format + * @param {Function} callback + */ + _toDataURL: function (format, callback) { + this.clone(function (clone) { + callback(clone.toDataURL(format)); + }); + }, + + /** + * @private + * @param {String} format + * @param {Number} multiplier + * @param {Function} callback + */ + _toDataURLWithMultiplier: function (format, multiplier, callback) { + this.clone(function (clone) { + callback(clone.toDataURLWithMultiplier(format, multiplier)); + }); + }, + + /** + * Clones canvas instance + * @param {Object} [callback] Receives cloned instance as a first argument + * @param {Array} [properties] Array of properties to include in the cloned canvas and children + */ + clone: function (callback, properties) { + var data = JSON.stringify(this.toJSON(properties)); + this.cloneWithoutData(function(clone) { + clone.loadFromJSON(data, function() { + callback && callback(clone); + }); + }); + }, + + /** + * Clones canvas instance without cloning existing data. + * This essentially copies canvas dimensions, clipping properties, etc. + * but leaves data empty (so that you can populate it with your own) + * @param {Object} [callback] Receives cloned instance as a first argument + */ + cloneWithoutData: function(callback) { + var el = fabric.util.createCanvasElement(); + + el.width = this.width; + el.height = this.height; + + var clone = new fabric.Canvas(el); + if (this.backgroundImage) { + clone.setBackgroundImage(this.backgroundImage.src, function() { + clone.renderAll(); + callback && callback(clone); + }); + clone.backgroundImageOpacity = this.backgroundImageOpacity; + clone.backgroundImageStretch = this.backgroundImageStretch; + } + else { + callback && callback(clone); + } + } +}); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + clone = fabric.util.object.clone, + toFixed = fabric.util.toFixed, + capitalize = fabric.util.string.capitalize, + degreesToRadians = fabric.util.degreesToRadians, + objectCaching = !fabric.isLikelyNode, + ALIASING_LIMIT = 2; + + if (fabric.Object) { + return; + } + + /** + * Root object class from which all 2d shape classes inherit from + * @class fabric.Object + * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects} + * @see {@link fabric.Object#initialize} for constructor definition + * + * @fires added + * @fires removed + * + * @fires selected + * @fires deselected + * @fires modified + * @fires modified + * @fires moved + * @fires scaled + * @fires rotated + * @fires skewed + * + * @fires rotating + * @fires scaling + * @fires moving + * @fires skewing + * + * @fires mousedown + * @fires mouseup + * @fires mouseover + * @fires mouseout + * @fires mousewheel + * @fires mousedblclick + * + * @fires dragover + * @fires dragenter + * @fires dragleave + * @fires drop + */ + fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ { + + /** + * Type of an object (rect, circle, path, etc.). + * Note that this property is meant to be read-only and not meant to be modified. + * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly. + * @type String + * @default + */ + type: 'object', + + /** + * Horizontal origin of transformation of an object (one of "left", "right", "center") + * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups + * @type String + * @default + */ + originX: 'left', + + /** + * Vertical origin of transformation of an object (one of "top", "bottom", "center") + * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups + * @type String + * @default + */ + originY: 'top', + + /** + * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom} + * @type Number + * @default + */ + top: 0, + + /** + * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right} + * @type Number + * @default + */ + left: 0, + + /** + * Object width + * @type Number + * @default + */ + width: 0, + + /** + * Object height + * @type Number + * @default + */ + height: 0, + + /** + * Object scale factor (horizontal) + * @type Number + * @default + */ + scaleX: 1, + + /** + * Object scale factor (vertical) + * @type Number + * @default + */ + scaleY: 1, + + /** + * When true, an object is rendered as flipped horizontally + * @type Boolean + * @default + */ + flipX: false, + + /** + * When true, an object is rendered as flipped vertically + * @type Boolean + * @default + */ + flipY: false, + + /** + * Opacity of an object + * @type Number + * @default + */ + opacity: 1, + + /** + * Angle of rotation of an object (in degrees) + * @type Number + * @default + */ + angle: 0, + + /** + * Angle of skew on x axes of an object (in degrees) + * @type Number + * @default + */ + skewX: 0, + + /** + * Angle of skew on y axes of an object (in degrees) + * @type Number + * @default + */ + skewY: 0, + + /** + * Size of object's controlling corners (in pixels) + * @type Number + * @default + */ + cornerSize: 13, + + /** + * Size of object's controlling corners when touch interaction is detected + * @type Number + * @default + */ + touchCornerSize: 24, + + /** + * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill) + * @type Boolean + * @default + */ + transparentCorners: true, + + /** + * Default cursor value used when hovering over this object on canvas + * @type String + * @default + */ + hoverCursor: null, + + /** + * Default cursor value used when moving this object on canvas + * @type String + * @default + */ + moveCursor: null, + + /** + * Padding between object and its controlling borders (in pixels) + * @type Number + * @default + */ + padding: 0, + + /** + * Color of controlling borders of an object (when it's active) + * @type String + * @default + */ + borderColor: 'rgb(178,204,255)', + + /** + * Array specifying dash pattern of an object's borders (hasBorder must be true) + * @since 1.6.2 + * @type Array + */ + borderDashArray: null, + + /** + * Color of controlling corners of an object (when it's active) + * @type String + * @default + */ + cornerColor: 'rgb(178,204,255)', + + /** + * Color of controlling corners of an object (when it's active and transparentCorners false) + * @since 1.6.2 + * @type String + * @default + */ + cornerStrokeColor: null, + + /** + * Specify style of control, 'rect' or 'circle' + * @since 1.6.2 + * @type String + */ + cornerStyle: 'rect', + + /** + * Array specifying dash pattern of an object's control (hasBorder must be true) + * @since 1.6.2 + * @type Array + */ + cornerDashArray: null, + + /** + * When true, this object will use center point as the origin of transformation + * when being scaled via the controls. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredScaling: false, + + /** + * When true, this object will use center point as the origin of transformation + * when being rotated via the controls. + * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). + * @since 1.3.4 + * @type Boolean + * @default + */ + centeredRotation: true, + + /** + * Color of object's fill + * takes css colors https://www.w3.org/TR/css-color-3/ + * @type String + * @default + */ + fill: 'rgb(0,0,0)', + + /** + * Fill rule used to fill an object + * accepted values are nonzero, evenodd + * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead) + * @type String + * @default + */ + fillRule: 'nonzero', + + /** + * Composite rule used for canvas globalCompositeOperation + * @type String + * @default + */ + globalCompositeOperation: 'source-over', + + /** + * Background color of an object. + * takes css colors https://www.w3.org/TR/css-color-3/ + * @type String + * @default + */ + backgroundColor: '', + + /** + * Selection Background color of an object. colored layer behind the object when it is active. + * does not mix good with globalCompositeOperation methods. + * @type String + * @default + */ + selectionBackgroundColor: '', + + /** + * When defined, an object is rendered via stroke and this property specifies its color + * takes css colors https://www.w3.org/TR/css-color-3/ + * @type String + * @default + */ + stroke: null, + + /** + * Width of a stroke used to render this object + * @type Number + * @default + */ + strokeWidth: 1, + + /** + * Array specifying dash pattern of an object's stroke (stroke must be defined) + * @type Array + */ + strokeDashArray: null, + + /** + * Line offset of an object's stroke + * @type Number + * @default + */ + strokeDashOffset: 0, + + /** + * Line endings style of an object's stroke (one of "butt", "round", "square") + * @type String + * @default + */ + strokeLineCap: 'butt', + + /** + * Corner style of an object's stroke (one of "bevel", "round", "miter") + * @type String + * @default + */ + strokeLineJoin: 'miter', + + /** + * Maximum miter length (used for strokeLineJoin = "miter") of an object's stroke + * @type Number + * @default + */ + strokeMiterLimit: 4, + + /** + * Shadow object representing shadow of this shape + * @type fabric.Shadow + * @default + */ + shadow: null, + + /** + * Opacity of object's controlling borders when object is active and moving + * @type Number + * @default + */ + borderOpacityWhenMoving: 0.4, + + /** + * Scale factor of object's controlling borders + * bigger number will make a thicker border + * border is 1, so this is basically a border thickness + * since there is no way to change the border itself. + * @type Number + * @default + */ + borderScaleFactor: 1, + + /** + * Minimum allowed scale value of an object + * @type Number + * @default + */ + minScaleLimit: 0, + + /** + * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection). + * But events still fire on it. + * @type Boolean + * @default + */ + selectable: true, + + /** + * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4 + * @type Boolean + * @default + */ + evented: true, + + /** + * When set to `false`, an object is not rendered on canvas + * @type Boolean + * @default + */ + visible: true, + + /** + * When set to `false`, object's controls are not displayed and can not be used to manipulate object + * @type Boolean + * @default + */ + hasControls: true, + + /** + * When set to `false`, object's controlling borders are not rendered + * @type Boolean + * @default + */ + hasBorders: true, + + /** + * When set to `true`, objects are "found" on canvas on per-pixel basis rather than according to bounding box + * @type Boolean + * @default + */ + perPixelTargetFind: false, + + /** + * When `false`, default object's values are not included in its serialization + * @type Boolean + * @default + */ + includeDefaultValues: true, + + /** + * When `true`, object horizontal movement is locked + * @type Boolean + * @default + */ + lockMovementX: false, + + /** + * When `true`, object vertical movement is locked + * @type Boolean + * @default + */ + lockMovementY: false, + + /** + * When `true`, object rotation is locked + * @type Boolean + * @default + */ + lockRotation: false, + + /** + * When `true`, object horizontal scaling is locked + * @type Boolean + * @default + */ + lockScalingX: false, + + /** + * When `true`, object vertical scaling is locked + * @type Boolean + * @default + */ + lockScalingY: false, + + /** + * When `true`, object horizontal skewing is locked + * @type Boolean + * @default + */ + lockSkewingX: false, + + /** + * When `true`, object vertical skewing is locked + * @type Boolean + * @default + */ + lockSkewingY: false, + + /** + * When `true`, object cannot be flipped by scaling into negative values + * @type Boolean + * @default + */ + lockScalingFlip: false, + + /** + * When `true`, object is not exported in OBJECT/JSON + * @since 1.6.3 + * @type Boolean + * @default + */ + excludeFromExport: false, + + /** + * When `true`, object is cached on an additional canvas. + * When `false`, object is not cached unless necessary ( clipPath ) + * default to true + * @since 1.7.0 + * @type Boolean + * @default true + */ + objectCaching: objectCaching, + + /** + * When `true`, object properties are checked for cache invalidation. In some particular + * situation you may want this to be disabled ( spray brush, very big, groups) + * or if your application does not allow you to modify properties for groups child you want + * to disable it for groups. + * default to false + * since 1.7.0 + * @type Boolean + * @default false + */ + statefullCache: false, + + /** + * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled + * too much and will be redrawn with correct details at the end of scaling. + * this setting is performance and application dependant. + * default to true + * since 1.7.0 + * @type Boolean + * @default true + */ + noScaleCache: true, + + /** + * When `false`, the stoke width will scale with the object. + * When `true`, the stroke will always match the exact pixel size entered for stroke width. + * this Property does not work on Text classes or drawing call that uses strokeText,fillText methods + * default to false + * @since 2.6.0 + * @type Boolean + * @default false + * @type Boolean + * @default false + */ + strokeUniform: false, + + /** + * When set to `true`, object's cache will be rerendered next render call. + * since 1.7.0 + * @type Boolean + * @default true + */ + dirty: true, + + /** + * keeps the value of the last hovered corner during mouse move. + * 0 is no corner, or 'mt', 'ml', 'mtr' etc.. + * It should be private, but there is no harm in using it as + * a read-only property. + * @type number|string|any + * @default 0 + */ + __corner: 0, + + /** + * Determines if the fill or the stroke is drawn first (one of "fill" or "stroke") + * @type String + * @default + */ + paintFirst: 'fill', + + /** + * When 'down', object is set to active on mousedown/touchstart + * When 'up', object is set to active on mouseup/touchend + * Experimental. Let's see if this breaks anything before supporting officially + * @private + * since 4.4.0 + * @type String + * @default 'down' + */ + activeOn: 'down', + + /** + * List of properties to consider when checking if state + * of an object is changed (fabric.Object#hasStateChanged) + * as well as for history (undo/redo) purposes + * @type Array + */ + stateProperties: ( + 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' + + 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' + + 'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' + + 'skewX skewY fillRule paintFirst clipPath strokeUniform' + ).split(' '), + + /** + * List of properties to consider when checking if cache needs refresh + * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single + * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty + * and refreshed at the next render + * @type Array + */ + cacheProperties: ( + 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' + + ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath' + ).split(' '), + + /** + * List of properties to consider for animating colors. + * @type Array + */ + colorProperties: ( + 'fill stroke backgroundColor' + ).split(' '), + + /** + * a fabricObject that, without stroke define a clipping area with their shape. filled in black + * the clipPath object gets used when the object has rendered, and the context is placed in the center + * of the object cacheCanvas. + * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center' + * @type fabric.Object + */ + clipPath: undefined, + + /** + * Meaningful ONLY when the object is used as clipPath. + * if true, the clipPath will make the object clip to the outside of the clipPath + * since 2.4.0 + * @type boolean + * @default false + */ + inverted: false, + + /** + * Meaningful ONLY when the object is used as clipPath. + * if true, the clipPath will have its top and left relative to canvas, and will + * not be influenced by the object transform. This will make the clipPath relative + * to the canvas, but clipping just a particular object. + * WARNING this is beta, this feature may change or be renamed. + * since 2.4.0 + * @type boolean + * @default false + */ + absolutePositioned: false, + + /** + * Constructor + * @param {Object} [options] Options object + */ + initialize: function(options) { + if (options) { + this.setOptions(options); + } + }, + + /** + * Create a the canvas used to keep the cached copy of the object + * @private + */ + _createCacheCanvas: function() { + this._cacheProperties = {}; + this._cacheCanvas = fabric.util.createCanvasElement(); + this._cacheContext = this._cacheCanvas.getContext('2d'); + this._updateCacheCanvas(); + // if canvas gets created, is empty, so dirty. + this.dirty = true; + }, + + /** + * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal + * and each side do not cross fabric.cacheSideLimit + * those numbers are configurable so that you can get as much detail as you want + * making bargain with performances. + * @param {Object} dims + * @param {Object} dims.width width of canvas + * @param {Object} dims.height height of canvas + * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache + * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache + * @return {Object}.width width of canvas + * @return {Object}.height height of canvas + * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache + * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache + */ + _limitCacheSize: function(dims) { + var perfLimitSizeTotal = fabric.perfLimitSizeTotal, + width = dims.width, height = dims.height, + max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit; + if (width <= max && height <= max && width * height <= perfLimitSizeTotal) { + if (width < min) { + dims.width = min; + } + if (height < min) { + dims.height = min; + } + return dims; + } + var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal), + capValue = fabric.util.capValue, + x = capValue(min, limitedDims.x, max), + y = capValue(min, limitedDims.y, max); + if (width > x) { + dims.zoomX /= width / x; + dims.width = x; + dims.capped = true; + } + if (height > y) { + dims.zoomY /= height / y; + dims.height = y; + dims.capped = true; + } + return dims; + }, + + /** + * Return the dimension and the zoom level needed to create a cache canvas + * big enough to host the object to be cached. + * @private + * @return {Object}.x width of object to be cached + * @return {Object}.y height of object to be cached + * @return {Object}.width width of canvas + * @return {Object}.height height of canvas + * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache + * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache + */ + _getCacheCanvasDimensions: function() { + var objectScale = this.getTotalObjectScaling(), + // caculate dimensions without skewing + dim = this._getTransformedDimensions(0, 0), + neededX = dim.x * objectScale.scaleX / this.scaleX, + neededY = dim.y * objectScale.scaleY / this.scaleY; + return { + // for sure this ALIASING_LIMIT is slightly creating problem + // in situation in which the cache canvas gets an upper limit + // also objectScale contains already scaleX and scaleY + width: neededX + ALIASING_LIMIT, + height: neededY + ALIASING_LIMIT, + zoomX: objectScale.scaleX, + zoomY: objectScale.scaleY, + x: neededX, + y: neededY + }; + }, + + /** + * Update width and height of the canvas for cache + * returns true or false if canvas needed resize. + * @private + * @return {Boolean} true if the canvas has been resized + */ + _updateCacheCanvas: function() { + var targetCanvas = this.canvas; + if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) { + var target = targetCanvas._currentTransform.target, + action = targetCanvas._currentTransform.action; + if (this === target && action.slice && action.slice(0, 5) === 'scale') { + return false; + } + } + var canvas = this._cacheCanvas, + dims = this._limitCacheSize(this._getCacheCanvasDimensions()), + minCacheSize = fabric.minCacheSideLimit, + width = dims.width, height = dims.height, drawingWidth, drawingHeight, + zoomX = dims.zoomX, zoomY = dims.zoomY, + dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight, + zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY, + shouldRedraw = dimensionsChanged || zoomChanged, + additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false; + if (dimensionsChanged) { + var canvasWidth = this._cacheCanvas.width, + canvasHeight = this._cacheCanvas.height, + sizeGrowing = width > canvasWidth || height > canvasHeight, + sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) && + canvasWidth > minCacheSize && canvasHeight > minCacheSize; + shouldResizeCanvas = sizeGrowing || sizeShrinking; + if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) { + additionalWidth = width * 0.1; + additionalHeight = height * 0.1; + } + } + if (this instanceof fabric.Text && this.path) { + shouldRedraw = true; + shouldResizeCanvas = true; + additionalWidth += this.getHeightOfLine(0) * this.zoomX; + additionalHeight += this.getHeightOfLine(0) * this.zoomY; + } + if (shouldRedraw) { + if (shouldResizeCanvas) { + canvas.width = Math.ceil(width + additionalWidth); + canvas.height = Math.ceil(height + additionalHeight); + } + else { + this._cacheContext.setTransform(1, 0, 0, 1, 0, 0); + this._cacheContext.clearRect(0, 0, canvas.width, canvas.height); + } + drawingWidth = dims.x / 2; + drawingHeight = dims.y / 2; + this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth; + this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight; + this.cacheWidth = width; + this.cacheHeight = height; + this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY); + this._cacheContext.scale(zoomX, zoomY); + this.zoomX = zoomX; + this.zoomY = zoomY; + return true; + } + return false; + }, + + /** + * Sets object's properties from options + * @param {Object} [options] Options object + */ + setOptions: function(options) { + this._setOptions(options); + this._initGradient(options.fill, 'fill'); + this._initGradient(options.stroke, 'stroke'); + this._initPattern(options.fill, 'fill'); + this._initPattern(options.stroke, 'stroke'); + }, + + /** + * Transforms context when rendering an object + * @param {CanvasRenderingContext2D} ctx Context + */ + transform: function(ctx) { + var needFullTransform = (this.group && !this.group._transformDone) || + (this.group && this.canvas && ctx === this.canvas.contextTop); + var m = this.calcTransformMatrix(!needFullTransform); + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + }, + + /** + * Returns an object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of an instance + */ + toObject: function(propertiesToInclude) { + var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, + + object = { + type: this.type, + version: fabric.version, + originX: this.originX, + originY: this.originY, + left: toFixed(this.left, NUM_FRACTION_DIGITS), + top: toFixed(this.top, NUM_FRACTION_DIGITS), + width: toFixed(this.width, NUM_FRACTION_DIGITS), + height: toFixed(this.height, NUM_FRACTION_DIGITS), + fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill, + stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke, + strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS), + strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray, + strokeLineCap: this.strokeLineCap, + strokeDashOffset: this.strokeDashOffset, + strokeLineJoin: this.strokeLineJoin, + strokeUniform: this.strokeUniform, + strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS), + scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS), + scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS), + angle: toFixed(this.angle, NUM_FRACTION_DIGITS), + flipX: this.flipX, + flipY: this.flipY, + opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS), + shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow, + visible: this.visible, + backgroundColor: this.backgroundColor, + fillRule: this.fillRule, + paintFirst: this.paintFirst, + globalCompositeOperation: this.globalCompositeOperation, + skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS), + skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS), + }; + + if (this.clipPath && !this.clipPath.excludeFromExport) { + object.clipPath = this.clipPath.toObject(propertiesToInclude); + object.clipPath.inverted = this.clipPath.inverted; + object.clipPath.absolutePositioned = this.clipPath.absolutePositioned; + } + + fabric.util.populateWithProperties(this, object, propertiesToInclude); + if (!this.includeDefaultValues) { + object = this._removeDefaultValues(object); + } + + return object; + }, + + /** + * Returns (dataless) object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of an instance + */ + toDatalessObject: function(propertiesToInclude) { + // will be overwritten by subclasses + return this.toObject(propertiesToInclude); + }, + + /** + * @private + * @param {Object} object + */ + _removeDefaultValues: function(object) { + var prototype = fabric.util.getKlass(object.type).prototype, + stateProperties = prototype.stateProperties; + stateProperties.forEach(function(prop) { + if (prop === 'left' || prop === 'top') { + return; + } + if (object[prop] === prototype[prop]) { + delete object[prop]; + } + // basically a check for [] === [] + if (Array.isArray(object[prop]) && Array.isArray(prototype[prop]) + && object[prop].length === 0 && prototype[prop].length === 0) { + delete object[prop]; + } + }); + + return object; + }, + + /** + * Returns a string representation of an instance + * @return {String} + */ + toString: function() { + return '#'; + }, + + /** + * Return the object scale factor counting also the group scaling + * @return {Object} object with scaleX and scaleY properties + */ + getObjectScaling: function() { + // if the object is a top level one, on the canvas, we go for simple aritmetic + // otherwise the complex method with angles will return approximations and decimals + // and will likely kill the cache when not needed + // https://github.com/fabricjs/fabric.js/issues/7157 + if (!this.group) { + return { + scaleX: this.scaleX, + scaleY: this.scaleY, + }; + } + // if we are inside a group total zoom calculation is complex, we defer to generic matrices + var options = fabric.util.qrDecompose(this.calcTransformMatrix()); + return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) }; + }, + + /** + * Return the object scale factor counting also the group scaling, zoom and retina + * @return {Object} object with scaleX and scaleY properties + */ + getTotalObjectScaling: function() { + var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY; + if (this.canvas) { + var zoom = this.canvas.getZoom(); + var retina = this.canvas.getRetinaScaling(); + scaleX *= zoom * retina; + scaleY *= zoom * retina; + } + return { scaleX: scaleX, scaleY: scaleY }; + }, + + /** + * Return the object opacity counting also the group property + * @return {Number} + */ + getObjectOpacity: function() { + var opacity = this.opacity; + if (this.group) { + opacity *= this.group.getObjectOpacity(); + } + return opacity; + }, + + /** + * @private + * @param {String} key + * @param {*} value + * @return {fabric.Object} thisArg + */ + _set: function(key, value) { + var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'), + isChanged = this[key] !== value, groupNeedsUpdate = false; + + if (shouldConstrainValue) { + value = this._constrainScale(value); + } + if (key === 'scaleX' && value < 0) { + this.flipX = !this.flipX; + value *= -1; + } + else if (key === 'scaleY' && value < 0) { + this.flipY = !this.flipY; + value *= -1; + } + else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) { + value = new fabric.Shadow(value); + } + else if (key === 'dirty' && this.group) { + this.group.set('dirty', value); + } + + this[key] = value; + + if (isChanged) { + groupNeedsUpdate = this.group && this.group.isOnACache(); + if (this.cacheProperties.indexOf(key) > -1) { + this.dirty = true; + groupNeedsUpdate && this.group.set('dirty', true); + } + else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) { + this.group.set('dirty', true); + } + } + return this; + }, + + /** + * This callback function is called by the parent group of an object every + * time a non-delegated property changes on the group. It is passed the key + * and value as parameters. Not adding in this function's signature to avoid + * Travis build error about unused variables. + */ + setOnGroup: function() { + // implemented by sub-classes, as needed. + }, + + /** + * Retrieves viewportTransform from Object's canvas if possible + * @method getViewportTransform + * @memberOf fabric.Object.prototype + * @return {Array} + */ + getViewportTransform: function() { + if (this.canvas && this.canvas.viewportTransform) { + return this.canvas.viewportTransform; + } + return fabric.iMatrix.concat(); + }, + + /* + * @private + * return if the object would be visible in rendering + * @memberOf fabric.Object.prototype + * @return {Boolean} + */ + isNotVisible: function() { + return this.opacity === 0 || + (!this.width && !this.height && this.strokeWidth === 0) || + !this.visible; + }, + + /** + * Renders an object on a specified context + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + render: function(ctx) { + // do not render if width/height are zeros or object is not visible + if (this.isNotVisible()) { + return; + } + if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { + return; + } + ctx.save(); + this._setupCompositeOperation(ctx); + this.drawSelectionBackground(ctx); + this.transform(ctx); + this._setOpacity(ctx); + this._setShadow(ctx, this); + if (this.shouldCache()) { + this.renderCache(); + this.drawCacheOnCanvas(ctx); + } + else { + this._removeCacheCanvas(); + this.dirty = false; + this.drawObject(ctx); + if (this.objectCaching && this.statefullCache) { + this.saveState({ propertySet: 'cacheProperties' }); + } + } + ctx.restore(); + }, + + renderCache: function(options) { + options = options || {}; + if (!this._cacheCanvas || !this._cacheContext) { + this._createCacheCanvas(); + } + if (this.isCacheDirty()) { + this.statefullCache && this.saveState({ propertySet: 'cacheProperties' }); + this.drawObject(this._cacheContext, options.forClipping); + this.dirty = false; + } + }, + + /** + * Remove cacheCanvas and its dimensions from the objects + */ + _removeCacheCanvas: function() { + this._cacheCanvas = null; + this._cacheContext = null; + this.cacheWidth = 0; + this.cacheHeight = 0; + }, + + /** + * return true if the object will draw a stroke + * Does not consider text styles. This is just a shortcut used at rendering time + * We want it to be an approximation and be fast. + * wrote to avoid extra caching, it has to return true when stroke happens, + * can guess when it will not happen at 100% chance, does not matter if it misses + * some use case where the stroke is invisible. + * @since 3.0.0 + * @returns Boolean + */ + hasStroke: function() { + return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0; + }, + + /** + * return true if the object will draw a fill + * Does not consider text styles. This is just a shortcut used at rendering time + * We want it to be an approximation and be fast. + * wrote to avoid extra caching, it has to return true when fill happens, + * can guess when it will not happen at 100% chance, does not matter if it misses + * some use case where the fill is invisible. + * @since 3.0.0 + * @returns Boolean + */ + hasFill: function() { + return this.fill && this.fill !== 'transparent'; + }, + + /** + * When set to `true`, force the object to have its own cache, even if it is inside a group + * it may be needed when your object behave in a particular way on the cache and always needs + * its own isolated canvas to render correctly. + * Created to be overridden + * since 1.7.12 + * @returns Boolean + */ + needsItsOwnCache: function() { + if (this.paintFirst === 'stroke' && + this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') { + return true; + } + if (this.clipPath) { + return true; + } + return false; + }, + + /** + * Decide if the object should cache or not. Create its own cache level + * objectCaching is a global flag, wins over everything + * needsItsOwnCache should be used when the object drawing method requires + * a cache step. None of the fabric classes requires it. + * Generally you do not cache objects in groups because the group outside is cached. + * Read as: cache if is needed, or if the feature is enabled but we are not already caching. + * @return {Boolean} + */ + shouldCache: function() { + this.ownCaching = this.needsItsOwnCache() || ( + this.objectCaching && + (!this.group || !this.group.isOnACache()) + ); + return this.ownCaching; + }, + + /** + * Check if this object or a child object will cast a shadow + * used by Group.shouldCache to know if child has a shadow recursively + * @return {Boolean} + */ + willDrawShadow: function() { + return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0); + }, + + /** + * Execute the drawing operation for an object clipPath + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {fabric.Object} clipPath + */ + drawClipPathOnCache: function(ctx, clipPath) { + ctx.save(); + // DEBUG: uncomment this line, comment the following + // ctx.globalAlpha = 0.4 + if (clipPath.inverted) { + ctx.globalCompositeOperation = 'destination-out'; + } + else { + ctx.globalCompositeOperation = 'destination-in'; + } + //ctx.scale(1 / 2, 1 / 2); + if (clipPath.absolutePositioned) { + var m = fabric.util.invertTransform(this.calcTransformMatrix()); + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + clipPath.transform(ctx); + ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY); + ctx.drawImage(clipPath._cacheCanvas, -clipPath.cacheTranslationX, -clipPath.cacheTranslationY); + ctx.restore(); + }, + + /** + * Execute the drawing operation for an object on a specified context + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + drawObject: function(ctx, forClipping) { + var originalFill = this.fill, originalStroke = this.stroke; + if (forClipping) { + this.fill = 'black'; + this.stroke = ''; + this._setClippingProperties(ctx); + } + else { + this._renderBackground(ctx); + } + this._render(ctx); + this._drawClipPath(ctx, this.clipPath); + this.fill = originalFill; + this.stroke = originalStroke; + }, + + /** + * Prepare clipPath state and cache and draw it on instance's cache + * @param {CanvasRenderingContext2D} ctx + * @param {fabric.Object} clipPath + */ + _drawClipPath: function (ctx, clipPath) { + if (!clipPath) { return; } + // needed to setup a couple of variables + // path canvas gets overridden with this one. + // TODO find a better solution? + clipPath.canvas = this.canvas; + clipPath.shouldCache(); + clipPath._transformDone = true; + clipPath.renderCache({ forClipping: true }); + this.drawClipPathOnCache(ctx, clipPath); + }, + + /** + * Paint the cached copy of the object on the target context. + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + drawCacheOnCanvas: function(ctx) { + ctx.scale(1 / this.zoomX, 1 / this.zoomY); + ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY); + }, + + /** + * Check if cache is dirty + * @param {Boolean} skipCanvas skip canvas checks because this object is painted + * on parent canvas. + */ + isCacheDirty: function(skipCanvas) { + if (this.isNotVisible()) { + return false; + } + if (this._cacheCanvas && this._cacheContext && !skipCanvas && this._updateCacheCanvas()) { + // in this case the context is already cleared. + return true; + } + else { + if (this.dirty || + (this.clipPath && this.clipPath.absolutePositioned) || + (this.statefullCache && this.hasStateChanged('cacheProperties')) + ) { + if (this._cacheCanvas && this._cacheContext && !skipCanvas) { + var width = this.cacheWidth / this.zoomX; + var height = this.cacheHeight / this.zoomY; + this._cacheContext.clearRect(-width / 2, -height / 2, width, height); + } + return true; + } + } + return false; + }, + + /** + * Draws a background for the object big as its untransformed dimensions + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderBackground: function(ctx) { + if (!this.backgroundColor) { + return; + } + var dim = this._getNonTransformedDimensions(); + ctx.fillStyle = this.backgroundColor; + + ctx.fillRect( + -dim.x / 2, + -dim.y / 2, + dim.x, + dim.y + ); + // if there is background color no other shadows + // should be casted + this._removeShadow(ctx); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _setOpacity: function(ctx) { + if (this.group && !this.group._transformDone) { + ctx.globalAlpha = this.getObjectOpacity(); + } + else { + ctx.globalAlpha *= this.opacity; + } + }, + + _setStrokeStyles: function(ctx, decl) { + var stroke = decl.stroke; + if (stroke) { + ctx.lineWidth = decl.strokeWidth; + ctx.lineCap = decl.strokeLineCap; + ctx.lineDashOffset = decl.strokeDashOffset; + ctx.lineJoin = decl.strokeLineJoin; + ctx.miterLimit = decl.strokeMiterLimit; + if (stroke.toLive) { + if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) { + // need to transform gradient in a pattern. + // this is a slow process. If you are hitting this codepath, and the object + // is not using caching, you should consider switching it on. + // we need a canvas as big as the current object caching canvas. + this._applyPatternForTransformedGradient(ctx, stroke); + } + else { + // is a simple gradient or pattern + ctx.strokeStyle = stroke.toLive(ctx, this); + this._applyPatternGradientTransform(ctx, stroke); + } + } + else { + // is a color + ctx.strokeStyle = decl.stroke; + } + } + }, + + _setFillStyles: function(ctx, decl) { + var fill = decl.fill; + if (fill) { + if (fill.toLive) { + ctx.fillStyle = fill.toLive(ctx, this); + this._applyPatternGradientTransform(ctx, decl.fill); + } + else { + ctx.fillStyle = fill; + } + } + }, + + _setClippingProperties: function(ctx) { + ctx.globalAlpha = 1; + ctx.strokeStyle = 'transparent'; + ctx.fillStyle = '#000000'; + }, + + /** + * @private + * Sets line dash + * @param {CanvasRenderingContext2D} ctx Context to set the dash line on + * @param {Array} dashArray array representing dashes + */ + _setLineDash: function(ctx, dashArray) { + if (!dashArray || dashArray.length === 0) { + return; + } + // Spec requires the concatenation of two copies the dash list when the number of elements is odd + if (1 & dashArray.length) { + dashArray.push.apply(dashArray, dashArray); + } + ctx.setLineDash(dashArray); + }, + + /** + * Renders controls and borders for the object + * the context here is not transformed + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Object} [styleOverride] properties to override the object style + */ + _renderControls: function(ctx, styleOverride) { + var vpt = this.getViewportTransform(), + matrix = this.calcTransformMatrix(), + options, drawBorders, drawControls; + styleOverride = styleOverride || { }; + drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders; + drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls; + matrix = fabric.util.multiplyTransformMatrices(vpt, matrix); + options = fabric.util.qrDecompose(matrix); + ctx.save(); + ctx.translate(options.translateX, options.translateY); + ctx.lineWidth = 1 * this.borderScaleFactor; + if (!this.group) { + ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; + } + if (this.flipX) { + options.angle -= 180; + } + ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle)); + if (styleOverride.forActiveSelection || this.group) { + drawBorders && this.drawBordersInGroup(ctx, options, styleOverride); + } + else { + drawBorders && this.drawBorders(ctx, styleOverride); + } + drawControls && this.drawControls(ctx, styleOverride); + ctx.restore(); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _setShadow: function(ctx) { + if (!this.shadow) { + return; + } + + var shadow = this.shadow, canvas = this.canvas, scaling, + multX = (canvas && canvas.viewportTransform[0]) || 1, + multY = (canvas && canvas.viewportTransform[3]) || 1; + if (shadow.nonScaling) { + scaling = { scaleX: 1, scaleY: 1 }; + } + else { + scaling = this.getObjectScaling(); + } + if (canvas && canvas._isRetinaScaling()) { + multX *= fabric.devicePixelRatio; + multY *= fabric.devicePixelRatio; + } + ctx.shadowColor = shadow.color; + ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant * + (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4; + ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX; + ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _removeShadow: function(ctx) { + if (!this.shadow) { + return; + } + + ctx.shadowColor = ''; + ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Object} filler fabric.Pattern or fabric.Gradient + * @return {Object} offset.offsetX offset for text rendering + * @return {Object} offset.offsetY offset for text rendering + */ + _applyPatternGradientTransform: function(ctx, filler) { + if (!filler || !filler.toLive) { + return { offsetX: 0, offsetY: 0 }; + } + var t = filler.gradientTransform || filler.patternTransform; + var offsetX = -this.width / 2 + filler.offsetX || 0, + offsetY = -this.height / 2 + filler.offsetY || 0; + + if (filler.gradientUnits === 'percentage') { + ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY); + } + else { + ctx.transform(1, 0, 0, 1, offsetX, offsetY); + } + if (t) { + ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]); + } + return { offsetX: offsetX, offsetY: offsetY }; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderPaintInOrder: function(ctx) { + if (this.paintFirst === 'stroke') { + this._renderStroke(ctx); + this._renderFill(ctx); + } + else { + this._renderFill(ctx); + this._renderStroke(ctx); + } + }, + + /** + * @private + * function that actually render something on the context. + * empty here to allow Obects to work on tests to benchmark fabric functionalites + * not related to rendering + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(/* ctx */) { + + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderFill: function(ctx) { + if (!this.fill) { + return; + } + + ctx.save(); + this._setFillStyles(ctx, this); + if (this.fillRule === 'evenodd') { + ctx.fill('evenodd'); + } + else { + ctx.fill(); + } + ctx.restore(); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderStroke: function(ctx) { + if (!this.stroke || this.strokeWidth === 0) { + return; + } + + if (this.shadow && !this.shadow.affectStroke) { + this._removeShadow(ctx); + } + + ctx.save(); + if (this.strokeUniform && this.group) { + var scaling = this.getObjectScaling(); + ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY); + } + else if (this.strokeUniform) { + ctx.scale(1 / this.scaleX, 1 / this.scaleY); + } + this._setLineDash(ctx, this.strokeDashArray); + this._setStrokeStyles(ctx, this); + ctx.stroke(); + ctx.restore(); + }, + + /** + * This function try to patch the missing gradientTransform on canvas gradients. + * transforming a context to transform the gradient, is going to transform the stroke too. + * we want to transform the gradient but not the stroke operation, so we create + * a transformed gradient on a pattern and then we use the pattern instead of the gradient. + * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size + * is limited. + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {fabric.Gradient} filler a fabric gradient instance + */ + _applyPatternForTransformedGradient: function(ctx, filler) { + var dims = this._limitCacheSize(this._getCacheCanvasDimensions()), + pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(), + width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling; + pCanvas.width = width; + pCanvas.height = height; + pCtx = pCanvas.getContext('2d'); + pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); + pCtx.lineTo(0, height); pCtx.closePath(); + pCtx.translate(width / 2, height / 2); + pCtx.scale( + dims.zoomX / this.scaleX / retinaScaling, + dims.zoomY / this.scaleY / retinaScaling + ); + this._applyPatternGradientTransform(pCtx, filler); + pCtx.fillStyle = filler.toLive(ctx); + pCtx.fill(); + ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2); + ctx.scale( + retinaScaling * this.scaleX / dims.zoomX, + retinaScaling * this.scaleY / dims.zoomY + ); + ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat'); + }, + + /** + * This function is an helper for svg import. it returns the center of the object in the svg + * untransformed coordinates + * @private + * @return {Object} center point from element coordinates + */ + _findCenterFromElement: function() { + return { x: this.left + this.width / 2, y: this.top + this.height / 2 }; + }, + + /** + * This function is an helper for svg import. it decompose the transformMatrix + * and assign properties to object. + * untransformed coordinates + * @private + * @chainable + */ + _assignTransformMatrixProps: function() { + if (this.transformMatrix) { + var options = fabric.util.qrDecompose(this.transformMatrix); + this.flipX = false; + this.flipY = false; + this.set('scaleX', options.scaleX); + this.set('scaleY', options.scaleY); + this.angle = options.angle; + this.skewX = options.skewX; + this.skewY = 0; + } + }, + + /** + * This function is an helper for svg import. it removes the transform matrix + * and set to object properties that fabricjs can handle + * @private + * @param {Object} preserveAspectRatioOptions + * @return {thisArg} + */ + _removeTransformMatrix: function(preserveAspectRatioOptions) { + var center = this._findCenterFromElement(); + if (this.transformMatrix) { + this._assignTransformMatrixProps(); + center = fabric.util.transformPoint(center, this.transformMatrix); + } + this.transformMatrix = null; + if (preserveAspectRatioOptions) { + this.scaleX *= preserveAspectRatioOptions.scaleX; + this.scaleY *= preserveAspectRatioOptions.scaleY; + this.cropX = preserveAspectRatioOptions.cropX; + this.cropY = preserveAspectRatioOptions.cropY; + center.x += preserveAspectRatioOptions.offsetLeft; + center.y += preserveAspectRatioOptions.offsetTop; + this.width = preserveAspectRatioOptions.width; + this.height = preserveAspectRatioOptions.height; + } + this.setPositionByOrigin(center, 'center', 'center'); + }, + + /** + * Clones an instance, using a callback method will work for every object. + * @param {Function} callback Callback is invoked with a clone as a first argument + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + */ + clone: function(callback, propertiesToInclude) { + var objectForm = this.toObject(propertiesToInclude); + if (this.constructor.fromObject) { + this.constructor.fromObject(objectForm, callback); + } + else { + fabric.Object._fromObject('Object', objectForm, callback); + } + }, + + /** + * Creates an instance of fabric.Image out of an object + * makes use of toCanvasElement. + * Once this method was based on toDataUrl and loadImage, so it also had a quality + * and format option. toCanvasElement is faster and produce no loss of quality. + * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it. + * toCanvasElement and then toBlob from the obtained canvas is also a good option. + * This method is sync now, but still support the callback because we did not want to break. + * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback. + * @param {Function} callback callback, invoked with an instance as a first argument + * @param {Object} [options] for clone as image, passed to toDataURL + * @param {Number} [options.multiplier=1] Multiplier to scale by + * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 + * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 + * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 + * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 + * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 + * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 + * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 + * @return {fabric.Object} thisArg + */ + cloneAsImage: function(callback, options) { + var canvasEl = this.toCanvasElement(options); + if (callback) { + callback(new fabric.Image(canvasEl)); + } + return this; + }, + + /** + * Converts an object into a HTMLCanvas element + * @param {Object} options Options object + * @param {Number} [options.multiplier=1] Multiplier to scale by + * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 + * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 + * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 + * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 + * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 + * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 + * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 + * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object + */ + toCanvasElement: function(options) { + options || (options = { }); + + var utils = fabric.util, origParams = utils.saveObjectTransform(this), + originalGroup = this.group, + originalShadow = this.shadow, abs = Math.abs, + multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1); + delete this.group; + if (options.withoutTransform) { + utils.resetObjectTransform(this); + } + if (options.withoutShadow) { + this.shadow = null; + } + + var el = fabric.util.createCanvasElement(), + // skip canvas zoom and calculate with setCoords now. + boundingRect = this.getBoundingRect(true, true), + shadow = this.shadow, scaling, + shadowOffset = { x: 0, y: 0 }, shadowBlur, + width, height; + + if (shadow) { + shadowBlur = shadow.blur; + if (shadow.nonScaling) { + scaling = { scaleX: 1, scaleY: 1 }; + } + else { + scaling = this.getObjectScaling(); + } + // consider non scaling shadow. + shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX)); + shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY)); + } + width = boundingRect.width + shadowOffset.x; + height = boundingRect.height + shadowOffset.y; + // if the current width/height is not an integer + // we need to make it so. + el.width = Math.ceil(width); + el.height = Math.ceil(height); + var canvas = new fabric.StaticCanvas(el, { + enableRetinaScaling: false, + renderOnAddRemove: false, + skipOffscreen: false, + }); + if (options.format === 'jpeg') { + canvas.backgroundColor = '#fff'; + } + this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center'); + + var originalCanvas = this.canvas; + canvas.add(this); + var canvasEl = canvas.toCanvasElement(multiplier || 1, options); + this.shadow = originalShadow; + this.set('canvas', originalCanvas); + if (originalGroup) { + this.group = originalGroup; + } + this.set(origParams).setCoords(); + // canvas.dispose will call image.dispose that will nullify the elements + // since this canvas is a simple element for the process, we remove references + // to objects in this way in order to avoid object trashing. + canvas._objects = []; + canvas.dispose(); + canvas = null; + + return canvasEl; + }, + + /** + * Converts an object into a data-url-like string + * @param {Object} options Options object + * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" + * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. + * @param {Number} [options.multiplier=1] Multiplier to scale by + * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 + * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 + * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 + * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 + * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 + * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 + * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 + * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format + */ + toDataURL: function(options) { + options || (options = { }); + return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1); + }, + + /** + * Returns true if specified type is identical to the type of an instance + * @param {String} type Type to check against + * @return {Boolean} + */ + isType: function(type) { + return arguments.length > 1 ? Array.from(arguments).includes(this.type) : this.type === type; + }, + + /** + * Returns complexity of an instance + * @return {Number} complexity of this instance (is 1 unless subclassed) + */ + complexity: function() { + return 1; + }, + + /** + * Returns a JSON representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} JSON + */ + toJSON: function(propertiesToInclude) { + // delegate, not alias + return this.toObject(propertiesToInclude); + }, + + /** + * Sets "angle" of an instance with centered rotation + * @param {Number} angle Angle value (in degrees) + * @return {fabric.Object} thisArg + * @chainable + */ + rotate: function(angle) { + var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation; + + if (shouldCenterOrigin) { + this._setOriginToCenter(); + } + + this.set('angle', angle); + + if (shouldCenterOrigin) { + this._resetOrigin(); + } + + return this; + }, + + /** + * Centers object horizontally on canvas to which it was added last. + * You might need to call `setCoords` on an object after centering, to update controls area. + * @return {fabric.Object} thisArg + * @chainable + */ + centerH: function () { + this.canvas && this.canvas.centerObjectH(this); + return this; + }, + + /** + * Centers object horizontally on current viewport of canvas to which it was added last. + * You might need to call `setCoords` on an object after centering, to update controls area. + * @return {fabric.Object} thisArg + * @chainable + */ + viewportCenterH: function () { + this.canvas && this.canvas.viewportCenterObjectH(this); + return this; + }, + + /** + * Centers object vertically on canvas to which it was added last. + * You might need to call `setCoords` on an object after centering, to update controls area. + * @return {fabric.Object} thisArg + * @chainable + */ + centerV: function () { + this.canvas && this.canvas.centerObjectV(this); + return this; + }, + + /** + * Centers object vertically on current viewport of canvas to which it was added last. + * You might need to call `setCoords` on an object after centering, to update controls area. + * @return {fabric.Object} thisArg + * @chainable + */ + viewportCenterV: function () { + this.canvas && this.canvas.viewportCenterObjectV(this); + return this; + }, + + /** + * Centers object vertically and horizontally on canvas to which is was added last + * You might need to call `setCoords` on an object after centering, to update controls area. + * @return {fabric.Object} thisArg + * @chainable + */ + center: function () { + this.canvas && this.canvas.centerObject(this); + return this; + }, + + /** + * Centers object on current viewport of canvas to which it was added last. + * You might need to call `setCoords` on an object after centering, to update controls area. + * @return {fabric.Object} thisArg + * @chainable + */ + viewportCenter: function () { + this.canvas && this.canvas.viewportCenterObject(this); + return this; + }, + + /** + * Returns coordinates of a pointer relative to an object + * @param {Event} e Event to operate upon + * @param {Object} [pointer] Pointer to operate upon (instead of event) + * @return {Object} Coordinates of a pointer (x, y) + */ + getLocalPointer: function(e, pointer) { + pointer = pointer || this.canvas.getPointer(e); + var pClicked = new fabric.Point(pointer.x, pointer.y), + objectLeftTop = this._getLeftTopCoords(); + if (this.angle) { + pClicked = fabric.util.rotatePoint( + pClicked, objectLeftTop, degreesToRadians(-this.angle)); + } + return { + x: pClicked.x - objectLeftTop.x, + y: pClicked.y - objectLeftTop.y + }; + }, + + /** + * Sets canvas globalCompositeOperation for specific object + * custom composition operation for the particular object can be specified using globalCompositeOperation property + * @param {CanvasRenderingContext2D} ctx Rendering canvas context + */ + _setupCompositeOperation: function (ctx) { + if (this.globalCompositeOperation) { + ctx.globalCompositeOperation = this.globalCompositeOperation; + } + }, + + /** + * cancel instance's running animations + * override if necessary to dispose artifacts such as `clipPath` + */ + dispose: function () { + if (fabric.runningAnimations) { + fabric.runningAnimations.cancelByTarget(this); + } + } + }); + + fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object); + + extend(fabric.Object.prototype, fabric.Observable); + + /** + * Defines the number of fraction digits to use when serializing object values. + * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. + * @static + * @memberOf fabric.Object + * @constant + * @type Number + */ + fabric.Object.NUM_FRACTION_DIGITS = 2; + + /** + * Defines which properties should be enlivened from the object passed to {@link fabric.Object._fromObject} + * @static + * @memberOf fabric.Object + * @constant + * @type string[] + */ + fabric.Object.ENLIVEN_PROPS = ['clipPath']; + + fabric.Object._fromObject = function(className, object, callback, extraParam) { + var klass = fabric[className]; + object = clone(object, true); + fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) { + if (typeof patterns[0] !== 'undefined') { + object.fill = patterns[0]; + } + if (typeof patterns[1] !== 'undefined') { + object.stroke = patterns[1]; + } + fabric.util.enlivenObjectEnlivables(object, object, function () { + var instance = extraParam ? new klass(object[extraParam], object) : new klass(object); + callback && callback(instance); + }); + }); + }; + + /** + * Unique id used internally when creating SVG elements + * @static + * @memberOf fabric.Object + * @type Number + */ + fabric.Object.__uid = 0; +})(typeof exports !== 'undefined' ? exports : this); +(function() { + + var degreesToRadians = fabric.util.degreesToRadians, + originXOffset = { + left: -0.5, + center: 0, + right: 0.5 + }, + originYOffset = { + top: -0.5, + center: 0, + bottom: 0.5 + }; + + fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + + /** + * Translates the coordinates from a set of origin to another (based on the object's dimensions) + * @param {fabric.Point} point The point which corresponds to the originX and originY params + * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right' + * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom' + * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right' + * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom' + * @return {fabric.Point} + */ + translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) { + var x = point.x, + y = point.y, + offsetX, offsetY, dim; + + if (typeof fromOriginX === 'string') { + fromOriginX = originXOffset[fromOriginX]; + } + else { + fromOriginX -= 0.5; + } + + if (typeof toOriginX === 'string') { + toOriginX = originXOffset[toOriginX]; + } + else { + toOriginX -= 0.5; + } + + offsetX = toOriginX - fromOriginX; + + if (typeof fromOriginY === 'string') { + fromOriginY = originYOffset[fromOriginY]; + } + else { + fromOriginY -= 0.5; + } + + if (typeof toOriginY === 'string') { + toOriginY = originYOffset[toOriginY]; + } + else { + toOriginY -= 0.5; + } + + offsetY = toOriginY - fromOriginY; + + if (offsetX || offsetY) { + dim = this._getTransformedDimensions(); + x = point.x + offsetX * dim.x; + y = point.y + offsetY * dim.y; + } + + return new fabric.Point(x, y); + }, + + /** + * Translates the coordinates from origin to center coordinates (based on the object's dimensions) + * @param {fabric.Point} point The point which corresponds to the originX and originY params + * @param {String} originX Horizontal origin: 'left', 'center' or 'right' + * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' + * @return {fabric.Point} + */ + translateToCenterPoint: function(point, originX, originY) { + var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center'); + if (this.angle) { + return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle)); + } + return p; + }, + + /** + * Translates the coordinates from center to origin coordinates (based on the object's dimensions) + * @param {fabric.Point} center The point which corresponds to center of the object + * @param {String} originX Horizontal origin: 'left', 'center' or 'right' + * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' + * @return {fabric.Point} + */ + translateToOriginPoint: function(center, originX, originY) { + var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); + if (this.angle) { + return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle)); + } + return p; + }, + + /** + * Returns the real center coordinates of the object + * @return {fabric.Point} + */ + getCenterPoint: function() { + var leftTop = new fabric.Point(this.left, this.top); + return this.translateToCenterPoint(leftTop, this.originX, this.originY); + }, + + /** + * Returns the coordinates of the object based on center coordinates + * @param {fabric.Point} point The point which corresponds to the originX and originY params + * @return {fabric.Point} + */ + // getOriginPoint: function(center) { + // return this.translateToOriginPoint(center, this.originX, this.originY); + // }, + + /** + * Returns the coordinates of the object as if it has a different origin + * @param {String} originX Horizontal origin: 'left', 'center' or 'right' + * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' + * @return {fabric.Point} + */ + getPointByOrigin: function(originX, originY) { + var center = this.getCenterPoint(); + return this.translateToOriginPoint(center, originX, originY); + }, + + /** + * Returns the point in local coordinates + * @param {fabric.Point} point The point relative to the global coordinate system + * @param {String} originX Horizontal origin: 'left', 'center' or 'right' + * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' + * @return {fabric.Point} + */ + toLocalPoint: function(point, originX, originY) { + var center = this.getCenterPoint(), + p, p2; + + if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) { + p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); + } + else { + p = new fabric.Point(this.left, this.top); + } + + p2 = new fabric.Point(point.x, point.y); + if (this.angle) { + p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle)); + } + return p2.subtractEquals(p); + }, + + /** + * Returns the point in global coordinates + * @param {fabric.Point} The point relative to the local coordinate system + * @return {fabric.Point} + */ + // toGlobalPoint: function(point) { + // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top)); + // }, + + /** + * Sets the position of the object taking into consideration the object's origin + * @param {fabric.Point} pos The new position of the object + * @param {String} originX Horizontal origin: 'left', 'center' or 'right' + * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' + * @return {void} + */ + setPositionByOrigin: function(pos, originX, originY) { + var center = this.translateToCenterPoint(pos, originX, originY), + position = this.translateToOriginPoint(center, this.originX, this.originY); + this.set('left', position.x); + this.set('top', position.y); + }, + + /** + * @param {String} to One of 'left', 'center', 'right' + */ + adjustPosition: function(to) { + var angle = degreesToRadians(this.angle), + hypotFull = this.getScaledWidth(), + xFull = fabric.util.cos(angle) * hypotFull, + yFull = fabric.util.sin(angle) * hypotFull, + offsetFrom, offsetTo; + + //TODO: this function does not consider mixed situation like top, center. + if (typeof this.originX === 'string') { + offsetFrom = originXOffset[this.originX]; + } + else { + offsetFrom = this.originX - 0.5; + } + if (typeof to === 'string') { + offsetTo = originXOffset[to]; + } + else { + offsetTo = to - 0.5; + } + this.left += xFull * (offsetTo - offsetFrom); + this.top += yFull * (offsetTo - offsetFrom); + this.setCoords(); + this.originX = to; + }, + + /** + * Sets the origin/position of the object to it's center point + * @private + * @return {void} + */ + _setOriginToCenter: function() { + this._originalOriginX = this.originX; + this._originalOriginY = this.originY; + + var center = this.getCenterPoint(); + + this.originX = 'center'; + this.originY = 'center'; + + this.left = center.x; + this.top = center.y; + }, + + /** + * Resets the origin/position of the object to it's original origin + * @private + * @return {void} + */ + _resetOrigin: function() { + var originPoint = this.translateToOriginPoint( + this.getCenterPoint(), + this._originalOriginX, + this._originalOriginY); + + this.originX = this._originalOriginX; + this.originY = this._originalOriginY; + + this.left = originPoint.x; + this.top = originPoint.y; + + this._originalOriginX = null; + this._originalOriginY = null; + }, + + /** + * @private + */ + _getLeftTopCoords: function() { + return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top'); + }, + }); + +})(); +(function() { + + function arrayFromCoords(coords) { + return [ + new fabric.Point(coords.tl.x, coords.tl.y), + new fabric.Point(coords.tr.x, coords.tr.y), + new fabric.Point(coords.br.x, coords.br.y), + new fabric.Point(coords.bl.x, coords.bl.y) + ]; + } + + var util = fabric.util, + degreesToRadians = util.degreesToRadians, + multiplyMatrices = util.multiplyTransformMatrices, + transformPoint = util.transformPoint; + + util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + + /** + * Describe object's corner position in canvas element coordinates. + * properties are depending on control keys and padding the main controls. + * each property is an object with x, y and corner. + * The `corner` property contains in a similar manner the 4 points of the + * interactive area of the corner. + * The coordinates depends from the controls positionHandler and are used + * to draw and locate controls + * @memberOf fabric.Object.prototype + */ + oCoords: null, + + /** + * Describe object's corner position in canvas object absolute coordinates + * properties are tl,tr,bl,br and describe the four main corner. + * each property is an object with x, y, instance of Fabric.Point. + * The coordinates depends from this properties: width, height, scaleX, scaleY + * skewX, skewY, angle, strokeWidth, top, left. + * Those coordinates are useful to understand where an object is. They get updated + * with oCoords but they do not need to be updated when zoom or panning change. + * The coordinates get updated with @method setCoords. + * You can calculate them without updating with @method calcACoords(); + * @memberOf fabric.Object.prototype + */ + aCoords: null, + + /** + * Describe object's corner position in canvas element coordinates. + * includes padding. Used of object detection. + * set and refreshed with setCoords. + * @memberOf fabric.Object.prototype + */ + lineCoords: null, + + /** + * storage for object transform matrix + */ + ownMatrixCache: null, + + /** + * storage for object full transform matrix + */ + matrixCache: null, + + /** + * custom controls interface + * controls are added by default_controls.js + */ + controls: { }, + + /** + * return correct set of coordinates for intersection + * this will return either aCoords or lineCoords. + * @param {Boolean} absolute will return aCoords if true or lineCoords + * @return {Object} {tl, tr, br, bl} points + */ + _getCoords: function(absolute, calculate) { + if (calculate) { + return (absolute ? this.calcACoords() : this.calcLineCoords()); + } + if (!this.aCoords || !this.lineCoords) { + this.setCoords(true); + } + return (absolute ? this.aCoords : this.lineCoords); + }, + + /** + * return correct set of coordinates for intersection + * this will return either aCoords or lineCoords. + * The coords are returned in an array. + * @return {Array} [tl, tr, br, bl] of points + */ + getCoords: function(absolute, calculate) { + return arrayFromCoords(this._getCoords(absolute, calculate)); + }, + + /** + * Checks if object intersects with an area formed by 2 points + * @param {Object} pointTL top-left point of area + * @param {Object} pointBR bottom-right point of area + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords + * @return {Boolean} true if object intersects with an area formed by 2 points + */ + intersectsWithRect: function(pointTL, pointBR, absolute, calculate) { + var coords = this.getCoords(absolute, calculate), + intersection = fabric.Intersection.intersectPolygonRectangle( + coords, + pointTL, + pointBR + ); + return intersection.status === 'Intersection'; + }, + + /** + * Checks if object intersects with another object + * @param {Object} other Object to test + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords + * @return {Boolean} true if object intersects with another object + */ + intersectsWithObject: function(other, absolute, calculate) { + var intersection = fabric.Intersection.intersectPolygonPolygon( + this.getCoords(absolute, calculate), + other.getCoords(absolute, calculate) + ); + + return intersection.status === 'Intersection' + || other.isContainedWithinObject(this, absolute, calculate) + || this.isContainedWithinObject(other, absolute, calculate); + }, + + /** + * Checks if object is fully contained within area of another object + * @param {Object} other Object to test + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords + * @return {Boolean} true if object is fully contained within area of another object + */ + isContainedWithinObject: function(other, absolute, calculate) { + var points = this.getCoords(absolute, calculate), + otherCoords = absolute ? other.aCoords : other.lineCoords, + i = 0, lines = other._getImageLines(otherCoords); + for (; i < 4; i++) { + if (!other.containsPoint(points[i], lines)) { + return false; + } + } + return true; + }, + + /** + * Checks if object is fully contained within area formed by 2 points + * @param {Object} pointTL top-left point of area + * @param {Object} pointBR bottom-right point of area + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords + * @return {Boolean} true if object is fully contained within area formed by 2 points + */ + isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) { + var boundingRect = this.getBoundingRect(absolute, calculate); + + return ( + boundingRect.left >= pointTL.x && + boundingRect.left + boundingRect.width <= pointBR.x && + boundingRect.top >= pointTL.y && + boundingRect.top + boundingRect.height <= pointBR.y + ); + }, + + /** + * Checks if point is inside the object + * @param {fabric.Point} point Point to check against + * @param {Object} [lines] object returned from @method _getImageLines + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords + * @return {Boolean} true if point is inside the object + */ + containsPoint: function(point, lines, absolute, calculate) { + var coords = this._getCoords(absolute, calculate), + lines = lines || this._getImageLines(coords), + xPoints = this._findCrossPoints(point, lines); + // if xPoints is odd then point is inside the object + return (xPoints !== 0 && xPoints % 2 === 1); + }, + + /** + * Checks if object is contained within the canvas with current viewportTransform + * the check is done stopping at first point that appears on screen + * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords + * @return {Boolean} true if object is fully or partially contained within canvas + */ + isOnScreen: function(calculate) { + if (!this.canvas) { + return false; + } + var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; + var points = this.getCoords(true, calculate); + // if some point is on screen, the object is on screen. + if (points.some(function(point) { + return point.x <= pointBR.x && point.x >= pointTL.x && + point.y <= pointBR.y && point.y >= pointTL.y; + })) { + return true; + } + // no points on screen, check intersection with absolute coordinates + if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { + return true; + } + return this._containsCenterOfCanvas(pointTL, pointBR, calculate); + }, + + /** + * Checks if the object contains the midpoint between canvas extremities + * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen + * @private + * @param {Fabric.Point} pointTL Top Left point + * @param {Fabric.Point} pointBR Top Right point + * @param {Boolean} calculate use coordinates of current position instead of .oCoords + * @return {Boolean} true if the object contains the point + */ + _containsCenterOfCanvas: function(pointTL, pointBR, calculate) { + // worst case scenario the object is so big that contains the screen + var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 }; + if (this.containsPoint(centerPoint, null, true, calculate)) { + return true; + } + return false; + }, + + /** + * Checks if object is partially contained within the canvas with current viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords + * @return {Boolean} true if object is partially contained within canvas + */ + isPartiallyOnScreen: function(calculate) { + if (!this.canvas) { + return false; + } + var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; + if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { + return true; + } + var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) { + return (point.x >= pointBR.x || point.x <= pointTL.x) && + (point.y >= pointBR.y || point.y <= pointTL.y); + }); + return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate); + }, + + /** + * Method that returns an object with the object edges in it, given the coordinates of the corners + * @private + * @param {Object} oCoords Coordinates of the object corners + */ + _getImageLines: function(oCoords) { + + var lines = { + topline: { + o: oCoords.tl, + d: oCoords.tr + }, + rightline: { + o: oCoords.tr, + d: oCoords.br + }, + bottomline: { + o: oCoords.br, + d: oCoords.bl + }, + leftline: { + o: oCoords.bl, + d: oCoords.tl + } + }; + + // // debugging + // if (this.canvas.contextTop) { + // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); + // + // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); + // + // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); + // + // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); + // } + + return lines; + }, + + /** + * Helper method to determine how many cross points are between the 4 object edges + * and the horizontal line determined by a point on canvas + * @private + * @param {fabric.Point} point Point to check + * @param {Object} lines Coordinates of the object being evaluated + */ + // remove yi, not used but left code here just in case. + _findCrossPoints: function(point, lines) { + var b1, b2, a1, a2, xi, // yi, + xcount = 0, + iLine; + + for (var lineKey in lines) { + iLine = lines[lineKey]; + // optimisation 1: line below point. no cross + if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) { + continue; + } + // optimisation 2: line above point. no cross + if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) { + continue; + } + // optimisation 3: vertical line case + if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) { + xi = iLine.o.x; + // yi = point.y; + } + // calculate the intersection point + else { + b1 = 0; + b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x); + a1 = point.y - b1 * point.x; + a2 = iLine.o.y - b2 * iLine.o.x; + + xi = -(a1 - a2) / (b1 - b2); + // yi = a1 + b1 * xi; + } + // dont count xi < point.x cases + if (xi >= point.x) { + xcount += 1; + } + // optimisation 4: specific for square images + if (xcount === 2) { + break; + } + } + return xcount; + }, + + /** + * Returns coordinates of object's bounding rectangle (left, top, width, height) + * the box is intended as aligned to axis of canvas. + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords + * @return {Object} Object with left, top, width, height properties + */ + getBoundingRect: function(absolute, calculate) { + var coords = this.getCoords(absolute, calculate); + return util.makeBoundingBoxFromPoints(coords); + }, + + /** + * Returns width of an object's bounding box counting transformations + * before 2.0 it was named getWidth(); + * @return {Number} width value + */ + getScaledWidth: function() { + return this._getTransformedDimensions().x; + }, + + /** + * Returns height of an object bounding box counting transformations + * before 2.0 it was named getHeight(); + * @return {Number} height value + */ + getScaledHeight: function() { + return this._getTransformedDimensions().y; + }, + + /** + * Makes sure the scale is valid and modifies it if necessary + * @private + * @param {Number} value + * @return {Number} + */ + _constrainScale: function(value) { + if (Math.abs(value) < this.minScaleLimit) { + if (value < 0) { + return -this.minScaleLimit; + } + else { + return this.minScaleLimit; + } + } + else if (value === 0) { + return 0.0001; + } + return value; + }, + + /** + * Scales an object (equally by x and y) + * @param {Number} value Scale factor + * @return {fabric.Object} thisArg + * @chainable + */ + scale: function(value) { + this._set('scaleX', value); + this._set('scaleY', value); + return this.setCoords(); + }, + + /** + * Scales an object to a given width, with respect to bounding box (scaling by x/y equally) + * @param {Number} value New width value + * @param {Boolean} absolute ignore viewport + * @return {fabric.Object} thisArg + * @chainable + */ + scaleToWidth: function(value, absolute) { + // adjust to bounding rect factor so that rotated shapes would fit as well + var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth(); + return this.scale(value / this.width / boundingRectFactor); + }, + + /** + * Scales an object to a given height, with respect to bounding box (scaling by x/y equally) + * @param {Number} value New height value + * @param {Boolean} absolute ignore viewport + * @return {fabric.Object} thisArg + * @chainable + */ + scaleToHeight: function(value, absolute) { + // adjust to bounding rect factor so that rotated shapes would fit as well + var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight(); + return this.scale(value / this.height / boundingRectFactor); + }, + + calcLineCoords: function() { + var vpt = this.getViewportTransform(), + padding = this.padding, angle = degreesToRadians(this.angle), + cos = util.cos(angle), sin = util.sin(angle), + cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP, + cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords(); + + var lineCoords = { + tl: transformPoint(aCoords.tl, vpt), + tr: transformPoint(aCoords.tr, vpt), + bl: transformPoint(aCoords.bl, vpt), + br: transformPoint(aCoords.br, vpt), + }; + + if (padding) { + lineCoords.tl.x -= cosPMinusSinP; + lineCoords.tl.y -= cosPSinP; + lineCoords.tr.x += cosPSinP; + lineCoords.tr.y -= cosPMinusSinP; + lineCoords.bl.x -= cosPSinP; + lineCoords.bl.y += cosPMinusSinP; + lineCoords.br.x += cosPMinusSinP; + lineCoords.br.y += cosPSinP; + } + + return lineCoords; + }, + + calcOCoords: function() { + var rotateMatrix = this._calcRotateMatrix(), + translateMatrix = this._calcTranslateMatrix(), + vpt = this.getViewportTransform(), + startMatrix = multiplyMatrices(vpt, translateMatrix), + finalMatrix = multiplyMatrices(startMatrix, rotateMatrix), + finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]), + dim = this._calculateCurrentDimensions(), + coords = {}; + this.forEachControl(function(control, key, fabricObject) { + coords[key] = control.positionHandler(dim, finalMatrix, fabricObject); + }); + + // debug code + // var canvas = this.canvas; + // setTimeout(function() { + // canvas.contextTop.clearRect(0, 0, 700, 700); + // canvas.contextTop.fillStyle = 'green'; + // Object.keys(coords).forEach(function(key) { + // var control = coords[key]; + // canvas.contextTop.fillRect(control.x, control.y, 3, 3); + // }); + // }, 50); + return coords; + }, + + calcACoords: function() { + var rotateMatrix = this._calcRotateMatrix(), + translateMatrix = this._calcTranslateMatrix(), + finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix), + dim = this._getTransformedDimensions(), + w = dim.x / 2, h = dim.y / 2; + return { + // corners + tl: transformPoint({ x: -w, y: -h }, finalMatrix), + tr: transformPoint({ x: w, y: -h }, finalMatrix), + bl: transformPoint({ x: -w, y: h }, finalMatrix), + br: transformPoint({ x: w, y: h }, finalMatrix) + }; + }, + + /** + * Sets corner and controls position coordinates based on current angle, width and height, left and top. + * oCoords are used to find the corners + * aCoords are used to quickly find an object on the canvas + * lineCoords are used to quickly find object during pointer events. + * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas} + * + * @param {Boolean} [skipCorners] skip calculation of oCoords. + * @return {fabric.Object} thisArg + * @chainable + */ + setCoords: function(skipCorners) { + this.aCoords = this.calcACoords(); + // in case we are in a group, for how the inner group target check works, + // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer. + this.lineCoords = this.group ? this.aCoords : this.calcLineCoords(); + if (skipCorners) { + return this; + } + // set coordinates of the draggable boxes in the corners used to scale/rotate the image + this.oCoords = this.calcOCoords(); + this._setCornerCoords && this._setCornerCoords(); + return this; + }, + + /** + * calculate rotation matrix of an object + * @return {Array} rotation matrix for the object + */ + _calcRotateMatrix: function() { + return util.calcRotateMatrix(this); + }, + + /** + * calculate the translation matrix for an object transform + * @return {Array} rotation matrix for the object + */ + _calcTranslateMatrix: function() { + var center = this.getCenterPoint(); + return [1, 0, 0, 1, center.x, center.y]; + }, + + transformMatrixKey: function(skipGroup) { + var sep = '_', prefix = ''; + if (!skipGroup && this.group) { + prefix = this.group.transformMatrixKey(skipGroup) + sep; + }; + return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY + + sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY + + sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY; + }, + + /** + * calculate transform matrix that represents the current transformations from the + * object's properties. + * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations + * There are some situation in which this is useful to avoid the fake rotation. + * @return {Array} transform matrix for the object + */ + calcTransformMatrix: function(skipGroup) { + var matrix = this.calcOwnMatrix(); + if (skipGroup || !this.group) { + return matrix; + } + var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {}); + if (cache.key === key) { + return cache.value; + } + if (this.group) { + matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix); + } + cache.key = key; + cache.value = matrix; + return matrix; + }, + + /** + * calculate transform matrix that represents the current transformations from the + * object's properties, this matrix does not include the group transformation + * @return {Array} transform matrix for the object + */ + calcOwnMatrix: function() { + var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {}); + if (cache.key === key) { + return cache.value; + } + var tMatrix = this._calcTranslateMatrix(), + options = { + angle: this.angle, + translateX: tMatrix[4], + translateY: tMatrix[5], + scaleX: this.scaleX, + scaleY: this.scaleY, + skewX: this.skewX, + skewY: this.skewY, + flipX: this.flipX, + flipY: this.flipY, + }; + cache.key = key; + cache.value = util.composeMatrix(options); + return cache.value; + }, + + /* + * Calculate object dimensions from its properties + * @private + * @return {Object} .x width dimension + * @return {Object} .y height dimension + */ + _getNonTransformedDimensions: function() { + var strokeWidth = this.strokeWidth, + w = this.width + strokeWidth, + h = this.height + strokeWidth; + return { x: w, y: h }; + }, + + /* + * Calculate object bounding box dimensions from its properties scale, skew. + * @param {Number} skewX, a value to override current skewX + * @param {Number} skewY, a value to override current skewY + * @private + * @return {Object} .x width dimension + * @return {Object} .y height dimension + */ + _getTransformedDimensions: function(skewX, skewY) { + if (typeof skewX === 'undefined') { + skewX = this.skewX; + } + if (typeof skewY === 'undefined') { + skewY = this.skewY; + } + var dimensions, dimX, dimY, + noSkew = skewX === 0 && skewY === 0; + + if (this.strokeUniform) { + dimX = this.width; + dimY = this.height; + } + else { + dimensions = this._getNonTransformedDimensions(); + dimX = dimensions.x; + dimY = dimensions.y; + } + if (noSkew) { + return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY); + } + var bbox = util.sizeAfterTransform(dimX, dimY, { + scaleX: this.scaleX, + scaleY: this.scaleY, + skewX: skewX, + skewY: skewY, + }); + return this._finalizeDimensions(bbox.x, bbox.y); + }, + + /* + * Calculate object bounding box dimensions from its properties scale, skew. + * @param Number width width of the bbox + * @param Number height height of the bbox + * @private + * @return {Object} .x finalized width dimension + * @return {Object} .y finalized height dimension + */ + _finalizeDimensions: function(width, height) { + return this.strokeUniform ? + { x: width + this.strokeWidth, y: height + this.strokeWidth } + : + { x: width, y: height }; + }, + + /* + * Calculate object dimensions for controls box, including padding and canvas zoom. + * and active selection + * private + */ + _calculateCurrentDimensions: function() { + var vpt = this.getViewportTransform(), + dim = this._getTransformedDimensions(), + p = transformPoint(dim, vpt, true); + return p.scalarAdd(2 * this.padding); + }, + }); +})(); +fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + + /** + * Moves an object to the bottom of the stack of drawn objects + * @return {fabric.Object} thisArg + * @chainable + */ + sendToBack: function() { + if (this.group) { + fabric.StaticCanvas.prototype.sendToBack.call(this.group, this); + } + else if (this.canvas) { + this.canvas.sendToBack(this); + } + return this; + }, + + /** + * Moves an object to the top of the stack of drawn objects + * @return {fabric.Object} thisArg + * @chainable + */ + bringToFront: function() { + if (this.group) { + fabric.StaticCanvas.prototype.bringToFront.call(this.group, this); + } + else if (this.canvas) { + this.canvas.bringToFront(this); + } + return this; + }, + + /** + * Moves an object down in stack of drawn objects + * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object + * @return {fabric.Object} thisArg + * @chainable + */ + sendBackwards: function(intersecting) { + if (this.group) { + fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting); + } + else if (this.canvas) { + this.canvas.sendBackwards(this, intersecting); + } + return this; + }, + + /** + * Moves an object up in stack of drawn objects + * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object + * @return {fabric.Object} thisArg + * @chainable + */ + bringForward: function(intersecting) { + if (this.group) { + fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting); + } + else if (this.canvas) { + this.canvas.bringForward(this, intersecting); + } + return this; + }, + + /** + * Moves an object to specified level in stack of drawn objects + * @param {Number} index New position of object + * @return {fabric.Object} thisArg + * @chainable + */ + moveTo: function(index) { + if (this.group && this.group.type !== 'activeSelection') { + fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index); + } + else if (this.canvas) { + this.canvas.moveTo(this, index); + } + return this; + } +}); +/* _TO_SVG_START_ */ +(function() { + function getSvgColorString(prop, value) { + if (!value) { + return prop + ': none; '; + } + else if (value.toLive) { + return prop + ': url(#SVGID_' + value.id + '); '; + } + else { + var color = new fabric.Color(value), + str = prop + ': ' + color.toRgb() + '; ', + opacity = color.getAlpha(); + if (opacity !== 1) { + //change the color in rgb + opacity + str += prop + '-opacity: ' + opacity.toString() + '; '; + } + return str; + } + } + + var toFixed = fabric.util.toFixed; + + fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + /** + * Returns styles-string for svg-export + * @param {Boolean} skipShadow a boolean to skip shadow filter output + * @return {String} + */ + getSvgStyles: function(skipShadow) { + + var fillRule = this.fillRule ? this.fillRule : 'nonzero', + strokeWidth = this.strokeWidth ? this.strokeWidth : '0', + strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none', + strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0', + strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt', + strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter', + strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4', + opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1', + visibility = this.visible ? '' : ' visibility: hidden;', + filter = skipShadow ? '' : this.getSvgFilter(), + fill = getSvgColorString('fill', this.fill), + stroke = getSvgColorString('stroke', this.stroke); + + return [ + stroke, + 'stroke-width: ', strokeWidth, '; ', + 'stroke-dasharray: ', strokeDashArray, '; ', + 'stroke-linecap: ', strokeLineCap, '; ', + 'stroke-dashoffset: ', strokeDashOffset, '; ', + 'stroke-linejoin: ', strokeLineJoin, '; ', + 'stroke-miterlimit: ', strokeMiterLimit, '; ', + fill, + 'fill-rule: ', fillRule, '; ', + 'opacity: ', opacity, ';', + filter, + visibility + ].join(''); + }, + + /** + * Returns styles-string for svg-export + * @param {Object} style the object from which to retrieve style properties + * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style. + * @return {String} + */ + getSvgSpanStyles: function(style, useWhiteSpace) { + var term = '; '; + var fontFamily = style.fontFamily ? + 'font-family: ' + (((style.fontFamily.indexOf('\'') === -1 && style.fontFamily.indexOf('"') === -1) ? + '\'' + style.fontFamily + '\'' : style.fontFamily)) + term : ''; + var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '', + fontFamily = fontFamily, + fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '', + fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '', + fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '', + fill = style.fill ? getSvgColorString('fill', style.fill) : '', + stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '', + textDecoration = this.getSvgTextDecoration(style), + deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : ''; + if (textDecoration) { + textDecoration = 'text-decoration: ' + textDecoration + term; + } + + return [ + stroke, + strokeWidth, + fontFamily, + fontSize, + fontStyle, + fontWeight, + textDecoration, + fill, + deltaY, + useWhiteSpace ? 'white-space: pre; ' : '' + ].join(''); + }, + + /** + * Returns text-decoration property for svg-export + * @param {Object} style the object from which to retrieve style properties + * @return {String} + */ + getSvgTextDecoration: function(style) { + return ['overline', 'underline', 'line-through'].filter(function(decoration) { + return style[decoration.replace('-', '')]; + }).join(' '); + }, + + /** + * Returns filter for svg shadow + * @return {String} + */ + getSvgFilter: function() { + return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : ''; + }, + + /** + * Returns id attribute for svg output + * @return {String} + */ + getSvgCommons: function() { + return [ + this.id ? 'id="' + this.id + '" ' : '', + this.clipPath ? 'clip-path="url(#' + this.clipPath.clipPathId + ')" ' : '', + ].join(''); + }, + + /** + * Returns transform-string for svg-export + * @param {Boolean} use the full transform or the single object one. + * @return {String} + */ + getSvgTransform: function(full, additionalTransform) { + var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(), + svgTransform = 'transform="' + fabric.util.matrixToSVG(transform); + return svgTransform + + (additionalTransform || '') + '" '; + }, + + _setSVGBg: function(textBgRects) { + if (this.backgroundColor) { + var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; + textBgRects.push( + '\t\t\n'); + } + }, + + /** + * Returns svg representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + toSVG: function(reviver) { + return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver }); + }, + + /** + * Returns svg clipPath representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + toClipPathSVG: function(reviver) { + return '\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver }); + }, + + /** + * @private + */ + _createBaseClipPathSVGMarkup: function(objectMarkup, options) { + options = options || {}; + var reviver = options.reviver, + additionalTransform = options.additionalTransform || '', + commonPieces = [ + this.getSvgTransform(true, additionalTransform), + this.getSvgCommons(), + ].join(''), + // insert commons in the markup, style and svgCommons + index = objectMarkup.indexOf('COMMON_PARTS'); + objectMarkup[index] = commonPieces; + return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join(''); + }, + + /** + * @private + */ + _createBaseSVGMarkup: function(objectMarkup, options) { + options = options || {}; + var noStyle = options.noStyle, + reviver = options.reviver, + styleInfo = noStyle ? '' : 'style="' + this.getSvgStyles() + '" ', + shadowInfo = options.withShadow ? 'style="' + this.getSvgFilter() + '" ' : '', + clipPath = this.clipPath, + vectorEffect = this.strokeUniform ? 'vector-effect="non-scaling-stroke" ' : '', + absoluteClipPath = clipPath && clipPath.absolutePositioned, + stroke = this.stroke, fill = this.fill, shadow = this.shadow, + commonPieces, markup = [], clipPathMarkup, + // insert commons in the markup, style and svgCommons + index = objectMarkup.indexOf('COMMON_PARTS'), + additionalTransform = options.additionalTransform; + if (clipPath) { + clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++; + clipPathMarkup = '\n' + + clipPath.toClipPathSVG(reviver) + + '\n'; + } + if (absoluteClipPath) { + markup.push( + '\n' + ); + } + markup.push( + '\n' + ); + commonPieces = [ + styleInfo, + vectorEffect, + noStyle ? '' : this.addPaintOrder(), ' ', + additionalTransform ? 'transform="' + additionalTransform + '" ' : '', + ].join(''); + objectMarkup[index] = commonPieces; + if (fill && fill.toLive) { + markup.push(fill.toSVG(this)); + } + if (stroke && stroke.toLive) { + markup.push(stroke.toSVG(this)); + } + if (shadow) { + markup.push(shadow.toSVG(this)); + } + if (clipPath) { + markup.push(clipPathMarkup); + } + markup.push(objectMarkup.join('')); + markup.push('\n'); + absoluteClipPath && markup.push('\n'); + return reviver ? reviver(markup.join('')) : markup.join(''); + }, + + addPaintOrder: function() { + return this.paintFirst !== 'fill' ? ' paint-order="' + this.paintFirst + '" ' : ''; + } + }); +})(); +/* _TO_SVG_END_ */ +(function() { + + var extend = fabric.util.object.extend, + originalSet = 'stateProperties'; + + /* + Depends on `stateProperties` + */ + function saveProps(origin, destination, props) { + var tmpObj = { }, deep = true; + props.forEach(function(prop) { + tmpObj[prop] = origin[prop]; + }); + + extend(origin[destination], tmpObj, deep); + } + + function _isEqual(origValue, currentValue, firstPass) { + if (origValue === currentValue) { + // if the objects are identical, return + return true; + } + else if (Array.isArray(origValue)) { + if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) { + return false; + } + for (var i = 0, len = origValue.length; i < len; i++) { + if (!_isEqual(origValue[i], currentValue[i])) { + return false; + } + } + return true; + } + else if (origValue && typeof origValue === 'object') { + var keys = Object.keys(origValue), key; + if (!currentValue || + typeof currentValue !== 'object' || + (!firstPass && keys.length !== Object.keys(currentValue).length) + ) { + return false; + } + for (var i = 0, len = keys.length; i < len; i++) { + key = keys[i]; + // since clipPath is in the statefull cache list and the clipPath objects + // would be iterated as an object, this would lead to possible infinite recursion + // we do not want to compare those. + if (key === 'canvas' || key === 'group') { + continue; + } + if (!_isEqual(origValue[key], currentValue[key])) { + return false; + } + } + return true; + } + } + + + fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + + /** + * Returns true if object state (one of its state properties) was changed + * @param {String} [propertySet] optional name for the set of property we want to save + * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called + */ + hasStateChanged: function(propertySet) { + propertySet = propertySet || originalSet; + var dashedPropertySet = '_' + propertySet; + if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) { + return true; + } + return !_isEqual(this[dashedPropertySet], this, true); + }, + + /** + * Saves state of an object + * @param {Object} [options] Object with additional `stateProperties` array to include when saving state + * @return {fabric.Object} thisArg + */ + saveState: function(options) { + var propertySet = options && options.propertySet || originalSet, + destination = '_' + propertySet; + if (!this[destination]) { + return this.setupState(options); + } + saveProps(this, destination, this[propertySet]); + if (options && options.stateProperties) { + saveProps(this, destination, options.stateProperties); + } + return this; + }, + + /** + * Setups state of an object + * @param {Object} [options] Object with additional `stateProperties` array to include when saving state + * @return {fabric.Object} thisArg + */ + setupState: function(options) { + options = options || { }; + var propertySet = options.propertySet || originalSet; + options.propertySet = propertySet; + this['_' + propertySet] = { }; + this.saveState(options); + return this; + } + }); +})(); +(function() { + + var degreesToRadians = fabric.util.degreesToRadians; + + fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + /** + * Determines which corner has been clicked + * @private + * @param {Object} pointer The pointer indicating the mouse position + * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found + */ + _findTargetCorner: function(pointer, forTouch) { + // objects in group, anykind, are not self modificable, + // must not return an hovered corner. + if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) { + return false; + } + + var ex = pointer.x, + ey = pointer.y, + xPoints, + lines, keys = Object.keys(this.oCoords), + j = keys.length - 1, i; + this.__corner = 0; + + // cycle in reverse order so we pick first the one on top + for (; j >= 0; j--) { + i = keys[j]; + if (!this.isControlVisible(i)) { + continue; + } + + lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner); + // // debugging + // + // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); + // + // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); + // + // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); + // + // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); + // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); + + xPoints = this._findCrossPoints({ x: ex, y: ey }, lines); + if (xPoints !== 0 && xPoints % 2 === 1) { + this.__corner = i; + return i; + } + } + return false; + }, + + /** + * Calls a function for each control. The function gets called, + * with the control, the object that is calling the iterator and the control's key + * @param {Function} fn function to iterate over the controls over + */ + forEachControl: function(fn) { + for (var i in this.controls) { + fn(this.controls[i], i, this); + }; + }, + + /** + * Sets the coordinates of the draggable boxes in the corners of + * the image used to scale/rotate it. + * note: if we would switch to ROUND corner area, all of this would disappear. + * everything would resolve to a single point and a pythagorean theorem for the distance + * @private + */ + _setCornerCoords: function() { + var coords = this.oCoords; + + for (var control in coords) { + var controlObject = this.controls[control]; + coords[control].corner = controlObject.calcCornerCoords( + this.angle, this.cornerSize, coords[control].x, coords[control].y, false); + coords[control].touchCorner = controlObject.calcCornerCoords( + this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true); + } + }, + + /** + * Draws a colored layer behind the object, inside its selection borders. + * Requires public options: padding, selectionBackgroundColor + * this function is called when the context is transformed + * has checks to be skipped when the object is on a staticCanvas + * @param {CanvasRenderingContext2D} ctx Context to draw on + * @return {fabric.Object} thisArg + * @chainable + */ + drawSelectionBackground: function(ctx) { + if (!this.selectionBackgroundColor || + (this.canvas && !this.canvas.interactive) || + (this.canvas && this.canvas._activeObject !== this) + ) { + return this; + } + ctx.save(); + var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(), + vpt = this.canvas.viewportTransform; + ctx.translate(center.x, center.y); + ctx.scale(1 / vpt[0], 1 / vpt[3]); + ctx.rotate(degreesToRadians(this.angle)); + ctx.fillStyle = this.selectionBackgroundColor; + ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y); + ctx.restore(); + return this; + }, + + /** + * Draws borders of an object's bounding box. + * Requires public properties: width, height + * Requires public options: padding, borderColor + * @param {CanvasRenderingContext2D} ctx Context to draw on + * @param {Object} styleOverride object to override the object style + * @return {fabric.Object} thisArg + * @chainable + */ + drawBorders: function(ctx, styleOverride) { + styleOverride = styleOverride || {}; + var wh = this._calculateCurrentDimensions(), + strokeWidth = this.borderScaleFactor, + width = wh.x + strokeWidth, + height = wh.y + strokeWidth, + hasControls = typeof styleOverride.hasControls !== 'undefined' ? + styleOverride.hasControls : this.hasControls, + shouldStroke = false; + + ctx.save(); + ctx.strokeStyle = styleOverride.borderColor || this.borderColor; + this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray); + + ctx.strokeRect( + -width / 2, + -height / 2, + width, + height + ); + + if (hasControls) { + ctx.beginPath(); + this.forEachControl(function(control, key, fabricObject) { + // in this moment, the ctx is centered on the object. + // width and height of the above function are the size of the bbox. + if (control.withConnection && control.getVisibility(fabricObject, key)) { + // reset movement for each control + shouldStroke = true; + ctx.moveTo(control.x * width, control.y * height); + ctx.lineTo( + control.x * width + control.offsetX, + control.y * height + control.offsetY + ); + } + }); + if (shouldStroke) { + ctx.stroke(); + } + } + ctx.restore(); + return this; + }, + + /** + * Draws borders of an object's bounding box when it is inside a group. + * Requires public properties: width, height + * Requires public options: padding, borderColor + * @param {CanvasRenderingContext2D} ctx Context to draw on + * @param {object} options object representing current object parameters + * @param {Object} styleOverride object to override the object style + * @return {fabric.Object} thisArg + * @chainable + */ + drawBordersInGroup: function(ctx, options, styleOverride) { + styleOverride = styleOverride || {}; + var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options), + strokeWidth = this.strokeWidth, + strokeUniform = this.strokeUniform, + borderScaleFactor = this.borderScaleFactor, + width = + bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor, + height = + bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor; + ctx.save(); + this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray); + ctx.strokeStyle = styleOverride.borderColor || this.borderColor; + ctx.strokeRect( + -width / 2, + -height / 2, + width, + height + ); + + ctx.restore(); + return this; + }, + + /** + * Draws corners of an object's bounding box. + * Requires public properties: width, height + * Requires public options: cornerSize, padding + * @param {CanvasRenderingContext2D} ctx Context to draw on + * @param {Object} styleOverride object to override the object style + * @return {fabric.Object} thisArg + * @chainable + */ + drawControls: function(ctx, styleOverride) { + styleOverride = styleOverride || {}; + ctx.save(); + var retinaScaling = this.canvas.getRetinaScaling(), matrix, p; + ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0); + ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor; + if (!this.transparentCorners) { + ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor; + } + this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray); + this.setCoords(); + if (this.group) { + // fabricJS does not really support drawing controls inside groups, + // this piece of code here helps having at least the control in places. + // If an application needs to show some objects as selected because of some UI state + // can still call Object._renderControls() on any object they desire, independently of groups. + // using no padding, circular controls and hiding the rotating cursor is higly suggested, + matrix = this.group.calcTransformMatrix(); + } + this.forEachControl(function(control, key, fabricObject) { + p = fabricObject.oCoords[key]; + if (control.getVisibility(fabricObject, key)) { + if (matrix) { + p = fabric.util.transformPoint(p, matrix); + } + control.render(ctx, p.x, p.y, styleOverride, fabricObject); + } + }); + ctx.restore(); + + return this; + }, + + /** + * Returns true if the specified control is visible, false otherwise. + * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. + * @returns {Boolean} true if the specified control is visible, false otherwise + */ + isControlVisible: function(controlKey) { + return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey); + }, + + /** + * Sets the visibility of the specified control. + * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. + * @param {Boolean} visible true to set the specified control visible, false otherwise + * @return {fabric.Object} thisArg + * @chainable + */ + setControlVisible: function(controlKey, visible) { + if (!this._controlsVisibility) { + this._controlsVisibility = {}; + } + this._controlsVisibility[controlKey] = visible; + return this; + }, + + /** + * Sets the visibility state of object controls. + * @param {Object} [options] Options object + * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it + * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it + * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it + * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it + * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it + * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it + * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it + * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it + * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it + * @return {fabric.Object} thisArg + * @chainable + */ + setControlsVisibility: function(options) { + options || (options = { }); + + for (var p in options) { + this.setControlVisible(p, options[p]); + } + return this; + }, + + + /** + * This callback function is called every time _discardActiveObject or _setActiveObject + * try to to deselect this object. If the function returns true, the process is cancelled + * @param {Object} [options] options sent from the upper functions + * @param {Event} [options.e] event if the process is generated by an event + */ + onDeselect: function() { + // implemented by sub-classes, as needed. + }, + + + /** + * This callback function is called every time _discardActiveObject or _setActiveObject + * try to to select this object. If the function returns true, the process is cancelled + * @param {Object} [options] options sent from the upper functions + * @param {Event} [options.e] event if the process is generated by an event + */ + onSelect: function() { + // implemented by sub-classes, as needed. + } + }); +})(); +fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { + + /** + * Animation duration (in ms) for fx* methods + * @type Number + * @default + */ + FX_DURATION: 500, + + /** + * Centers object horizontally with animation. + * @param {fabric.Object} object Object to center + * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties + * @param {Function} [callbacks.onComplete] Invoked on completion + * @param {Function} [callbacks.onChange] Invoked on every step of animation + * @return {fabric.AnimationContext} context + */ + fxCenterObjectH: function (object, callbacks) { + callbacks = callbacks || { }; + + var empty = function() { }, + onComplete = callbacks.onComplete || empty, + onChange = callbacks.onChange || empty, + _this = this; + + return fabric.util.animate({ + target: this, + startValue: object.left, + endValue: this.getCenterPoint().x, + duration: this.FX_DURATION, + onChange: function(value) { + object.set('left', value); + _this.requestRenderAll(); + onChange(); + }, + onComplete: function() { + object.setCoords(); + onComplete(); + } + }); + }, + + /** + * Centers object vertically with animation. + * @param {fabric.Object} object Object to center + * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties + * @param {Function} [callbacks.onComplete] Invoked on completion + * @param {Function} [callbacks.onChange] Invoked on every step of animation + * @return {fabric.AnimationContext} context + */ + fxCenterObjectV: function (object, callbacks) { + callbacks = callbacks || { }; + + var empty = function() { }, + onComplete = callbacks.onComplete || empty, + onChange = callbacks.onChange || empty, + _this = this; + + return fabric.util.animate({ + target: this, + startValue: object.top, + endValue: this.getCenterPoint().y, + duration: this.FX_DURATION, + onChange: function(value) { + object.set('top', value); + _this.requestRenderAll(); + onChange(); + }, + onComplete: function() { + object.setCoords(); + onComplete(); + } + }); + }, + + /** + * Same as `fabric.Canvas#remove` but animated + * @param {fabric.Object} object Object to remove + * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties + * @param {Function} [callbacks.onComplete] Invoked on completion + * @param {Function} [callbacks.onChange] Invoked on every step of animation + * @return {fabric.AnimationContext} context + */ + fxRemove: function (object, callbacks) { + callbacks = callbacks || { }; + + var empty = function() { }, + onComplete = callbacks.onComplete || empty, + onChange = callbacks.onChange || empty, + _this = this; + + return fabric.util.animate({ + target: this, + startValue: object.opacity, + endValue: 0, + duration: this.FX_DURATION, + onChange: function(value) { + object.set('opacity', value); + _this.requestRenderAll(); + onChange(); + }, + onComplete: function () { + _this.remove(object); + onComplete(); + } + }); + } +}); + +fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + /** + * Animates object's properties + * @param {String|Object} property Property to animate (if string) or properties to animate (if object) + * @param {Number|Object} value Value to animate property to (if string was given first) or options object + * @return {fabric.Object} thisArg + * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation} + * @return {fabric.AnimationContext | fabric.AnimationContext[]} animation context (or an array if passed multiple properties) + * + * As object — multiple properties + * + * object.animate({ left: ..., top: ... }); + * object.animate({ left: ..., top: ... }, { duration: ... }); + * + * As string — one property + * + * object.animate('left', ...); + * object.animate('left', { duration: ... }); + * + */ + animate: function () { + if (arguments[0] && typeof arguments[0] === 'object') { + var propsToAnimate = [], prop, skipCallbacks, out = []; + for (prop in arguments[0]) { + propsToAnimate.push(prop); + } + for (var i = 0, len = propsToAnimate.length; i < len; i++) { + prop = propsToAnimate[i]; + skipCallbacks = i !== len - 1; + out.push(this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks)); + } + return out; + } + else { + return this._animate.apply(this, arguments); + } + }, + + /** + * @private + * @param {String} property Property to animate + * @param {String} to Value to animate to + * @param {Object} [options] Options object + * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked + */ + _animate: function(property, to, options, skipCallbacks) { + var _this = this, propPair; + + to = to.toString(); + + if (!options) { + options = { }; + } + else { + options = fabric.util.object.clone(options); + } + + if (~property.indexOf('.')) { + propPair = property.split('.'); + } + + var propIsColor = + _this.colorProperties.indexOf(property) > -1 || + (propPair && _this.colorProperties.indexOf(propPair[1]) > -1); + + var currentValue = propPair + ? this.get(propPair[0])[propPair[1]] + : this.get(property); + + if (!('from' in options)) { + options.from = currentValue; + } + + if (!propIsColor) { + if (~to.indexOf('=')) { + to = currentValue + parseFloat(to.replace('=', '')); + } + else { + to = parseFloat(to); + } + } + + var _options = { + target: this, + startValue: options.from, + endValue: to, + byValue: options.by, + easing: options.easing, + duration: options.duration, + abort: options.abort && function(value, valueProgress, timeProgress) { + return options.abort.call(_this, value, valueProgress, timeProgress); + }, + onChange: function (value, valueProgress, timeProgress) { + if (propPair) { + _this[propPair[0]][propPair[1]] = value; + } + else { + _this.set(property, value); + } + if (skipCallbacks) { + return; + } + options.onChange && options.onChange(value, valueProgress, timeProgress); + }, + onComplete: function (value, valueProgress, timeProgress) { + if (skipCallbacks) { + return; + } + + _this.setCoords(); + options.onComplete && options.onComplete(value, valueProgress, timeProgress); + } + }; + + if (propIsColor) { + return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options); + } + else { + return fabric.util.animate(_options); + } + } +}); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + clone = fabric.util.object.clone, + coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 }; + + if (fabric.Line) { + fabric.warn('fabric.Line is already defined'); + return; + } + + /** + * Line class + * @class fabric.Line + * @extends fabric.Object + * @see {@link fabric.Line#initialize} for constructor definition + */ + fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'line', + + /** + * x value or first line edge + * @type Number + * @default + */ + x1: 0, + + /** + * y value or first line edge + * @type Number + * @default + */ + y1: 0, + + /** + * x value or second line edge + * @type Number + * @default + */ + x2: 0, + + /** + * y value or second line edge + * @type Number + * @default + */ + y2: 0, + + cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'), + + /** + * Constructor + * @param {Array} [points] Array of points + * @param {Object} [options] Options object + * @return {fabric.Line} thisArg + */ + initialize: function(points, options) { + if (!points) { + points = [0, 0, 0, 0]; + } + + this.callSuper('initialize', options); + + this.set('x1', points[0]); + this.set('y1', points[1]); + this.set('x2', points[2]); + this.set('y2', points[3]); + + this._setWidthHeight(options); + }, + + /** + * @private + * @param {Object} [options] Options + */ + _setWidthHeight: function(options) { + options || (options = { }); + + this.width = Math.abs(this.x2 - this.x1); + this.height = Math.abs(this.y2 - this.y1); + + this.left = 'left' in options + ? options.left + : this._getLeftToOriginX(); + + this.top = 'top' in options + ? options.top + : this._getTopToOriginY(); + }, + + /** + * @private + * @param {String} key + * @param {*} value + */ + _set: function(key, value) { + this.callSuper('_set', key, value); + if (typeof coordProps[key] !== 'undefined') { + this._setWidthHeight(); + } + return this; + }, + + /** + * @private + * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line. + */ + _getLeftToOriginX: makeEdgeToOriginGetter( + { // property names + origin: 'originX', + axis1: 'x1', + axis2: 'x2', + dimension: 'width' + }, + { // possible values of origin + nearest: 'left', + center: 'center', + farthest: 'right' + } + ), + + /** + * @private + * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line. + */ + _getTopToOriginY: makeEdgeToOriginGetter( + { // property names + origin: 'originY', + axis1: 'y1', + axis2: 'y2', + dimension: 'height' + }, + { // possible values of origin + nearest: 'top', + center: 'center', + farthest: 'bottom' + } + ), + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + ctx.beginPath(); + + + var p = this.calcLinePoints(); + ctx.moveTo(p.x1, p.y1); + ctx.lineTo(p.x2, p.y2); + + ctx.lineWidth = this.strokeWidth; + + // TODO: test this + // make sure setting "fill" changes color of a line + // (by copying fillStyle to strokeStyle, since line is stroked, not filled) + var origStrokeStyle = ctx.strokeStyle; + ctx.strokeStyle = this.stroke || ctx.fillStyle; + this.stroke && this._renderStroke(ctx); + ctx.strokeStyle = origStrokeStyle; + }, + + /** + * This function is an helper for svg import. it returns the center of the object in the svg + * untransformed coordinates + * @private + * @return {Object} center point from element coordinates + */ + _findCenterFromElement: function() { + return { + x: (this.x1 + this.x2) / 2, + y: (this.y1 + this.y2) / 2, + }; + }, + + /** + * Returns object representation of an instance + * @method toObject + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function(propertiesToInclude) { + return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints()); + }, + + /* + * Calculate object dimensions from its properties + * @private + */ + _getNonTransformedDimensions: function() { + var dim = this.callSuper('_getNonTransformedDimensions'); + if (this.strokeLineCap === 'butt') { + if (this.width === 0) { + dim.y -= this.strokeWidth; + } + if (this.height === 0) { + dim.x -= this.strokeWidth; + } + } + return dim; + }, + + /** + * Recalculates line points given width and height + * @private + */ + calcLinePoints: function() { + var xMult = this.x1 <= this.x2 ? -1 : 1, + yMult = this.y1 <= this.y2 ? -1 : 1, + x1 = (xMult * this.width * 0.5), + y1 = (yMult * this.height * 0.5), + x2 = (xMult * this.width * -0.5), + y2 = (yMult * this.height * -0.5); + + return { + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + var p = this.calcLinePoints(); + return [ + '\n' + ]; + }, + /* _TO_SVG_END_ */ + }); + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement}) + * @static + * @memberOf fabric.Line + * @see http://www.w3.org/TR/SVG/shapes.html#LineElement + */ + fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' ')); + + /** + * Returns fabric.Line instance from an SVG element + * @static + * @memberOf fabric.Line + * @param {SVGElement} element Element to parse + * @param {Object} [options] Options object + * @param {Function} [callback] callback function invoked after parsing + */ + fabric.Line.fromElement = function(element, callback, options) { + options = options || { }; + var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES), + points = [ + parsedAttributes.x1 || 0, + parsedAttributes.y1 || 0, + parsedAttributes.x2 || 0, + parsedAttributes.y2 || 0 + ]; + callback(new fabric.Line(points, extend(parsedAttributes, options))); + }; + /* _FROM_SVG_END_ */ + + /** + * Returns fabric.Line instance from an object representation + * @static + * @memberOf fabric.Line + * @param {Object} object Object to create an instance from + * @param {function} [callback] invoked with new instance as first argument + */ + fabric.Line.fromObject = function(object, callback) { + function _callback(instance) { + delete instance.points; + callback && callback(instance); + }; + var options = clone(object, true); + options.points = [object.x1, object.y1, object.x2, object.y2]; + fabric.Object._fromObject('Line', options, _callback, 'points'); + }; + + /** + * Produces a function that calculates distance from canvas edge to Line origin. + */ + function makeEdgeToOriginGetter(propertyNames, originValues) { + var origin = propertyNames.origin, + axis1 = propertyNames.axis1, + axis2 = propertyNames.axis2, + dimension = propertyNames.dimension, + nearest = originValues.nearest, + center = originValues.center, + farthest = originValues.farthest; + + return function() { + switch (this.get(origin)) { + case nearest: + return Math.min(this.get(axis1), this.get(axis2)); + case center: + return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension)); + case farthest: + return Math.max(this.get(axis1), this.get(axis2)); + } + }; + + } + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + degreesToRadians = fabric.util.degreesToRadians; + + if (fabric.Circle) { + fabric.warn('fabric.Circle is already defined.'); + return; + } + + /** + * Circle class + * @class fabric.Circle + * @extends fabric.Object + * @see {@link fabric.Circle#initialize} for constructor definition + */ + fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'circle', + + /** + * Radius of this circle + * @type Number + * @default + */ + radius: 0, + + /** + * degrees of start of the circle. + * probably will change to degrees in next major version + * @type Number 0 - 359 + * @default 0 + */ + startAngle: 0, + + /** + * End angle of the circle + * probably will change to degrees in next major version + * @type Number 1 - 360 + * @default 360 + */ + endAngle: 360, + + cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'), + + /** + * @private + * @param {String} key + * @param {*} value + * @return {fabric.Circle} thisArg + */ + _set: function(key, value) { + this.callSuper('_set', key, value); + + if (key === 'radius') { + this.setRadius(value); + } + + return this; + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function(propertiesToInclude) { + return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude)); + }, + + /* _TO_SVG_START_ */ + + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + var svgString, x = 0, y = 0, + angle = (this.endAngle - this.startAngle) % 360; + + if (angle === 0) { + svgString = [ + '\n' + ]; + } + else { + var start = degreesToRadians(this.startAngle), + end = degreesToRadians(this.endAngle), + radius = this.radius, + startX = fabric.util.cos(start) * radius, + startY = fabric.util.sin(start) * radius, + endX = fabric.util.cos(end) * radius, + endY = fabric.util.sin(end) * radius, + largeFlag = angle > 180 ? '1' : '0'; + svgString = [ + '\n' + ]; + } + return svgString; + }, + /* _TO_SVG_END_ */ + + /** + * @private + * @param {CanvasRenderingContext2D} ctx context to render on + */ + _render: function(ctx) { + ctx.beginPath(); + ctx.arc( + 0, + 0, + this.radius, + degreesToRadians(this.startAngle), + degreesToRadians(this.endAngle), + false + ); + this._renderPaintInOrder(ctx); + }, + + /** + * Returns horizontal radius of an object (according to how an object is scaled) + * @return {Number} + */ + getRadiusX: function() { + return this.get('radius') * this.get('scaleX'); + }, + + /** + * Returns vertical radius of an object (according to how an object is scaled) + * @return {Number} + */ + getRadiusY: function() { + return this.get('radius') * this.get('scaleY'); + }, + + /** + * Sets radius of an object (and updates width accordingly) + * @return {fabric.Circle} thisArg + */ + setRadius: function(value) { + this.radius = value; + return this.set('width', value * 2).set('height', value * 2); + }, + }); + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement}) + * @static + * @memberOf fabric.Circle + * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement + */ + fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' ')); + + /** + * Returns {@link fabric.Circle} instance from an SVG element + * @static + * @memberOf fabric.Circle + * @param {SVGElement} element Element to parse + * @param {Function} [callback] Options callback invoked after parsing is finished + * @param {Object} [options] Options object + * @throws {Error} If value of `r` attribute is missing or invalid + */ + fabric.Circle.fromElement = function(element, callback) { + var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES); + + if (!isValidRadius(parsedAttributes)) { + throw new Error('value of `r` attribute is required and can not be negative'); + } + + parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius; + parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius; + callback(new fabric.Circle(parsedAttributes)); + }; + + /** + * @private + */ + function isValidRadius(attributes) { + return (('radius' in attributes) && (attributes.radius >= 0)); + } + /* _FROM_SVG_END_ */ + + /** + * Returns {@link fabric.Circle} instance from an object representation + * @static + * @memberOf fabric.Circle + * @param {Object} object Object to create an instance from + * @param {function} [callback] invoked with new instance as first argument + * @return {void} + */ + fabric.Circle.fromObject = function(object, callback) { + fabric.Object._fromObject('Circle', object, callback); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }); + + if (fabric.Triangle) { + fabric.warn('fabric.Triangle is already defined'); + return; + } + + /** + * Triangle class + * @class fabric.Triangle + * @extends fabric.Object + * @return {fabric.Triangle} thisArg + * @see {@link fabric.Triangle#initialize} for constructor definition + */ + fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'triangle', + + /** + * Width is set to 100 to compensate the old initialize code that was setting it to 100 + * @type Number + * @default + */ + width: 100, + + /** + * Height is set to 100 to compensate the old initialize code that was setting it to 100 + * @type Number + * @default + */ + height: 100, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + var widthBy2 = this.width / 2, + heightBy2 = this.height / 2; + + ctx.beginPath(); + ctx.moveTo(-widthBy2, heightBy2); + ctx.lineTo(0, -heightBy2); + ctx.lineTo(widthBy2, heightBy2); + ctx.closePath(); + + this._renderPaintInOrder(ctx); + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + var widthBy2 = this.width / 2, + heightBy2 = this.height / 2, + points = [ + -widthBy2 + ' ' + heightBy2, + '0 ' + -heightBy2, + widthBy2 + ' ' + heightBy2 + ].join(','); + return [ + '' + ]; + }, + /* _TO_SVG_END_ */ + }); + + /** + * Returns {@link fabric.Triangle} instance from an object representation + * @static + * @memberOf fabric.Triangle + * @param {Object} object Object to create an instance from + * @param {function} [callback] invoked with new instance as first argument + */ + fabric.Triangle.fromObject = function(object, callback) { + return fabric.Object._fromObject('Triangle', object, callback); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + piBy2 = Math.PI * 2; + + if (fabric.Ellipse) { + fabric.warn('fabric.Ellipse is already defined.'); + return; + } + + /** + * Ellipse class + * @class fabric.Ellipse + * @extends fabric.Object + * @return {fabric.Ellipse} thisArg + * @see {@link fabric.Ellipse#initialize} for constructor definition + */ + fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'ellipse', + + /** + * Horizontal radius + * @type Number + * @default + */ + rx: 0, + + /** + * Vertical radius + * @type Number + * @default + */ + ry: 0, + + cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), + + /** + * Constructor + * @param {Object} [options] Options object + * @return {fabric.Ellipse} thisArg + */ + initialize: function(options) { + this.callSuper('initialize', options); + this.set('rx', options && options.rx || 0); + this.set('ry', options && options.ry || 0); + }, + + /** + * @private + * @param {String} key + * @param {*} value + * @return {fabric.Ellipse} thisArg + */ + _set: function(key, value) { + this.callSuper('_set', key, value); + switch (key) { + + case 'rx': + this.rx = value; + this.set('width', value * 2); + break; + + case 'ry': + this.ry = value; + this.set('height', value * 2); + break; + + } + return this; + }, + + /** + * Returns horizontal radius of an object (according to how an object is scaled) + * @return {Number} + */ + getRx: function() { + return this.get('rx') * this.get('scaleX'); + }, + + /** + * Returns Vertical radius of an object (according to how an object is scaled) + * @return {Number} + */ + getRy: function() { + return this.get('ry') * this.get('scaleY'); + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function(propertiesToInclude) { + return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + return [ + '\n' + ]; + }, + /* _TO_SVG_END_ */ + + /** + * @private + * @param {CanvasRenderingContext2D} ctx context to render on + */ + _render: function(ctx) { + ctx.beginPath(); + ctx.save(); + ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0); + ctx.arc( + 0, + 0, + this.rx, + 0, + piBy2, + false); + ctx.restore(); + this._renderPaintInOrder(ctx); + }, + }); + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement}) + * @static + * @memberOf fabric.Ellipse + * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement + */ + fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' ')); + + /** + * Returns {@link fabric.Ellipse} instance from an SVG element + * @static + * @memberOf fabric.Ellipse + * @param {SVGElement} element Element to parse + * @param {Function} [callback] Options callback invoked after parsing is finished + * @return {fabric.Ellipse} + */ + fabric.Ellipse.fromElement = function(element, callback) { + + var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES); + + parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx; + parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry; + callback(new fabric.Ellipse(parsedAttributes)); + }; + /* _FROM_SVG_END_ */ + + /** + * Returns {@link fabric.Ellipse} instance from an object representation + * @static + * @memberOf fabric.Ellipse + * @param {Object} object Object to create an instance from + * @param {function} [callback] invoked with new instance as first argument + * @return {void} + */ + fabric.Ellipse.fromObject = function(object, callback) { + fabric.Object._fromObject('Ellipse', object, callback); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend; + + if (fabric.Rect) { + fabric.warn('fabric.Rect is already defined'); + return; + } + + /** + * Rectangle class + * @class fabric.Rect + * @extends fabric.Object + * @return {fabric.Rect} thisArg + * @see {@link fabric.Rect#initialize} for constructor definition + */ + fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ { + + /** + * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged}) + * as well as for history (undo/redo) purposes + * @type Array + */ + stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'), + + /** + * Type of an object + * @type String + * @default + */ + type: 'rect', + + /** + * Horizontal border radius + * @type Number + * @default + */ + rx: 0, + + /** + * Vertical border radius + * @type Number + * @default + */ + ry: 0, + + cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), + + /** + * Constructor + * @param {Object} [options] Options object + * @return {Object} thisArg + */ + initialize: function(options) { + this.callSuper('initialize', options); + this._initRxRy(); + }, + + /** + * Initializes rx/ry attributes + * @private + */ + _initRxRy: function() { + if (this.rx && !this.ry) { + this.ry = this.rx; + } + else if (this.ry && !this.rx) { + this.rx = this.ry; + } + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + + // 1x1 case (used in spray brush) optimization was removed because + // with caching and higher zoom level this makes more damage than help + + var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0, + ry = this.ry ? Math.min(this.ry, this.height / 2) : 0, + w = this.width, + h = this.height, + x = -this.width / 2, + y = -this.height / 2, + isRounded = rx !== 0 || ry !== 0, + /* "magic number" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */ + k = 1 - 0.5522847498; + ctx.beginPath(); + + ctx.moveTo(x + rx, y); + + ctx.lineTo(x + w - rx, y); + isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry); + + ctx.lineTo(x + w, y + h - ry); + isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h); + + ctx.lineTo(x + rx, y + h); + isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry); + + ctx.lineTo(x, y + ry); + isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y); + + ctx.closePath(); + + this._renderPaintInOrder(ctx); + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function(propertiesToInclude) { + return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + var x = -this.width / 2, y = -this.height / 2; + return [ + '\n' + ]; + }, + /* _TO_SVG_END_ */ + }); + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`) + * @static + * @memberOf fabric.Rect + * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement + */ + fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' ')); + + /** + * Returns {@link fabric.Rect} instance from an SVG element + * @static + * @memberOf fabric.Rect + * @param {SVGElement} element Element to parse + * @param {Function} callback callback function invoked after parsing + * @param {Object} [options] Options object + */ + fabric.Rect.fromElement = function(element, callback, options) { + if (!element) { + return callback(null); + } + options = options || { }; + + var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES); + parsedAttributes.left = parsedAttributes.left || 0; + parsedAttributes.top = parsedAttributes.top || 0; + parsedAttributes.height = parsedAttributes.height || 0; + parsedAttributes.width = parsedAttributes.width || 0; + var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); + rect.visible = rect.visible && rect.width > 0 && rect.height > 0; + callback(rect); + }; + /* _FROM_SVG_END_ */ + + /** + * Returns {@link fabric.Rect} instance from an object representation + * @static + * @memberOf fabric.Rect + * @param {Object} object Object to create an instance from + * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created + */ + fabric.Rect.fromObject = function(object, callback) { + return fabric.Object._fromObject('Rect', object, callback); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + min = fabric.util.array.min, + max = fabric.util.array.max, + toFixed = fabric.util.toFixed, + projectStrokeOnPoints = fabric.util.projectStrokeOnPoints; + + if (fabric.Polyline) { + fabric.warn('fabric.Polyline is already defined'); + return; + } + + /** + * Polyline class + * @class fabric.Polyline + * @extends fabric.Object + * @see {@link fabric.Polyline#initialize} for constructor definition + */ + fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'polyline', + + /** + * Points array + * @type Array + * @default + */ + points: null, + + /** + * WARNING: Feature in progress + * Calculate the exact bounding box taking in account strokeWidth on acute angles + * this will be turned to true by default on fabric 6.0 + * maybe will be left in as an optimization since calculations may be slow + * @deprecated + * @type Boolean + * @default false + */ + exactBoundingBox: false, + + cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'), + + /** + * Constructor + * @param {Array} points Array of points (where each point is an object with x and y) + * @param {Object} [options] Options object + * @return {fabric.Polyline} thisArg + * @example + * var poly = new fabric.Polyline([ + * { x: 10, y: 10 }, + * { x: 50, y: 30 }, + * { x: 40, y: 70 }, + * { x: 60, y: 50 }, + * { x: 100, y: 150 }, + * { x: 40, y: 100 } + * ], { + * stroke: 'red', + * left: 100, + * top: 100 + * }); + */ + initialize: function(points, options) { + options = options || {}; + this.points = points || []; + this.callSuper('initialize', options); + this._setPositionDimensions(options); + }, + + /** + * @private + */ + _projectStrokeOnPoints: function () { + return projectStrokeOnPoints(this.points, this, true); + }, + + _setPositionDimensions: function(options) { + var calcDim = this._calcDimensions(options), correctLeftTop, + correctSize = this.exactBoundingBox ? this.strokeWidth : 0; + this.width = calcDim.width - correctSize; + this.height = calcDim.height - correctSize; + if (!options.fromSVG) { + correctLeftTop = this.translateToGivenOrigin( + { + // this looks bad, but is one way to keep it optional for now. + x: calcDim.left - this.strokeWidth / 2 + correctSize / 2, + y: calcDim.top - this.strokeWidth / 2 + correctSize / 2 + }, + 'left', + 'top', + this.originX, + this.originY + ); + } + if (typeof options.left === 'undefined') { + this.left = options.fromSVG ? calcDim.left : correctLeftTop.x; + } + if (typeof options.top === 'undefined') { + this.top = options.fromSVG ? calcDim.top : correctLeftTop.y; + } + this.pathOffset = { + x: calcDim.left + this.width / 2 + correctSize / 2, + y: calcDim.top + this.height / 2 + correctSize / 2 + }; + }, + + /** + * Calculate the polygon min and max point from points array, + * returning an object with left, top, width, height to measure the + * polygon size + * @return {Object} object.left X coordinate of the polygon leftmost point + * @return {Object} object.top Y coordinate of the polygon topmost point + * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point + * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point + * @private + */ + _calcDimensions: function() { + + var points = this.exactBoundingBox ? this._projectStrokeOnPoints() : this.points, + minX = min(points, 'x') || 0, + minY = min(points, 'y') || 0, + maxX = max(points, 'x') || 0, + maxY = max(points, 'y') || 0, + width = (maxX - minX), + height = (maxY - minY); + + return { + left: minX, + top: minY, + width: width, + height: height, + }; + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of an instance + */ + toObject: function(propertiesToInclude) { + return extend(this.callSuper('toObject', propertiesToInclude), { + points: this.points.concat() + }); + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y, + NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; + + for (var i = 0, len = this.points.length; i < len; i++) { + points.push( + toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',', + toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' ' + ); + } + return [ + '<' + this.type + ' ', 'COMMON_PARTS', + 'points="', points.join(''), + '" />\n' + ]; + }, + /* _TO_SVG_END_ */ + + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + commonRender: function(ctx) { + var point, len = this.points.length, + x = this.pathOffset.x, + y = this.pathOffset.y; + + if (!len || isNaN(this.points[len - 1].y)) { + // do not draw if no points or odd points + // NaN comes from parseFloat of a empty string in parser + return false; + } + ctx.beginPath(); + ctx.moveTo(this.points[0].x - x, this.points[0].y - y); + for (var i = 0; i < len; i++) { + point = this.points[i]; + ctx.lineTo(point.x - x, point.y - y); + } + return true; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + if (!this.commonRender(ctx)) { + return; + } + this._renderPaintInOrder(ctx); + }, + + /** + * Returns complexity of an instance + * @return {Number} complexity of this instance + */ + complexity: function() { + return this.get('points').length; + } + }); + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement}) + * @static + * @memberOf fabric.Polyline + * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement + */ + fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); + + /** + * Returns fabric.Polyline instance from an SVG element + * @static + * @memberOf fabric.Polyline + * @param {SVGElement} element Element to parser + * @param {Function} callback callback function invoked after parsing + * @param {Object} [options] Options object + */ + fabric.Polyline.fromElementGenerator = function(_class) { + return function(element, callback, options) { + if (!element) { + return callback(null); + } + options || (options = { }); + + var points = fabric.parsePointsAttribute(element.getAttribute('points')), + parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES); + parsedAttributes.fromSVG = true; + callback(new fabric[_class](points, extend(parsedAttributes, options))); + }; + }; + + fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline'); + + /* _FROM_SVG_END_ */ + + /** + * Returns fabric.Polyline instance from an object representation + * @static + * @memberOf fabric.Polyline + * @param {Object} object Object to create an instance from + * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created + */ + fabric.Polyline.fromObject = function(object, callback) { + return fabric.Object._fromObject('Polyline', object, callback, 'points'); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = {}), + projectStrokeOnPoints = fabric.util.projectStrokeOnPoints; + + if (fabric.Polygon) { + fabric.warn('fabric.Polygon is already defined'); + return; + } + + /** + * Polygon class + * @class fabric.Polygon + * @extends fabric.Polyline + * @see {@link fabric.Polygon#initialize} for constructor definition + */ + fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'polygon', + + /** + * @private + */ + _projectStrokeOnPoints: function () { + return projectStrokeOnPoints(this.points, this); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + if (!this.commonRender(ctx)) { + return; + } + ctx.closePath(); + this._renderPaintInOrder(ctx); + }, + + }); + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`) + * @static + * @memberOf fabric.Polygon + * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement + */ + fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); + + /** + * Returns {@link fabric.Polygon} instance from an SVG element + * @static + * @memberOf fabric.Polygon + * @param {SVGElement} element Element to parse + * @param {Function} callback callback function invoked after parsing + * @param {Object} [options] Options object + */ + fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon'); + /* _FROM_SVG_END_ */ + + /** + * Returns fabric.Polygon instance from an object representation + * @static + * @memberOf fabric.Polygon + * @param {Object} object Object to create an instance from + * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created + * @return {void} + */ + fabric.Polygon.fromObject = function(object, callback) { + fabric.Object._fromObject('Polygon', object, callback, 'points'); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + min = fabric.util.array.min, + max = fabric.util.array.max, + extend = fabric.util.object.extend, + clone = fabric.util.object.clone, + toFixed = fabric.util.toFixed; + + if (fabric.Path) { + fabric.warn('fabric.Path is already defined'); + return; + } + + /** + * Path class + * @class fabric.Path + * @extends fabric.Object + * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup} + * @see {@link fabric.Path#initialize} for constructor definition + */ + fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'path', + + /** + * Array of path points + * @type Array + * @default + */ + path: null, + + cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'), + + stateProperties: fabric.Object.prototype.stateProperties.concat('path'), + + /** + * Constructor + * @param {Array|String} path Path data (sequence of coordinates and corresponding "command" tokens) + * @param {Object} [options] Options object + * @return {fabric.Path} thisArg + */ + initialize: function (path, options) { + options = clone(options || {}); + delete options.path; + this.callSuper('initialize', options); + this._setPath(path || [], options); + }, + + /** + * @private + * @param {Array|String} path Path data (sequence of coordinates and corresponding "command" tokens) + * @param {Object} [options] Options object + */ + _setPath: function (path, options) { + this.path = fabric.util.makePathSimpler( + Array.isArray(path) ? path : fabric.util.parsePath(path) + ); + + fabric.Polyline.prototype._setPositionDimensions.call(this, options || {}); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx context to render path on + */ + _renderPathCommands: function(ctx) { + var current, // current instruction + subpathStartX = 0, + subpathStartY = 0, + x = 0, // current x + y = 0, // current y + controlX = 0, // current control point x + controlY = 0, // current control point y + l = -this.pathOffset.x, + t = -this.pathOffset.y; + + ctx.beginPath(); + + for (var i = 0, len = this.path.length; i < len; ++i) { + + current = this.path[i]; + + switch (current[0]) { // first letter + + case 'L': // lineto, absolute + x = current[1]; + y = current[2]; + ctx.lineTo(x + l, y + t); + break; + + case 'M': // moveTo, absolute + x = current[1]; + y = current[2]; + subpathStartX = x; + subpathStartY = y; + ctx.moveTo(x + l, y + t); + break; + + case 'C': // bezierCurveTo, absolute + x = current[5]; + y = current[6]; + controlX = current[3]; + controlY = current[4]; + ctx.bezierCurveTo( + current[1] + l, + current[2] + t, + controlX + l, + controlY + t, + x + l, + y + t + ); + break; + + case 'Q': // quadraticCurveTo, absolute + ctx.quadraticCurveTo( + current[1] + l, + current[2] + t, + current[3] + l, + current[4] + t + ); + x = current[3]; + y = current[4]; + controlX = current[1]; + controlY = current[2]; + break; + + case 'z': + case 'Z': + x = subpathStartX; + y = subpathStartY; + ctx.closePath(); + break; + } + } + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx context to render path on + */ + _render: function(ctx) { + this._renderPathCommands(ctx); + this._renderPaintInOrder(ctx); + }, + + /** + * Returns string representation of an instance + * @return {String} string representation of an instance + */ + toString: function() { + return '#'; + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function(propertiesToInclude) { + return extend(this.callSuper('toObject', propertiesToInclude), { + path: this.path.map(function(item) { return item.slice(); }), + }); + }, + + /** + * Returns dataless object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toDatalessObject: function(propertiesToInclude) { + var o = this.toObject(['sourcePath'].concat(propertiesToInclude)); + if (o.sourcePath) { + delete o.path; + } + return o; + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + var path = fabric.util.joinPath(this.path); + return [ + '\n' + ]; + }, + + _getOffsetTransform: function() { + var digits = fabric.Object.NUM_FRACTION_DIGITS; + return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' + + toFixed(-this.pathOffset.y, digits) + ')'; + }, + + /** + * Returns svg clipPath representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + toClipPathSVG: function(reviver) { + var additionalTransform = this._getOffsetTransform(); + return '\t' + this._createBaseClipPathSVGMarkup( + this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform } + ); + }, + + /** + * Returns svg representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + toSVG: function(reviver) { + var additionalTransform = this._getOffsetTransform(); + return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }); + }, + /* _TO_SVG_END_ */ + + /** + * Returns number representation of an instance complexity + * @return {Number} complexity of this instance + */ + complexity: function() { + return this.path.length; + }, + + /** + * @private + */ + _calcDimensions: function() { + + var aX = [], + aY = [], + current, // current instruction + subpathStartX = 0, + subpathStartY = 0, + x = 0, // current x + y = 0, // current y + bounds; + + for (var i = 0, len = this.path.length; i < len; ++i) { + + current = this.path[i]; + + switch (current[0]) { // first letter + + case 'L': // lineto, absolute + x = current[1]; + y = current[2]; + bounds = []; + break; + + case 'M': // moveTo, absolute + x = current[1]; + y = current[2]; + subpathStartX = x; + subpathStartY = y; + bounds = []; + break; + + case 'C': // bezierCurveTo, absolute + bounds = fabric.util.getBoundsOfCurve(x, y, + current[1], + current[2], + current[3], + current[4], + current[5], + current[6] + ); + x = current[5]; + y = current[6]; + break; + + case 'Q': // quadraticCurveTo, absolute + bounds = fabric.util.getBoundsOfCurve(x, y, + current[1], + current[2], + current[1], + current[2], + current[3], + current[4] + ); + x = current[3]; + y = current[4]; + break; + + case 'z': + case 'Z': + x = subpathStartX; + y = subpathStartY; + break; + } + bounds.forEach(function (point) { + aX.push(point.x); + aY.push(point.y); + }); + aX.push(x); + aY.push(y); + } + + var minX = min(aX) || 0, + minY = min(aY) || 0, + maxX = max(aX) || 0, + maxY = max(aY) || 0, + deltaX = maxX - minX, + deltaY = maxY - minY; + + return { + left: minX, + top: minY, + width: deltaX, + height: deltaY + }; + } + }); + + /** + * Creates an instance of fabric.Path from an object + * @static + * @memberOf fabric.Path + * @param {Object} object + * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created + */ + fabric.Path.fromObject = function(object, callback) { + if (typeof object.sourcePath === 'string') { + var pathUrl = object.sourcePath; + fabric.loadSVGFromURL(pathUrl, function (elements) { + var path = elements[0]; + path.setOptions(object); + callback && callback(path); + }); + } + else { + fabric.Object._fromObject('Path', object, callback, 'path'); + } + }; + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`) + * @static + * @memberOf fabric.Path + * @see http://www.w3.org/TR/SVG/paths.html#PathElement + */ + fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']); + + /** + * Creates an instance of fabric.Path from an SVG element + * @static + * @memberOf fabric.Path + * @param {SVGElement} element to parse + * @param {Function} callback Callback to invoke when an fabric.Path instance is created + * @param {Object} [options] Options object + * @param {Function} [callback] Options callback invoked after parsing is finished + */ + fabric.Path.fromElement = function(element, callback, options) { + var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES); + parsedAttributes.fromSVG = true; + callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options))); + }; + /* _FROM_SVG_END_ */ + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + min = fabric.util.array.min, + max = fabric.util.array.max; + + if (fabric.Group) { + return; + } + + /** + * Group class + * @class fabric.Group + * @extends fabric.Object + * @mixes fabric.Collection + * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} + * @see {@link fabric.Group#initialize} for constructor definition + */ + fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'group', + + /** + * Width of stroke + * @type Number + * @default + */ + strokeWidth: 0, + + /** + * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets + * @type Boolean + * @default + */ + subTargetCheck: false, + + /** + * Groups are container, do not render anything on theyr own, ence no cache properties + * @type Array + * @default + */ + cacheProperties: [], + + /** + * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still + * available setting this boolean to true. + * @type Boolean + * @since 2.0.0 + * @default + */ + useSetOnGroup: false, + + /** + * Constructor + * @param {Object} objects Group objects + * @param {Object} [options] Options object + * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already. + * @return {Object} thisArg + */ + initialize: function(objects, options, isAlreadyGrouped) { + options = options || {}; + this._objects = []; + // if objects enclosed in a group have been grouped already, + // we cannot change properties of objects. + // Thus we need to set options to group without objects, + isAlreadyGrouped && this.callSuper('initialize', options); + this._objects = objects || []; + for (var i = this._objects.length; i--; ) { + this._objects[i].group = this; + } + + if (!isAlreadyGrouped) { + var center = options && options.centerPoint; + // we want to set origins before calculating the bounding box. + // so that the topleft can be set with that in mind. + // if specific top and left are passed, are overwritten later + // with the callSuper('initialize', options) + if (options.originX !== undefined) { + this.originX = options.originX; + } + if (options.originY !== undefined) { + this.originY = options.originY; + } + // if coming from svg i do not want to calc bounds. + // i assume width and height are passed along options + center || this._calcBounds(); + this._updateObjectsCoords(center); + delete options.centerPoint; + this.callSuper('initialize', options); + } + else { + this._updateObjectsACoords(); + } + + this.setCoords(); + }, + + /** + * @private + */ + _updateObjectsACoords: function() { + var skipControls = true; + for (var i = this._objects.length; i--; ){ + this._objects[i].setCoords(skipControls); + } + }, + + /** + * @private + * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change + */ + _updateObjectsCoords: function(center) { + var center = center || this.getCenterPoint(); + for (var i = this._objects.length; i--; ){ + this._updateObjectCoords(this._objects[i], center); + } + }, + + /** + * @private + * @param {Object} object + * @param {fabric.Point} center, current center of group. + */ + _updateObjectCoords: function(object, center) { + var objectLeft = object.left, + objectTop = object.top, + skipControls = true; + + object.set({ + left: objectLeft - center.x, + top: objectTop - center.y + }); + object.group = this; + object.setCoords(skipControls); + }, + + /** + * Returns string represenation of a group + * @return {String} + */ + toString: function() { + return '#'; + }, + + /** + * Adds an object to a group; Then recalculates group's dimension, position. + * @param {Object} object + * @return {fabric.Group} thisArg + * @chainable + */ + addWithUpdate: function(object) { + var nested = !!this.group; + this._restoreObjectsState(); + fabric.util.resetObjectTransform(this); + if (object) { + if (nested) { + // if this group is inside another group, we need to pre transform the object + fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix()); + } + this._objects.push(object); + object.group = this; + object._set('canvas', this.canvas); + } + this._calcBounds(); + this._updateObjectsCoords(); + this.dirty = true; + if (nested) { + this.group.addWithUpdate(); + } + else { + this.setCoords(); + } + return this; + }, + + /** + * Removes an object from a group; Then recalculates group's dimension, position. + * @param {Object} object + * @return {fabric.Group} thisArg + * @chainable + */ + removeWithUpdate: function(object) { + this._restoreObjectsState(); + fabric.util.resetObjectTransform(this); + + this.remove(object); + this._calcBounds(); + this._updateObjectsCoords(); + this.setCoords(); + this.dirty = true; + return this; + }, + + /** + * @private + */ + _onObjectAdded: function(object) { + this.dirty = true; + object.group = this; + object._set('canvas', this.canvas); + }, + + /** + * @private + */ + _onObjectRemoved: function(object) { + this.dirty = true; + delete object.group; + }, + + /** + * @private + */ + _set: function(key, value) { + var i = this._objects.length; + if (this.useSetOnGroup) { + while (i--) { + this._objects[i].setOnGroup(key, value); + } + } + if (key === 'canvas') { + while (i--) { + this._objects[i]._set(key, value); + } + } + fabric.Object.prototype._set.call(this, key, value); + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function(propertiesToInclude) { + var _includeDefaultValues = this.includeDefaultValues; + var objsToObject = this._objects + .filter(function (obj) { + return !obj.excludeFromExport; + }) + .map(function (obj) { + var originalDefaults = obj.includeDefaultValues; + obj.includeDefaultValues = _includeDefaultValues; + var _obj = obj.toObject(propertiesToInclude); + obj.includeDefaultValues = originalDefaults; + return _obj; + }); + var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude); + obj.objects = objsToObject; + return obj; + }, + + /** + * Returns object representation of an instance, in dataless mode. + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toDatalessObject: function(propertiesToInclude) { + var objsToObject, sourcePath = this.sourcePath; + if (sourcePath) { + objsToObject = sourcePath; + } + else { + var _includeDefaultValues = this.includeDefaultValues; + objsToObject = this._objects.map(function(obj) { + var originalDefaults = obj.includeDefaultValues; + obj.includeDefaultValues = _includeDefaultValues; + var _obj = obj.toDatalessObject(propertiesToInclude); + obj.includeDefaultValues = originalDefaults; + return _obj; + }); + } + var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude); + obj.objects = objsToObject; + return obj; + }, + + /** + * Renders instance on a given context + * @param {CanvasRenderingContext2D} ctx context to render instance on + */ + render: function(ctx) { + this._transformDone = true; + this.callSuper('render', ctx); + this._transformDone = false; + }, + + /** + * Decide if the object should cache or not. Create its own cache level + * needsItsOwnCache should be used when the object drawing method requires + * a cache step. None of the fabric classes requires it. + * Generally you do not cache objects in groups because the group is already cached. + * @return {Boolean} + */ + shouldCache: function() { + var ownCache = fabric.Object.prototype.shouldCache.call(this); + if (ownCache) { + for (var i = 0, len = this._objects.length; i < len; i++) { + if (this._objects[i].willDrawShadow()) { + this.ownCaching = false; + return false; + } + } + } + return ownCache; + }, + + /** + * Check if this object or a child object will cast a shadow + * @return {Boolean} + */ + willDrawShadow: function() { + if (fabric.Object.prototype.willDrawShadow.call(this)) { + return true; + } + for (var i = 0, len = this._objects.length; i < len; i++) { + if (this._objects[i].willDrawShadow()) { + return true; + } + } + return false; + }, + + /** + * Check if this group or its parent group are caching, recursively up + * @return {Boolean} + */ + isOnACache: function() { + return this.ownCaching || (this.group && this.group.isOnACache()); + }, + + /** + * Execute the drawing operation for an object on a specified context + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + drawObject: function(ctx) { + for (var i = 0, len = this._objects.length; i < len; i++) { + this._objects[i].render(ctx); + } + this._drawClipPath(ctx, this.clipPath); + }, + + /** + * Check if cache is dirty + */ + isCacheDirty: function(skipCanvas) { + if (this.callSuper('isCacheDirty', skipCanvas)) { + return true; + } + if (!this.statefullCache) { + return false; + } + for (var i = 0, len = this._objects.length; i < len; i++) { + if (this._objects[i].isCacheDirty(true)) { + if (this._cacheCanvas) { + // if this group has not a cache canvas there is nothing to clean + var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY; + this._cacheContext.clearRect(-x / 2, -y / 2, x, y); + } + return true; + } + } + return false; + }, + + /** + * Restores original state of each of group objects (original state is that which was before group was created). + * if the nested boolean is true, the original state will be restored just for the + * first group and not for all the group chain + * @private + * @param {Boolean} nested tell the function to restore object state up to the parent group and not more + * @return {fabric.Group} thisArg + * @chainable + */ + _restoreObjectsState: function() { + var groupMatrix = this.calcOwnMatrix(); + this._objects.forEach(function(object) { + // instead of using _this = this; + fabric.util.addTransformToObject(object, groupMatrix); + delete object.group; + object.setCoords(); + }); + return this; + }, + + /** + * Destroys a group (restoring state of its objects) + * @return {fabric.Group} thisArg + * @chainable + */ + destroy: function() { + // when group is destroyed objects needs to get a repaint to be eventually + // displayed on canvas. + this._objects.forEach(function(object) { + object.set('dirty', true); + }); + return this._restoreObjectsState(); + }, + + dispose: function () { + this.callSuper('dispose'); + this.forEachObject(function (object) { + object.dispose && object.dispose(); + }); + this._objects = []; + }, + + /** + * make a group an active selection, remove the group from canvas + * the group has to be on canvas for this to work. + * @return {fabric.ActiveSelection} thisArg + * @chainable + */ + toActiveSelection: function() { + if (!this.canvas) { + return; + } + var objects = this._objects, canvas = this.canvas; + this._objects = []; + var options = this.toObject(); + delete options.objects; + var activeSelection = new fabric.ActiveSelection([]); + activeSelection.set(options); + activeSelection.type = 'activeSelection'; + canvas.remove(this); + objects.forEach(function(object) { + object.group = activeSelection; + object.dirty = true; + canvas.add(object); + }); + activeSelection.canvas = canvas; + activeSelection._objects = objects; + canvas._activeObject = activeSelection; + activeSelection.setCoords(); + return activeSelection; + }, + + /** + * Destroys a group (restoring state of its objects) + * @return {fabric.Group} thisArg + * @chainable + */ + ungroupOnCanvas: function() { + return this._restoreObjectsState(); + }, + + /** + * Sets coordinates of all objects inside group + * @return {fabric.Group} thisArg + * @chainable + */ + setObjectsCoords: function() { + var skipControls = true; + this.forEachObject(function(object) { + object.setCoords(skipControls); + }); + return this; + }, + + /** + * @private + */ + _calcBounds: function(onlyWidthHeight) { + var aX = [], + aY = [], + o, prop, coords, + props = ['tr', 'br', 'bl', 'tl'], + i = 0, iLen = this._objects.length, + j, jLen = props.length; + + for ( ; i < iLen; ++i) { + o = this._objects[i]; + coords = o.calcACoords(); + for (j = 0; j < jLen; j++) { + prop = props[j]; + aX.push(coords[prop].x); + aY.push(coords[prop].y); + } + o.aCoords = coords; + } + + this._getBounds(aX, aY, onlyWidthHeight); + }, + + /** + * @private + */ + _getBounds: function(aX, aY, onlyWidthHeight) { + var minXY = new fabric.Point(min(aX), min(aY)), + maxXY = new fabric.Point(max(aX), max(aY)), + top = minXY.y || 0, left = minXY.x || 0, + width = (maxXY.x - minXY.x) || 0, + height = (maxXY.y - minXY.y) || 0; + this.width = width; + this.height = height; + if (!onlyWidthHeight) { + // the bounding box always finds the topleft most corner. + // whatever is the group origin, we set up here the left/top position. + this.setPositionByOrigin({ x: left, y: top }, 'left', 'top'); + } + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + _toSVG: function(reviver) { + var svgString = ['\n']; + + for (var i = 0, len = this._objects.length; i < len; i++) { + svgString.push('\t\t', this._objects[i].toSVG(reviver)); + } + svgString.push('\n'); + return svgString; + }, + + /** + * Returns styles-string for svg-export, specific version for group + * @return {String} + */ + getSvgStyles: function() { + var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ? + 'opacity: ' + this.opacity + ';' : '', + visibility = this.visible ? '' : ' visibility: hidden;'; + return [ + opacity, + this.getSvgFilter(), + visibility + ].join(''); + }, + + /** + * Returns svg clipPath representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + toClipPathSVG: function(reviver) { + var svgString = []; + + for (var i = 0, len = this._objects.length; i < len; i++) { + svgString.push('\t', this._objects[i].toClipPathSVG(reviver)); + } + + return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver }); + }, + /* _TO_SVG_END_ */ + }); + + /** + * Returns {@link fabric.Group} instance from an object representation + * @static + * @memberOf fabric.Group + * @param {Object} object Object to create a group from + * @param {Function} [callback] Callback to invoke when an group instance is created + */ + fabric.Group.fromObject = function(object, callback) { + var objects = object.objects, + options = fabric.util.object.clone(object, true); + delete options.objects; + if (typeof objects === 'string') { + // it has to be an url or something went wrong. + fabric.loadSVGFromURL(objects, function (elements) { + var group = fabric.util.groupSVGElements(elements, object, objects); + group.set(options); + callback && callback(group); + }); + return; + } + fabric.util.enlivenObjects(objects, function (enlivenedObjects) { + var options = fabric.util.object.clone(object, true); + delete options.objects; + fabric.util.enlivenObjectEnlivables(object, options, function () { + callback && callback(new fabric.Group(enlivenedObjects, options, true)); + }); + }); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }); + + if (fabric.ActiveSelection) { + return; + } + + /** + * Group class + * @class fabric.ActiveSelection + * @extends fabric.Group + * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} + * @see {@link fabric.ActiveSelection#initialize} for constructor definition + */ + fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'activeSelection', + + /** + * Constructor + * @param {Object} objects ActiveSelection objects + * @param {Object} [options] Options object + * @return {Object} thisArg + */ + initialize: function(objects, options) { + options = options || {}; + this._objects = objects || []; + for (var i = this._objects.length; i--; ) { + this._objects[i].group = this; + } + + if (options.originX) { + this.originX = options.originX; + } + if (options.originY) { + this.originY = options.originY; + } + this._calcBounds(); + this._updateObjectsCoords(); + fabric.Object.prototype.initialize.call(this, options); + this.setCoords(); + }, + + /** + * Change te activeSelection to a normal group, + * High level function that automatically adds it to canvas as + * active object. no events fired. + * @since 2.0.0 + * @return {fabric.Group} + */ + toGroup: function() { + var objects = this._objects.concat(); + this._objects = []; + var options = fabric.Object.prototype.toObject.call(this); + var newGroup = new fabric.Group([]); + delete options.type; + newGroup.set(options); + objects.forEach(function(object) { + object.canvas.remove(object); + object.group = newGroup; + }); + newGroup._objects = objects; + if (!this.canvas) { + return newGroup; + } + var canvas = this.canvas; + canvas.add(newGroup); + canvas._activeObject = newGroup; + newGroup.setCoords(); + return newGroup; + }, + + /** + * If returns true, deselection is cancelled. + * @since 2.0.0 + * @return {Boolean} [cancel] + */ + onDeselect: function() { + this.destroy(); + return false; + }, + + /** + * Returns string representation of a group + * @return {String} + */ + toString: function() { + return '#'; + }, + + /** + * Decide if the object should cache or not. Create its own cache level + * objectCaching is a global flag, wins over everything + * needsItsOwnCache should be used when the object drawing method requires + * a cache step. None of the fabric classes requires it. + * Generally you do not cache objects in groups because the group outside is cached. + * @return {Boolean} + */ + shouldCache: function() { + return false; + }, + + /** + * Check if this group or its parent group are caching, recursively up + * @return {Boolean} + */ + isOnACache: function() { + return false; + }, + + /** + * Renders controls and borders for the object + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Object} [styleOverride] properties to override the object style + * @param {Object} [childrenOverride] properties to override the children overrides + */ + _renderControls: function(ctx, styleOverride, childrenOverride) { + ctx.save(); + ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; + this.callSuper('_renderControls', ctx, styleOverride); + childrenOverride = childrenOverride || { }; + if (typeof childrenOverride.hasControls === 'undefined') { + childrenOverride.hasControls = false; + } + childrenOverride.forActiveSelection = true; + for (var i = 0, len = this._objects.length; i < len; i++) { + this._objects[i]._renderControls(ctx, childrenOverride); + } + ctx.restore(); + }, + }); + + /** + * Returns {@link fabric.ActiveSelection} instance from an object representation + * @static + * @memberOf fabric.ActiveSelection + * @param {Object} object Object to create a group from + * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created + */ + fabric.ActiveSelection.fromObject = function(object, callback) { + fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { + delete object.objects; + callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true)); + }); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var extend = fabric.util.object.extend; + + if (!global.fabric) { + global.fabric = { }; + } + + if (global.fabric.Image) { + fabric.warn('fabric.Image is already defined.'); + return; + } + + /** + * Image class + * @class fabric.Image + * @extends fabric.Object + * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images} + * @see {@link fabric.Image#initialize} for constructor definition + */ + fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'image', + + /** + * Width of a stroke. + * For image quality a stroke multiple of 2 gives better results. + * @type Number + * @default + */ + strokeWidth: 0, + + /** + * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`. + * This allows for relative urls as image src. + * @since 2.7.0 + * @type Boolean + * @default + */ + srcFromAttribute: false, + + /** + * private + * contains last value of scaleX to detect + * if the Image got resized after the last Render + * @type Number + */ + _lastScaleX: 1, + + /** + * private + * contains last value of scaleY to detect + * if the Image got resized after the last Render + * @type Number + */ + _lastScaleY: 1, + + /** + * private + * contains last value of scaling applied by the apply filter chain + * @type Number + */ + _filterScalingX: 1, + + /** + * private + * contains last value of scaling applied by the apply filter chain + * @type Number + */ + _filterScalingY: 1, + + /** + * minimum scale factor under which any resizeFilter is triggered to resize the image + * 0 will disable the automatic resize. 1 will trigger automatically always. + * number bigger than 1 are not implemented yet. + * @type Number + */ + minimumScaleTrigger: 0.5, + + /** + * List of properties to consider when checking if + * state of an object is changed ({@link fabric.Object#hasStateChanged}) + * as well as for history (undo/redo) purposes + * @type Array + */ + stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'), + + /** + * List of properties to consider when checking if cache needs refresh + * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single + * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty + * and refreshed at the next render + * @type Array + */ + cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'), + + /** + * key used to retrieve the texture representing this image + * @since 2.0.0 + * @type String + * @default + */ + cacheKey: '', + + /** + * Image crop in pixels from original image size. + * @since 2.0.0 + * @type Number + * @default + */ + cropX: 0, + + /** + * Image crop in pixels from original image size. + * @since 2.0.0 + * @type Number + * @default + */ + cropY: 0, + + /** + * Indicates whether this canvas will use image smoothing when painting this image. + * Also influence if the cacheCanvas for this image uses imageSmoothing + * @since 4.0.0-beta.11 + * @type Boolean + * @default + */ + imageSmoothing: true, + + /** + * Constructor + * Image can be initialized with any canvas drawable or a string. + * The string should be a url and will be loaded as an image. + * Canvas and Image element work out of the box, while videos require extra code to work. + * Please check video element events for seeking. + * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element + * @param {Object} [options] Options object + * @param {function} [callback] callback function to call after eventual filters applied. + * @return {fabric.Image} thisArg + */ + initialize: function(element, options) { + options || (options = { }); + this.filters = []; + this.cacheKey = 'texture' + fabric.Object.__uid++; + this.callSuper('initialize', options); + this._initElement(element, options); + }, + + /** + * Returns image element which this instance if based on + * @return {HTMLImageElement} Image element + */ + getElement: function() { + return this._element || {}; + }, + + /** + * Sets image element for this instance to a specified one. + * If filters defined they are applied to new image. + * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area. + * @param {HTMLImageElement} element + * @param {Object} [options] Options object + * @return {fabric.Image} thisArg + * @chainable + */ + setElement: function(element, options) { + this.removeTexture(this.cacheKey); + this.removeTexture(this.cacheKey + '_filtered'); + this._element = element; + this._originalElement = element; + this._initConfig(options); + if (this.filters.length !== 0) { + this.applyFilters(); + } + // resizeFilters work on the already filtered copy. + // we need to apply resizeFilters AFTER normal filters. + // applyResizeFilters is run more often than normal filters + // and is triggered by user interactions rather than dev code + if (this.resizeFilter) { + this.applyResizeFilters(); + } + return this; + }, + + /** + * Delete a single texture if in webgl mode + */ + removeTexture: function(key) { + var backend = fabric.filterBackend; + if (backend && backend.evictCachesForKey) { + backend.evictCachesForKey(key); + } + }, + + /** + * Delete textures, reference to elements and eventually JSDOM cleanup + */ + dispose: function () { + this.callSuper('dispose'); + this.removeTexture(this.cacheKey); + this.removeTexture(this.cacheKey + '_filtered'); + this._cacheContext = undefined; + ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) { + fabric.util.cleanUpJsdomNode(this[element]); + this[element] = undefined; + }).bind(this)); + }, + + /** + * Get the crossOrigin value (of the corresponding image element) + */ + getCrossOrigin: function() { + return this._originalElement && (this._originalElement.crossOrigin || null); + }, + + /** + * Returns original size of an image + * @return {Object} Object with "width" and "height" properties + */ + getOriginalSize: function() { + var element = this.getElement(); + return { + width: element.naturalWidth || element.width, + height: element.naturalHeight || element.height + }; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _stroke: function(ctx) { + if (!this.stroke || this.strokeWidth === 0) { + return; + } + var w = this.width / 2, h = this.height / 2; + ctx.beginPath(); + ctx.moveTo(-w, -h); + ctx.lineTo(w, -h); + ctx.lineTo(w, h); + ctx.lineTo(-w, h); + ctx.lineTo(-w, -h); + ctx.closePath(); + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of an instance + */ + toObject: function(propertiesToInclude) { + var filters = []; + + this.filters.forEach(function(filterObj) { + if (filterObj) { + filters.push(filterObj.toObject()); + } + }); + var object = extend( + this.callSuper( + 'toObject', + ['cropX', 'cropY'].concat(propertiesToInclude) + ), { + src: this.getSrc(), + crossOrigin: this.getCrossOrigin(), + filters: filters, + }); + if (this.resizeFilter) { + object.resizeFilter = this.resizeFilter.toObject(); + } + return object; + }, + + /** + * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height. + * @return {Boolean} + */ + hasCrop: function() { + return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height; + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * @return {Array} an array of strings with the specific svg representation + * of the instance + */ + _toSVG: function() { + var svgString = [], imageMarkup = [], strokeSvg, element = this._element, + x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = ''; + if (!element) { + return []; + } + if (this.hasCrop()) { + var clipPathId = fabric.Object.__uid++; + svgString.push( + '\n', + '\t\n', + '\n' + ); + clipPath = ' clip-path="url(#imageCrop_' + clipPathId + ')" '; + } + if (!this.imageSmoothing) { + imageRendering = '" image-rendering="optimizeSpeed'; + } + imageMarkup.push('\t\n'); + + if (this.stroke || this.strokeDashArray) { + var origFill = this.fill; + this.fill = null; + strokeSvg = [ + '\t\n' + ]; + this.fill = origFill; + } + if (this.paintFirst !== 'fill') { + svgString = svgString.concat(strokeSvg, imageMarkup); + } + else { + svgString = svgString.concat(imageMarkup, strokeSvg); + } + return svgString; + }, + /* _TO_SVG_END_ */ + + /** + * Returns source of an image + * @param {Boolean} filtered indicates if the src is needed for svg + * @return {String} Source of an image + */ + getSrc: function(filtered) { + var element = filtered ? this._element : this._originalElement; + if (element) { + if (element.toDataURL) { + return element.toDataURL(); + } + + if (this.srcFromAttribute) { + return element.getAttribute('src'); + } + else { + return element.src; + } + } + else { + return this.src || ''; + } + }, + + /** + * Sets source of an image + * @param {String} src Source string (URL) + * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied) + * @param {Object} [options] Options object + * @param {String} [options.crossOrigin] crossOrigin value (one of "", "anonymous", "use-credentials") + * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes + * @return {fabric.Image} thisArg + * @chainable + */ + setSrc: function(src, callback, options) { + fabric.util.loadImage(src, function(img, isError) { + this.setElement(img, options); + this._setWidthHeight(); + callback && callback(this, isError); + }, this, options && options.crossOrigin); + return this; + }, + + /** + * Returns string representation of an instance + * @return {String} String representation of an instance + */ + toString: function() { + return '#'; + }, + + applyResizeFilters: function() { + var filter = this.resizeFilter, + minimumScale = this.minimumScaleTrigger, + objectScale = this.getTotalObjectScaling(), + scaleX = objectScale.scaleX, + scaleY = objectScale.scaleY, + elementToFilter = this._filteredEl || this._originalElement; + if (this.group) { + this.set('dirty', true); + } + if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) { + this._element = elementToFilter; + this._filterScalingX = 1; + this._filterScalingY = 1; + this._lastScaleX = scaleX; + this._lastScaleY = scaleY; + return; + } + if (!fabric.filterBackend) { + fabric.filterBackend = fabric.initFilterBackend(); + } + var canvasEl = fabric.util.createCanvasElement(), + cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey, + sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height; + canvasEl.width = sourceWidth; + canvasEl.height = sourceHeight; + this._element = canvasEl; + this._lastScaleX = filter.scaleX = scaleX; + this._lastScaleY = filter.scaleY = scaleY; + fabric.filterBackend.applyFilters( + [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey); + this._filterScalingX = canvasEl.width / this._originalElement.width; + this._filterScalingY = canvasEl.height / this._originalElement.height; + }, + + /** + * Applies filters assigned to this image (from "filters" array) or from filter param + * @method applyFilters + * @param {Array} filters to be applied + * @param {Boolean} forResizing specify if the filter operation is a resize operation + * @return {thisArg} return the fabric.Image object + * @chainable + */ + applyFilters: function(filters) { + + filters = filters || this.filters || []; + filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); }); + this.set('dirty', true); + + // needs to clear out or WEBGL will not resize correctly + this.removeTexture(this.cacheKey + '_filtered'); + + if (filters.length === 0) { + this._element = this._originalElement; + this._filteredEl = null; + this._filterScalingX = 1; + this._filterScalingY = 1; + return this; + } + + var imgElement = this._originalElement, + sourceWidth = imgElement.naturalWidth || imgElement.width, + sourceHeight = imgElement.naturalHeight || imgElement.height; + + if (this._element === this._originalElement) { + // if the element is the same we need to create a new element + var canvasEl = fabric.util.createCanvasElement(); + canvasEl.width = sourceWidth; + canvasEl.height = sourceHeight; + this._element = canvasEl; + this._filteredEl = canvasEl; + } + else { + // clear the existing element to get new filter data + // also dereference the eventual resized _element + this._element = this._filteredEl; + this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight); + // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y + this._lastScaleX = 1; + this._lastScaleY = 1; + } + if (!fabric.filterBackend) { + fabric.filterBackend = fabric.initFilterBackend(); + } + fabric.filterBackend.applyFilters( + filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey); + if (this._originalElement.width !== this._element.width || + this._originalElement.height !== this._element.height) { + this._filterScalingX = this._element.width / this._originalElement.width; + this._filterScalingY = this._element.height / this._originalElement.height; + } + return this; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + fabric.util.setImageSmoothing(ctx, this.imageSmoothing); + if (this.isMoving !== true && this.resizeFilter && this._needsResize()) { + this.applyResizeFilters(); + } + this._stroke(ctx); + this._renderPaintInOrder(ctx); + }, + + /** + * Paint the cached copy of the object on the target context. + * it will set the imageSmoothing for the draw operation + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + drawCacheOnCanvas: function(ctx) { + fabric.util.setImageSmoothing(ctx, this.imageSmoothing); + fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx); + }, + + /** + * Decide if the object should cache or not. Create its own cache level + * needsItsOwnCache should be used when the object drawing method requires + * a cache step. None of the fabric classes requires it. + * Generally you do not cache objects in groups because the group outside is cached. + * This is the special image version where we would like to avoid caching where possible. + * Essentially images do not benefit from caching. They may require caching, and in that + * case we do it. Also caching an image usually ends in a loss of details. + * A full performance audit should be done. + * @return {Boolean} + */ + shouldCache: function() { + return this.needsItsOwnCache(); + }, + + _renderFill: function(ctx) { + var elementToDraw = this._element; + if (!elementToDraw) { + return; + } + var scaleX = this._filterScalingX, scaleY = this._filterScalingY, + w = this.width, h = this.height, min = Math.min, max = Math.max, + // crop values cannot be lesser than 0. + cropX = max(this.cropX, 0), cropY = max(this.cropY, 0), + elWidth = elementToDraw.naturalWidth || elementToDraw.width, + elHeight = elementToDraw.naturalHeight || elementToDraw.height, + sX = cropX * scaleX, + sY = cropY * scaleY, + // the width height cannot exceed element width/height, starting from the crop offset. + sW = min(w * scaleX, elWidth - sX), + sH = min(h * scaleY, elHeight - sY), + x = -w / 2, y = -h / 2, + maxDestW = min(w, elWidth / scaleX - cropX), + maxDestH = min(h, elHeight / scaleY - cropY); + + elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH); + }, + + /** + * needed to check if image needs resize + * @private + */ + _needsResize: function() { + var scale = this.getTotalObjectScaling(); + return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY); + }, + + /** + * @private + */ + _resetWidthHeight: function() { + this.set(this.getOriginalSize()); + }, + + /** + * The Image class's initialization method. This method is automatically + * called by the constructor. + * @private + * @param {HTMLImageElement|String} element The element representing the image + * @param {Object} [options] Options object + */ + _initElement: function(element, options) { + this.setElement(fabric.util.getById(element), options); + fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS); + }, + + /** + * @private + * @param {Object} [options] Options object + */ + _initConfig: function(options) { + options || (options = { }); + this.setOptions(options); + this._setWidthHeight(options); + }, + + /** + * @private + * @param {Array} filters to be initialized + * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created + */ + _initFilters: function(filters, callback) { + if (filters && filters.length) { + fabric.util.enlivenObjects(filters, function(enlivenedObjects) { + callback && callback(enlivenedObjects); + }, 'fabric.Image.filters'); + } + else { + callback && callback(); + } + }, + + /** + * @private + * Set the width and the height of the image object, using the element or the + * options. + * @param {Object} [options] Object with width/height properties + */ + _setWidthHeight: function(options) { + options || (options = { }); + var el = this.getElement(); + this.width = options.width || el.naturalWidth || el.width || 0; + this.height = options.height || el.naturalHeight || el.height || 0; + }, + + /** + * Calculate offset for center and scale factor for the image in order to respect + * the preserveAspectRatio attribute + * @private + * @return {Object} + */ + parsePreserveAspectRatioAttribute: function() { + var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''), + rWidth = this._element.width, rHeight = this._element.height, + scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0, + offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight }; + if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) { + if (pAR.meetOrSlice === 'meet') { + scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes); + offset = (pWidth - rWidth * scaleX) / 2; + if (pAR.alignX === 'Min') { + offsetLeft = -offset; + } + if (pAR.alignX === 'Max') { + offsetLeft = offset; + } + offset = (pHeight - rHeight * scaleY) / 2; + if (pAR.alignY === 'Min') { + offsetTop = -offset; + } + if (pAR.alignY === 'Max') { + offsetTop = offset; + } + } + if (pAR.meetOrSlice === 'slice') { + scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes); + offset = rWidth - pWidth / scaleX; + if (pAR.alignX === 'Mid') { + cropX = offset / 2; + } + if (pAR.alignX === 'Max') { + cropX = offset; + } + offset = rHeight - pHeight / scaleY; + if (pAR.alignY === 'Mid') { + cropY = offset / 2; + } + if (pAR.alignY === 'Max') { + cropY = offset; + } + rWidth = pWidth / scaleX; + rHeight = pHeight / scaleY; + } + } + else { + scaleX = pWidth / rWidth; + scaleY = pHeight / rHeight; + } + return { + width: rWidth, + height: rHeight, + scaleX: scaleX, + scaleY: scaleY, + offsetLeft: offsetLeft, + offsetTop: offsetTop, + cropX: cropX, + cropY: cropY + }; + } + }); + + /** + * Default CSS class name for canvas + * @static + * @type String + * @default + */ + fabric.Image.CSS_CANVAS = 'canvas-img'; + + /** + * Alias for getSrc + * @static + */ + fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc; + + /** + * Creates an instance of fabric.Image from its object representation + * @static + * @param {Object} object Object to create an instance from + * @param {Function} callback Callback to invoke when an image instance is created + */ + fabric.Image.fromObject = function(_object, callback) { + var object = fabric.util.object.clone(_object); + fabric.util.loadImage(object.src, function(img, isError) { + if (isError) { + callback && callback(null, true); + return; + } + fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) { + object.filters = filters || []; + fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) { + object.resizeFilter = resizeFilters[0]; + fabric.util.enlivenObjectEnlivables(object, object, function () { + var image = new fabric.Image(img, object); + callback(image, false); + }); + }); + }); + }, null, object.crossOrigin); + }; + + /** + * Creates an instance of fabric.Image from an URL string + * @static + * @param {String} url URL to create an image from + * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not. + * @param {Object} [imgOptions] Options object + */ + fabric.Image.fromURL = function(url, callback, imgOptions) { + fabric.util.loadImage(url, function(img, isError) { + callback && callback(new fabric.Image(img, imgOptions), isError); + }, null, imgOptions && imgOptions.crossOrigin); + }; + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement}) + * @static + * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement} + */ + fabric.Image.ATTRIBUTE_NAMES = + fabric.SHARED_ATTRIBUTES.concat( + 'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ') + ); + + /** + * Returns {@link fabric.Image} instance from an SVG element + * @static + * @param {SVGElement} element Element to parse + * @param {Object} [options] Options object + * @param {Function} callback Callback to execute when fabric.Image object is created + * @return {fabric.Image} Instance of fabric.Image + */ + fabric.Image.fromElement = function(element, callback, options) { + var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES); + fabric.Image.fromURL(parsedAttributes['xlink:href'], callback, + extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); + }; + /* _FROM_SVG_END_ */ + +})(typeof exports !== 'undefined' ? exports : this); +fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { + + /** + * @private + * @return {Number} angle value + */ + _getAngleValueForStraighten: function() { + var angle = this.angle % 360; + if (angle > 0) { + return Math.round((angle - 1) / 90) * 90; + } + return Math.round(angle / 90) * 90; + }, + + /** + * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer) + * @return {fabric.Object} thisArg + * @chainable + */ + straighten: function() { + return this.rotate(this._getAngleValueForStraighten()); + }, + + /** + * Same as {@link fabric.Object.prototype.straighten} but with animation + * @param {Object} callbacks Object with callback functions + * @param {Function} [callbacks.onComplete] Invoked on completion + * @param {Function} [callbacks.onChange] Invoked on every step of animation + * @return {fabric.Object} thisArg + */ + fxStraighten: function(callbacks) { + callbacks = callbacks || { }; + + var empty = function() { }, + onComplete = callbacks.onComplete || empty, + onChange = callbacks.onChange || empty, + _this = this; + + return fabric.util.animate({ + target: this, + startValue: this.get('angle'), + endValue: this._getAngleValueForStraighten(), + duration: this.FX_DURATION, + onChange: function(value) { + _this.rotate(value); + onChange(); + }, + onComplete: function() { + _this.setCoords(); + onComplete(); + }, + }); + } +}); + +fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { + + /** + * Straightens object, then rerenders canvas + * @param {fabric.Object} object Object to straighten + * @return {fabric.Canvas} thisArg + * @chainable + */ + straightenObject: function (object) { + object.straighten(); + this.requestRenderAll(); + return this; + }, + + /** + * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated + * @param {fabric.Object} object Object to straighten + * @return {fabric.Canvas} thisArg + */ + fxStraightenObject: function (object) { + return object.fxStraighten({ + onChange: this.requestRenderAllBound + }); + } +}); +(function() { + + 'use strict'; + + /** + * Tests if webgl supports certain precision + * @param {WebGL} Canvas WebGL context to test on + * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp' + * @returns {Boolean} Whether the user's browser WebGL supports given precision. + */ + function testPrecision(gl, precision){ + var fragmentSource = 'precision ' + precision + ' float;\nvoid main(){}'; + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fragmentShader, fragmentSource); + gl.compileShader(fragmentShader); + if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { + return false; + } + return true; + } + + /** + * Indicate whether this filtering backend is supported by the user's browser. + * @param {Number} tileSize check if the tileSize is supported + * @returns {Boolean} Whether the user's browser supports WebGL. + */ + fabric.isWebglSupported = function(tileSize) { + if (fabric.isLikelyNode) { + return false; + } + tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize; + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); + var isSupported = false; + // eslint-disable-next-line + if (gl) { + fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + isSupported = fabric.maxTextureSize >= tileSize; + var precisions = ['highp', 'mediump', 'lowp']; + for (var i = 0; i < 3; i++){ + if (testPrecision(gl, precisions[i])){ + fabric.webGlPrecision = precisions[i]; + break; + }; + } + } + this.isSupported = isSupported; + return isSupported; + }; + + fabric.WebglFilterBackend = WebglFilterBackend; + + /** + * WebGL filter backend. + */ + function WebglFilterBackend(options) { + if (options && options.tileSize) { + this.tileSize = options.tileSize; + } + this.setupGLContext(this.tileSize, this.tileSize); + this.captureGPUInfo(); + }; + + WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ { + + tileSize: 2048, + + /** + * Experimental. This object is a sort of repository of help layers used to avoid + * of recreating them during frequent filtering. If you are previewing a filter with + * a slider you probably do not want to create help layers every filter step. + * in this object there will be appended some canvases, created once, resized sometimes + * cleared never. Clearing is left to the developer. + **/ + resources: { + + }, + + /** + * Setup a WebGL context suitable for filtering, and bind any needed event handlers. + */ + setupGLContext: function(width, height) { + this.dispose(); + this.createWebGLCanvas(width, height); + // eslint-disable-next-line + this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]); + this.chooseFastestCopyGLTo2DMethod(width, height); + }, + + /** + * Pick a method to copy data from GL context to 2d canvas. In some browsers using + * putImageData is faster than drawImage for that specific operation. + */ + chooseFastestCopyGLTo2DMethod: function(width, height) { + var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData; + try { + new ImageData(1, 1); + canUseImageData = true; + } + catch (e) { + canUseImageData = false; + } + // eslint-disable-next-line no-undef + var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined'; + // eslint-disable-next-line no-undef + var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined'; + + if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) { + return; + } + + var targetCanvas = fabric.util.createCanvasElement(); + // eslint-disable-next-line no-undef + var imageBuffer = new ArrayBuffer(width * height * 4); + if (fabric.forceGLPutImageData) { + this.imageBuffer = imageBuffer; + this.copyGLTo2D = copyGLTo2DPutImageData; + return; + } + var testContext = { + imageBuffer: imageBuffer, + destinationWidth: width, + destinationHeight: height, + targetCanvas: targetCanvas + }; + var startTime, drawImageTime, putImageDataTime; + targetCanvas.width = width; + targetCanvas.height = height; + + startTime = window.performance.now(); + copyGLTo2DDrawImage.call(testContext, this.gl, testContext); + drawImageTime = window.performance.now() - startTime; + + startTime = window.performance.now(); + copyGLTo2DPutImageData.call(testContext, this.gl, testContext); + putImageDataTime = window.performance.now() - startTime; + + if (drawImageTime > putImageDataTime) { + this.imageBuffer = imageBuffer; + this.copyGLTo2D = copyGLTo2DPutImageData; + } + else { + this.copyGLTo2D = copyGLTo2DDrawImage; + } + }, + + /** + * Create a canvas element and associated WebGL context and attaches them as + * class properties to the GLFilterBackend class. + */ + createWebGLCanvas: function(width, height) { + var canvas = fabric.util.createCanvasElement(); + canvas.width = width; + canvas.height = height; + var glOptions = { + alpha: true, + premultipliedAlpha: false, + depth: false, + stencil: false, + antialias: false + }, + gl = canvas.getContext('webgl', glOptions); + if (!gl) { + gl = canvas.getContext('experimental-webgl', glOptions); + } + if (!gl) { + return; + } + gl.clearColor(0, 0, 0, 0); + // this canvas can fire webglcontextlost and webglcontextrestored + this.canvas = canvas; + this.gl = gl; + }, + + /** + * Attempts to apply the requested filters to the source provided, drawing the filtered output + * to the provided target canvas. + * + * @param {Array} filters The filters to apply. + * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered. + * @param {Number} width The width of the source input. + * @param {Number} height The height of the source input. + * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. + * @param {String|undefined} cacheKey A key used to cache resources related to the source. If + * omitted, caching will be skipped. + */ + applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) { + var gl = this.gl; + var cachedTexture; + if (cacheKey) { + cachedTexture = this.getCachedTexture(cacheKey, source); + } + var pipelineState = { + originalWidth: source.width || source.originalWidth, + originalHeight: source.height || source.originalHeight, + sourceWidth: width, + sourceHeight: height, + destinationWidth: width, + destinationHeight: height, + context: gl, + sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source), + targetTexture: this.createTexture(gl, width, height), + originalTexture: cachedTexture || + this.createTexture(gl, width, height, !cachedTexture && source), + passes: filters.length, + webgl: true, + aPosition: this.aPosition, + programCache: this.programCache, + pass: 0, + filterBackend: this, + targetCanvas: targetCanvas + }; + var tempFbo = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo); + filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); }); + resizeCanvasIfNeeded(pipelineState); + this.copyGLTo2D(gl, pipelineState); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.deleteTexture(pipelineState.sourceTexture); + gl.deleteTexture(pipelineState.targetTexture); + gl.deleteFramebuffer(tempFbo); + targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0); + return pipelineState; + }, + + /** + * Detach event listeners, remove references, and clean up caches. + */ + dispose: function() { + if (this.canvas) { + this.canvas = null; + this.gl = null; + } + this.clearWebGLCaches(); + }, + + /** + * Wipe out WebGL-related caches. + */ + clearWebGLCaches: function() { + this.programCache = {}; + this.textureCache = {}; + }, + + /** + * Create a WebGL texture object. + * + * Accepts specific dimensions to initialize the texture to or a source image. + * + * @param {WebGLRenderingContext} gl The GL context to use for creating the texture. + * @param {Number} width The width to initialize the texture at. + * @param {Number} height The height to initialize the texture. + * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data. + * @returns {WebGLTexture} + */ + createTexture: function(gl, width, height, textureImageSource) { + var texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + if (textureImageSource) { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource); + } + else { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + } + return texture; + }, + + /** + * Can be optionally used to get a texture from the cache array + * + * If an existing texture is not found, a new texture is created and cached. + * + * @param {String} uniqueId A cache key to use to find an existing texture. + * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the + * texture cache entry if one does not already exist. + */ + getCachedTexture: function(uniqueId, textureImageSource) { + if (this.textureCache[uniqueId]) { + return this.textureCache[uniqueId]; + } + else { + var texture = this.createTexture( + this.gl, textureImageSource.width, textureImageSource.height, textureImageSource); + this.textureCache[uniqueId] = texture; + return texture; + } + }, + + /** + * Clear out cached resources related to a source image that has been + * filtered previously. + * + * @param {String} cacheKey The cache key provided when the source image was filtered. + */ + evictCachesForKey: function(cacheKey) { + if (this.textureCache[cacheKey]) { + this.gl.deleteTexture(this.textureCache[cacheKey]); + delete this.textureCache[cacheKey]; + } + }, + + copyGLTo2D: copyGLTo2DDrawImage, + + /** + * Attempt to extract GPU information strings from a WebGL context. + * + * Useful information when debugging or blacklisting specific GPUs. + * + * @returns {Object} A GPU info object with renderer and vendor strings. + */ + captureGPUInfo: function() { + if (this.gpuInfo) { + return this.gpuInfo; + } + var gl = this.gl, gpuInfo = { renderer: '', vendor: '' }; + if (!gl) { + return gpuInfo; + } + var ext = gl.getExtension('WEBGL_debug_renderer_info'); + if (ext) { + var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); + if (renderer) { + gpuInfo.renderer = renderer.toLowerCase(); + } + if (vendor) { + gpuInfo.vendor = vendor.toLowerCase(); + } + } + this.gpuInfo = gpuInfo; + return gpuInfo; + }, + }; +})(); + +function resizeCanvasIfNeeded(pipelineState) { + var targetCanvas = pipelineState.targetCanvas, + width = targetCanvas.width, height = targetCanvas.height, + dWidth = pipelineState.destinationWidth, + dHeight = pipelineState.destinationHeight; + + if (width !== dWidth || height !== dHeight) { + targetCanvas.width = dWidth; + targetCanvas.height = dHeight; + } +} + +/** + * Copy an input WebGL canvas on to an output 2D canvas. + * + * The WebGL canvas is assumed to be upside down, with the top-left pixel of the + * desired output image appearing in the bottom-left corner of the WebGL canvas. + * + * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. + * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. + * @param {Object} pipelineState The 2D target canvas to copy on to. + */ +function copyGLTo2DDrawImage(gl, pipelineState) { + var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas, + ctx = targetCanvas.getContext('2d'); + ctx.translate(0, targetCanvas.height); // move it down again + ctx.scale(1, -1); // vertical flip + // where is my image on the big glcanvas? + var sourceY = glCanvas.height - targetCanvas.height; + ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, + targetCanvas.width, targetCanvas.height); +} + +/** + * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData + * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra). + * + * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. + * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. + * @param {Object} pipelineState The 2D target canvas to copy on to. + */ +function copyGLTo2DPutImageData(gl, pipelineState) { + var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'), + dWidth = pipelineState.destinationWidth, + dHeight = pipelineState.destinationHeight, + numBytes = dWidth * dHeight * 4; + + // eslint-disable-next-line no-undef + var u8 = new Uint8Array(this.imageBuffer, 0, numBytes); + // eslint-disable-next-line no-undef + var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes); + + gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8); + var imgData = new ImageData(u8Clamped, dWidth, dHeight); + ctx.putImageData(imgData, 0, 0); +} +(function() { + + 'use strict'; + + var noop = function() {}; + + fabric.Canvas2dFilterBackend = Canvas2dFilterBackend; + + /** + * Canvas 2D filter backend. + */ + function Canvas2dFilterBackend() {}; + + Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ { + evictCachesForKey: noop, + dispose: noop, + clearWebGLCaches: noop, + + /** + * Experimental. This object is a sort of repository of help layers used to avoid + * of recreating them during frequent filtering. If you are previewing a filter with + * a slider you probably do not want to create help layers every filter step. + * in this object there will be appended some canvases, created once, resized sometimes + * cleared never. Clearing is left to the developer. + **/ + resources: { + + }, + + /** + * Apply a set of filters against a source image and draw the filtered output + * to the provided destination canvas. + * + * @param {EnhancedFilter} filters The filter to apply. + * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered. + * @param {Number} sourceWidth The width of the source input. + * @param {Number} sourceHeight The height of the source input. + * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. + */ + applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) { + var ctx = targetCanvas.getContext('2d'); + ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight); + var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); + var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); + var pipelineState = { + sourceWidth: sourceWidth, + sourceHeight: sourceHeight, + imageData: imageData, + originalEl: sourceElement, + originalImageData: originalImageData, + canvasEl: targetCanvas, + ctx: ctx, + filterBackend: this, + }; + filters.forEach(function(filter) { filter.applyTo(pipelineState); }); + if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) { + targetCanvas.width = pipelineState.imageData.width; + targetCanvas.height = pipelineState.imageData.height; + } + ctx.putImageData(pipelineState.imageData, 0, 0); + return pipelineState; + }, + + }; +})(); +/** + * @namespace fabric.Image.filters + * @memberOf fabric.Image + * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters} + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + */ +fabric.Image = fabric.Image || { }; +fabric.Image.filters = fabric.Image.filters || { }; + +/** + * Root filter class from which all filter classes inherit from + * @class fabric.Image.filters.BaseFilter + * @memberOf fabric.Image.filters + */ +fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'BaseFilter', + + /** + * Array of attributes to send with buffers. do not modify + * @private + */ + + vertexSource: 'attribute vec2 aPosition;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vTexCoord = aPosition;\n' + + 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + + '}', + + fragmentSource: 'precision highp float;\n' + + 'varying vec2 vTexCoord;\n' + + 'uniform sampler2D uTexture;\n' + + 'void main() {\n' + + 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + + '}', + + /** + * Constructor + * @param {Object} [options] Options object + */ + initialize: function(options) { + if (options) { + this.setOptions(options); + } + }, + + /** + * Sets filter's properties from options + * @param {Object} [options] Options object + */ + setOptions: function(options) { + for (var prop in options) { + this[prop] = options[prop]; + } + }, + + /** + * Compile this filter's shader program. + * + * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation. + * @param {String} fragmentSource fragmentShader source for compilation + * @param {String} vertexSource vertexShader source for compilation + */ + createProgram: function(gl, fragmentSource, vertexSource) { + fragmentSource = fragmentSource || this.fragmentSource; + vertexSource = vertexSource || this.vertexSource; + if (fabric.webGlPrecision !== 'highp'){ + fragmentSource = fragmentSource.replace( + /precision highp float/g, + 'precision ' + fabric.webGlPrecision + ' float' + ); + } + var vertexShader = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vertexShader, vertexSource); + gl.compileShader(vertexShader); + if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { + throw new Error( + // eslint-disable-next-line prefer-template + 'Vertex shader compile error for ' + this.type + ': ' + + gl.getShaderInfoLog(vertexShader) + ); + } + + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fragmentShader, fragmentSource); + gl.compileShader(fragmentShader); + if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { + throw new Error( + // eslint-disable-next-line prefer-template + 'Fragment shader compile error for ' + this.type + ': ' + + gl.getShaderInfoLog(fragmentShader) + ); + } + + var program = gl.createProgram(); + gl.attachShader(program, vertexShader); + gl.attachShader(program, fragmentShader); + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + throw new Error( + // eslint-disable-next-line prefer-template + 'Shader link error for "${this.type}" ' + + gl.getProgramInfoLog(program) + ); + } + + var attributeLocations = this.getAttributeLocations(gl, program); + var uniformLocations = this.getUniformLocations(gl, program) || { }; + uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW'); + uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH'); + return { + program: program, + attributeLocations: attributeLocations, + uniformLocations: uniformLocations + }; + }, + + /** + * Return a map of attribute names to WebGLAttributeLocation objects. + * + * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. + * @param {WebGLShaderProgram} program The shader program from which to take attribute locations. + * @returns {Object} A map of attribute names to attribute locations. + */ + getAttributeLocations: function(gl, program) { + return { + aPosition: gl.getAttribLocation(program, 'aPosition'), + }; + }, + + /** + * Return a map of uniform names to WebGLUniformLocation objects. + * + * Intended to be overridden by subclasses. + * + * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. + * @param {WebGLShaderProgram} program The shader program from which to take uniform locations. + * @returns {Object} A map of uniform names to uniform locations. + */ + getUniformLocations: function (/* gl, program */) { + // in case i do not need any special uniform i need to return an empty object + return { }; + }, + + /** + * Send attribute data from this filter to its shader program on the GPU. + * + * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. + * @param {Object} attributeLocations A map of shader attribute names to their locations. + */ + sendAttributeData: function(gl, attributeLocations, aPositionData) { + var attributeLocation = attributeLocations.aPosition; + var buffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.enableVertexAttribArray(attributeLocation); + gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0); + gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW); + }, + + _setupFrameBuffer: function(options) { + var gl = options.context, width, height; + if (options.passes > 1) { + width = options.destinationWidth; + height = options.destinationHeight; + if (options.sourceWidth !== width || options.sourceHeight !== height) { + gl.deleteTexture(options.targetTexture); + options.targetTexture = options.filterBackend.createTexture(gl, width, height); + } + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, + options.targetTexture, 0); + } + else { + // draw last filter on canvas and not to framebuffer. + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.finish(); + } + }, + + _swapTextures: function(options) { + options.passes--; + options.pass++; + var temp = options.targetTexture; + options.targetTexture = options.sourceTexture; + options.sourceTexture = temp; + }, + + /** + * Generic isNeutral implementation for one parameter based filters. + * Used only in image applyFilters to discard filters that will not have an effect + * on the image + * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter ) + * @param {Object} options + **/ + isNeutralState: function(/* options */) { + var main = this.mainParameter, + _class = fabric.Image.filters[this.type].prototype; + if (main) { + if (Array.isArray(_class[main])) { + for (var i = _class[main].length; i--;) { + if (this[main][i] !== _class[main][i]) { + return false; + } + } + return true; + } + else { + return _class[main] === this[main]; + } + } + else { + return false; + } + }, + + /** + * Apply this filter to the input image data provided. + * + * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. + * + * @param {Object} options + * @param {Number} options.passes The number of filters remaining to be executed + * @param {Boolean} options.webgl Whether to use webgl to render the filter. + * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. + * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + applyTo: function(options) { + if (options.webgl) { + this._setupFrameBuffer(options); + this.applyToWebGL(options); + this._swapTextures(options); + } + else { + this.applyTo2d(options); + } + }, + + /** + * Retrieves the cached shader. + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + retrieveShader: function(options) { + if (!options.programCache.hasOwnProperty(this.type)) { + options.programCache[this.type] = this.createProgram(options.context); + } + return options.programCache[this.type]; + }, + + /** + * Apply this filter using webgl. + * + * @param {Object} options + * @param {Number} options.passes The number of filters remaining to be executed + * @param {Boolean} options.webgl Whether to use webgl to render the filter. + * @param {WebGLTexture} options.originalTexture The texture of the original input image. + * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. + * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + applyToWebGL: function(options) { + var gl = options.context; + var shader = this.retrieveShader(options); + if (options.pass === 0 && options.originalTexture) { + gl.bindTexture(gl.TEXTURE_2D, options.originalTexture); + } + else { + gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture); + } + gl.useProgram(shader.program); + this.sendAttributeData(gl, shader.attributeLocations, options.aPosition); + + gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth); + gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight); + + this.sendUniformData(gl, shader.uniformLocations); + gl.viewport(0, 0, options.destinationWidth, options.destinationHeight); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + }, + + bindAdditionalTexture: function(gl, texture, textureUnit) { + gl.activeTexture(textureUnit); + gl.bindTexture(gl.TEXTURE_2D, texture); + // reset active texture to 0 as usual + gl.activeTexture(gl.TEXTURE0); + }, + + unbindAdditionalTexture: function(gl, textureUnit) { + gl.activeTexture(textureUnit); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.activeTexture(gl.TEXTURE0); + }, + + getMainParameter: function() { + return this[this.mainParameter]; + }, + + setMainParameter: function(value) { + this[this.mainParameter] = value; + }, + + /** + * Send uniform data from this filter to its shader program on the GPU. + * + * Intended to be overridden by subclasses. + * + * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. + * @param {Object} uniformLocations A map of shader uniform names to their locations. + */ + sendUniformData: function(/* gl, uniformLocations */) { + // Intentionally left blank. Override me in subclasses. + }, + + /** + * If needed by a 2d filter, this functions can create an helper canvas to be used + * remember that options.targetCanvas is available for use till end of chain. + */ + createHelpLayer: function(options) { + if (!options.helpLayer) { + var helpLayer = document.createElement('canvas'); + helpLayer.width = options.sourceWidth; + helpLayer.height = options.sourceHeight; + options.helpLayer = helpLayer; + } + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + var object = { type: this.type }, mainP = this.mainParameter; + if (mainP) { + object[mainP] = this[mainP]; + } + return object; + }, + + /** + * Returns a JSON representation of an instance + * @return {Object} JSON + */ + toJSON: function() { + // delegate, not alias + return this.toObject(); + } +}); + +fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { + var filter = new fabric.Image.filters[object.type](object); + callback && callback(filter); + return filter; +}; +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Color Matrix filter class + * @class fabric.Image.filters.ColorMatrix + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php} + * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl} + * @example Kodachrome filter + * var filter = new fabric.Image.filters.ColorMatrix({ + * matrix: [ + 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502, + -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203, + -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946, + 0, 0, 0, 1, 0 + ] + * }); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'ColorMatrix', + + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'varying vec2 vTexCoord;\n' + + 'uniform mat4 uColorMatrix;\n' + + 'uniform vec4 uConstants;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'color *= uColorMatrix;\n' + + 'color += uConstants;\n' + + 'gl_FragColor = color;\n' + + '}', + + /** + * Colormatrix for pixels. + * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning + * outside the -1, 1 range. + * 0.0039215686 is the part of 1 that get translated to 1 in 2d + * @param {Array} matrix array of 20 numbers. + * @default + */ + matrix: [ + 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0 + ], + + mainParameter: 'matrix', + + /** + * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario + * to save some calculation + * @type Boolean + * @default true + */ + colorsOnly: true, + + /** + * Constructor + * @param {Object} [options] Options object + */ + initialize: function(options) { + this.callSuper('initialize', options); + // create a new array instead mutating the prototype with push + this.matrix = this.matrix.slice(0); + }, + + /** + * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8Array to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + data = imageData.data, + iLen = data.length, + m = this.matrix, + r, g, b, a, i, colorsOnly = this.colorsOnly; + + for (i = 0; i < iLen; i += 4) { + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + if (colorsOnly) { + data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255; + data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255; + data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255; + } + else { + a = data[i + 3]; + data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255; + data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255; + data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255; + data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255; + } + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'), + uConstants: gl.getUniformLocation(program, 'uConstants'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + var m = this.matrix, + matrix = [ + m[0], m[1], m[2], m[3], + m[5], m[6], m[7], m[8], + m[10], m[11], m[12], m[13], + m[15], m[16], m[17], m[18] + ], + constants = [m[4], m[9], m[14], m[19]]; + gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix); + gl.uniform4fv(uniformLocations.uConstants, constants); + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] function to invoke after filter creation + * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix + */ + fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject; +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Brightness filter class + * @class fabric.Image.filters.Brightness + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Brightness({ + * brightness: 0.05 + * }); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Brightness', + + /** + * Fragment source for the brightness program + */ + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uBrightness;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'color.rgb += uBrightness;\n' + + 'gl_FragColor = color;\n' + + '}', + + /** + * Brightness value, from -1 to 1. + * translated to -255 to 255 for 2d + * 0.0039215686 is the part of 1 that get translated to 1 in 2d + * @param {Number} brightness + * @default + */ + brightness: 0, + + /** + * Describe the property that is the filter parameter + * @param {String} m + * @default + */ + mainParameter: 'brightness', + + /** + * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + if (this.brightness === 0) { + return; + } + var imageData = options.imageData, + data = imageData.data, i, len = data.length, + brightness = Math.round(this.brightness * 255); + for (i = 0; i < len; i += 4) { + data[i] = data[i] + brightness; + data[i + 1] = data[i + 1] + brightness; + data[i + 2] = data[i + 2] + brightness; + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uBrightness: gl.getUniformLocation(program, 'uBrightness'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform1f(uniformLocations.uBrightness, this.brightness); + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness + */ + fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Adapted from html5rocks article + * @class fabric.Image.filters.Convolute + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example Sharpen filter + * var filter = new fabric.Image.filters.Convolute({ + * matrix: [ 0, -1, 0, + * -1, 5, -1, + * 0, -1, 0 ] + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + * @example Blur filter + * var filter = new fabric.Image.filters.Convolute({ + * matrix: [ 1/9, 1/9, 1/9, + * 1/9, 1/9, 1/9, + * 1/9, 1/9, 1/9 ] + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + * @example Emboss filter + * var filter = new fabric.Image.filters.Convolute({ + * matrix: [ 1, 1, 1, + * 1, 0.7, -1, + * -1, -1, -1 ] + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + * @example Emboss filter with opaqueness + * var filter = new fabric.Image.filters.Convolute({ + * opaque: true, + * matrix: [ 1, 1, 1, + * 1, 0.7, -1, + * -1, -1, -1 ] + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + */ + filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Convolute', + + /* + * Opaque value (true/false) + */ + opaque: false, + + /* + * matrix for the filter, max 9x9 + */ + matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0], + + /** + * Fragment source for the brightness program + */ + fragmentSource: { + Convolute_3_1: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[9];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 0);\n' + + 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n' + + 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n' + + '}\n' + + '}\n' + + 'gl_FragColor = color;\n' + + '}', + Convolute_3_0: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[9];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 1);\n' + + 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n' + + 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n' + + '}\n' + + '}\n' + + 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + + 'gl_FragColor = color;\n' + + 'gl_FragColor.a = alpha;\n' + + '}', + Convolute_5_1: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[25];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 0);\n' + + 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + + 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n' + + '}\n' + + '}\n' + + 'gl_FragColor = color;\n' + + '}', + Convolute_5_0: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[25];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 1);\n' + + 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + + 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n' + + '}\n' + + '}\n' + + 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + + 'gl_FragColor = color;\n' + + 'gl_FragColor.a = alpha;\n' + + '}', + Convolute_7_1: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[49];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 0);\n' + + 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + + 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n' + + '}\n' + + '}\n' + + 'gl_FragColor = color;\n' + + '}', + Convolute_7_0: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[49];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 1);\n' + + 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + + 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n' + + '}\n' + + '}\n' + + 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + + 'gl_FragColor = color;\n' + + 'gl_FragColor.a = alpha;\n' + + '}', + Convolute_9_1: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[81];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 0);\n' + + 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + + 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n' + + '}\n' + + '}\n' + + 'gl_FragColor = color;\n' + + '}', + Convolute_9_0: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uMatrix[81];\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = vec4(0, 0, 0, 1);\n' + + 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + + 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + + 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + + 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n' + + '}\n' + + '}\n' + + 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + + 'gl_FragColor = color;\n' + + 'gl_FragColor.a = alpha;\n' + + '}', + }, + + /** + * Constructor + * @memberOf fabric.Image.filters.Convolute.prototype + * @param {Object} [options] Options object + * @param {Boolean} [options.opaque=false] Opaque value (true/false) + * @param {Array} [options.matrix] Filter matrix + */ + + + /** + * Retrieves the cached shader. + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + retrieveShader: function(options) { + var size = Math.sqrt(this.matrix.length); + var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0); + var shaderSource = this.fragmentSource[cacheKey]; + if (!options.programCache.hasOwnProperty(cacheKey)) { + options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); + } + return options.programCache[cacheKey]; + }, + + /** + * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + data = imageData.data, + weights = this.matrix, + side = Math.round(Math.sqrt(weights.length)), + halfSide = Math.floor(side / 2), + sw = imageData.width, + sh = imageData.height, + output = options.ctx.createImageData(sw, sh), + dst = output.data, + // go through the destination image pixels + alphaFac = this.opaque ? 1 : 0, + r, g, b, a, dstOff, + scx, scy, srcOff, wt, + x, y, cx, cy; + + for (y = 0; y < sh; y++) { + for (x = 0; x < sw; x++) { + dstOff = (y * sw + x) * 4; + // calculate the weighed sum of the source image pixels that + // fall under the convolution matrix + r = 0; g = 0; b = 0; a = 0; + + for (cy = 0; cy < side; cy++) { + for (cx = 0; cx < side; cx++) { + scy = y + cy - halfSide; + scx = x + cx - halfSide; + + // eslint-disable-next-line max-depth + if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) { + continue; + } + + srcOff = (scy * sw + scx) * 4; + wt = weights[cy * side + cx]; + + r += data[srcOff] * wt; + g += data[srcOff + 1] * wt; + b += data[srcOff + 2] * wt; + // eslint-disable-next-line max-depth + if (!alphaFac) { + a += data[srcOff + 3] * wt; + } + } + } + dst[dstOff] = r; + dst[dstOff + 1] = g; + dst[dstOff + 2] = b; + if (!alphaFac) { + dst[dstOff + 3] = a; + } + else { + dst[dstOff + 3] = data[dstOff + 3]; + } + } + } + options.imageData = output; + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uMatrix: gl.getUniformLocation(program, 'uMatrix'), + uOpaque: gl.getUniformLocation(program, 'uOpaque'), + uHalfSize: gl.getUniformLocation(program, 'uHalfSize'), + uSize: gl.getUniformLocation(program, 'uSize'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform1fv(uniformLocations.uMatrix, this.matrix); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return extend(this.callSuper('toObject'), { + opaque: this.opaque, + matrix: this.matrix + }); + } + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute + */ + fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Grayscale image filter class + * @class fabric.Image.filters.Grayscale + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Grayscale(); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Grayscale', + + fragmentSource: { + average: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'float average = (color.r + color.b + color.g) / 3.0;\n' + + 'gl_FragColor = vec4(average, average, average, color.a);\n' + + '}', + lightness: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform int uMode;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 col = texture2D(uTexture, vTexCoord);\n' + + 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n' + + 'gl_FragColor = vec4(average, average, average, col.a);\n' + + '}', + luminosity: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform int uMode;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 col = texture2D(uTexture, vTexCoord);\n' + + 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n' + + 'gl_FragColor = vec4(average, average, average, col.a);\n' + + '}', + }, + + + /** + * Grayscale mode, between 'average', 'lightness', 'luminosity' + * @param {String} type + * @default + */ + mode: 'average', + + mainParameter: 'mode', + + /** + * Apply the Grayscale operation to a Uint8Array representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8Array to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + data = imageData.data, i, + len = data.length, value, + mode = this.mode; + for (i = 0; i < len; i += 4) { + if (mode === 'average') { + value = (data[i] + data[i + 1] + data[i + 2]) / 3; + } + else if (mode === 'lightness') { + value = (Math.min(data[i], data[i + 1], data[i + 2]) + + Math.max(data[i], data[i + 1], data[i + 2])) / 2; + } + else if (mode === 'luminosity') { + value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2]; + } + data[i] = value; + data[i + 1] = value; + data[i + 2] = value; + } + }, + + /** + * Retrieves the cached shader. + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + retrieveShader: function(options) { + var cacheKey = this.type + '_' + this.mode; + if (!options.programCache.hasOwnProperty(cacheKey)) { + var shaderSource = this.fragmentSource[this.mode]; + options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); + } + return options.programCache[cacheKey]; + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uMode: gl.getUniformLocation(program, 'uMode'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + // default average mode. + var mode = 1; + gl.uniform1i(uniformLocations.uMode, mode); + }, + + /** + * Grayscale filter isNeutralState implementation + * The filter is never neutral + * on the image + **/ + isNeutralState: function() { + return false; + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale + */ + fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Invert filter class + * @class fabric.Image.filters.Invert + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Invert(); + * object.filters.push(filter); + * object.applyFilters(canvas.renderAll.bind(canvas)); + */ + filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Invert', + + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform int uInvert;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'if (uInvert == 1) {\n' + + 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n' + + '} else {\n' + + 'gl_FragColor = color;\n' + + '}\n' + + '}', + + /** + * Filter invert. if false, does nothing + * @param {Boolean} invert + * @default + */ + invert: true, + + mainParameter: 'invert', + + /** + * Apply the Invert operation to a Uint8Array representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8Array to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + data = imageData.data, i, + len = data.length; + for (i = 0; i < len; i += 4) { + data[i] = 255 - data[i]; + data[i + 1] = 255 - data[i + 1]; + data[i + 2] = 255 - data[i + 2]; + } + }, + + /** + * Invert filter isNeutralState implementation + * Used only in image applyFilters to discard filters that will not have an effect + * on the image + * @param {Object} options + **/ + isNeutralState: function() { + return !this.invert; + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uInvert: gl.getUniformLocation(program, 'uInvert'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform1i(uniformLocations.uInvert, this.invert); + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert + */ + fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject; + + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Noise filter class + * @class fabric.Image.filters.Noise + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Noise({ + * noise: 700 + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + */ + filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Noise', + + /** + * Fragment source for the noise program + */ + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uStepH;\n' + + 'uniform float uNoise;\n' + + 'uniform float uSeed;\n' + + 'varying vec2 vTexCoord;\n' + + 'float rand(vec2 co, float seed, float vScale) {\n' + + 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n' + + '}\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n' + + 'gl_FragColor = color;\n' + + '}', + + /** + * Describe the property that is the filter parameter + * @param {String} m + * @default + */ + mainParameter: 'noise', + + /** + * Noise value, from + * @param {Number} noise + * @default + */ + noise: 0, + + /** + * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + if (this.noise === 0) { + return; + } + var imageData = options.imageData, + data = imageData.data, i, len = data.length, + noise = this.noise, rand; + + for (i = 0, len = data.length; i < len; i += 4) { + + rand = (0.5 - Math.random()) * noise; + + data[i] += rand; + data[i + 1] += rand; + data[i + 2] += rand; + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uNoise: gl.getUniformLocation(program, 'uNoise'), + uSeed: gl.getUniformLocation(program, 'uSeed'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform1f(uniformLocations.uNoise, this.noise / 255); + gl.uniform1f(uniformLocations.uSeed, Math.random()); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return extend(this.callSuper('toObject'), { + noise: this.noise + }); + } + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {Function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise + */ + fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Pixelate filter class + * @class fabric.Image.filters.Pixelate + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Pixelate({ + * blocksize: 8 + * }); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Pixelate', + + blocksize: 4, + + mainParameter: 'blocksize', + + /** + * Fragment source for the Pixelate program + */ + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uBlocksize;\n' + + 'uniform float uStepW;\n' + + 'uniform float uStepH;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'float blockW = uBlocksize * uStepW;\n' + + 'float blockH = uBlocksize * uStepW;\n' + + 'int posX = int(vTexCoord.x / blockW);\n' + + 'int posY = int(vTexCoord.y / blockH);\n' + + 'float fposX = float(posX);\n' + + 'float fposY = float(posY);\n' + + 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n' + + 'vec4 color = texture2D(uTexture, squareCoords);\n' + + 'gl_FragColor = color;\n' + + '}', + + /** + * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + data = imageData.data, + iLen = imageData.height, + jLen = imageData.width, + index, i, j, r, g, b, a, + _i, _j, _iLen, _jLen; + + for (i = 0; i < iLen; i += this.blocksize) { + for (j = 0; j < jLen; j += this.blocksize) { + + index = (i * 4) * jLen + (j * 4); + + r = data[index]; + g = data[index + 1]; + b = data[index + 2]; + a = data[index + 3]; + + _iLen = Math.min(i + this.blocksize, iLen); + _jLen = Math.min(j + this.blocksize, jLen); + for (_i = i; _i < _iLen; _i++) { + for (_j = j; _j < _jLen; _j++) { + index = (_i * 4) * jLen + (_j * 4); + data[index] = r; + data[index + 1] = g; + data[index + 2] = b; + data[index + 3] = a; + } + } + } + } + }, + + /** + * Indicate when the filter is not gonna apply changes to the image + **/ + isNeutralState: function() { + return this.blocksize === 1; + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uBlocksize: gl.getUniformLocation(program, 'uBlocksize'), + uStepW: gl.getUniformLocation(program, 'uStepW'), + uStepH: gl.getUniformLocation(program, 'uStepH'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform1f(uniformLocations.uBlocksize, this.blocksize); + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {Function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate + */ + fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Remove white filter class + * @class fabric.Image.filters.RemoveColor + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.RemoveColor({ + * threshold: 0.2, + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + */ + filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'RemoveColor', + + /** + * Color to remove, in any format understood by fabric.Color. + * @param {String} type + * @default + */ + color: '#FFFFFF', + + /** + * Fragment source for the brightness program + */ + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform vec4 uLow;\n' + + 'uniform vec4 uHigh;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + + 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n' + + 'gl_FragColor.a = 0.0;\n' + + '}\n' + + '}', + + /** + * distance to actual color, as value up or down from each r,g,b + * between 0 and 1 + **/ + distance: 0.02, + + /** + * For color to remove inside distance, use alpha channel for a smoother deletion + * NOT IMPLEMENTED YET + **/ + useAlpha: false, + + /** + * Constructor + * @memberOf fabric.Image.filters.RemoveWhite.prototype + * @param {Object} [options] Options object + * @param {Number} [options.color=#RRGGBB] Threshold value + * @param {Number} [options.distance=10] Distance value + */ + + /** + * Applies filter to canvas element + * @param {Object} canvasEl Canvas element to apply filter to + */ + applyTo2d: function(options) { + var imageData = options.imageData, + data = imageData.data, i, + distance = this.distance * 255, + r, g, b, + source = new fabric.Color(this.color).getSource(), + lowC = [ + source[0] - distance, + source[1] - distance, + source[2] - distance, + ], + highC = [ + source[0] + distance, + source[1] + distance, + source[2] + distance, + ]; + + + for (i = 0; i < data.length; i += 4) { + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + + if (r > lowC[0] && + g > lowC[1] && + b > lowC[2] && + r < highC[0] && + g < highC[1] && + b < highC[2]) { + data[i + 3] = 0; + } + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uLow: gl.getUniformLocation(program, 'uLow'), + uHigh: gl.getUniformLocation(program, 'uHigh'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + var source = new fabric.Color(this.color).getSource(), + distance = parseFloat(this.distance), + lowC = [ + 0 + source[0] / 255 - distance, + 0 + source[1] / 255 - distance, + 0 + source[2] / 255 - distance, + 1 + ], + highC = [ + source[0] / 255 + distance, + source[1] / 255 + distance, + source[2] / 255 + distance, + 1 + ]; + gl.uniform4fv(uniformLocations.uLow, lowC); + gl.uniform4fv(uniformLocations.uHigh, highC); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return extend(this.callSuper('toObject'), { + color: this.color, + distance: this.distance + }); + } + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {Function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite + */ + fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + var matrices = { + Brownie: [ + 0.59970,0.34553,-0.27082,0,0.186, + -0.03770,0.86095,0.15059,0,-0.1449, + 0.24113,-0.07441,0.44972,0,-0.02965, + 0,0,0,1,0 + ], + Vintage: [ + 0.62793,0.32021,-0.03965,0,0.03784, + 0.02578,0.64411,0.03259,0,0.02926, + 0.04660,-0.08512,0.52416,0,0.02023, + 0,0,0,1,0 + ], + Kodachrome: [ + 1.12855,-0.39673,-0.03992,0,0.24991, + -0.16404,1.08352,-0.05498,0,0.09698, + -0.16786,-0.56034,1.60148,0,0.13972, + 0,0,0,1,0 + ], + Technicolor: [ + 1.91252,-0.85453,-0.09155,0,0.04624, + -0.30878,1.76589,-0.10601,0,-0.27589, + -0.23110,-0.75018,1.84759,0,0.12137, + 0,0,0,1,0 + ], + Polaroid: [ + 1.438,-0.062,-0.062,0,0, + -0.122,1.378,-0.122,0,0, + -0.016,-0.016,1.483,0,0, + 0,0,0,1,0 + ], + Sepia: [ + 0.393, 0.769, 0.189, 0, 0, + 0.349, 0.686, 0.168, 0, 0, + 0.272, 0.534, 0.131, 0, 0, + 0, 0, 0, 1, 0 + ], + BlackWhite: [ + 1.5, 1.5, 1.5, 0, -1, + 1.5, 1.5, 1.5, 0, -1, + 1.5, 1.5, 1.5, 0, -1, + 0, 0, 0, 1, 0, + ] + }; + + for (var key in matrices) { + filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: key, + + /** + * Colormatrix for the effect + * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning + * outside the -1, 1 range. + * @param {Array} matrix array of 20 numbers. + * @default + */ + matrix: matrices[key], + + /** + * Lock the matrix export for this kind of static, parameter less filters. + */ + mainParameter: false, + /** + * Lock the colormatrix on the color part, skipping alpha + */ + colorsOnly: true, + + }); + fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject; + } +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + 'use strict'; + + var fabric = global.fabric, + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Color Blend filter class + * @class fabric.Image.filter.BlendColor + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @example + * var filter = new fabric.Image.filters.BlendColor({ + * color: '#000', + * mode: 'multiply' + * }); + * + * var filter = new fabric.Image.filters.BlendImage({ + * image: fabricImageObject, + * mode: 'multiply', + * alpha: 0.5 + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + */ + + filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ { + type: 'BlendColor', + + /** + * Color to make the blend operation with. default to a reddish color since black or white + * gives always strong result. + * @type String + * @default + **/ + color: '#F95C63', + + /** + * Blend mode for the filter: one of multiply, add, diff, screen, subtract, + * darken, lighten, overlay, exclusion, tint. + * @type String + * @default + **/ + mode: 'multiply', + + /** + * alpha value. represent the strength of the blend color operation. + * @type Number + * @default + **/ + alpha: 1, + + /** + * Fragment source for the Multiply program + */ + fragmentSource: { + multiply: 'gl_FragColor.rgb *= uColor.rgb;\n', + screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n', + add: 'gl_FragColor.rgb += uColor.rgb;\n', + diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n', + subtract: 'gl_FragColor.rgb -= uColor.rgb;\n', + lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n', + darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n', + exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n', + overlay: 'if (uColor.r < 0.5) {\n' + + 'gl_FragColor.r *= 2.0 * uColor.r;\n' + + '} else {\n' + + 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n' + + '}\n' + + 'if (uColor.g < 0.5) {\n' + + 'gl_FragColor.g *= 2.0 * uColor.g;\n' + + '} else {\n' + + 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n' + + '}\n' + + 'if (uColor.b < 0.5) {\n' + + 'gl_FragColor.b *= 2.0 * uColor.b;\n' + + '} else {\n' + + 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n' + + '}\n', + tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\n' + + 'gl_FragColor.rgb += uColor.rgb;\n', + }, + + /** + * build the fragment source for the filters, joining the common part with + * the specific one. + * @param {String} mode the mode of the filter, a key of this.fragmentSource + * @return {String} the source to be compiled + * @private + */ + buildSource: function(mode) { + return 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform vec4 uColor;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'gl_FragColor = color;\n' + + 'if (color.a > 0.0) {\n' + + this.fragmentSource[mode] + + '}\n' + + '}'; + }, + + /** + * Retrieves the cached shader. + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + retrieveShader: function(options) { + var cacheKey = this.type + '_' + this.mode, shaderSource; + if (!options.programCache.hasOwnProperty(cacheKey)) { + shaderSource = this.buildSource(this.mode); + options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); + } + return options.programCache[cacheKey]; + }, + + /** + * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + data = imageData.data, iLen = data.length, + tr, tg, tb, + r, g, b, + source, alpha1 = 1 - this.alpha; + + source = new fabric.Color(this.color).getSource(); + tr = source[0] * this.alpha; + tg = source[1] * this.alpha; + tb = source[2] * this.alpha; + + for (var i = 0; i < iLen; i += 4) { + + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + + switch (this.mode) { + case 'multiply': + data[i] = r * tr / 255; + data[i + 1] = g * tg / 255; + data[i + 2] = b * tb / 255; + break; + case 'screen': + data[i] = 255 - (255 - r) * (255 - tr) / 255; + data[i + 1] = 255 - (255 - g) * (255 - tg) / 255; + data[i + 2] = 255 - (255 - b) * (255 - tb) / 255; + break; + case 'add': + data[i] = r + tr; + data[i + 1] = g + tg; + data[i + 2] = b + tb; + break; + case 'diff': + case 'difference': + data[i] = Math.abs(r - tr); + data[i + 1] = Math.abs(g - tg); + data[i + 2] = Math.abs(b - tb); + break; + case 'subtract': + data[i] = r - tr; + data[i + 1] = g - tg; + data[i + 2] = b - tb; + break; + case 'darken': + data[i] = Math.min(r, tr); + data[i + 1] = Math.min(g, tg); + data[i + 2] = Math.min(b, tb); + break; + case 'lighten': + data[i] = Math.max(r, tr); + data[i + 1] = Math.max(g, tg); + data[i + 2] = Math.max(b, tb); + break; + case 'overlay': + data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255); + data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255); + data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255); + break; + case 'exclusion': + data[i] = tr + r - ((2 * tr * r) / 255); + data[i + 1] = tg + g - ((2 * tg * g) / 255); + data[i + 2] = tb + b - ((2 * tb * b) / 255); + break; + case 'tint': + data[i] = tr + r * alpha1; + data[i + 1] = tg + g * alpha1; + data[i + 2] = tb + b * alpha1; + } + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uColor: gl.getUniformLocation(program, 'uColor'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + var source = new fabric.Color(this.color).getSource(); + source[0] = this.alpha * source[0] / 255; + source[1] = this.alpha * source[1] / 255; + source[2] = this.alpha * source[2] / 255; + source[3] = this.alpha; + gl.uniform4fv(uniformLocations.uColor, source); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return { + type: this.type, + color: this.color, + mode: this.mode, + alpha: this.alpha + }; + } + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor + */ + fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + 'use strict'; + + var fabric = global.fabric, + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Image Blend filter class + * @class fabric.Image.filter.BlendImage + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @example + * var filter = new fabric.Image.filters.BlendColor({ + * color: '#000', + * mode: 'multiply' + * }); + * + * var filter = new fabric.Image.filters.BlendImage({ + * image: fabricImageObject, + * mode: 'multiply', + * alpha: 0.5 + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + */ + + filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ { + type: 'BlendImage', + + /** + * Color to make the blend operation with. default to a reddish color since black or white + * gives always strong result. + **/ + image: null, + + /** + * Blend mode for the filter (one of "multiply", "mask") + * @type String + * @default + **/ + mode: 'multiply', + + /** + * alpha value. represent the strength of the blend image operation. + * not implemented. + **/ + alpha: 1, + + vertexSource: 'attribute vec2 aPosition;\n' + + 'varying vec2 vTexCoord;\n' + + 'varying vec2 vTexCoord2;\n' + + 'uniform mat3 uTransformMatrix;\n' + + 'void main() {\n' + + 'vTexCoord = aPosition;\n' + + 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n' + + 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + + '}', + + /** + * Fragment source for the Multiply program + */ + fragmentSource: { + multiply: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform sampler2D uImage;\n' + + 'uniform vec4 uColor;\n' + + 'varying vec2 vTexCoord;\n' + + 'varying vec2 vTexCoord2;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + + 'color.rgba *= color2.rgba;\n' + + 'gl_FragColor = color;\n' + + '}', + mask: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform sampler2D uImage;\n' + + 'uniform vec4 uColor;\n' + + 'varying vec2 vTexCoord;\n' + + 'varying vec2 vTexCoord2;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + + 'color.a = color2.a;\n' + + 'gl_FragColor = color;\n' + + '}', + }, + + /** + * Retrieves the cached shader. + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + retrieveShader: function(options) { + var cacheKey = this.type + '_' + this.mode; + var shaderSource = this.fragmentSource[this.mode]; + if (!options.programCache.hasOwnProperty(cacheKey)) { + options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); + } + return options.programCache[cacheKey]; + }, + + applyToWebGL: function(options) { + // load texture to blend. + var gl = options.context, + texture = this.createTexture(options.filterBackend, this.image); + this.bindAdditionalTexture(gl, texture, gl.TEXTURE1); + this.callSuper('applyToWebGL', options); + this.unbindAdditionalTexture(gl, gl.TEXTURE1); + }, + + createTexture: function(backend, image) { + return backend.getCachedTexture(image.cacheKey, image._element); + }, + + /** + * Calculate a transformMatrix to adapt the image to blend over + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + calculateMatrix: function() { + var image = this.image, + width = image._element.width, + height = image._element.height; + return [ + 1 / image.scaleX, 0, 0, + 0, 1 / image.scaleY, 0, + -image.left / width, -image.top / height, 1 + ]; + }, + + /** + * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + resources = options.filterBackend.resources, + data = imageData.data, iLen = data.length, + width = imageData.width, + height = imageData.height, + tr, tg, tb, ta, + r, g, b, a, + canvas1, context, image = this.image, blendData; + + if (!resources.blendImage) { + resources.blendImage = fabric.util.createCanvasElement(); + } + canvas1 = resources.blendImage; + context = canvas1.getContext('2d'); + if (canvas1.width !== width || canvas1.height !== height) { + canvas1.width = width; + canvas1.height = height; + } + else { + context.clearRect(0, 0, width, height); + } + context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top); + context.drawImage(image._element, 0, 0, width, height); + blendData = context.getImageData(0, 0, width, height).data; + for (var i = 0; i < iLen; i += 4) { + + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + a = data[i + 3]; + + tr = blendData[i]; + tg = blendData[i + 1]; + tb = blendData[i + 2]; + ta = blendData[i + 3]; + + switch (this.mode) { + case 'multiply': + data[i] = r * tr / 255; + data[i + 1] = g * tg / 255; + data[i + 2] = b * tb / 255; + data[i + 3] = a * ta / 255; + break; + case 'mask': + data[i + 3] = ta; + break; + } + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'), + uImage: gl.getUniformLocation(program, 'uImage'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + var matrix = this.calculateMatrix(); + gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1. + gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return { + type: this.type, + image: this.image && this.image.toObject(), + mode: this.mode, + alpha: this.alpha + }; + } + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} callback to be invoked after filter creation + * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage + */ + fabric.Image.filters.BlendImage.fromObject = function(object, callback) { + fabric.Image.fromObject(object.image, function(image) { + var options = fabric.util.object.clone(object); + options.image = image; + callback(new fabric.Image.filters.BlendImage(options)); + }); + }; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor, + sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin, + ceil = Math.ceil, + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Resize image filter class + * @class fabric.Image.filters.Resize + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Resize(); + * object.filters.push(filter); + * object.applyFilters(canvas.renderAll.bind(canvas)); + */ + filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Resize', + + /** + * Resize type + * for webgl resizeType is just lanczos, for canvas2d can be: + * bilinear, hermite, sliceHack, lanczos. + * @param {String} resizeType + * @default + */ + resizeType: 'hermite', + + /** + * Scale factor for resizing, x axis + * @param {Number} scaleX + * @default + */ + scaleX: 1, + + /** + * Scale factor for resizing, y axis + * @param {Number} scaleY + * @default + */ + scaleY: 1, + + /** + * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos + * @param {Number} lanczosLobes + * @default + */ + lanczosLobes: 3, + + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uDelta: gl.getUniformLocation(program, 'uDelta'), + uTaps: gl.getUniformLocation(program, 'uTaps'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]); + gl.uniform1fv(uniformLocations.uTaps, this.taps); + }, + + /** + * Retrieves the cached shader. + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + retrieveShader: function(options) { + var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow; + if (!options.programCache.hasOwnProperty(cacheKey)) { + var fragmentShader = this.generateShader(filterWindow); + options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader); + } + return options.programCache[cacheKey]; + }, + + getFilterWindow: function() { + var scale = this.tempScale; + return Math.ceil(this.lanczosLobes / scale); + }, + + getTaps: function() { + var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale, + filterWindow = this.getFilterWindow(), taps = new Array(filterWindow); + for (var i = 1; i <= filterWindow; i++) { + taps[i - 1] = lobeFunction(i * scale); + } + return taps; + }, + + /** + * Generate vertex and shader sources from the necessary steps numbers + * @param {Number} filterWindow + */ + generateShader: function(filterWindow) { + var offsets = new Array(filterWindow), + fragmentShader = this.fragmentSourceTOP, filterWindow; + + for (var i = 1; i <= filterWindow; i++) { + offsets[i - 1] = i + '.0 * uDelta'; + } + + fragmentShader += 'uniform float uTaps[' + filterWindow + '];\n'; + fragmentShader += 'void main() {\n'; + fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\n'; + fragmentShader += ' float sum = 1.0;\n'; + + offsets.forEach(function(offset, i) { + fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\n'; + fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\n'; + fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\n'; + }); + fragmentShader += ' gl_FragColor = color / sum;\n'; + fragmentShader += '}'; + return fragmentShader; + }, + + fragmentSourceTOP: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform vec2 uDelta;\n' + + 'varying vec2 vTexCoord;\n', + + /** + * Apply the resize filter to the image + * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. + * + * @param {Object} options + * @param {Number} options.passes The number of filters remaining to be executed + * @param {Boolean} options.webgl Whether to use webgl to render the filter. + * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. + * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + applyTo: function(options) { + if (options.webgl) { + options.passes++; + this.width = options.sourceWidth; + this.horizontal = true; + this.dW = Math.round(this.width * this.scaleX); + this.dH = options.sourceHeight; + this.tempScale = this.dW / this.width; + this.taps = this.getTaps(); + options.destinationWidth = this.dW; + this._setupFrameBuffer(options); + this.applyToWebGL(options); + this._swapTextures(options); + options.sourceWidth = options.destinationWidth; + + this.height = options.sourceHeight; + this.horizontal = false; + this.dH = Math.round(this.height * this.scaleY); + this.tempScale = this.dH / this.height; + this.taps = this.getTaps(); + options.destinationHeight = this.dH; + this._setupFrameBuffer(options); + this.applyToWebGL(options); + this._swapTextures(options); + options.sourceHeight = options.destinationHeight; + } + else { + this.applyTo2d(options); + } + }, + + isNeutralState: function() { + return this.scaleX === 1 && this.scaleY === 1; + }, + + lanczosCreate: function(lobes) { + return function(x) { + if (x >= lobes || x <= -lobes) { + return 0.0; + } + if (x < 1.19209290E-07 && x > -1.19209290E-07) { + return 1.0; + } + x *= Math.PI; + var xx = x / lobes; + return (sin(x) / x) * sin(xx) / xx; + }; + }, + + /** + * Applies filter to canvas element + * @memberOf fabric.Image.filters.Resize.prototype + * @param {Object} canvasEl Canvas element to apply filter to + * @param {Number} scaleX + * @param {Number} scaleY + */ + applyTo2d: function(options) { + var imageData = options.imageData, + scaleX = this.scaleX, + scaleY = this.scaleY; + + this.rcpScaleX = 1 / scaleX; + this.rcpScaleY = 1 / scaleY; + + var oW = imageData.width, oH = imageData.height, + dW = round(oW * scaleX), dH = round(oH * scaleY), + newData; + + if (this.resizeType === 'sliceHack') { + newData = this.sliceByTwo(options, oW, oH, dW, dH); + } + else if (this.resizeType === 'hermite') { + newData = this.hermiteFastResize(options, oW, oH, dW, dH); + } + else if (this.resizeType === 'bilinear') { + newData = this.bilinearFiltering(options, oW, oH, dW, dH); + } + else if (this.resizeType === 'lanczos') { + newData = this.lanczosResize(options, oW, oH, dW, dH); + } + options.imageData = newData; + }, + + /** + * Filter sliceByTwo + * @param {Object} canvasEl Canvas element to apply filter to + * @param {Number} oW Original Width + * @param {Number} oH Original Height + * @param {Number} dW Destination Width + * @param {Number} dH Destination Height + * @returns {ImageData} + */ + sliceByTwo: function(options, oW, oH, dW, dH) { + var imageData = options.imageData, + mult = 0.5, doneW = false, doneH = false, stepW = oW * mult, + stepH = oH * mult, resources = fabric.filterBackend.resources, + tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0; + if (!resources.sliceByTwo) { + resources.sliceByTwo = document.createElement('canvas'); + } + tmpCanvas = resources.sliceByTwo; + if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) { + tmpCanvas.width = oW * 1.5; + tmpCanvas.height = oH; + } + ctx = tmpCanvas.getContext('2d'); + ctx.clearRect(0, 0, oW * 1.5, oH); + ctx.putImageData(imageData, 0, 0); + + dW = floor(dW); + dH = floor(dH); + + while (!doneW || !doneH) { + oW = stepW; + oH = stepH; + if (dW < floor(stepW * mult)) { + stepW = floor(stepW * mult); + } + else { + stepW = dW; + doneW = true; + } + if (dH < floor(stepH * mult)) { + stepH = floor(stepH * mult); + } + else { + stepH = dH; + doneH = true; + } + ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH); + sX = dX; + sY = dY; + dY += stepH; + } + return ctx.getImageData(sX, sY, dW, dH); + }, + + /** + * Filter lanczosResize + * @param {Object} canvasEl Canvas element to apply filter to + * @param {Number} oW Original Width + * @param {Number} oH Original Height + * @param {Number} dW Destination Width + * @param {Number} dH Destination Height + * @returns {ImageData} + */ + lanczosResize: function(options, oW, oH, dW, dH) { + + function process(u) { + var v, i, weight, idx, a, red, green, + blue, alpha, fX, fY; + center.x = (u + 0.5) * ratioX; + icenter.x = floor(center.x); + for (v = 0; v < dH; v++) { + center.y = (v + 0.5) * ratioY; + icenter.y = floor(center.y); + a = 0; red = 0; green = 0; blue = 0; alpha = 0; + for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) { + if (i < 0 || i >= oW) { + continue; + } + fX = floor(1000 * abs(i - center.x)); + if (!cacheLanc[fX]) { + cacheLanc[fX] = { }; + } + for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) { + if (j < 0 || j >= oH) { + continue; + } + fY = floor(1000 * abs(j - center.y)); + if (!cacheLanc[fX][fY]) { + cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000); + } + weight = cacheLanc[fX][fY]; + if (weight > 0) { + idx = (j * oW + i) * 4; + a += weight; + red += weight * srcData[idx]; + green += weight * srcData[idx + 1]; + blue += weight * srcData[idx + 2]; + alpha += weight * srcData[idx + 3]; + } + } + } + idx = (v * dW + u) * 4; + destData[idx] = red / a; + destData[idx + 1] = green / a; + destData[idx + 2] = blue / a; + destData[idx + 3] = alpha / a; + } + + if (++u < dW) { + return process(u); + } + else { + return destImg; + } + } + + var srcData = options.imageData.data, + destImg = options.ctx.createImageData(dW, dH), + destData = destImg.data, + lanczos = this.lanczosCreate(this.lanczosLobes), + ratioX = this.rcpScaleX, ratioY = this.rcpScaleY, + rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY, + range2X = ceil(ratioX * this.lanczosLobes / 2), + range2Y = ceil(ratioY * this.lanczosLobes / 2), + cacheLanc = { }, center = { }, icenter = { }; + + return process(0); + }, + + /** + * bilinearFiltering + * @param {Object} canvasEl Canvas element to apply filter to + * @param {Number} oW Original Width + * @param {Number} oH Original Height + * @param {Number} dW Destination Width + * @param {Number} dH Destination Height + * @returns {ImageData} + */ + bilinearFiltering: function(options, oW, oH, dW, dH) { + var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl, + color, offset = 0, origPix, ratioX = this.rcpScaleX, + ratioY = this.rcpScaleY, + w4 = 4 * (oW - 1), img = options.imageData, + pixels = img.data, destImage = options.ctx.createImageData(dW, dH), + destPixels = destImage.data; + for (i = 0; i < dH; i++) { + for (j = 0; j < dW; j++) { + x = floor(ratioX * j); + y = floor(ratioY * i); + xDiff = ratioX * j - x; + yDiff = ratioY * i - y; + origPix = 4 * (y * oW + x); + + for (chnl = 0; chnl < 4; chnl++) { + a = pixels[origPix + chnl]; + b = pixels[origPix + 4 + chnl]; + c = pixels[origPix + w4 + chnl]; + d = pixels[origPix + w4 + 4 + chnl]; + color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) + + c * yDiff * (1 - xDiff) + d * xDiff * yDiff; + destPixels[offset++] = color; + } + } + } + return destImage; + }, + + /** + * hermiteFastResize + * @param {Object} canvasEl Canvas element to apply filter to + * @param {Number} oW Original Width + * @param {Number} oH Original Height + * @param {Number} dW Destination Width + * @param {Number} dH Destination Height + * @returns {ImageData} + */ + hermiteFastResize: function(options, oW, oH, dW, dH) { + var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY, + ratioWHalf = ceil(ratioW / 2), + ratioHHalf = ceil(ratioH / 2), + img = options.imageData, data = img.data, + img2 = options.ctx.createImageData(dW, dH), data2 = img2.data; + for (var j = 0; j < dH; j++) { + for (var i = 0; i < dW; i++) { + var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0, + gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH; + for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) { + var dy = abs(centerY - (yy + 0.5)) / ratioHHalf, + centerX = (i + 0.5) * ratioW, w0 = dy * dy; + for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) { + var dx = abs(centerX - (xx + 0.5)) / ratioWHalf, + w = sqrt(w0 + dx * dx); + /* eslint-disable max-depth */ + if (w > 1 && w < -1) { + continue; + } + //hermite filter + weight = 2 * w * w * w - 3 * w * w + 1; + if (weight > 0) { + dx = 4 * (xx + yy * oW); + //alpha + gxA += weight * data[dx + 3]; + weightsAlpha += weight; + //colors + if (data[dx + 3] < 255) { + weight = weight * data[dx + 3] / 250; + } + gxR += weight * data[dx]; + gxG += weight * data[dx + 1]; + gxB += weight * data[dx + 2]; + weights += weight; + } + /* eslint-enable max-depth */ + } + } + data2[x2] = gxR / weights; + data2[x2 + 1] = gxG / weights; + data2[x2 + 2] = gxB / weights; + data2[x2 + 3] = gxA / weightsAlpha; + } + } + return img2; + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return { + type: this.type, + scaleX: this.scaleX, + scaleY: this.scaleY, + resizeType: this.resizeType, + lanczosLobes: this.lanczosLobes + }; + } + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {Function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize + */ + fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Contrast filter class + * @class fabric.Image.filters.Contrast + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Contrast({ + * contrast: 0.25 + * }); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Contrast', + + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uContrast;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n' + + 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n' + + 'gl_FragColor = color;\n' + + '}', + + /** + * contrast value, range from -1 to 1. + * @param {Number} contrast + * @default 0 + */ + contrast: 0, + + mainParameter: 'contrast', + + /** + * Constructor + * @memberOf fabric.Image.filters.Contrast.prototype + * @param {Object} [options] Options object + * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1) + */ + + /** + * Apply the Contrast operation to a Uint8Array representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8Array to be filtered. + */ + applyTo2d: function(options) { + if (this.contrast === 0) { + return; + } + var imageData = options.imageData, i, len, + data = imageData.data, len = data.length, + contrast = Math.floor(this.contrast * 255), + contrastF = 259 * (contrast + 255) / (255 * (259 - contrast)); + + for (i = 0; i < len; i += 4) { + data[i] = contrastF * (data[i] - 128) + 128; + data[i + 1] = contrastF * (data[i + 1] - 128) + 128; + data[i + 2] = contrastF * (data[i + 2] - 128) + 128; + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uContrast: gl.getUniformLocation(program, 'uContrast'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform1f(uniformLocations.uContrast, this.contrast); + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast + */ + fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Saturate filter class + * @class fabric.Image.filters.Saturation + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Saturation({ + * saturation: 1 + * }); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Saturation', + + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform float uSaturation;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'float rgMax = max(color.r, color.g);\n' + + 'float rgbMax = max(rgMax, color.b);\n' + + 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n' + + 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n' + + 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n' + + 'gl_FragColor = color;\n' + + '}', + + /** + * Saturation value, from -1 to 1. + * Increases/decreases the color saturation. + * A value of 0 has no effect. + * + * @param {Number} saturation + * @default + */ + saturation: 0, + + mainParameter: 'saturation', + + /** + * Constructor + * @memberOf fabric.Image.filters.Saturate.prototype + * @param {Object} [options] Options object + * @param {Number} [options.saturate=0] Value to saturate the image (-1...1) + */ + + /** + * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + if (this.saturation === 0) { + return; + } + var imageData = options.imageData, + data = imageData.data, len = data.length, + adjust = -this.saturation, i, max; + + for (i = 0; i < len; i += 4) { + max = Math.max(data[i], data[i + 1], data[i + 2]); + data[i] += max !== data[i] ? (max - data[i]) * adjust : 0; + data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0; + data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0; + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uSaturation: gl.getUniformLocation(program, 'uSaturation'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform1f(uniformLocations.uSaturation, -this.saturation); + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {Function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate + */ + fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Blur filter class + * @class fabric.Image.filters.Blur + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Blur({ + * blur: 0.5 + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + */ + filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ { + + type: 'Blur', + + /* +'gl_FragColor = vec4(0.0);', +'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;', +'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;', +'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;', +'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;', +'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;', +'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;', +'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;', +'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;', +'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;', +'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;', +'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;', +'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;', +'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;', +'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;', +'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;', +*/ + + /* eslint-disable max-len */ + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform vec2 uDelta;\n' + + 'varying vec2 vTexCoord;\n' + + 'const float nSamples = 15.0;\n' + + 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n' + + 'float random(vec3 scale) {\n' + + /* use the fragment position for a different seed per-pixel */ + 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n' + + '}\n' + + 'void main() {\n' + + 'vec4 color = vec4(0.0);\n' + + 'float total = 0.0;\n' + + 'float offset = random(v3offset);\n' + + 'for (float t = -nSamples; t <= nSamples; t++) {\n' + + 'float percent = (t + offset - 0.5) / nSamples;\n' + + 'float weight = 1.0 - abs(percent);\n' + + 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\n' + + 'total += weight;\n' + + '}\n' + + 'gl_FragColor = color / total;\n' + + '}', + /* eslint-enable max-len */ + + /** + * blur value, in percentage of image dimensions. + * specific to keep the image blur constant at different resolutions + * range between 0 and 1. + * @type Number + * @default + */ + blur: 0, + + mainParameter: 'blur', + + applyTo: function(options) { + if (options.webgl) { + // this aspectRatio is used to give the same blur to vertical and horizontal + this.aspectRatio = options.sourceWidth / options.sourceHeight; + options.passes++; + this._setupFrameBuffer(options); + this.horizontal = true; + this.applyToWebGL(options); + this._swapTextures(options); + this._setupFrameBuffer(options); + this.horizontal = false; + this.applyToWebGL(options); + this._swapTextures(options); + } + else { + this.applyTo2d(options); + } + }, + + applyTo2d: function(options) { + // paint canvasEl with current image data. + //options.ctx.putImageData(options.imageData, 0, 0); + options.imageData = this.simpleBlur(options); + }, + + simpleBlur: function(options) { + var resources = options.filterBackend.resources, canvas1, canvas2, + width = options.imageData.width, + height = options.imageData.height; + + if (!resources.blurLayer1) { + resources.blurLayer1 = fabric.util.createCanvasElement(); + resources.blurLayer2 = fabric.util.createCanvasElement(); + } + canvas1 = resources.blurLayer1; + canvas2 = resources.blurLayer2; + if (canvas1.width !== width || canvas1.height !== height) { + canvas2.width = canvas1.width = width; + canvas2.height = canvas1.height = height; + } + var ctx1 = canvas1.getContext('2d'), + ctx2 = canvas2.getContext('2d'), + nSamples = 15, + random, percent, j, i, + blur = this.blur * 0.06 * 0.5; + + // load first canvas + ctx1.putImageData(options.imageData, 0, 0); + ctx2.clearRect(0, 0, width, height); + + for (i = -nSamples; i <= nSamples; i++) { + random = (Math.random() - 0.5) / 4; + percent = i / nSamples; + j = blur * percent * width + random; + ctx2.globalAlpha = 1 - Math.abs(percent); + ctx2.drawImage(canvas1, j, random); + ctx1.drawImage(canvas2, 0, 0); + ctx2.globalAlpha = 1; + ctx2.clearRect(0, 0, canvas2.width, canvas2.height); + } + for (i = -nSamples; i <= nSamples; i++) { + random = (Math.random() - 0.5) / 4; + percent = i / nSamples; + j = blur * percent * height + random; + ctx2.globalAlpha = 1 - Math.abs(percent); + ctx2.drawImage(canvas1, random, j); + ctx1.drawImage(canvas2, 0, 0); + ctx2.globalAlpha = 1; + ctx2.clearRect(0, 0, canvas2.width, canvas2.height); + } + options.ctx.drawImage(canvas1, 0, 0); + var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height); + ctx1.globalAlpha = 1; + ctx1.clearRect(0, 0, canvas1.width, canvas1.height); + return newImageData; + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + delta: gl.getUniformLocation(program, 'uDelta'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + var delta = this.chooseRightDelta(); + gl.uniform2fv(uniformLocations.delta, delta); + }, + + /** + * choose right value of image percentage to blur with + * @returns {Array} a numeric array with delta values + */ + chooseRightDelta: function() { + var blurScale = 1, delta = [0, 0], blur; + if (this.horizontal) { + if (this.aspectRatio > 1) { + // image is wide, i want to shrink radius horizontal + blurScale = 1 / this.aspectRatio; + } + } + else { + if (this.aspectRatio < 1) { + // image is tall, i want to shrink radius vertical + blurScale = this.aspectRatio; + } + } + blur = blurScale * this.blur * 0.12; + if (this.horizontal) { + delta[0] = blur; + } + else { + delta[1] = blur; + } + return delta; + }, + }); + + /** + * Deserialize a JSON definition of a BlurFilter into a concrete instance. + */ + filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Gamma filter class + * @class fabric.Image.filters.Gamma + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.Gamma({ + * gamma: [1, 0.5, 2.1] + * }); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'Gamma', + + fragmentSource: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform vec3 uGamma;\n' + + 'varying vec2 vTexCoord;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'vec3 correction = (1.0 / uGamma);\n' + + 'color.r = pow(color.r, correction.r);\n' + + 'color.g = pow(color.g, correction.g);\n' + + 'color.b = pow(color.b, correction.b);\n' + + 'gl_FragColor = color;\n' + + 'gl_FragColor.rgb *= color.a;\n' + + '}', + + /** + * Gamma array value, from 0.01 to 2.2. + * @param {Array} gamma + * @default + */ + gamma: [1, 1, 1], + + /** + * Describe the property that is the filter parameter + * @param {String} m + * @default + */ + mainParameter: 'gamma', + + /** + * Constructor + * @param {Object} [options] Options object + */ + initialize: function(options) { + this.gamma = [1, 1, 1]; + filters.BaseFilter.prototype.initialize.call(this, options); + }, + + /** + * Apply the Gamma operation to a Uint8Array representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8Array to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, data = imageData.data, + gamma = this.gamma, len = data.length, + rInv = 1 / gamma[0], gInv = 1 / gamma[1], + bInv = 1 / gamma[2], i; + + if (!this.rVals) { + // eslint-disable-next-line + this.rVals = new Uint8Array(256); + // eslint-disable-next-line + this.gVals = new Uint8Array(256); + // eslint-disable-next-line + this.bVals = new Uint8Array(256); + } + + // This is an optimization - pre-compute a look-up table for each color channel + // instead of performing these pow calls for each pixel in the image. + for (i = 0, len = 256; i < len; i++) { + this.rVals[i] = Math.pow(i / 255, rInv) * 255; + this.gVals[i] = Math.pow(i / 255, gInv) * 255; + this.bVals[i] = Math.pow(i / 255, bInv) * 255; + } + for (i = 0, len = data.length; i < len; i += 4) { + data[i] = this.rVals[data[i]]; + data[i + 1] = this.gVals[data[i + 1]]; + data[i + 2] = this.bVals[data[i + 2]]; + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uGamma: gl.getUniformLocation(program, 'uGamma'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + gl.uniform3fv(uniformLocations.uGamma, this.gamma); + }, + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma + */ + fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * A container class that knows how to apply a sequence of filters to an input image. + */ + filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ { + + type: 'Composed', + + /** + * A non sparse array of filters to apply + */ + subFilters: [], + + /** + * Constructor + * @param {Object} [options] Options object + */ + initialize: function(options) { + this.callSuper('initialize', options); + // create a new array instead mutating the prototype with push + this.subFilters = this.subFilters.slice(0); + }, + + /** + * Apply this container's filters to the input image provided. + * + * @param {Object} options + * @param {Number} options.passes The number of filters remaining to be applied. + */ + applyTo: function(options) { + options.passes += this.subFilters.length - 1; + this.subFilters.forEach(function(filter) { + filter.applyTo(options); + }); + }, + + /** + * Serialize this filter into JSON. + * + * @returns {Object} A JSON representation of this filter. + */ + toObject: function() { + return fabric.util.object.extend(this.callSuper('toObject'), { + subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }), + }); + }, + + isNeutralState: function() { + return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); }); + } + }); + + /** + * Deserialize a JSON definition of a ComposedFilter into a concrete instance. + */ + fabric.Image.filters.Composed.fromObject = function(object, callback) { + var filters = object.subFilters || [], + subFilters = filters.map(function(filter) { + return new fabric.Image.filters[filter.type](filter); + }), + instance = new fabric.Image.filters.Composed({ subFilters: subFilters }); + callback && callback(instance); + return instance; + }; +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * HueRotation filter class + * @class fabric.Image.filters.HueRotation + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition + * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} + * @example + * var filter = new fabric.Image.filters.HueRotation({ + * rotation: -0.5 + * }); + * object.filters.push(filter); + * object.applyFilters(); + */ + filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ { + + /** + * Filter type + * @param {String} type + * @default + */ + type: 'HueRotation', + + /** + * HueRotation value, from -1 to 1. + * the unit is radians + * @param {Number} myParameter + * @default + */ + rotation: 0, + + /** + * Describe the property that is the filter parameter + * @param {String} m + * @default + */ + mainParameter: 'rotation', + + calculateMatrix: function() { + var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad), + aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos; + this.matrix = [ + 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0 + ]; + this.matrix[0] = cos + OneMinusCos / 3; + this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin; + this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin; + this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin; + this.matrix[6] = cos + aThird * OneMinusCos; + this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin; + this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin; + this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin; + this.matrix[12] = cos + aThird * OneMinusCos; + }, + + /** + * HueRotation isNeutralState implementation + * Used only in image applyFilters to discard filters that will not have an effect + * on the image + * @param {Object} options + **/ + isNeutralState: function(options) { + this.calculateMatrix(); + return filters.BaseFilter.prototype.isNeutralState.call(this, options); + }, + + /** + * Apply this filter to the input image data provided. + * + * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. + * + * @param {Object} options + * @param {Number} options.passes The number of filters remaining to be executed + * @param {Boolean} options.webgl Whether to use webgl to render the filter. + * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. + * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + applyTo: function(options) { + this.calculateMatrix(); + filters.BaseFilter.prototype.applyTo.call(this, options); + }, + + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} [callback] to be invoked after filter creation + * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation + */ + fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject; + +})(typeof exports !== 'undefined' ? exports : this); +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }), + clone = fabric.util.object.clone; + + if (fabric.Text) { + fabric.warn('fabric.Text is already defined'); + return; + } + + var additionalProps = + ('fontFamily fontWeight fontSize text underline overline linethrough' + + ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' + + ' direction path pathStartOffset pathSide pathAlign').split(' '); + + /** + * Text class + * @class fabric.Text + * @extends fabric.Object + * @return {fabric.Text} thisArg + * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text} + * @see {@link fabric.Text#initialize} for constructor definition + */ + fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ { + + /** + * Properties which when set cause object to change dimensions + * @type Array + * @private + */ + _dimensionAffectingProps: [ + 'fontSize', + 'fontWeight', + 'fontFamily', + 'fontStyle', + 'lineHeight', + 'text', + 'charSpacing', + 'textAlign', + 'styles', + 'path', + 'pathStartOffset', + 'pathSide', + 'pathAlign' + ], + + /** + * @private + */ + _reNewline: /\r?\n/, + + /** + * Use this regular expression to filter for whitespaces that is not a new line. + * Mostly used when text is 'justify' aligned. + * @private + */ + _reSpacesAndTabs: /[ \t\r]/g, + + /** + * Use this regular expression to filter for whitespace that is not a new line. + * Mostly used when text is 'justify' aligned. + * @private + */ + _reSpaceAndTab: /[ \t\r]/, + + /** + * Use this regular expression to filter consecutive groups of non spaces. + * Mostly used when text is 'justify' aligned. + * @private + */ + _reWords: /\S+/g, + + /** + * Type of an object + * @type String + * @default + */ + type: 'text', + + /** + * Font size (in pixels) + * @type Number + * @default + */ + fontSize: 40, + + /** + * Font weight (e.g. bold, normal, 400, 600, 800) + * @type {(Number|String)} + * @default + */ + fontWeight: 'normal', + + /** + * Font family + * @type String + * @default + */ + fontFamily: 'Times New Roman', + + /** + * Text decoration underline. + * @type Boolean + * @default + */ + underline: false, + + /** + * Text decoration overline. + * @type Boolean + * @default + */ + overline: false, + + /** + * Text decoration linethrough. + * @type Boolean + * @default + */ + linethrough: false, + + /** + * Text alignment. Possible values: "left", "center", "right", "justify", + * "justify-left", "justify-center" or "justify-right". + * @type String + * @default + */ + textAlign: 'left', + + /** + * Font style . Possible values: "", "normal", "italic" or "oblique". + * @type String + * @default + */ + fontStyle: 'normal', + + /** + * Line height + * @type Number + * @default + */ + lineHeight: 1.16, + + /** + * Superscript schema object (minimum overlap) + * @type {Object} + * @default + */ + superscript: { + size: 0.60, // fontSize factor + baseline: -0.35 // baseline-shift factor (upwards) + }, + + /** + * Subscript schema object (minimum overlap) + * @type {Object} + * @default + */ + subscript: { + size: 0.60, // fontSize factor + baseline: 0.11 // baseline-shift factor (downwards) + }, + + /** + * Background color of text lines + * @type String + * @default + */ + textBackgroundColor: '', + + /** + * List of properties to consider when checking if + * state of an object is changed ({@link fabric.Object#hasStateChanged}) + * as well as for history (undo/redo) purposes + * @type Array + */ + stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps), + + /** + * List of properties to consider when checking if cache needs refresh + * @type Array + */ + cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps), + + /** + * When defined, an object is rendered via stroke and this property specifies its color. + * Backwards incompatibility note: This property was named "strokeStyle" until v1.1.6 + * @type String + * @default + */ + stroke: null, + + /** + * Shadow object representing shadow of this shape. + * Backwards incompatibility note: This property was named "textShadow" (String) until v1.2.11 + * @type fabric.Shadow + * @default + */ + shadow: null, + + /** + * fabric.Path that the text should follow. + * since 4.6.0 the path will be drawn automatically. + * if you want to make the path visible, give it a stroke and strokeWidth or fill value + * if you want it to be hidden, assign visible = false to the path. + * This feature is in BETA, and SVG import/export is not yet supported. + * @type fabric.Path + * @example + * var textPath = new fabric.Text('Text on a path', { + * top: 150, + * left: 150, + * textAlign: 'center', + * charSpacing: -50, + * path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', { + * strokeWidth: 1, + * visible: false + * }), + * pathSide: 'left', + * pathStartOffset: 0 + * }); + * @default + */ + path: null, + + /** + * Offset amount for text path starting position + * Only used when text has a path + * @type Number + * @default + */ + pathStartOffset: 0, + + /** + * Which side of the path the text should be drawn on. + * Only used when text has a path + * @type {String} 'left|right' + * @default + */ + pathSide: 'left', + + /** + * How text is aligned to the path. This property determines + * the perpendicular position of each character relative to the path. + * (one of "baseline", "center", "ascender", "descender") + * This feature is in BETA, and its behavior may change + * @type String + * @default + */ + pathAlign: 'baseline', + + /** + * @private + */ + _fontSizeFraction: 0.222, + + /** + * @private + */ + offsets: { + underline: 0.10, + linethrough: -0.315, + overline: -0.88 + }, + + /** + * Text Line proportion to font Size (in pixels) + * @type Number + * @default + */ + _fontSizeMult: 1.13, + + /** + * additional space between characters + * expressed in thousands of em unit + * @type Number + * @default + */ + charSpacing: 0, + + /** + * Object containing character styles - top-level properties -> line numbers, + * 2nd-level properties - character numbers + * @type Object + * @default + */ + styles: null, + + /** + * Reference to a context to measure text char or couple of chars + * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas + * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every + * text object created. + * @type {CanvasRenderingContext2D} + * @default + */ + _measuringContext: null, + + /** + * Baseline shift, styles only, keep at 0 for the main text object + * @type {Number} + * @default + */ + deltaY: 0, + + /** + * WARNING: EXPERIMENTAL. NOT SUPPORTED YET + * determine the direction of the text. + * This has to be set manually together with textAlign and originX for proper + * experience. + * some interesting link for the future + * https://www.w3.org/International/questions/qa-bidi-unicode-controls + * @since 4.5.0 + * @type {String} 'ltr|rtl' + * @default + */ + direction: 'ltr', + + /** + * Array of properties that define a style unit (of 'styles'). + * @type {Array} + * @default + */ + _styleProperties: [ + 'stroke', + 'strokeWidth', + 'fill', + 'fontFamily', + 'fontSize', + 'fontWeight', + 'fontStyle', + 'underline', + 'overline', + 'linethrough', + 'deltaY', + 'textBackgroundColor', + ], + + /** + * contains characters bounding boxes + */ + __charBounds: [], + + /** + * use this size when measuring text. To avoid IE11 rounding errors + * @type {Number} + * @default + * @readonly + * @private + */ + CACHE_FONT_SIZE: 400, + + /** + * contains the min text width to avoid getting 0 + * @type {Number} + * @default + */ + MIN_TEXT_WIDTH: 2, + + /** + * Constructor + * @param {String} text Text string + * @param {Object} [options] Options object + * @return {fabric.Text} thisArg + */ + initialize: function(text, options) { + this.styles = options ? (options.styles || { }) : { }; + this.text = text; + this.__skipDimension = true; + this.callSuper('initialize', options); + if (this.path) { + this.setPathInfo(); + } + this.__skipDimension = false; + this.initDimensions(); + this.setCoords(); + this.setupState({ propertySet: '_dimensionAffectingProps' }); + }, + + /** + * If text has a path, it will add the extra information needed + * for path and text calculations + * @return {fabric.Text} thisArg + */ + setPathInfo: function() { + var path = this.path; + if (path) { + path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path); + } + }, + + /** + * Return a context for measurement of text string. + * if created it gets stored for reuse + * this is for internal use, please do not use it + * @private + * @param {String} text Text string + * @param {Object} [options] Options object + * @return {fabric.Text} thisArg + */ + getMeasuringContext: function() { + // if we did not return we have to measure something. + if (!fabric._measuringContext) { + fabric._measuringContext = this.canvas && this.canvas.contextCache || + fabric.util.createCanvasElement().getContext('2d'); + } + return fabric._measuringContext; + }, + + /** + * @private + * Divides text into lines of text and lines of graphemes. + */ + _splitText: function() { + var newLines = this._splitTextIntoLines(this.text); + this.textLines = newLines.lines; + this._textLines = newLines.graphemeLines; + this._unwrappedTextLines = newLines._unwrappedLines; + this._text = newLines.graphemeText; + return newLines; + }, + + /** + * Initialize or update text dimensions. + * Updates this.width and this.height with the proper values. + * Does not return dimensions. + */ + initDimensions: function() { + if (this.__skipDimension) { + return; + } + this._splitText(); + this._clearCache(); + if (this.path) { + this.width = this.path.width; + this.height = this.path.height; + } + else { + this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH; + this.height = this.calcTextHeight(); + } + if (this.textAlign.indexOf('justify') !== -1) { + // once text is measured we need to make space fatter to make justified text. + this.enlargeSpaces(); + } + this.saveState({ propertySet: '_dimensionAffectingProps' }); + }, + + /** + * Enlarge space boxes and shift the others + */ + enlargeSpaces: function() { + var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces; + for (var i = 0, len = this._textLines.length; i < len; i++) { + if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) { + continue; + } + accumulatedSpace = 0; + line = this._textLines[i]; + currentLineWidth = this.getLineWidth(i); + if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) { + numberOfSpaces = spaces.length; + diffSpace = (this.width - currentLineWidth) / numberOfSpaces; + for (var j = 0, jlen = line.length; j <= jlen; j++) { + charBound = this.__charBounds[i][j]; + if (this._reSpaceAndTab.test(line[j])) { + charBound.width += diffSpace; + charBound.kernedWidth += diffSpace; + charBound.left += accumulatedSpace; + accumulatedSpace += diffSpace; + } + else { + charBound.left += accumulatedSpace; + } + } + } + } + }, + + /** + * Detect if the text line is ended with an hard break + * text and itext do not have wrapping, return false + * @return {Boolean} + */ + isEndOfWrapping: function(lineIndex) { + return lineIndex === this._textLines.length - 1; + }, + + /** + * Detect if a line has a linebreak and so we need to account for it when moving + * and counting style. + * It return always for text and Itext. + * @return Number + */ + missingNewlineOffset: function() { + return 1; + }, + + /** + * Returns string representation of an instance + * @return {String} String representation of text object + */ + toString: function() { + return '#'; + }, + + /** + * Return the dimension and the zoom level needed to create a cache canvas + * big enough to host the object to be cached. + * @private + * @param {Object} dim.x width of object to be cached + * @param {Object} dim.y height of object to be cached + * @return {Object}.width width of canvas + * @return {Object}.height height of canvas + * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache + * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache + */ + _getCacheCanvasDimensions: function() { + var dims = this.callSuper('_getCacheCanvasDimensions'); + var fontSize = this.fontSize; + dims.width += fontSize * dims.zoomX; + dims.height += fontSize * dims.zoomY; + return dims; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + var path = this.path; + path && !path.isNotVisible() && path._render(ctx); + this._setTextStyles(ctx); + this._renderTextLinesBackground(ctx); + this._renderTextDecoration(ctx, 'underline'); + this._renderText(ctx); + this._renderTextDecoration(ctx, 'overline'); + this._renderTextDecoration(ctx, 'linethrough'); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderText: function(ctx) { + if (this.paintFirst === 'stroke') { + this._renderTextStroke(ctx); + this._renderTextFill(ctx); + } + else { + this._renderTextFill(ctx); + this._renderTextStroke(ctx); + } + }, + + /** + * Set the font parameter of the context with the object properties or with charStyle + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Object} [charStyle] object with font style properties + * @param {String} [charStyle.fontFamily] Font Family + * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix ) + * @param {String} [charStyle.fontWeight] Font weight + * @param {String} [charStyle.fontStyle] Font style (italic|normal) + */ + _setTextStyles: function(ctx, charStyle, forMeasuring) { + ctx.textBaseline = 'alphabetical'; + if (this.path) { + switch (this.pathAlign) { + case 'center': + ctx.textBaseline = 'middle'; + break; + case 'ascender': + ctx.textBaseline = 'top'; + break; + case 'descender': + ctx.textBaseline = 'bottom'; + break; + } + } + ctx.font = this._getFontDeclaration(charStyle, forMeasuring); + }, + + /** + * calculate and return the text Width measuring each line. + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @return {Number} Maximum width of fabric.Text object + */ + calcTextWidth: function() { + var maxWidth = this.getLineWidth(0); + + for (var i = 1, len = this._textLines.length; i < len; i++) { + var currentLineWidth = this.getLineWidth(i); + if (currentLineWidth > maxWidth) { + maxWidth = currentLineWidth; + } + } + return maxWidth; + }, + + /** + * @private + * @param {String} method Method name ("fillText" or "strokeText") + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {String} line Text to render + * @param {Number} left Left position of text + * @param {Number} top Top position of text + * @param {Number} lineIndex Index of a line in a text + */ + _renderTextLine: function(method, ctx, line, left, top, lineIndex) { + this._renderChars(method, ctx, line, left, top, lineIndex); + }, + + /** + * Renders the text background for lines, taking care of style + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderTextLinesBackground: function(ctx) { + if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) { + return; + } + var heightOfLine, + lineLeftOffset, originalFill = ctx.fillStyle, + line, lastColor, + leftOffset = this._getLeftOffset(), + lineTopOffset = this._getTopOffset(), + boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path, + drawStart; + + for (var i = 0, len = this._textLines.length; i < len; i++) { + heightOfLine = this.getHeightOfLine(i); + if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) { + lineTopOffset += heightOfLine; + continue; + } + line = this._textLines[i]; + lineLeftOffset = this._getLineLeftOffset(i); + boxWidth = 0; + boxStart = 0; + lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); + for (var j = 0, jlen = line.length; j < jlen; j++) { + charBox = this.__charBounds[i][j]; + currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); + if (path) { + ctx.save(); + ctx.translate(charBox.renderLeft, charBox.renderTop); + ctx.rotate(charBox.angle); + ctx.fillStyle = currentColor; + currentColor && ctx.fillRect( + -charBox.width / 2, + -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction), + charBox.width, + heightOfLine / this.lineHeight + ); + ctx.restore(); + } + else if (currentColor !== lastColor) { + drawStart = leftOffset + lineLeftOffset + boxStart; + if (this.direction === 'rtl') { + drawStart = this.width - drawStart - boxWidth; + } + ctx.fillStyle = lastColor; + lastColor && ctx.fillRect( + drawStart, + lineTopOffset, + boxWidth, + heightOfLine / this.lineHeight + ); + boxStart = charBox.left; + boxWidth = charBox.width; + lastColor = currentColor; + } + else { + boxWidth += charBox.kernedWidth; + } + } + if (currentColor && !path) { + drawStart = leftOffset + lineLeftOffset + boxStart; + if (this.direction === 'rtl') { + drawStart = this.width - drawStart - boxWidth; + } + ctx.fillStyle = currentColor; + ctx.fillRect( + drawStart, + lineTopOffset, + boxWidth, + heightOfLine / this.lineHeight + ); + } + lineTopOffset += heightOfLine; + } + ctx.fillStyle = originalFill; + // if there is text background color no + // other shadows should be casted + this._removeShadow(ctx); + }, + + /** + * @private + * @param {Object} decl style declaration for cache + * @param {String} decl.fontFamily fontFamily + * @param {String} decl.fontStyle fontStyle + * @param {String} decl.fontWeight fontWeight + * @return {Object} reference to cache + */ + getFontCache: function(decl) { + var fontFamily = decl.fontFamily.toLowerCase(); + if (!fabric.charWidthsCache[fontFamily]) { + fabric.charWidthsCache[fontFamily] = { }; + } + var cache = fabric.charWidthsCache[fontFamily], + cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase(); + if (!cache[cacheProp]) { + cache[cacheProp] = { }; + } + return cache[cacheProp]; + }, + + /** + * measure and return the width of a single character. + * possibly overridden to accommodate different measure logic or + * to hook some external lib for character measurement + * @private + * @param {String} _char, char to be measured + * @param {Object} charStyle style of char to be measured + * @param {String} [previousChar] previous char + * @param {Object} [prevCharStyle] style of previous char + */ + _measureChar: function(_char, charStyle, previousChar, prevCharStyle) { + // first i try to return from cache + var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle), + previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char, + stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth, + fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth; + + if (previousChar && fontCache[previousChar] !== undefined) { + previousWidth = fontCache[previousChar]; + } + if (fontCache[_char] !== undefined) { + kernedWidth = width = fontCache[_char]; + } + if (stylesAreEqual && fontCache[couple] !== undefined) { + coupleWidth = fontCache[couple]; + kernedWidth = coupleWidth - previousWidth; + } + if (width === undefined || previousWidth === undefined || coupleWidth === undefined) { + var ctx = this.getMeasuringContext(); + // send a TRUE to specify measuring font size CACHE_FONT_SIZE + this._setTextStyles(ctx, charStyle, true); + } + if (width === undefined) { + kernedWidth = width = ctx.measureText(_char).width; + fontCache[_char] = width; + } + if (previousWidth === undefined && stylesAreEqual && previousChar) { + previousWidth = ctx.measureText(previousChar).width; + fontCache[previousChar] = previousWidth; + } + if (stylesAreEqual && coupleWidth === undefined) { + // we can measure the kerning couple and subtract the width of the previous character + coupleWidth = ctx.measureText(couple).width; + fontCache[couple] = coupleWidth; + kernedWidth = coupleWidth - previousWidth; + } + return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier }; + }, + + /** + * Computes height of character at given position + * @param {Number} line the line index number + * @param {Number} _char the character index number + * @return {Number} fontSize of the character + */ + getHeightOfChar: function(line, _char) { + return this.getValueOfPropertyAt(line, _char, 'fontSize'); + }, + + /** + * measure a text line measuring all characters. + * @param {Number} lineIndex line number + * @return {Number} Line width + */ + measureLine: function(lineIndex) { + var lineInfo = this._measureLine(lineIndex); + if (this.charSpacing !== 0) { + lineInfo.width -= this._getWidthOfCharSpacing(); + } + if (lineInfo.width < 0) { + lineInfo.width = 0; + } + return lineInfo; + }, + + /** + * measure every grapheme of a line, populating __charBounds + * @param {Number} lineIndex + * @return {Object} object.width total width of characters + * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs + */ + _measureLine: function(lineIndex) { + var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme, + graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length), + positionInPath = 0, startingPoint, totalPathLength, path = this.path, + reverse = this.pathSide === 'right'; + + this.__charBounds[lineIndex] = lineBounds; + for (i = 0; i < line.length; i++) { + grapheme = line[i]; + graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme); + lineBounds[i] = graphemeInfo; + width += graphemeInfo.kernedWidth; + prevGrapheme = grapheme; + } + // this latest bound box represent the last character of the line + // to simplify cursor handling in interactive mode. + lineBounds[i] = { + left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0, + width: 0, + kernedWidth: 0, + height: this.fontSize + }; + if (path) { + totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length; + startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo); + startingPoint.x += path.pathOffset.x; + startingPoint.y += path.pathOffset.y; + switch (this.textAlign) { + case 'left': + positionInPath = reverse ? (totalPathLength - width) : 0; + break; + case 'center': + positionInPath = (totalPathLength - width) / 2; + break; + case 'right': + positionInPath = reverse ? 0 : (totalPathLength - width); + break; + //todo - add support for justify + } + positionInPath += this.pathStartOffset * (reverse ? -1 : 1); + for (i = reverse ? line.length - 1 : 0; + reverse ? i >= 0 : i < line.length; + reverse ? i-- : i++) { + graphemeInfo = lineBounds[i]; + if (positionInPath > totalPathLength) { + positionInPath %= totalPathLength; + } + else if (positionInPath < 0) { + positionInPath += totalPathLength; + } + // it would probably much faster to send all the grapheme position for a line + // and calculate path position/angle at once. + this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint); + positionInPath += graphemeInfo.kernedWidth; + } + } + return { width: width, numOfSpaces: numOfSpaces }; + }, + + /** + * Calculate the angle and the left,top position of the char that follow a path. + * It appends it to graphemeInfo to be reused later at rendering + * @private + * @param {Number} positionInPath to be measured + * @param {Object} graphemeInfo current grapheme box information + * @param {Object} startingPoint position of the point + */ + _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) { + var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2, + path = this.path; + + // we are at currentPositionOnPath. we want to know what point on the path is. + var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo); + graphemeInfo.renderLeft = info.x - startingPoint.x; + graphemeInfo.renderTop = info.y - startingPoint.y; + graphemeInfo.angle = info.angle + (this.pathSide === 'right' ? Math.PI : 0); + }, + + /** + * Measure and return the info of a single grapheme. + * needs the the info of previous graphemes already filled + * @private + * @param {String} grapheme to be measured + * @param {Number} lineIndex index of the line where the char is + * @param {Number} charIndex position in the line + * @param {String} [prevGrapheme] character preceding the one to be measured + */ + _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) { + var style = this.getCompleteStyleDeclaration(lineIndex, charIndex), + prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { }, + info = this._measureChar(grapheme, style, prevGrapheme, prevStyle), + kernedWidth = info.kernedWidth, + width = info.width, charSpacing; + + if (this.charSpacing !== 0) { + charSpacing = this._getWidthOfCharSpacing(); + width += charSpacing; + kernedWidth += charSpacing; + } + + var box = { + width: width, + left: 0, + height: style.fontSize, + kernedWidth: kernedWidth, + deltaY: style.deltaY, + }; + if (charIndex > 0 && !skipLeft) { + var previousBox = this.__charBounds[lineIndex][charIndex - 1]; + box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width; + } + return box; + }, + + /** + * Calculate height of line at 'lineIndex' + * @param {Number} lineIndex index of line to calculate + * @return {Number} + */ + getHeightOfLine: function(lineIndex) { + if (this.__lineHeights[lineIndex]) { + return this.__lineHeights[lineIndex]; + } + + var line = this._textLines[lineIndex], + // char 0 is measured before the line cycle because it nneds to char + // emptylines + maxHeight = this.getHeightOfChar(lineIndex, 0); + for (var i = 1, len = line.length; i < len; i++) { + maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight); + } + + return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult; + }, + + /** + * Calculate text box height + */ + calcTextHeight: function() { + var lineHeight, height = 0; + for (var i = 0, len = this._textLines.length; i < len; i++) { + lineHeight = this.getHeightOfLine(i); + height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight); + } + return height; + }, + + /** + * @private + * @return {Number} Left offset + */ + _getLeftOffset: function() { + return this.direction === 'ltr' ? -this.width / 2 : this.width / 2; + }, + + /** + * @private + * @return {Number} Top offset + */ + _getTopOffset: function() { + return -this.height / 2; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {String} method Method name ("fillText" or "strokeText") + */ + _renderTextCommon: function(ctx, method) { + ctx.save(); + var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset(); + for (var i = 0, len = this._textLines.length; i < len; i++) { + var heightOfLine = this.getHeightOfLine(i), + maxHeight = heightOfLine / this.lineHeight, + leftOffset = this._getLineLeftOffset(i); + this._renderTextLine( + method, + ctx, + this._textLines[i], + left + leftOffset, + top + lineHeights + maxHeight, + i + ); + lineHeights += heightOfLine; + } + ctx.restore(); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderTextFill: function(ctx) { + if (!this.fill && !this.styleHas('fill')) { + return; + } + + this._renderTextCommon(ctx, 'fillText'); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderTextStroke: function(ctx) { + if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) { + return; + } + + if (this.shadow && !this.shadow.affectStroke) { + this._removeShadow(ctx); + } + + ctx.save(); + this._setLineDash(ctx, this.strokeDashArray); + ctx.beginPath(); + this._renderTextCommon(ctx, 'strokeText'); + ctx.closePath(); + ctx.restore(); + }, + + /** + * @private + * @param {String} method fillText or strokeText. + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Array} line Content of the line, splitted in an array by grapheme + * @param {Number} left + * @param {Number} top + * @param {Number} lineIndex + */ + _renderChars: function(method, ctx, line, left, top, lineIndex) { + // set proper line offset + var lineHeight = this.getHeightOfLine(lineIndex), + isJustify = this.textAlign.indexOf('justify') !== -1, + actualStyle, + nextStyle, + charsToRender = '', + charBox, + boxWidth = 0, + timeToRender, + path = this.path, + shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path, + isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1, + drawingLeft, currentDirection = ctx.canvas.getAttribute('dir'); + ctx.save(); + if (currentDirection !== this.direction) { + ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl'); + ctx.direction = isLtr ? 'ltr' : 'rtl'; + ctx.textAlign = isLtr ? 'left' : 'right'; + } + top -= lineHeight * this._fontSizeFraction / this.lineHeight; + if (shortCut) { + // render all the line in one pass without checking + // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex); + this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight); + ctx.restore(); + return; + } + for (var i = 0, len = line.length - 1; i <= len; i++) { + timeToRender = i === len || this.charSpacing || path; + charsToRender += line[i]; + charBox = this.__charBounds[lineIndex][i]; + if (boxWidth === 0) { + left += sign * (charBox.kernedWidth - charBox.width); + boxWidth += charBox.width; + } + else { + boxWidth += charBox.kernedWidth; + } + if (isJustify && !timeToRender) { + if (this._reSpaceAndTab.test(line[i])) { + timeToRender = true; + } + } + if (!timeToRender) { + // if we have charSpacing, we render char by char + actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); + nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); + timeToRender = this._hasStyleChanged(actualStyle, nextStyle); + } + if (timeToRender) { + if (path) { + ctx.save(); + ctx.translate(charBox.renderLeft, charBox.renderTop); + ctx.rotate(charBox.angle); + this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight); + ctx.restore(); + } + else { + drawingLeft = left; + this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight); + } + charsToRender = ''; + actualStyle = nextStyle; + left += sign * boxWidth; + boxWidth = 0; + } + } + ctx.restore(); + }, + + /** + * This function try to patch the missing gradientTransform on canvas gradients. + * transforming a context to transform the gradient, is going to transform the stroke too. + * we want to transform the gradient but not the stroke operation, so we create + * a transformed gradient on a pattern and then we use the pattern instead of the gradient. + * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size + * is limited. + * @private + * @param {fabric.Gradient} filler a fabric gradient instance + * @return {CanvasPattern} a pattern to use as fill/stroke style + */ + _applyPatternGradientTransformText: function(filler) { + var pCanvas = fabric.util.createCanvasElement(), pCtx, + // TODO: verify compatibility with strokeUniform + width = this.width + this.strokeWidth, height = this.height + this.strokeWidth; + pCanvas.width = width; + pCanvas.height = height; + pCtx = pCanvas.getContext('2d'); + pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); + pCtx.lineTo(0, height); pCtx.closePath(); + pCtx.translate(width / 2, height / 2); + pCtx.fillStyle = filler.toLive(pCtx); + this._applyPatternGradientTransform(pCtx, filler); + pCtx.fill(); + return pCtx.createPattern(pCanvas, 'no-repeat'); + }, + + handleFiller: function(ctx, property, filler) { + var offsetX, offsetY; + if (filler.toLive) { + if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) { + // need to transform gradient in a pattern. + // this is a slow process. If you are hitting this codepath, and the object + // is not using caching, you should consider switching it on. + // we need a canvas as big as the current object caching canvas. + offsetX = -this.width / 2; + offsetY = -this.height / 2; + ctx.translate(offsetX, offsetY); + ctx[property] = this._applyPatternGradientTransformText(filler); + return { offsetX: offsetX, offsetY: offsetY }; + } + else { + // is a simple gradient or pattern + ctx[property] = filler.toLive(ctx, this); + return this._applyPatternGradientTransform(ctx, filler); + } + } + else { + // is a color + ctx[property] = filler; + } + return { offsetX: 0, offsetY: 0 }; + }, + + _setStrokeStyles: function(ctx, decl) { + ctx.lineWidth = decl.strokeWidth; + ctx.lineCap = this.strokeLineCap; + ctx.lineDashOffset = this.strokeDashOffset; + ctx.lineJoin = this.strokeLineJoin; + ctx.miterLimit = this.strokeMiterLimit; + return this.handleFiller(ctx, 'strokeStyle', decl.stroke); + }, + + _setFillStyles: function(ctx, decl) { + return this.handleFiller(ctx, 'fillStyle', decl.fill); + }, + + /** + * @private + * @param {String} method + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Number} lineIndex + * @param {Number} charIndex + * @param {String} _char + * @param {Number} left Left coordinate + * @param {Number} top Top coordinate + * @param {Number} lineHeight Height of the line + */ + _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) { + var decl = this._getStyleDeclaration(lineIndex, charIndex), + fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex), + shouldFill = method === 'fillText' && fullDecl.fill, + shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth, + fillOffsets, strokeOffsets; + + if (!shouldStroke && !shouldFill) { + return; + } + ctx.save(); + + shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl)); + shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl)); + + ctx.font = this._getFontDeclaration(fullDecl); + + + if (decl && decl.textBackgroundColor) { + this._removeShadow(ctx); + } + if (decl && decl.deltaY) { + top += decl.deltaY; + } + shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY); + shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY); + ctx.restore(); + }, + + /** + * Turns the character into a 'superior figure' (i.e. 'superscript') + * @param {Number} start selection start + * @param {Number} end selection end + * @returns {fabric.Text} thisArg + * @chainable + */ + setSuperscript: function(start, end) { + return this._setScript(start, end, this.superscript); + }, + + /** + * Turns the character into an 'inferior figure' (i.e. 'subscript') + * @param {Number} start selection start + * @param {Number} end selection end + * @returns {fabric.Text} thisArg + * @chainable + */ + setSubscript: function(start, end) { + return this._setScript(start, end, this.subscript); + }, + + /** + * Applies 'schema' at given position + * @private + * @param {Number} start selection start + * @param {Number} end selection end + * @param {Number} schema + * @returns {fabric.Text} thisArg + * @chainable + */ + _setScript: function(start, end, schema) { + var loc = this.get2DCursorLocation(start, true), + fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'), + dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'), + style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline }; + this.setSelectionStyles(style, start, end); + return this; + }, + + /** + * @private + * @param {Object} prevStyle + * @param {Object} thisStyle + */ + _hasStyleChanged: function(prevStyle, thisStyle) { + return prevStyle.fill !== thisStyle.fill || + prevStyle.stroke !== thisStyle.stroke || + prevStyle.strokeWidth !== thisStyle.strokeWidth || + prevStyle.fontSize !== thisStyle.fontSize || + prevStyle.fontFamily !== thisStyle.fontFamily || + prevStyle.fontWeight !== thisStyle.fontWeight || + prevStyle.fontStyle !== thisStyle.fontStyle || + prevStyle.deltaY !== thisStyle.deltaY; + }, + + /** + * @private + * @param {Object} prevStyle + * @param {Object} thisStyle + */ + _hasStyleChangedForSvg: function(prevStyle, thisStyle) { + return this._hasStyleChanged(prevStyle, thisStyle) || + prevStyle.overline !== thisStyle.overline || + prevStyle.underline !== thisStyle.underline || + prevStyle.linethrough !== thisStyle.linethrough; + }, + + /** + * @private + * @param {Number} lineIndex index text line + * @return {Number} Line left offset + */ + _getLineLeftOffset: function(lineIndex) { + var lineWidth = this.getLineWidth(lineIndex), + lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction, + isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex); + if (textAlign === 'justify' + || (textAlign === 'justify-center' && !isEndOfWrapping) + || (textAlign === 'justify-right' && !isEndOfWrapping) + || (textAlign === 'justify-left' && !isEndOfWrapping) + ) { + return 0; + } + if (textAlign === 'center') { + leftOffset = lineDiff / 2; + } + if (textAlign === 'right') { + leftOffset = lineDiff; + } + if (textAlign === 'justify-center') { + leftOffset = lineDiff / 2; + } + if (textAlign === 'justify-right') { + leftOffset = lineDiff; + } + if (direction === 'rtl') { + leftOffset -= lineDiff; + } + return leftOffset; + }, + + /** + * @private + */ + _clearCache: function() { + this.__lineWidths = []; + this.__lineHeights = []; + this.__charBounds = []; + }, + + /** + * @private + */ + _shouldClearDimensionCache: function() { + var shouldClear = this._forceClearCache; + shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps')); + if (shouldClear) { + this.dirty = true; + this._forceClearCache = false; + } + return shouldClear; + }, + + /** + * Measure a single line given its index. Used to calculate the initial + * text bounding box. The values are calculated and stored in __lineWidths cache. + * @private + * @param {Number} lineIndex line number + * @return {Number} Line width + */ + getLineWidth: function(lineIndex) { + if (this.__lineWidths[lineIndex] !== undefined) { + return this.__lineWidths[lineIndex]; + } + + var lineInfo = this.measureLine(lineIndex); + var width = lineInfo.width; + this.__lineWidths[lineIndex] = width; + return width; + }, + + _getWidthOfCharSpacing: function() { + if (this.charSpacing !== 0) { + return this.fontSize * this.charSpacing / 1000; + } + return 0; + }, + + /** + * Retrieves the value of property at given character position + * @param {Number} lineIndex the line number + * @param {Number} charIndex the character number + * @param {String} property the property name + * @returns the value of 'property' + */ + getValueOfPropertyAt: function(lineIndex, charIndex, property) { + var charStyle = this._getStyleDeclaration(lineIndex, charIndex); + if (charStyle && typeof charStyle[property] !== 'undefined') { + return charStyle[property]; + } + return this[property]; + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _renderTextDecoration: function(ctx, type) { + if (!this[type] && !this.styleHas(type)) { + return; + } + var heightOfLine, size, _size, + lineLeftOffset, dy, _dy, + line, lastDecoration, + leftOffset = this._getLeftOffset(), + topOffset = this._getTopOffset(), top, + boxStart, boxWidth, charBox, currentDecoration, + maxHeight, currentFill, lastFill, path = this.path, + charSpacing = this._getWidthOfCharSpacing(), + offsetY = this.offsets[type]; + + for (var i = 0, len = this._textLines.length; i < len; i++) { + heightOfLine = this.getHeightOfLine(i); + if (!this[type] && !this.styleHas(type, i)) { + topOffset += heightOfLine; + continue; + } + line = this._textLines[i]; + maxHeight = heightOfLine / this.lineHeight; + lineLeftOffset = this._getLineLeftOffset(i); + boxStart = 0; + boxWidth = 0; + lastDecoration = this.getValueOfPropertyAt(i, 0, type); + lastFill = this.getValueOfPropertyAt(i, 0, 'fill'); + top = topOffset + maxHeight * (1 - this._fontSizeFraction); + size = this.getHeightOfChar(i, 0); + dy = this.getValueOfPropertyAt(i, 0, 'deltaY'); + for (var j = 0, jlen = line.length; j < jlen; j++) { + charBox = this.__charBounds[i][j]; + currentDecoration = this.getValueOfPropertyAt(i, j, type); + currentFill = this.getValueOfPropertyAt(i, j, 'fill'); + _size = this.getHeightOfChar(i, j); + _dy = this.getValueOfPropertyAt(i, j, 'deltaY'); + if (path && currentDecoration && currentFill) { + ctx.save(); + ctx.fillStyle = lastFill; + ctx.translate(charBox.renderLeft, charBox.renderTop); + ctx.rotate(charBox.angle); + ctx.fillRect( + -charBox.kernedWidth / 2, + offsetY * _size + _dy, + charBox.kernedWidth, + this.fontSize / 15 + ); + ctx.restore(); + } + else if ( + (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy) + && boxWidth > 0 + ) { + var drawStart = leftOffset + lineLeftOffset + boxStart; + if (this.direction === 'rtl') { + drawStart = this.width - drawStart - boxWidth; + } + if (lastDecoration && lastFill) { + ctx.fillStyle = lastFill; + ctx.fillRect( + drawStart, + top + offsetY * size + dy, + boxWidth, + this.fontSize / 15 + ); + } + boxStart = charBox.left; + boxWidth = charBox.width; + lastDecoration = currentDecoration; + lastFill = currentFill; + size = _size; + dy = _dy; + } + else { + boxWidth += charBox.kernedWidth; + } + } + var drawStart = leftOffset + lineLeftOffset + boxStart; + if (this.direction === 'rtl') { + drawStart = this.width - drawStart - boxWidth; + } + ctx.fillStyle = currentFill; + currentDecoration && currentFill && ctx.fillRect( + drawStart, + top + offsetY * size + dy, + boxWidth - charSpacing, + this.fontSize / 15 + ); + topOffset += heightOfLine; + } + // if there is text background color no + // other shadows should be casted + this._removeShadow(ctx); + }, + + /** + * return font declaration string for canvas context + * @param {Object} [styleObject] object + * @returns {String} font declaration formatted for canvas context. + */ + _getFontDeclaration: function(styleObject, forMeasuring) { + var style = styleObject || this, family = this.fontFamily, + fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1; + var fontFamily = family === undefined || + family.indexOf('\'') > -1 || family.indexOf(',') > -1 || + family.indexOf('"') > -1 || fontIsGeneric + ? style.fontFamily : '"' + style.fontFamily + '"'; + return [ + // node-canvas needs "weight style", while browsers need "style weight" + // verify if this can be fixed in JSDOM + (fabric.isLikelyNode ? style.fontWeight : style.fontStyle), + (fabric.isLikelyNode ? style.fontStyle : style.fontWeight), + forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px', + fontFamily + ].join(' '); + }, + + /** + * Renders text instance on a specified context + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + render: function(ctx) { + // do not render if object is not visible + if (!this.visible) { + return; + } + if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { + return; + } + if (this._shouldClearDimensionCache()) { + this.initDimensions(); + } + this.callSuper('render', ctx); + }, + + /** + * Returns the text as an array of lines. + * @param {String} text text to split + * @returns {Array} Lines in the text + */ + _splitTextIntoLines: function(text) { + var lines = text.split(this._reNewline), + newLines = new Array(lines.length), + newLine = ['\n'], + newText = []; + for (var i = 0; i < lines.length; i++) { + newLines[i] = fabric.util.string.graphemeSplit(lines[i]); + newText = newText.concat(newLines[i], newLine); + } + newText.pop(); + return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines }; + }, + + /** + * Returns object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of an instance + */ + toObject: function(propertiesToInclude) { + var allProperties = additionalProps.concat(propertiesToInclude); + var obj = this.callSuper('toObject', allProperties); + // styles will be overridden with a properly cloned structure + obj.styles = clone(this.styles, true); + if (obj.path) { + obj.path = this.path.toObject(); + } + return obj; + }, + + /** + * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. + * @param {String|Object} key Property name or object (if object, iterate over the object properties) + * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) + * @return {fabric.Object} thisArg + * @chainable + */ + set: function(key, value) { + this.callSuper('set', key, value); + var needsDims = false; + var isAddingPath = false; + if (typeof key === 'object') { + for (var _key in key) { + if (_key === 'path') { + this.setPathInfo(); + } + needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1; + isAddingPath = isAddingPath || _key === 'path'; + } + } + else { + needsDims = this._dimensionAffectingProps.indexOf(key) !== -1; + isAddingPath = key === 'path'; + } + if (isAddingPath) { + this.setPathInfo(); + } + if (needsDims) { + this.initDimensions(); + this.setCoords(); + } + return this; + }, + + /** + * Returns complexity of an instance + * @return {Number} complexity + */ + complexity: function() { + return 1; + } + }); + + /* _FROM_SVG_START_ */ + /** + * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement}) + * @static + * @memberOf fabric.Text + * @see: http://www.w3.org/TR/SVG/text.html#TextElement + */ + fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat( + 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' ')); + + /** + * Default SVG font size + * @static + * @memberOf fabric.Text + */ + fabric.Text.DEFAULT_SVG_FONT_SIZE = 16; + + /** + * Returns fabric.Text instance from an SVG element (not yet implemented) + * @static + * @memberOf fabric.Text + * @param {SVGElement} element Element to parse + * @param {Function} callback callback function invoked after parsing + * @param {Object} [options] Options object + */ + fabric.Text.fromElement = function(element, callback, options) { + if (!element) { + return callback(null); + } + + var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES), + parsedAnchor = parsedAttributes.textAnchor || 'left'; + options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes); + + options.top = options.top || 0; + options.left = options.left || 0; + if (parsedAttributes.textDecoration) { + var textDecoration = parsedAttributes.textDecoration; + if (textDecoration.indexOf('underline') !== -1) { + options.underline = true; + } + if (textDecoration.indexOf('overline') !== -1) { + options.overline = true; + } + if (textDecoration.indexOf('line-through') !== -1) { + options.linethrough = true; + } + delete options.textDecoration; + } + if ('dx' in parsedAttributes) { + options.left += parsedAttributes.dx; + } + if ('dy' in parsedAttributes) { + options.top += parsedAttributes.dy; + } + if (!('fontSize' in options)) { + options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; + } + + var textContent = ''; + + // The XML is not properly parsed in IE9 so a workaround to get + // textContent is through firstChild.data. Another workaround would be + // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does) + if (!('textContent' in element)) { + if ('firstChild' in element && element.firstChild !== null) { + if ('data' in element.firstChild && element.firstChild.data !== null) { + textContent = element.firstChild.data; + } + } + } + else { + textContent = element.textContent; + } + + textContent = textContent.replace(/^\s+|\s+$|\n+/g, '').replace(/\s+/g, ' '); + var originalStrokeWidth = options.strokeWidth; + options.strokeWidth = 0; + + var text = new fabric.Text(textContent, options), + textHeightScaleFactor = text.getScaledHeight() / text.height, + lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height, + scaledDiff = lineHeightDiff * textHeightScaleFactor, + textHeight = text.getScaledHeight() + scaledDiff, + offX = 0; + /* + Adjust positioning: + x/y attributes in SVG correspond to the bottom-left corner of text bounding box + fabric output by default at top, left. + */ + if (parsedAnchor === 'center') { + offX = text.getScaledWidth() / 2; + } + if (parsedAnchor === 'right') { + offX = text.getScaledWidth(); + } + text.set({ + left: text.left - offX, + top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight, + strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1, + }); + callback(text); + }; + /* _FROM_SVG_END_ */ + + /** + * Returns fabric.Text instance from an object representation + * @static + * @memberOf fabric.Text + * @param {Object} object plain js Object to create an instance from + * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created + */ + fabric.Text.fromObject = function(object, callback) { + var objectCopy = clone(object), path = object.path; + delete objectCopy.path; + return fabric.Object._fromObject('Text', objectCopy, function(textInstance) { + if (path) { + fabric.Object._fromObject('Path', path, function(pathInstance) { + textInstance.set('path', pathInstance); + callback(textInstance); + }, 'path'); + } + else { + callback(textInstance); + } + }, 'text'); + }; + + fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace']; + + fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text); + +})(typeof exports !== 'undefined' ? exports : this); +(function() { + fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { + /** + * Returns true if object has no styling or no styling in a line + * @param {Number} lineIndex , lineIndex is on wrapped lines. + * @return {Boolean} + */ + isEmptyStyles: function(lineIndex) { + if (!this.styles) { + return true; + } + if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { + return true; + } + var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; + for (var p1 in obj) { + for (var p2 in obj[p1]) { + // eslint-disable-next-line no-unused-vars + for (var p3 in obj[p1][p2]) { + return false; + } + } + } + return true; + }, + + /** + * Returns true if object has a style property or has it ina specified line + * This function is used to detect if a text will use a particular property or not. + * @param {String} property to check for + * @param {Number} lineIndex to check the style on + * @return {Boolean} + */ + styleHas: function(property, lineIndex) { + if (!this.styles || !property || property === '') { + return false; + } + if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { + return false; + } + var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] }; + // eslint-disable-next-line + for (var p1 in obj) { + // eslint-disable-next-line + for (var p2 in obj[p1]) { + if (typeof obj[p1][p2][property] !== 'undefined') { + return true; + } + } + } + return false; + }, + + /** + * Check if characters in a text have a value for a property + * whose value matches the textbox's value for that property. If so, + * the character-level property is deleted. If the character + * has no other properties, then it is also deleted. Finally, + * if the line containing that character has no other characters + * then it also is deleted. + * + * @param {string} property The property to compare between characters and text. + */ + cleanStyle: function(property) { + if (!this.styles || !property || property === '') { + return false; + } + var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue, + allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject; + // eslint-disable-next-line + for (var p1 in obj) { + letterCount = 0; + // eslint-disable-next-line + for (var p2 in obj[p1]) { + var styleObject = obj[p1][p2], + stylePropertyHasBeenSet = styleObject.hasOwnProperty(property); + + stylesCount++; + + if (stylePropertyHasBeenSet) { + if (!stylePropertyValue) { + stylePropertyValue = styleObject[property]; + } + else if (styleObject[property] !== stylePropertyValue) { + allStyleObjectPropertiesMatch = false; + } + + if (styleObject[property] === this[property]) { + delete styleObject[property]; + } + } + else { + allStyleObjectPropertiesMatch = false; + } + + if (Object.keys(styleObject).length !== 0) { + letterCount++; + } + else { + delete obj[p1][p2]; + } + } + + if (letterCount === 0) { + delete obj[p1]; + } + } + // if every grapheme has the same style set then + // delete those styles and set it on the parent + for (var i = 0; i < this._textLines.length; i++) { + graphemeCount += this._textLines[i].length; + } + if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) { + this[property] = stylePropertyValue; + this.removeStyle(property); + } + }, + + /** + * Remove a style property or properties from all individual character styles + * in a text object. Deletes the character style object if it contains no other style + * props. Deletes a line style object if it contains no other character styles. + * + * @param {String} props The property to remove from character styles. + */ + removeStyle: function(property) { + if (!this.styles || !property || property === '') { + return; + } + var obj = this.styles, line, lineNum, charNum; + for (lineNum in obj) { + line = obj[lineNum]; + for (charNum in line) { + delete line[charNum][property]; + if (Object.keys(line[charNum]).length === 0) { + delete line[charNum]; + } + } + if (Object.keys(line).length === 0) { + delete obj[lineNum]; + } + } + }, + + /** + * @private + */ + _extendStyles: function(index, styles) { + var loc = this.get2DCursorLocation(index); + + if (!this._getLineStyle(loc.lineIndex)) { + this._setLineStyle(loc.lineIndex); + } + + if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) { + this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {}); + } + + fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles); + }, + + /** + * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start) + * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used. + * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles. + */ + get2DCursorLocation: function(selectionStart, skipWrapping) { + if (typeof selectionStart === 'undefined') { + selectionStart = this.selectionStart; + } + var lines = skipWrapping ? this._unwrappedTextLines : this._textLines, + len = lines.length; + for (var i = 0; i < len; i++) { + if (selectionStart <= lines[i].length) { + return { + lineIndex: i, + charIndex: selectionStart + }; + } + selectionStart -= lines[i].length + this.missingNewlineOffset(i); + } + return { + lineIndex: i - 1, + charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart + }; + }, + + /** + * Gets style of a current selection/cursor (at the start position) + * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used. + * @param {Number} [startIndex] Start index to get styles at + * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 + * @param {Boolean} [complete] get full style or not + * @return {Array} styles an array with one, zero or more Style objects + */ + getSelectionStyles: function(startIndex, endIndex, complete) { + if (typeof startIndex === 'undefined') { + startIndex = this.selectionStart || 0; + } + if (typeof endIndex === 'undefined') { + endIndex = this.selectionEnd || startIndex; + } + var styles = []; + for (var i = startIndex; i < endIndex; i++) { + styles.push(this.getStyleAtPosition(i, complete)); + } + return styles; + }, + + /** + * Gets style of a current selection/cursor position + * @param {Number} position to get styles at + * @param {Boolean} [complete] full style if true + * @return {Object} style Style object at a specified index + * @private + */ + getStyleAtPosition: function(position, complete) { + var loc = this.get2DCursorLocation(position), + style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) : + this._getStyleDeclaration(loc.lineIndex, loc.charIndex); + return style || {}; + }, + + /** + * Sets style of a current selection, if no selection exist, do not set anything. + * @param {Object} [styles] Styles object + * @param {Number} [startIndex] Start index to get styles at + * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 + * @return {fabric.IText} thisArg + * @chainable + */ + setSelectionStyles: function(styles, startIndex, endIndex) { + if (typeof startIndex === 'undefined') { + startIndex = this.selectionStart || 0; + } + if (typeof endIndex === 'undefined') { + endIndex = this.selectionEnd || startIndex; + } + for (var i = startIndex; i < endIndex; i++) { + this._extendStyles(i, styles); + } + /* not included in _extendStyles to avoid clearing cache more than once */ + this._forceClearCache = true; + return this; + }, + + /** + * get the reference, not a clone, of the style object for a given character + * @param {Number} lineIndex + * @param {Number} charIndex + * @return {Object} style object + */ + _getStyleDeclaration: function(lineIndex, charIndex) { + var lineStyle = this.styles && this.styles[lineIndex]; + if (!lineStyle) { + return null; + } + return lineStyle[charIndex]; + }, + + /** + * return a new object that contains all the style property for a character + * the object returned is newly created + * @param {Number} lineIndex of the line where the character is + * @param {Number} charIndex position of the character on the line + * @return {Object} style object + */ + getCompleteStyleDeclaration: function(lineIndex, charIndex) { + var style = this._getStyleDeclaration(lineIndex, charIndex) || { }, + styleObject = { }, prop; + for (var i = 0; i < this._styleProperties.length; i++) { + prop = this._styleProperties[i]; + styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop]; + } + return styleObject; + }, + + /** + * @param {Number} lineIndex + * @param {Number} charIndex + * @param {Object} style + * @private + */ + _setStyleDeclaration: function(lineIndex, charIndex, style) { + this.styles[lineIndex][charIndex] = style; + }, + + /** + * + * @param {Number} lineIndex + * @param {Number} charIndex + * @private + */ + _deleteStyleDeclaration: function(lineIndex, charIndex) { + delete this.styles[lineIndex][charIndex]; + }, + + /** + * @param {Number} lineIndex + * @return {Boolean} if the line exists or not + * @private + */ + _getLineStyle: function(lineIndex) { + return !!this.styles[lineIndex]; + }, + + /** + * Set the line style to an empty object so that is initialized + * @param {Number} lineIndex + * @private + */ + _setLineStyle: function(lineIndex) { + this.styles[lineIndex] = {}; + }, + + /** + * @param {Number} lineIndex + * @private + */ + _deleteLineStyle: function(lineIndex) { + delete this.styles[lineIndex]; + } + }); +})(); +(function() { + + function parseDecoration(object) { + if (object.textDecoration) { + object.textDecoration.indexOf('underline') > -1 && (object.underline = true); + object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true); + object.textDecoration.indexOf('overline') > -1 && (object.overline = true); + delete object.textDecoration; + } + } + + /** + * IText class (introduced in v1.4) Events are also fired with "text:" + * prefix when observing canvas. + * @class fabric.IText + * @extends fabric.Text + * @mixes fabric.Observable + * + * @fires changed + * @fires selection:changed + * @fires editing:entered + * @fires editing:exited + * + * @return {fabric.IText} thisArg + * @see {@link fabric.IText#initialize} for constructor definition + * + *

Supported key combinations:

+ *
+   *   Move cursor:                    left, right, up, down
+   *   Select character:               shift + left, shift + right
+   *   Select text vertically:         shift + up, shift + down
+   *   Move cursor by word:            alt + left, alt + right
+   *   Select words:                   shift + alt + left, shift + alt + right
+   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end
+   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end
+   *   Jump to start/end of text:      cmd + up, cmd + down
+   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown
+   *   Delete character:               backspace
+   *   Delete word:                    alt + backspace
+   *   Delete line:                    cmd + backspace
+   *   Forward delete:                 delete
+   *   Copy text:                      ctrl/cmd + c
+   *   Paste text:                     ctrl/cmd + v
+   *   Cut text:                       ctrl/cmd + x
+   *   Select entire text:             ctrl/cmd + a
+   *   Quit editing                    tab or esc
+   * 
+ * + *

Supported mouse/touch combination

+ *
+   *   Position cursor:                click/touch
+   *   Create selection:               click/touch & drag
+   *   Create selection:               click & shift + click
+   *   Select word:                    double click
+   *   Select line:                    triple click
+   * 
+ */ + fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'i-text', + + /** + * Index where text selection starts (or where cursor is when there is no selection) + * @type Number + * @default + */ + selectionStart: 0, + + /** + * Index where text selection ends + * @type Number + * @default + */ + selectionEnd: 0, + + /** + * Color of text selection + * @type String + * @default + */ + selectionColor: 'rgba(17,119,255,0.3)', + + /** + * Indicates whether text is in editing mode + * @type Boolean + * @default + */ + isEditing: false, + + /** + * Indicates whether a text can be edited + * @type Boolean + * @default + */ + editable: true, + + /** + * Border color of text object while it's in editing mode + * @type String + * @default + */ + editingBorderColor: 'rgba(102,153,255,0.25)', + + /** + * Width of cursor (in px) + * @type Number + * @default + */ + cursorWidth: 2, + + /** + * Color of text cursor color in editing mode. + * if not set (default) will take color from the text. + * if set to a color value that fabric can understand, it will + * be used instead of the color of the text at the current position. + * @type String + * @default + */ + cursorColor: '', + + /** + * Delay between cursor blink (in ms) + * @type Number + * @default + */ + cursorDelay: 1000, + + /** + * Duration of cursor fadein (in ms) + * @type Number + * @default + */ + cursorDuration: 600, + + /** + * Indicates whether internal text char widths can be cached + * @type Boolean + * @default + */ + caching: true, + + /** + * DOM container to append the hiddenTextarea. + * An alternative to attaching to the document.body. + * Useful to reduce laggish redraw of the full document.body tree and + * also with modals event capturing that won't let the textarea take focus. + * @type HTMLElement + * @default + */ + hiddenTextareaContainer: null, + + /** + * @private + */ + _reSpace: /\s|\n/, + + /** + * @private + */ + _currentCursorOpacity: 0, + + /** + * @private + */ + _selectionDirection: null, + + /** + * @private + */ + _abortCursorAnimation: false, + + /** + * @private + */ + __widthOfSpace: [], + + /** + * Helps determining when the text is in composition, so that the cursor + * rendering is altered. + */ + inCompositionMode: false, + + /** + * Constructor + * @param {String} text Text string + * @param {Object} [options] Options object + * @return {fabric.IText} thisArg + */ + initialize: function(text, options) { + this.callSuper('initialize', text, options); + this.initBehavior(); + }, + + /** + * Sets selection start (left boundary of a selection) + * @param {Number} index Index to set selection start to + */ + setSelectionStart: function(index) { + index = Math.max(index, 0); + this._updateAndFire('selectionStart', index); + }, + + /** + * Sets selection end (right boundary of a selection) + * @param {Number} index Index to set selection end to + */ + setSelectionEnd: function(index) { + index = Math.min(index, this.text.length); + this._updateAndFire('selectionEnd', index); + }, + + /** + * @private + * @param {String} property 'selectionStart' or 'selectionEnd' + * @param {Number} index new position of property + */ + _updateAndFire: function(property, index) { + if (this[property] !== index) { + this._fireSelectionChanged(); + this[property] = index; + } + this._updateTextarea(); + }, + + /** + * Fires the even of selection changed + * @private + */ + _fireSelectionChanged: function() { + this.fire('selection:changed'); + this.canvas && this.canvas.fire('text:selection:changed', { target: this }); + }, + + /** + * Initialize text dimensions. Render all text on given context + * or on a offscreen canvas to get the text width with measureText. + * Updates this.width and this.height with the proper values. + * Does not return dimensions. + * @private + */ + initDimensions: function() { + this.isEditing && this.initDelayedCursor(); + this.clearContextTop(); + this.callSuper('initDimensions'); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + render: function(ctx) { + this.clearContextTop(); + this.callSuper('render', ctx); + // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor + // the correct position but not at every cursor animation. + this.cursorOffsetCache = { }; + this.renderCursorOrSelection(); + }, + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + */ + _render: function(ctx) { + this.callSuper('_render', ctx); + }, + + /** + * Prepare and clean the contextTop + */ + clearContextTop: function(skipRestore) { + if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { + return; + } + var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform; + ctx.save(); + ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); + this.transform(ctx); + this._clearTextArea(ctx); + skipRestore || ctx.restore(); + }, + /** + * Renders cursor or selection (depending on what exists) + * it does on the contextTop. If contextTop is not available, do nothing. + */ + renderCursorOrSelection: function() { + if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { + return; + } + var boundaries = this._getCursorBoundaries(), + ctx = this.canvas.contextTop; + this.clearContextTop(true); + if (this.selectionStart === this.selectionEnd) { + this.renderCursor(boundaries, ctx); + } + else { + this.renderSelection(boundaries, ctx); + } + ctx.restore(); + }, + + _clearTextArea: function(ctx) { + // we add 4 pixel, to be sure to do not leave any pixel out + var width = this.width + 4, height = this.height + 4; + ctx.clearRect(-width / 2, -height / 2, width, height); + }, + + /** + * Returns cursor boundaries (left, top, leftOffset, topOffset) + * @private + * @param {Array} chars Array of characters + * @param {String} typeOfBoundaries + */ + _getCursorBoundaries: function(position) { + + // left/top are left/top of entire text box + // leftOffset/topOffset are offset from that left/top point of a text box + + if (typeof position === 'undefined') { + position = this.selectionStart; + } + + var left = this._getLeftOffset(), + top = this._getTopOffset(), + offsets = this._getCursorBoundariesOffsets(position); + return { + left: left, + top: top, + leftOffset: offsets.left, + topOffset: offsets.top + }; + }, + + /** + * @private + */ + _getCursorBoundariesOffsets: function(position) { + if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) { + return this.cursorOffsetCache; + } + var lineLeftOffset, + lineIndex, + charIndex, + topOffset = 0, + leftOffset = 0, + boundaries, + cursorPosition = this.get2DCursorLocation(position); + charIndex = cursorPosition.charIndex; + lineIndex = cursorPosition.lineIndex; + for (var i = 0; i < lineIndex; i++) { + topOffset += this.getHeightOfLine(i); + } + lineLeftOffset = this._getLineLeftOffset(lineIndex); + var bound = this.__charBounds[lineIndex][charIndex]; + bound && (leftOffset = bound.left); + if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) { + leftOffset -= this._getWidthOfCharSpacing(); + } + boundaries = { + top: topOffset, + left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0), + }; + if (this.direction === 'rtl') { + boundaries.left *= -1; + } + this.cursorOffsetCache = boundaries; + return this.cursorOffsetCache; + }, + + /** + * Renders cursor + * @param {Object} boundaries + * @param {CanvasRenderingContext2D} ctx transformed context to draw on + */ + renderCursor: function(boundaries, ctx) { + var cursorLocation = this.get2DCursorLocation(), + lineIndex = cursorLocation.lineIndex, + charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0, + charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'), + multiplier = this.scaleX * this.canvas.getZoom(), + cursorWidth = this.cursorWidth / multiplier, + topOffset = boundaries.topOffset, + dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'); + topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight + - charHeight * (1 - this._fontSizeFraction); + + if (this.inCompositionMode) { + this.renderSelection(boundaries, ctx); + } + ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill'); + ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity; + ctx.fillRect( + boundaries.left + boundaries.leftOffset - cursorWidth / 2, + topOffset + boundaries.top + dy, + cursorWidth, + charHeight); + }, + + /** + * Renders text selection + * @param {Object} boundaries Object with left/top/leftOffset/topOffset + * @param {CanvasRenderingContext2D} ctx transformed context to draw on + */ + renderSelection: function(boundaries, ctx) { + + var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart, + selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd, + isJustify = this.textAlign.indexOf('justify') !== -1, + start = this.get2DCursorLocation(selectionStart), + end = this.get2DCursorLocation(selectionEnd), + startLine = start.lineIndex, + endLine = end.lineIndex, + startChar = start.charIndex < 0 ? 0 : start.charIndex, + endChar = end.charIndex < 0 ? 0 : end.charIndex; + + for (var i = startLine; i <= endLine; i++) { + var lineOffset = this._getLineLeftOffset(i) || 0, + lineHeight = this.getHeightOfLine(i), + realLineHeight = 0, boxStart = 0, boxEnd = 0; + + if (i === startLine) { + boxStart = this.__charBounds[startLine][startChar].left; + } + if (i >= startLine && i < endLine) { + boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5? + } + else if (i === endLine) { + if (endChar === 0) { + boxEnd = this.__charBounds[endLine][endChar].left; + } + else { + var charSpacing = this._getWidthOfCharSpacing(); + boxEnd = this.__charBounds[endLine][endChar - 1].left + + this.__charBounds[endLine][endChar - 1].width - charSpacing; + } + } + realLineHeight = lineHeight; + if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) { + lineHeight /= this.lineHeight; + } + var drawStart = boundaries.left + lineOffset + boxStart, + drawWidth = boxEnd - boxStart, + drawHeight = lineHeight, extraTop = 0; + if (this.inCompositionMode) { + ctx.fillStyle = this.compositionColor || 'black'; + drawHeight = 1; + extraTop = lineHeight; + } + else { + ctx.fillStyle = this.selectionColor; + } + if (this.direction === 'rtl') { + drawStart = this.width - drawStart - drawWidth; + } + ctx.fillRect( + drawStart, + boundaries.top + boundaries.topOffset + extraTop, + drawWidth, + drawHeight); + boundaries.topOffset += realLineHeight; + } + }, + + /** + * High level function to know the height of the cursor. + * the currentChar is the one that precedes the cursor + * Returns fontSize of char at the current cursor + * Unused from the library, is for the end user + * @return {Number} Character font size + */ + getCurrentCharFontSize: function() { + var cp = this._getCurrentCharIndex(); + return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize'); + }, + + /** + * High level function to know the color of the cursor. + * the currentChar is the one that precedes the cursor + * Returns color (fill) of char at the current cursor + * if the text object has a pattern or gradient for filler, it will return that. + * Unused by the library, is for the end user + * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill) + */ + getCurrentCharColor: function() { + var cp = this._getCurrentCharIndex(); + return this.getValueOfPropertyAt(cp.l, cp.c, 'fill'); + }, + + /** + * Returns the cursor position for the getCurrent.. functions + * @private + */ + _getCurrentCharIndex: function() { + var cursorPosition = this.get2DCursorLocation(this.selectionStart, true), + charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0; + return { l: cursorPosition.lineIndex, c: charIndex }; + } + }); + + /** + * Returns fabric.IText instance from an object representation + * @static + * @memberOf fabric.IText + * @param {Object} object Object to create an instance from + * @param {function} [callback] invoked with new instance as argument + */ + fabric.IText.fromObject = function(object, callback) { + parseDecoration(object); + if (object.styles) { + for (var i in object.styles) { + for (var j in object.styles[i]) { + parseDecoration(object.styles[i][j]); + } + } + } + fabric.Object._fromObject('IText', object, callback, 'text'); + }; +})(); +(function() { + + var clone = fabric.util.object.clone; + + fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { + + /** + * Initializes all the interactive behavior of IText + */ + initBehavior: function() { + this.initAddedHandler(); + this.initRemovedHandler(); + this.initCursorSelectionHandlers(); + this.initDoubleClickSimulation(); + this.mouseMoveHandler = this.mouseMoveHandler.bind(this); + }, + + onDeselect: function() { + this.isEditing && this.exitEditing(); + this.selected = false; + }, + + /** + * Initializes "added" event handler + */ + initAddedHandler: function() { + var _this = this; + this.on('added', function() { + var canvas = _this.canvas; + if (canvas) { + if (!canvas._hasITextHandlers) { + canvas._hasITextHandlers = true; + _this._initCanvasHandlers(canvas); + } + canvas._iTextInstances = canvas._iTextInstances || []; + canvas._iTextInstances.push(_this); + } + }); + }, + + initRemovedHandler: function() { + var _this = this; + this.on('removed', function() { + var canvas = _this.canvas; + if (canvas) { + canvas._iTextInstances = canvas._iTextInstances || []; + fabric.util.removeFromArray(canvas._iTextInstances, _this); + if (canvas._iTextInstances.length === 0) { + canvas._hasITextHandlers = false; + _this._removeCanvasHandlers(canvas); + } + } + }); + }, + + /** + * register canvas event to manage exiting on other instances + * @private + */ + _initCanvasHandlers: function(canvas) { + canvas._mouseUpITextHandler = function() { + if (canvas._iTextInstances) { + canvas._iTextInstances.forEach(function(obj) { + obj.__isMousedown = false; + }); + } + }; + canvas.on('mouse:up', canvas._mouseUpITextHandler); + }, + + /** + * remove canvas event to manage exiting on other instances + * @private + */ + _removeCanvasHandlers: function(canvas) { + canvas.off('mouse:up', canvas._mouseUpITextHandler); + }, + + /** + * @private + */ + _tick: function() { + this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete'); + }, + + /** + * @private + */ + _animateCursor: function(obj, targetOpacity, duration, completeMethod) { + + var tickState; + + tickState = { + isAborted: false, + abort: function() { + this.isAborted = true; + }, + }; + + obj.animate('_currentCursorOpacity', targetOpacity, { + duration: duration, + onComplete: function() { + if (!tickState.isAborted) { + obj[completeMethod](); + } + }, + onChange: function() { + // we do not want to animate a selection, only cursor + if (obj.canvas && obj.selectionStart === obj.selectionEnd) { + obj.renderCursorOrSelection(); + } + }, + abort: function() { + return tickState.isAborted; + } + }); + return tickState; + }, + + /** + * @private + */ + _onTickComplete: function() { + + var _this = this; + + if (this._cursorTimeout1) { + clearTimeout(this._cursorTimeout1); + } + this._cursorTimeout1 = setTimeout(function() { + _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick'); + }, 100); + }, + + /** + * Initializes delayed cursor + */ + initDelayedCursor: function(restart) { + var _this = this, + delay = restart ? 0 : this.cursorDelay; + + this.abortCursorAnimation(); + this._currentCursorOpacity = 1; + this._cursorTimeout2 = setTimeout(function() { + _this._tick(); + }, delay); + }, + + /** + * Aborts cursor animation and clears all timeouts + */ + abortCursorAnimation: function() { + var shouldClear = this._currentTickState || this._currentTickCompleteState, + canvas = this.canvas; + this._currentTickState && this._currentTickState.abort(); + this._currentTickCompleteState && this._currentTickCompleteState.abort(); + + clearTimeout(this._cursorTimeout1); + clearTimeout(this._cursorTimeout2); + + this._currentCursorOpacity = 0; + // to clear just itext area we need to transform the context + // it may not be worth it + if (shouldClear && canvas) { + canvas.clearContext(canvas.contextTop || canvas.contextContainer); + } + + }, + + /** + * Selects entire text + * @return {fabric.IText} thisArg + * @chainable + */ + selectAll: function() { + this.selectionStart = 0; + this.selectionEnd = this._text.length; + this._fireSelectionChanged(); + this._updateTextarea(); + return this; + }, + + /** + * Returns selected text + * @return {String} + */ + getSelectedText: function() { + return this._text.slice(this.selectionStart, this.selectionEnd).join(''); + }, + + /** + * Find new selection index representing start of current word according to current selection index + * @param {Number} startFrom Current selection index + * @return {Number} New selection index + */ + findWordBoundaryLeft: function(startFrom) { + var offset = 0, index = startFrom - 1; + + // remove space before cursor first + if (this._reSpace.test(this._text[index])) { + while (this._reSpace.test(this._text[index])) { + offset++; + index--; + } + } + while (/\S/.test(this._text[index]) && index > -1) { + offset++; + index--; + } + + return startFrom - offset; + }, + + /** + * Find new selection index representing end of current word according to current selection index + * @param {Number} startFrom Current selection index + * @return {Number} New selection index + */ + findWordBoundaryRight: function(startFrom) { + var offset = 0, index = startFrom; + + // remove space after cursor first + if (this._reSpace.test(this._text[index])) { + while (this._reSpace.test(this._text[index])) { + offset++; + index++; + } + } + while (/\S/.test(this._text[index]) && index < this._text.length) { + offset++; + index++; + } + + return startFrom + offset; + }, + + /** + * Find new selection index representing start of current line according to current selection index + * @param {Number} startFrom Current selection index + * @return {Number} New selection index + */ + findLineBoundaryLeft: function(startFrom) { + var offset = 0, index = startFrom - 1; + + while (!/\n/.test(this._text[index]) && index > -1) { + offset++; + index--; + } + + return startFrom - offset; + }, + + /** + * Find new selection index representing end of current line according to current selection index + * @param {Number} startFrom Current selection index + * @return {Number} New selection index + */ + findLineBoundaryRight: function(startFrom) { + var offset = 0, index = startFrom; + + while (!/\n/.test(this._text[index]) && index < this._text.length) { + offset++; + index++; + } + + return startFrom + offset; + }, + + /** + * Finds index corresponding to beginning or end of a word + * @param {Number} selectionStart Index of a character + * @param {Number} direction 1 or -1 + * @return {Number} Index of the beginning or end of a word + */ + searchWordBoundary: function(selectionStart, direction) { + var text = this._text, + index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart, + _char = text[index], + // wrong + reNonWord = fabric.reNonWord; + + while (!reNonWord.test(_char) && index > 0 && index < text.length) { + index += direction; + _char = text[index]; + } + if (reNonWord.test(_char)) { + index += direction === 1 ? 0 : 1; + } + return index; + }, + + /** + * Selects a word based on the index + * @param {Number} selectionStart Index of a character + */ + selectWord: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; + var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */ + newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */ + + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); + this.renderCursorOrSelection(); + }, + + /** + * Selects a line based on the index + * @param {Number} selectionStart Index of a character + * @return {fabric.IText} thisArg + * @chainable + */ + selectLine: function(selectionStart) { + selectionStart = selectionStart || this.selectionStart; + var newSelectionStart = this.findLineBoundaryLeft(selectionStart), + newSelectionEnd = this.findLineBoundaryRight(selectionStart); + + this.selectionStart = newSelectionStart; + this.selectionEnd = newSelectionEnd; + this._fireSelectionChanged(); + this._updateTextarea(); + return this; + }, + + /** + * Enters editing state + * @return {fabric.IText} thisArg + * @chainable + */ + enterEditing: function(e) { + if (this.isEditing || !this.editable) { + return; + } + + if (this.canvas) { + this.canvas.calcOffset(); + this.exitEditingOnOthers(this.canvas); + } + + this.isEditing = true; + + this.initHiddenTextarea(e); + this.hiddenTextarea.focus(); + this.hiddenTextarea.value = this.text; + this._updateTextarea(); + this._saveEditingProps(); + this._setEditingProps(); + this._textBeforeEdit = this.text; + + this._tick(); + this.fire('editing:entered'); + this._fireSelectionChanged(); + if (!this.canvas) { + return this; + } + this.canvas.fire('text:editing:entered', { target: this }); + this.initMouseMoveHandler(); + this.canvas.requestRenderAll(); + return this; + }, + + exitEditingOnOthers: function(canvas) { + if (canvas._iTextInstances) { + canvas._iTextInstances.forEach(function(obj) { + obj.selected = false; + if (obj.isEditing) { + obj.exitEditing(); + } + }); + } + }, + + /** + * Initializes "mousemove" event handler + */ + initMouseMoveHandler: function() { + this.canvas.on('mouse:move', this.mouseMoveHandler); + }, + + /** + * @private + */ + mouseMoveHandler: function(options) { + if (!this.__isMousedown || !this.isEditing) { + return; + } + + var newSelectionStart = this.getSelectionStartFromPointer(options.e), + currentStart = this.selectionStart, + currentEnd = this.selectionEnd; + if ( + (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd) + && + (currentStart === newSelectionStart || currentEnd === newSelectionStart) + ) { + return; + } + if (newSelectionStart > this.__selectionStartOnMouseDown) { + this.selectionStart = this.__selectionStartOnMouseDown; + this.selectionEnd = newSelectionStart; + } + else { + this.selectionStart = newSelectionStart; + this.selectionEnd = this.__selectionStartOnMouseDown; + } + if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) { + this.restartCursorIfNeeded(); + this._fireSelectionChanged(); + this._updateTextarea(); + this.renderCursorOrSelection(); + } + }, + + /** + * @private + */ + _setEditingProps: function() { + this.hoverCursor = 'text'; + + if (this.canvas) { + this.canvas.defaultCursor = this.canvas.moveCursor = 'text'; + } + + this.borderColor = this.editingBorderColor; + this.hasControls = this.selectable = false; + this.lockMovementX = this.lockMovementY = true; + }, + + /** + * convert from textarea to grapheme indexes + */ + fromStringToGraphemeSelection: function(start, end, text) { + var smallerTextStart = text.slice(0, start), + graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length; + if (start === end) { + return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; + } + var smallerTextEnd = text.slice(start, end), + graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length; + return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; + }, + + /** + * convert from fabric to textarea values + */ + fromGraphemeToStringSelection: function(start, end, _text) { + var smallerTextStart = _text.slice(0, start), + graphemeStart = smallerTextStart.join('').length; + if (start === end) { + return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; + } + var smallerTextEnd = _text.slice(start, end), + graphemeEnd = smallerTextEnd.join('').length; + return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; + }, + + /** + * @private + */ + _updateTextarea: function() { + this.cursorOffsetCache = { }; + if (!this.hiddenTextarea) { + return; + } + if (!this.inCompositionMode) { + var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text); + this.hiddenTextarea.selectionStart = newSelection.selectionStart; + this.hiddenTextarea.selectionEnd = newSelection.selectionEnd; + } + this.updateTextareaPosition(); + }, + + /** + * @private + */ + updateFromTextArea: function() { + if (!this.hiddenTextarea) { + return; + } + this.cursorOffsetCache = { }; + this.text = this.hiddenTextarea.value; + if (this._shouldClearDimensionCache()) { + this.initDimensions(); + this.setCoords(); + } + var newSelection = this.fromStringToGraphemeSelection( + this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value); + this.selectionEnd = this.selectionStart = newSelection.selectionEnd; + if (!this.inCompositionMode) { + this.selectionStart = newSelection.selectionStart; + } + this.updateTextareaPosition(); + }, + + /** + * @private + */ + updateTextareaPosition: function() { + if (this.selectionStart === this.selectionEnd) { + var style = this._calcTextareaPosition(); + this.hiddenTextarea.style.left = style.left; + this.hiddenTextarea.style.top = style.top; + } + }, + + /** + * @private + * @return {Object} style contains style for hiddenTextarea + */ + _calcTextareaPosition: function() { + if (!this.canvas) { + return { x: 1, y: 1 }; + } + var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart, + boundaries = this._getCursorBoundaries(desiredPosition), + cursorLocation = this.get2DCursorLocation(desiredPosition), + lineIndex = cursorLocation.lineIndex, + charIndex = cursorLocation.charIndex, + charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight, + leftOffset = boundaries.leftOffset, + m = this.calcTransformMatrix(), + p = { + x: boundaries.left + leftOffset, + y: boundaries.top + boundaries.topOffset + charHeight + }, + retinaScaling = this.canvas.getRetinaScaling(), + upperCanvas = this.canvas.upperCanvasEl, + upperCanvasWidth = upperCanvas.width / retinaScaling, + upperCanvasHeight = upperCanvas.height / retinaScaling, + maxWidth = upperCanvasWidth - charHeight, + maxHeight = upperCanvasHeight - charHeight, + scaleX = upperCanvas.clientWidth / upperCanvasWidth, + scaleY = upperCanvas.clientHeight / upperCanvasHeight; + + p = fabric.util.transformPoint(p, m); + p = fabric.util.transformPoint(p, this.canvas.viewportTransform); + p.x *= scaleX; + p.y *= scaleY; + if (p.x < 0) { + p.x = 0; + } + if (p.x > maxWidth) { + p.x = maxWidth; + } + if (p.y < 0) { + p.y = 0; + } + if (p.y > maxHeight) { + p.y = maxHeight; + } + + // add canvas offset on document + p.x += this.canvas._offset.left; + p.y += this.canvas._offset.top; + + return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight }; + }, + + /** + * @private + */ + _saveEditingProps: function() { + this._savedProps = { + hasControls: this.hasControls, + borderColor: this.borderColor, + lockMovementX: this.lockMovementX, + lockMovementY: this.lockMovementY, + hoverCursor: this.hoverCursor, + selectable: this.selectable, + defaultCursor: this.canvas && this.canvas.defaultCursor, + moveCursor: this.canvas && this.canvas.moveCursor + }; + }, + + /** + * @private + */ + _restoreEditingProps: function() { + if (!this._savedProps) { + return; + } + + this.hoverCursor = this._savedProps.hoverCursor; + this.hasControls = this._savedProps.hasControls; + this.borderColor = this._savedProps.borderColor; + this.selectable = this._savedProps.selectable; + this.lockMovementX = this._savedProps.lockMovementX; + this.lockMovementY = this._savedProps.lockMovementY; + + if (this.canvas) { + this.canvas.defaultCursor = this._savedProps.defaultCursor; + this.canvas.moveCursor = this._savedProps.moveCursor; + } + }, + + /** + * Exits from editing state + * @return {fabric.IText} thisArg + * @chainable + */ + exitEditing: function() { + var isTextChanged = (this._textBeforeEdit !== this.text); + var hiddenTextarea = this.hiddenTextarea; + this.selected = false; + this.isEditing = false; + + this.selectionEnd = this.selectionStart; + + if (hiddenTextarea) { + hiddenTextarea.blur && hiddenTextarea.blur(); + hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea); + } + this.hiddenTextarea = null; + this.abortCursorAnimation(); + this._restoreEditingProps(); + this._currentCursorOpacity = 0; + if (this._shouldClearDimensionCache()) { + this.initDimensions(); + this.setCoords(); + } + this.fire('editing:exited'); + isTextChanged && this.fire('modified'); + if (this.canvas) { + this.canvas.off('mouse:move', this.mouseMoveHandler); + this.canvas.fire('text:editing:exited', { target: this }); + isTextChanged && this.canvas.fire('object:modified', { target: this }); + } + return this; + }, + + /** + * @private + */ + _removeExtraneousStyles: function() { + for (var prop in this.styles) { + if (!this._textLines[prop]) { + delete this.styles[prop]; + } + } + }, + + /** + * remove and reflow a style block from start to end. + * @param {Number} start linear start position for removal (included in removal) + * @param {Number} end linear end position for removal ( excluded from removal ) + */ + removeStyleFromTo: function(start, end) { + var cursorStart = this.get2DCursorLocation(start, true), + cursorEnd = this.get2DCursorLocation(end, true), + lineStart = cursorStart.lineIndex, + charStart = cursorStart.charIndex, + lineEnd = cursorEnd.lineIndex, + charEnd = cursorEnd.charIndex, + i, styleObj; + if (lineStart !== lineEnd) { + // step1 remove the trailing of lineStart + if (this.styles[lineStart]) { + for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) { + delete this.styles[lineStart][i]; + } + } + // step2 move the trailing of lineEnd to lineStart if needed + if (this.styles[lineEnd]) { + for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) { + styleObj = this.styles[lineEnd][i]; + if (styleObj) { + this.styles[lineStart] || (this.styles[lineStart] = { }); + this.styles[lineStart][charStart + i - charEnd] = styleObj; + } + } + } + // step3 detects lines will be completely removed. + for (i = lineStart + 1; i <= lineEnd; i++) { + delete this.styles[i]; + } + // step4 shift remaining lines. + this.shiftLineStyles(lineEnd, lineStart - lineEnd); + } + else { + // remove and shift left on the same line + if (this.styles[lineStart]) { + styleObj = this.styles[lineStart]; + var diff = charEnd - charStart, numericChar, _char; + for (i = charStart; i < charEnd; i++) { + delete styleObj[i]; + } + for (_char in this.styles[lineStart]) { + numericChar = parseInt(_char, 10); + if (numericChar >= charEnd) { + styleObj[numericChar - diff] = styleObj[_char]; + delete styleObj[_char]; + } + } + } + } + }, + + /** + * Shifts line styles up or down + * @param {Number} lineIndex Index of a line + * @param {Number} offset Can any number? + */ + shiftLineStyles: function(lineIndex, offset) { + // shift all line styles by offset upward or downward + // do not clone deep. we need new array, not new style objects + var clonedStyles = clone(this.styles); + for (var line in this.styles) { + var numericLine = parseInt(line, 10); + if (numericLine > lineIndex) { + this.styles[numericLine + offset] = clonedStyles[numericLine]; + if (!clonedStyles[numericLine - offset]) { + delete this.styles[numericLine]; + } + } + } + }, + + restartCursorIfNeeded: function() { + if (!this._currentTickState || this._currentTickState.isAborted + || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted + ) { + this.initDelayedCursor(); + } + }, + + /** + * Handle insertion of more consecutive style lines for when one or more + * newlines gets added to the text. Since current style needs to be shifted + * first we shift the current style of the number lines needed, then we add + * new lines from the last to the first. + * @param {Number} lineIndex Index of a line + * @param {Number} charIndex Index of a char + * @param {Number} qty number of lines to add + * @param {Array} copiedStyle Array of objects styles + */ + insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) { + var currentCharStyle, + newLineStyles = {}, + somethingAdded = false, + isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex; + + qty || (qty = 1); + this.shiftLineStyles(lineIndex, qty); + if (this.styles[lineIndex]) { + currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]; + } + // we clone styles of all chars + // after cursor onto the current line + for (var index in this.styles[lineIndex]) { + var numIndex = parseInt(index, 10); + if (numIndex >= charIndex) { + somethingAdded = true; + newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index]; + // remove lines from the previous line since they're on a new line now + if (!(isEndOfLine && charIndex === 0)) { + delete this.styles[lineIndex][index]; + } + } + } + var styleCarriedOver = false; + if (somethingAdded && !isEndOfLine) { + // if is end of line, the extra style we copied + // is probably not something we want + this.styles[lineIndex + qty] = newLineStyles; + styleCarriedOver = true; + } + if (styleCarriedOver) { + // skip the last line of since we already prepared it. + qty--; + } + // for the all the lines or all the other lines + // we clone current char style onto the next (otherwise empty) line + while (qty > 0) { + if (copiedStyle && copiedStyle[qty - 1]) { + this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) }; + } + else if (currentCharStyle) { + this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) }; + } + else { + delete this.styles[lineIndex + qty]; + } + qty--; + } + this._forceClearCache = true; + }, + + /** + * Inserts style object for a given line/char index + * @param {Number} lineIndex Index of a line + * @param {Number} charIndex Index of a char + * @param {Number} quantity number Style object to insert, if given + * @param {Array} copiedStyle array of style objects + */ + insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) { + if (!this.styles) { + this.styles = {}; + } + var currentLineStyles = this.styles[lineIndex], + currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {}; + + quantity || (quantity = 1); + // shift all char styles by quantity forward + // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4 + for (var index in currentLineStylesCloned) { + var numericIndex = parseInt(index, 10); + if (numericIndex >= charIndex) { + currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex]; + // only delete the style if there was nothing moved there + if (!currentLineStylesCloned[numericIndex - quantity]) { + delete currentLineStyles[numericIndex]; + } + } + } + this._forceClearCache = true; + if (copiedStyle) { + while (quantity--) { + if (!Object.keys(copiedStyle[quantity]).length) { + continue; + } + if (!this.styles[lineIndex]) { + this.styles[lineIndex] = {}; + } + this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]); + } + return; + } + if (!currentLineStyles) { + return; + } + var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1]; + while (newStyle && quantity--) { + this.styles[lineIndex][charIndex + quantity] = clone(newStyle); + } + }, + + /** + * Inserts style object(s) + * @param {Array} insertedText Characters at the location where style is inserted + * @param {Number} start cursor index for inserting style + * @param {Array} [copiedStyle] array of style objects to insert. + */ + insertNewStyleBlock: function(insertedText, start, copiedStyle) { + var cursorLoc = this.get2DCursorLocation(start, true), + addedLines = [0], linesLength = 0; + // get an array of how many char per lines are being added. + for (var i = 0; i < insertedText.length; i++) { + if (insertedText[i] === '\n') { + linesLength++; + addedLines[linesLength] = 0; + } + else { + addedLines[linesLength]++; + } + } + // for the first line copy the style from the current char position. + if (addedLines[0] > 0) { + this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle); + copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1); + } + linesLength && this.insertNewlineStyleObject( + cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength); + for (var i = 1; i < linesLength; i++) { + if (addedLines[i] > 0) { + this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); + } + else if (copiedStyle) { + // this test is required in order to close #6841 + // when a pasted buffer begins with a newline then + // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0] + // may be undefined for some reason + if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) { + this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0]; + } + } + copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1); + } + // we use i outside the loop to get it like linesLength + if (addedLines[i] > 0) { + this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); + } + }, + + /** + * Set the selectionStart and selectionEnd according to the new position of cursor + * mimic the key - mouse navigation when shift is pressed. + */ + setSelectionStartEndWithShift: function(start, end, newSelection) { + if (newSelection <= start) { + if (end === start) { + this._selectionDirection = 'left'; + } + else if (this._selectionDirection === 'right') { + this._selectionDirection = 'left'; + this.selectionEnd = start; + } + this.selectionStart = newSelection; + } + else if (newSelection > start && newSelection < end) { + if (this._selectionDirection === 'right') { + this.selectionEnd = newSelection; + } + else { + this.selectionStart = newSelection; + } + } + else { + // newSelection is > selection start and end + if (end === start) { + this._selectionDirection = 'right'; + } + else if (this._selectionDirection === 'left') { + this._selectionDirection = 'right'; + this.selectionStart = end; + } + this.selectionEnd = newSelection; + } + }, + + setSelectionInBoundaries: function() { + var length = this.text.length; + if (this.selectionStart > length) { + this.selectionStart = length; + } + else if (this.selectionStart < 0) { + this.selectionStart = 0; + } + if (this.selectionEnd > length) { + this.selectionEnd = length; + } + else if (this.selectionEnd < 0) { + this.selectionEnd = 0; + } + } + }); +})(); +fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { + /** + * Initializes "dbclick" event handler + */ + initDoubleClickSimulation: function() { + + // for double click + this.__lastClickTime = +new Date(); + + // for triple click + this.__lastLastClickTime = +new Date(); + + this.__lastPointer = { }; + + this.on('mousedown', this.onMouseDown); + }, + + /** + * Default event handler to simulate triple click + * @private + */ + onMouseDown: function(options) { + if (!this.canvas) { + return; + } + this.__newClickTime = +new Date(); + var newPointer = options.pointer; + if (this.isTripleClick(newPointer)) { + this.fire('tripleclick', options); + this._stopEvent(options.e); + } + this.__lastLastClickTime = this.__lastClickTime; + this.__lastClickTime = this.__newClickTime; + this.__lastPointer = newPointer; + this.__lastIsEditing = this.isEditing; + this.__lastSelected = this.selected; + }, + + isTripleClick: function(newPointer) { + return this.__newClickTime - this.__lastClickTime < 500 && + this.__lastClickTime - this.__lastLastClickTime < 500 && + this.__lastPointer.x === newPointer.x && + this.__lastPointer.y === newPointer.y; + }, + + /** + * @private + */ + _stopEvent: function(e) { + e.preventDefault && e.preventDefault(); + e.stopPropagation && e.stopPropagation(); + }, + + /** + * Initializes event handlers related to cursor or selection + */ + initCursorSelectionHandlers: function() { + this.initMousedownHandler(); + this.initMouseupHandler(); + this.initClicks(); + }, + + /** + * Default handler for double click, select a word + */ + doubleClickHandler: function(options) { + if (!this.isEditing) { + return; + } + this.selectWord(this.getSelectionStartFromPointer(options.e)); + }, + + /** + * Default handler for triple click, select a line + */ + tripleClickHandler: function(options) { + if (!this.isEditing) { + return; + } + this.selectLine(this.getSelectionStartFromPointer(options.e)); + }, + + /** + * Initializes double and triple click event handlers + */ + initClicks: function() { + this.on('mousedblclick', this.doubleClickHandler); + this.on('tripleclick', this.tripleClickHandler); + }, + + /** + * Default event handler for the basic functionalities needed on _mouseDown + * can be overridden to do something different. + * Scope of this implementation is: find the click position, set selectionStart + * find selectionEnd, initialize the drawing of either cursor or selection area + * initializing a mousedDown on a text area will cancel fabricjs knowledge of + * current compositionMode. It will be set to false. + */ + _mouseDownHandler: function(options) { + if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { + return; + } + + this.__isMousedown = true; + + if (this.selected) { + this.inCompositionMode = false; + this.setCursorByClick(options.e); + } + + if (this.isEditing) { + this.__selectionStartOnMouseDown = this.selectionStart; + if (this.selectionStart === this.selectionEnd) { + this.abortCursorAnimation(); + } + this.renderCursorOrSelection(); + } + }, + + /** + * Default event handler for the basic functionalities needed on mousedown:before + * can be overridden to do something different. + * Scope of this implementation is: verify the object is already selected when mousing down + */ + _mouseDownHandlerBefore: function(options) { + if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { + return; + } + // we want to avoid that an object that was selected and then becomes unselectable, + // may trigger editing mode in some way. + this.selected = this === this.canvas._activeObject; + }, + + /** + * Initializes "mousedown" event handler + */ + initMousedownHandler: function() { + this.on('mousedown', this._mouseDownHandler); + this.on('mousedown:before', this._mouseDownHandlerBefore); + }, + + /** + * Initializes "mouseup" event handler + */ + initMouseupHandler: function() { + this.on('mouseup', this.mouseUpHandler); + }, + + /** + * standard handler for mouse up, overridable + * @private + */ + mouseUpHandler: function(options) { + this.__isMousedown = false; + if (!this.editable || this.group || + (options.transform && options.transform.actionPerformed) || + (options.e.button && options.e.button !== 1)) { + return; + } + + if (this.canvas) { + var currentActive = this.canvas._activeObject; + if (currentActive && currentActive !== this) { + // avoid running this logic when there is an active object + // this because is possible with shift click and fast clicks, + // to rapidly deselect and reselect this object and trigger an enterEdit + return; + } + } + + if (this.__lastSelected && !this.__corner) { + this.selected = false; + this.__lastSelected = false; + this.enterEditing(options.e); + if (this.selectionStart === this.selectionEnd) { + this.initDelayedCursor(true); + } + else { + this.renderCursorOrSelection(); + } + } + else { + this.selected = true; + } + }, + + /** + * Changes cursor location in a text depending on passed pointer (x/y) object + * @param {Event} e Event object + */ + setCursorByClick: function(e) { + var newSelection = this.getSelectionStartFromPointer(e), + start = this.selectionStart, end = this.selectionEnd; + if (e.shiftKey) { + this.setSelectionStartEndWithShift(start, end, newSelection); + } + else { + this.selectionStart = newSelection; + this.selectionEnd = newSelection; + } + if (this.isEditing) { + this._fireSelectionChanged(); + this._updateTextarea(); + } + }, + + /** + * Returns index of a character corresponding to where an object was clicked + * @param {Event} e Event object + * @return {Number} Index of a character + */ + getSelectionStartFromPointer: function(e) { + var mouseOffset = this.getLocalPointer(e), + prevWidth = 0, + width = 0, + height = 0, + charIndex = 0, + lineIndex = 0, + lineLeftOffset, + line; + for (var i = 0, len = this._textLines.length; i < len; i++) { + if (height <= mouseOffset.y) { + height += this.getHeightOfLine(i) * this.scaleY; + lineIndex = i; + if (i > 0) { + charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1); + } + } + else { + break; + } + } + lineLeftOffset = this._getLineLeftOffset(lineIndex); + width = lineLeftOffset * this.scaleX; + line = this._textLines[lineIndex]; + // handling of RTL: in order to get things work correctly, + // we assume RTL writing is mirrored compared to LTR writing. + // so in position detection we mirror the X offset, and when is time + // of rendering it, we mirror it again. + if (this.direction === 'rtl') { + mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width; + } + for (var j = 0, jlen = line.length; j < jlen; j++) { + prevWidth = width; + // i removed something about flipX here, check. + width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX; + if (width <= mouseOffset.x) { + charIndex++; + } + else { + break; + } + } + return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen); + }, + + /** + * @private + */ + _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) { + // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0 + var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth, + distanceBtwNextCharAndCursor = width - mouseOffset.x, + offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor || + distanceBtwNextCharAndCursor < 0 ? 0 : 1, + newSelectionStart = index + offset; + // if object is horizontally flipped, mirror cursor location from the end + if (this.flipX) { + newSelectionStart = jlen - newSelectionStart; + } + + if (newSelectionStart > this._text.length) { + newSelectionStart = this._text.length; + } + + return newSelectionStart; + } +}); +fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { + + /** + * Initializes hidden textarea (needed to bring up keyboard in iOS) + */ + initHiddenTextarea: function() { + this.hiddenTextarea = fabric.document.createElement('textarea'); + this.hiddenTextarea.setAttribute('autocapitalize', 'off'); + this.hiddenTextarea.setAttribute('autocorrect', 'off'); + this.hiddenTextarea.setAttribute('autocomplete', 'off'); + this.hiddenTextarea.setAttribute('spellcheck', 'false'); + this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', ''); + this.hiddenTextarea.setAttribute('wrap', 'off'); + var style = this._calcTextareaPosition(); + // line-height: 1px; was removed from the style to fix this: + // https://bugs.chromium.org/p/chromium/issues/detail?id=870966 + this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top + + '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' + + ' paddingーtop: ' + style.fontSize + ';'; + + if (this.hiddenTextareaContainer) { + this.hiddenTextareaContainer.appendChild(this.hiddenTextarea); + } + else { + fabric.document.body.appendChild(this.hiddenTextarea); + } + + fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this)); + fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this)); + + if (!this._clickHandlerInitialized && this.canvas) { + fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this)); + this._clickHandlerInitialized = true; + } + }, + + /** + * For functionalities on keyDown + * Map a special key to a function of the instance/prototype + * If you need different behaviour for ESC or TAB or arrows, you have to change + * this map setting the name of a function that you build on the fabric.Itext or + * your prototype. + * the map change will affect all Instances unless you need for only some text Instances + * in that case you have to clone this object and assign your Instance. + * this.keysMap = fabric.util.object.clone(this.keysMap); + * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0] + */ + keysMap: { + 9: 'exitEditing', + 27: 'exitEditing', + 33: 'moveCursorUp', + 34: 'moveCursorDown', + 35: 'moveCursorRight', + 36: 'moveCursorLeft', + 37: 'moveCursorLeft', + 38: 'moveCursorUp', + 39: 'moveCursorRight', + 40: 'moveCursorDown', + }, + + keysMapRtl: { + 9: 'exitEditing', + 27: 'exitEditing', + 33: 'moveCursorUp', + 34: 'moveCursorDown', + 35: 'moveCursorLeft', + 36: 'moveCursorRight', + 37: 'moveCursorRight', + 38: 'moveCursorUp', + 39: 'moveCursorLeft', + 40: 'moveCursorDown', + }, + + /** + * For functionalities on keyUp + ctrl || cmd + */ + ctrlKeysMapUp: { + 67: 'copy', + 88: 'cut' + }, + + /** + * For functionalities on keyDown + ctrl || cmd + */ + ctrlKeysMapDown: { + 65: 'selectAll' + }, + + onClick: function() { + // No need to trigger click event here, focus is enough to have the keyboard appear on Android + this.hiddenTextarea && this.hiddenTextarea.focus(); + }, + + /** + * Handles keydown event + * only used for arrows and combination of modifier keys. + * @param {Event} e Event object + */ + onKeyDown: function(e) { + if (!this.isEditing) { + return; + } + var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap; + if (e.keyCode in keyMap) { + this[keyMap[e.keyCode]](e); + } + else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) { + this[this.ctrlKeysMapDown[e.keyCode]](e); + } + else { + return; + } + e.stopImmediatePropagation(); + e.preventDefault(); + if (e.keyCode >= 33 && e.keyCode <= 40) { + // if i press an arrow key just update selection + this.inCompositionMode = false; + this.clearContextTop(); + this.renderCursorOrSelection(); + } + else { + this.canvas && this.canvas.requestRenderAll(); + } + }, + + /** + * Handles keyup event + * We handle KeyUp because ie11 and edge have difficulties copy/pasting + * if a copy/cut event fired, keyup is dismissed + * @param {Event} e Event object + */ + onKeyUp: function(e) { + if (!this.isEditing || this._copyDone || this.inCompositionMode) { + this._copyDone = false; + return; + } + if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) { + this[this.ctrlKeysMapUp[e.keyCode]](e); + } + else { + return; + } + e.stopImmediatePropagation(); + e.preventDefault(); + this.canvas && this.canvas.requestRenderAll(); + }, + + /** + * Handles onInput event + * @param {Event} e Event object + */ + onInput: function(e) { + var fromPaste = this.fromPaste; + this.fromPaste = false; + e && e.stopPropagation(); + if (!this.isEditing) { + return; + } + // decisions about style changes. + var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText, + charCount = this._text.length, + nextCharCount = nextText.length, + removedText, insertedText, + charDiff = nextCharCount - charCount, + selectionStart = this.selectionStart, selectionEnd = this.selectionEnd, + selection = selectionStart !== selectionEnd, + copiedStyle, removeFrom, removeTo; + if (this.hiddenTextarea.value === '') { + this.styles = { }; + this.updateFromTextArea(); + this.fire('changed'); + if (this.canvas) { + this.canvas.fire('text:changed', { target: this }); + this.canvas.requestRenderAll(); + } + return; + } + + var textareaSelection = this.fromStringToGraphemeSelection( + this.hiddenTextarea.selectionStart, + this.hiddenTextarea.selectionEnd, + this.hiddenTextarea.value + ); + var backDelete = selectionStart > textareaSelection.selectionStart; + + if (selection) { + removedText = this._text.slice(selectionStart, selectionEnd); + charDiff += selectionEnd - selectionStart; + } + else if (nextCharCount < charCount) { + if (backDelete) { + removedText = this._text.slice(selectionEnd + charDiff, selectionEnd); + } + else { + removedText = this._text.slice(selectionStart, selectionStart - charDiff); + } + } + insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd); + if (removedText && removedText.length) { + if (insertedText.length) { + // let's copy some style before deleting. + // we want to copy the style before the cursor OR the style at the cursor if selection + // is bigger than 0. + copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false); + // now duplicate the style one for each inserted text. + copiedStyle = insertedText.map(function() { + // this return an array of references, but that is fine since we are + // copying the style later. + return copiedStyle[0]; + }); + } + if (selection) { + removeFrom = selectionStart; + removeTo = selectionEnd; + } + else if (backDelete) { + // detect differences between forwardDelete and backDelete + removeFrom = selectionEnd - removedText.length; + removeTo = selectionEnd; + } + else { + removeFrom = selectionEnd; + removeTo = selectionEnd + removedText.length; + } + this.removeStyleFromTo(removeFrom, removeTo); + } + if (insertedText.length) { + if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) { + copiedStyle = fabric.copiedTextStyle; + } + this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle); + } + this.updateFromTextArea(); + this.fire('changed'); + if (this.canvas) { + this.canvas.fire('text:changed', { target: this }); + this.canvas.requestRenderAll(); + } + }, + /** + * Composition start + */ + onCompositionStart: function() { + this.inCompositionMode = true; + }, + + /** + * Composition end + */ + onCompositionEnd: function() { + this.inCompositionMode = false; + }, + + // /** + // * Composition update + // */ + onCompositionUpdate: function(e) { + this.compositionStart = e.target.selectionStart; + this.compositionEnd = e.target.selectionEnd; + this.updateTextareaPosition(); + }, + + /** + * Copies selected text + * @param {Event} e Event object + */ + copy: function() { + if (this.selectionStart === this.selectionEnd) { + //do not cut-copy if no selection + return; + } + + fabric.copiedText = this.getSelectedText(); + if (!fabric.disableStyleCopyPaste) { + fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true); + } + else { + fabric.copiedTextStyle = null; + } + this._copyDone = true; + }, + + /** + * Pastes text + * @param {Event} e Event object + */ + paste: function() { + this.fromPaste = true; + }, + + /** + * @private + * @param {Event} e Event object + * @return {Object} Clipboard data object + */ + _getClipboardData: function(e) { + return (e && e.clipboardData) || fabric.window.clipboardData; + }, + + /** + * Finds the width in pixels before the cursor on the same line + * @private + * @param {Number} lineIndex + * @param {Number} charIndex + * @return {Number} widthBeforeCursor width before cursor + */ + _getWidthBeforeCursor: function(lineIndex, charIndex) { + var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound; + + if (charIndex > 0) { + bound = this.__charBounds[lineIndex][charIndex - 1]; + widthBeforeCursor += bound.left + bound.width; + } + return widthBeforeCursor; + }, + + /** + * Gets start offset of a selection + * @param {Event} e Event object + * @param {Boolean} isRight + * @return {Number} + */ + getDownCursorOffset: function(e, isRight) { + var selectionProp = this._getSelectionForOffset(e, isRight), + cursorLocation = this.get2DCursorLocation(selectionProp), + lineIndex = cursorLocation.lineIndex; + // if on last line, down cursor goes to end of line + if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) { + // move to the end of a text + return this._text.length - selectionProp; + } + var charIndex = cursorLocation.charIndex, + widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), + indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor), + textAfterCursor = this._textLines[lineIndex].slice(charIndex); + return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex); + }, + + /** + * private + * Helps finding if the offset should be counted from Start or End + * @param {Event} e Event object + * @param {Boolean} isRight + * @return {Number} + */ + _getSelectionForOffset: function(e, isRight) { + if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) { + return this.selectionEnd; + } + else { + return this.selectionStart; + } + }, + + /** + * @param {Event} e Event object + * @param {Boolean} isRight + * @return {Number} + */ + getUpCursorOffset: function(e, isRight) { + var selectionProp = this._getSelectionForOffset(e, isRight), + cursorLocation = this.get2DCursorLocation(selectionProp), + lineIndex = cursorLocation.lineIndex; + if (lineIndex === 0 || e.metaKey || e.keyCode === 33) { + // if on first line, up cursor goes to start of line + return -selectionProp; + } + var charIndex = cursorLocation.charIndex, + widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), + indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor), + textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex), + missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1); + // return a negative offset + return -this._textLines[lineIndex - 1].length + + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset); + }, + + /** + * for a given width it founds the matching character. + * @private + */ + _getIndexOnLine: function(lineIndex, width) { + + var line = this._textLines[lineIndex], + lineLeftOffset = this._getLineLeftOffset(lineIndex), + widthOfCharsOnLine = lineLeftOffset, + indexOnLine = 0, charWidth, foundMatch; + + for (var j = 0, jlen = line.length; j < jlen; j++) { + charWidth = this.__charBounds[lineIndex][j].width; + widthOfCharsOnLine += charWidth; + if (widthOfCharsOnLine > width) { + foundMatch = true; + var leftEdge = widthOfCharsOnLine - charWidth, + rightEdge = widthOfCharsOnLine, + offsetFromLeftEdge = Math.abs(leftEdge - width), + offsetFromRightEdge = Math.abs(rightEdge - width); + + indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1); + break; + } + } + + // reached end + if (!foundMatch) { + indexOnLine = line.length - 1; + } + + return indexOnLine; + }, + + + /** + * Moves cursor down + * @param {Event} e Event object + */ + moveCursorDown: function(e) { + if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { + return; + } + this._moveCursorUpOrDown('Down', e); + }, + + /** + * Moves cursor up + * @param {Event} e Event object + */ + moveCursorUp: function(e) { + if (this.selectionStart === 0 && this.selectionEnd === 0) { + return; + } + this._moveCursorUpOrDown('Up', e); + }, + + /** + * Moves cursor up or down, fires the events + * @param {String} direction 'Up' or 'Down' + * @param {Event} e Event object + */ + _moveCursorUpOrDown: function(direction, e) { + // getUpCursorOffset + // getDownCursorOffset + var action = 'get' + direction + 'CursorOffset', + offset = this[action](e, this._selectionDirection === 'right'); + if (e.shiftKey) { + this.moveCursorWithShift(offset); + } + else { + this.moveCursorWithoutShift(offset); + } + if (offset !== 0) { + this.setSelectionInBoundaries(); + this.abortCursorAnimation(); + this._currentCursorOpacity = 1; + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); + } + }, + + /** + * Moves cursor with shift + * @param {Number} offset + */ + moveCursorWithShift: function(offset) { + var newSelection = this._selectionDirection === 'left' + ? this.selectionStart + offset + : this.selectionEnd + offset; + this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection); + return offset !== 0; + }, + + /** + * Moves cursor up without shift + * @param {Number} offset + */ + moveCursorWithoutShift: function(offset) { + if (offset < 0) { + this.selectionStart += offset; + this.selectionEnd = this.selectionStart; + } + else { + this.selectionEnd += offset; + this.selectionStart = this.selectionEnd; + } + return offset !== 0; + }, + + /** + * Moves cursor left + * @param {Event} e Event object + */ + moveCursorLeft: function(e) { + if (this.selectionStart === 0 && this.selectionEnd === 0) { + return; + } + this._moveCursorLeftOrRight('Left', e); + }, + + /** + * @private + * @return {Boolean} true if a change happened + */ + _move: function(e, prop, direction) { + var newValue; + if (e.altKey) { + newValue = this['findWordBoundary' + direction](this[prop]); + } + else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { + newValue = this['findLineBoundary' + direction](this[prop]); + } + else { + this[prop] += direction === 'Left' ? -1 : 1; + return true; + } + if (typeof newValue !== undefined && this[prop] !== newValue) { + this[prop] = newValue; + return true; + } + }, + + /** + * @private + */ + _moveLeft: function(e, prop) { + return this._move(e, prop, 'Left'); + }, + + /** + * @private + */ + _moveRight: function(e, prop) { + return this._move(e, prop, 'Right'); + }, + + /** + * Moves cursor left without keeping selection + * @param {Event} e + */ + moveCursorLeftWithoutShift: function(e) { + var change = true; + this._selectionDirection = 'left'; + + // only move cursor when there is no selection, + // otherwise we discard it, and leave cursor on same place + if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) { + change = this._moveLeft(e, 'selectionStart'); + + } + this.selectionEnd = this.selectionStart; + return change; + }, + + /** + * Moves cursor left while keeping selection + * @param {Event} e + */ + moveCursorLeftWithShift: function(e) { + if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) { + return this._moveLeft(e, 'selectionEnd'); + } + else if (this.selectionStart !== 0){ + this._selectionDirection = 'left'; + return this._moveLeft(e, 'selectionStart'); + } + }, + + /** + * Moves cursor right + * @param {Event} e Event object + */ + moveCursorRight: function(e) { + if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { + return; + } + this._moveCursorLeftOrRight('Right', e); + }, + + /** + * Moves cursor right or Left, fires event + * @param {String} direction 'Left', 'Right' + * @param {Event} e Event object + */ + _moveCursorLeftOrRight: function(direction, e) { + var actionName = 'moveCursor' + direction + 'With'; + this._currentCursorOpacity = 1; + + if (e.shiftKey) { + actionName += 'Shift'; + } + else { + actionName += 'outShift'; + } + if (this[actionName](e)) { + this.abortCursorAnimation(); + this.initDelayedCursor(); + this._fireSelectionChanged(); + this._updateTextarea(); + } + }, + + /** + * Moves cursor right while keeping selection + * @param {Event} e + */ + moveCursorRightWithShift: function(e) { + if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) { + return this._moveRight(e, 'selectionStart'); + } + else if (this.selectionEnd !== this._text.length) { + this._selectionDirection = 'right'; + return this._moveRight(e, 'selectionEnd'); + } + }, + + /** + * Moves cursor right without keeping selection + * @param {Event} e Event object + */ + moveCursorRightWithoutShift: function(e) { + var changed = true; + this._selectionDirection = 'right'; + + if (this.selectionStart === this.selectionEnd) { + changed = this._moveRight(e, 'selectionStart'); + this.selectionEnd = this.selectionStart; + } + else { + this.selectionStart = this.selectionEnd; + } + return changed; + }, + + /** + * Removes characters from start/end + * start/end ar per grapheme position in _text array. + * + * @param {Number} start + * @param {Number} end default to start + 1 + */ + removeChars: function(start, end) { + if (typeof end === 'undefined') { + end = start + 1; + } + this.removeStyleFromTo(start, end); + this._text.splice(start, end - start); + this.text = this._text.join(''); + this.set('dirty', true); + if (this._shouldClearDimensionCache()) { + this.initDimensions(); + this.setCoords(); + } + this._removeExtraneousStyles(); + }, + + /** + * insert characters at start position, before start position. + * start equal 1 it means the text get inserted between actual grapheme 0 and 1 + * if style array is provided, it must be as the same length of text in graphemes + * if end is provided and is bigger than start, old text is replaced. + * start/end ar per grapheme position in _text array. + * + * @param {String} text text to insert + * @param {Array} style array of style objects + * @param {Number} start + * @param {Number} end default to start + 1 + */ + insertChars: function(text, style, start, end) { + if (typeof end === 'undefined') { + end = start; + } + if (end > start) { + this.removeStyleFromTo(start, end); + } + var graphemes = fabric.util.string.graphemeSplit(text); + this.insertNewStyleBlock(graphemes, start, style); + this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end)); + this.text = this._text.join(''); + this.set('dirty', true); + if (this._shouldClearDimensionCache()) { + this.initDimensions(); + this.setCoords(); + } + this._removeExtraneousStyles(); + }, + +}); +/* _TO_SVG_START_ */ +(function() { + var toFixed = fabric.util.toFixed, + multipleSpacesRegex = / +/g; + + fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { + + /** + * Returns SVG representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + _toSVG: function() { + var offsets = this._getSVGLeftTopOffsets(), + textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft); + return this._wrapSVGTextAndBg(textAndBg); + }, + + /** + * Returns svg representation of an instance + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + toSVG: function(reviver) { + return this._createBaseSVGMarkup( + this._toSVG(), + { reviver: reviver, noStyle: true, withShadow: true } + ); + }, + + /** + * @private + */ + _getSVGLeftTopOffsets: function() { + return { + textLeft: -this.width / 2, + textTop: -this.height / 2, + lineTop: this.getHeightOfLine(0) + }; + }, + + /** + * @private + */ + _wrapSVGTextAndBg: function(textAndBg) { + var noShadow = true, + textDecoration = this.getSvgTextDecoration(this); + return [ + textAndBg.textBgRects.join(''), + '\t\t', + textAndBg.textSpans.join(''), + '\n' + ]; + }, + + /** + * @private + * @param {Number} textTopOffset Text top offset + * @param {Number} textLeftOffset Text left offset + * @return {Object} + */ + _getSVGTextAndBg: function(textTopOffset, textLeftOffset) { + var textSpans = [], + textBgRects = [], + height = textTopOffset, lineOffset; + // bounding-box background + this._setSVGBg(textBgRects); + + // text and text-background + for (var i = 0, len = this._textLines.length; i < len; i++) { + lineOffset = this._getLineLeftOffset(i); + if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) { + this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height); + } + this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height); + height += this.getHeightOfLine(i); + } + + return { + textSpans: textSpans, + textBgRects: textBgRects + }; + }, + + /** + * @private + */ + _createTextCharSpan: function(_char, styleDecl, left, top) { + var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex), + styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace), + fillStyles = styleProps ? 'style="' + styleProps + '"' : '', + dy = styleDecl.deltaY, dySpan = '', + NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; + if (dy) { + dySpan = ' dy="' + toFixed(dy, NUM_FRACTION_DIGITS) + '" '; + } + return [ + '', + fabric.util.string.escapeXml(_char), + '' + ].join(''); + }, + + _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) { + // set proper line offset + var lineHeight = this.getHeightOfLine(lineIndex), + isJustify = this.textAlign.indexOf('justify') !== -1, + actualStyle, + nextStyle, + charsToRender = '', + charBox, style, + boxWidth = 0, + line = this._textLines[lineIndex], + timeToRender; + + textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight; + for (var i = 0, len = line.length - 1; i <= len; i++) { + timeToRender = i === len || this.charSpacing; + charsToRender += line[i]; + charBox = this.__charBounds[lineIndex][i]; + if (boxWidth === 0) { + textLeftOffset += charBox.kernedWidth - charBox.width; + boxWidth += charBox.width; + } + else { + boxWidth += charBox.kernedWidth; + } + if (isJustify && !timeToRender) { + if (this._reSpaceAndTab.test(line[i])) { + timeToRender = true; + } + } + if (!timeToRender) { + // if we have charSpacing, we render char by char + actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); + nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); + timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle); + } + if (timeToRender) { + style = this._getStyleDeclaration(lineIndex, i) || { }; + textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset)); + charsToRender = ''; + actualStyle = nextStyle; + textLeftOffset += boxWidth; + boxWidth = 0; + } + } + }, + + _pushTextBgRect: function(textBgRects, color, left, top, width, height) { + var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; + textBgRects.push( + '\t\t\n'); + }, + + _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) { + var line = this._textLines[i], + heightOfLine = this.getHeightOfLine(i) / this.lineHeight, + boxWidth = 0, + boxStart = 0, + charBox, currentColor, + lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); + for (var j = 0, jlen = line.length; j < jlen; j++) { + charBox = this.__charBounds[i][j]; + currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); + if (currentColor !== lastColor) { + lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart, + textTopOffset, boxWidth, heightOfLine); + boxStart = charBox.left; + boxWidth = charBox.width; + lastColor = currentColor; + } + else { + boxWidth += charBox.kernedWidth; + } + } + currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart, + textTopOffset, boxWidth, heightOfLine); + }, + + /** + * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values + * we work around it by "moving" alpha channel into opacity attribute and setting fill's alpha to 1 + * + * @private + * @param {*} value + * @return {String} + */ + _getFillAttributes: function(value) { + var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : ''; + if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) { + return 'fill="' + value + '"'; + } + return 'opacity="' + fillColor.getAlpha() + '" fill="' + fillColor.setAlpha(1).toRgb() + '"'; + }, + + /** + * @private + */ + _getSVGLineTopOffset: function(lineIndex) { + var lineTopOffset = 0, lastHeight = 0; + for (var j = 0; j < lineIndex; j++) { + lineTopOffset += this.getHeightOfLine(j); + } + lastHeight = this.getHeightOfLine(j); + return { + lineTop: lineTopOffset, + offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult) + }; + }, + + /** + * Returns styles-string for svg-export + * @param {Boolean} skipShadow a boolean to skip shadow filter output + * @return {String} + */ + getSvgStyles: function(skipShadow) { + var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow); + return svgStyle + ' white-space: pre;'; + }, + }); +})(); +/* _TO_SVG_END_ */ +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = {}); + + /** + * Textbox class, based on IText, allows the user to resize the text rectangle + * and wraps lines automatically. Textboxes have their Y scaling locked, the + * user can only change width. Height is adjusted automatically based on the + * wrapping of lines. + * @class fabric.Textbox + * @extends fabric.IText + * @mixes fabric.Observable + * @return {fabric.Textbox} thisArg + * @see {@link fabric.Textbox#initialize} for constructor definition + */ + fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, { + + /** + * Type of an object + * @type String + * @default + */ + type: 'textbox', + + /** + * Minimum width of textbox, in pixels. + * @type Number + * @default + */ + minWidth: 20, + + /** + * Minimum calculated width of a textbox, in pixels. + * fixed to 2 so that an empty textbox cannot go to 0 + * and is still selectable without text. + * @type Number + * @default + */ + dynamicMinWidth: 2, + + /** + * Cached array of text wrapping. + * @type Array + */ + __cachedLines: null, + + /** + * Override standard Object class values + */ + lockScalingFlip: true, + + /** + * Override standard Object class values + * Textbox needs this on false + */ + noScaleCache: false, + + /** + * Properties which when set cause object to change dimensions + * @type Object + * @private + */ + _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'), + + /** + * Use this regular expression to split strings in breakable lines + * @private + */ + _wordJoiners: /[ \t\r]/, + + /** + * Use this boolean property in order to split strings that have no white space concept. + * this is a cheap way to help with chinese/japanese + * @type Boolean + * @since 2.6.0 + */ + splitByGrapheme: false, + + /** + * Unlike superclass's version of this function, Textbox does not update + * its width. + * @private + * @override + */ + initDimensions: function() { + if (this.__skipDimension) { + return; + } + this.isEditing && this.initDelayedCursor(); + this.clearContextTop(); + this._clearCache(); + // clear dynamicMinWidth as it will be different after we re-wrap line + this.dynamicMinWidth = 0; + // wrap lines + this._styleMap = this._generateStyleMap(this._splitText()); + // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap + if (this.dynamicMinWidth > this.width) { + this._set('width', this.dynamicMinWidth); + } + if (this.textAlign.indexOf('justify') !== -1) { + // once text is measured we need to make space fatter to make justified text. + this.enlargeSpaces(); + } + // clear cache and re-calculate height + this.height = this.calcTextHeight(); + this.saveState({ propertySet: '_dimensionAffectingProps' }); + }, + + /** + * Generate an object that translates the style object so that it is + * broken up by visual lines (new lines and automatic wrapping). + * The original text styles object is broken up by actual lines (new lines only), + * which is only sufficient for Text / IText + * @private + */ + _generateStyleMap: function(textInfo) { + var realLineCount = 0, + realLineCharCount = 0, + charCount = 0, + map = {}; + + for (var i = 0; i < textInfo.graphemeLines.length; i++) { + if (textInfo.graphemeText[charCount] === '\n' && i > 0) { + realLineCharCount = 0; + charCount++; + realLineCount++; + } + else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) { + // this case deals with space's that are removed from end of lines when wrapping + realLineCharCount++; + charCount++; + } + + map[i] = { line: realLineCount, offset: realLineCharCount }; + + charCount += textInfo.graphemeLines[i].length; + realLineCharCount += textInfo.graphemeLines[i].length; + } + + return map; + }, + + /** + * Returns true if object has a style property or has it on a specified line + * @param {Number} lineIndex + * @return {Boolean} + */ + styleHas: function(property, lineIndex) { + if (this._styleMap && !this.isWrapping) { + var map = this._styleMap[lineIndex]; + if (map) { + lineIndex = map.line; + } + } + return fabric.Text.prototype.styleHas.call(this, property, lineIndex); + }, + + /** + * Returns true if object has no styling or no styling in a line + * @param {Number} lineIndex , lineIndex is on wrapped lines. + * @return {Boolean} + */ + isEmptyStyles: function(lineIndex) { + if (!this.styles) { + return true; + } + var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false, + map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1]; + if (map) { + lineIndex = map.line; + offset = map.offset; + } + if (mapNextLine) { + nextLineIndex = mapNextLine.line; + shouldLimit = nextLineIndex === lineIndex; + nextOffset = mapNextLine.offset; + } + obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; + for (var p1 in obj) { + for (var p2 in obj[p1]) { + if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) { + // eslint-disable-next-line no-unused-vars + for (var p3 in obj[p1][p2]) { + return false; + } + } + } + } + return true; + }, + + /** + * @param {Number} lineIndex + * @param {Number} charIndex + * @private + */ + _getStyleDeclaration: function(lineIndex, charIndex) { + if (this._styleMap && !this.isWrapping) { + var map = this._styleMap[lineIndex]; + if (!map) { + return null; + } + lineIndex = map.line; + charIndex = map.offset + charIndex; + } + return this.callSuper('_getStyleDeclaration', lineIndex, charIndex); + }, + + /** + * @param {Number} lineIndex + * @param {Number} charIndex + * @param {Object} style + * @private + */ + _setStyleDeclaration: function(lineIndex, charIndex, style) { + var map = this._styleMap[lineIndex]; + lineIndex = map.line; + charIndex = map.offset + charIndex; + + this.styles[lineIndex][charIndex] = style; + }, + + /** + * @param {Number} lineIndex + * @param {Number} charIndex + * @private + */ + _deleteStyleDeclaration: function(lineIndex, charIndex) { + var map = this._styleMap[lineIndex]; + lineIndex = map.line; + charIndex = map.offset + charIndex; + delete this.styles[lineIndex][charIndex]; + }, + + /** + * probably broken need a fix + * Returns the real style line that correspond to the wrapped lineIndex line + * Used just to verify if the line does exist or not. + * @param {Number} lineIndex + * @returns {Boolean} if the line exists or not + * @private + */ + _getLineStyle: function(lineIndex) { + var map = this._styleMap[lineIndex]; + return !!this.styles[map.line]; + }, + + /** + * Set the line style to an empty object so that is initialized + * @param {Number} lineIndex + * @param {Object} style + * @private + */ + _setLineStyle: function(lineIndex) { + var map = this._styleMap[lineIndex]; + this.styles[map.line] = {}; + }, + + /** + * Wraps text using the 'width' property of Textbox. First this function + * splits text on newlines, so we preserve newlines entered by the user. + * Then it wraps each line using the width of the Textbox by calling + * _wrapLine(). + * @param {Array} lines The string array of text that is split into lines + * @param {Number} desiredWidth width you want to wrap to + * @returns {Array} Array of lines + */ + _wrapText: function(lines, desiredWidth) { + var wrapped = [], i; + this.isWrapping = true; + for (i = 0; i < lines.length; i++) { + wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth)); + } + this.isWrapping = false; + return wrapped; + }, + + /** + * Helper function to measure a string of text, given its lineIndex and charIndex offset + * it gets called when charBounds are not available yet. + * @param {CanvasRenderingContext2D} ctx + * @param {String} text + * @param {number} lineIndex + * @param {number} charOffset + * @returns {number} + * @private + */ + _measureWord: function(word, lineIndex, charOffset) { + var width = 0, prevGrapheme, skipLeft = true; + charOffset = charOffset || 0; + for (var i = 0, len = word.length; i < len; i++) { + var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft); + width += box.kernedWidth; + prevGrapheme = word[i]; + } + return width; + }, + + /** + * Wraps a line of text using the width of the Textbox and a context. + * @param {Array} line The grapheme array that represent the line + * @param {Number} lineIndex + * @param {Number} desiredWidth width you want to wrap the line to + * @param {Number} reservedSpace space to remove from wrapping for custom functionalities + * @returns {Array} Array of line(s) into which the given text is wrapped + * to. + */ + _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) { + var lineWidth = 0, + splitByGrapheme = this.splitByGrapheme, + graphemeLines = [], + line = [], + // spaces in different languages? + words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners), + word = '', + offset = 0, + infix = splitByGrapheme ? '' : ' ', + wordWidth = 0, + infixWidth = 0, + largestWordWidth = 0, + lineJustStarted = true, + additionalSpace = this._getWidthOfCharSpacing(), + reservedSpace = reservedSpace || 0; + // fix a difference between split and graphemeSplit + if (words.length === 0) { + words.push([]); + } + desiredWidth -= reservedSpace; + for (var i = 0; i < words.length; i++) { + // if using splitByGrapheme words are already in graphemes. + word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]); + wordWidth = this._measureWord(word, lineIndex, offset); + offset += word.length; + + lineWidth += infixWidth + wordWidth - additionalSpace; + if (lineWidth > desiredWidth && !lineJustStarted) { + graphemeLines.push(line); + line = []; + lineWidth = wordWidth; + lineJustStarted = true; + } + else { + lineWidth += additionalSpace; + } + + if (!lineJustStarted && !splitByGrapheme) { + line.push(infix); + } + line = line.concat(word); + + infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset); + offset++; + lineJustStarted = false; + // keep track of largest word + if (wordWidth > largestWordWidth) { + largestWordWidth = wordWidth; + } + } + + i && graphemeLines.push(line); + + if (largestWordWidth + reservedSpace > this.dynamicMinWidth) { + this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace; + } + return graphemeLines; + }, + + /** + * Detect if the text line is ended with an hard break + * text and itext do not have wrapping, return false + * @param {Number} lineIndex text to split + * @return {Boolean} + */ + isEndOfWrapping: function(lineIndex) { + if (!this._styleMap[lineIndex + 1]) { + // is last line, return true; + return true; + } + if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) { + // this is last line before a line break, return true; + return true; + } + return false; + }, + + /** + * Detect if a line has a linebreak and so we need to account for it when moving + * and counting style. + * @return Number + */ + missingNewlineOffset: function(lineIndex) { + if (this.splitByGrapheme) { + return this.isEndOfWrapping(lineIndex) ? 1 : 0; + } + return 1; + }, + + /** + * Gets lines of text to render in the Textbox. This function calculates + * text wrapping on the fly every time it is called. + * @param {String} text text to split + * @returns {Array} Array of lines in the Textbox. + * @override + */ + _splitTextIntoLines: function(text) { + var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text), + graphemeLines = this._wrapText(newText.lines, this.width), + lines = new Array(graphemeLines.length); + for (var i = 0; i < graphemeLines.length; i++) { + lines[i] = graphemeLines[i].join(''); + } + newText.lines = lines; + newText.graphemeLines = graphemeLines; + return newText; + }, + + getMinWidth: function() { + return Math.max(this.minWidth, this.dynamicMinWidth); + }, + + _removeExtraneousStyles: function() { + var linesToKeep = {}; + for (var prop in this._styleMap) { + if (this._textLines[prop]) { + linesToKeep[this._styleMap[prop].line] = 1; + } + } + for (var prop in this.styles) { + if (!linesToKeep[prop]) { + delete this.styles[prop]; + } + } + }, + + /** + * Returns object representation of an instance + * @method toObject + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} object representation of an instance + */ + toObject: function(propertiesToInclude) { + return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude)); + } + }); + + /** + * Returns fabric.Textbox instance from an object representation + * @static + * @memberOf fabric.Textbox + * @param {Object} object Object to create an instance from + * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created + */ + fabric.Textbox.fromObject = function(object, callback) { + return fabric.Object._fromObject('Textbox', object, callback, 'text'); + }; +})(typeof exports !== 'undefined' ? exports : this); +(function() { + + var controlsUtils = fabric.controlsUtils, + scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler, + scaleStyleHandler = controlsUtils.scaleCursorStyleHandler, + scalingEqually = controlsUtils.scalingEqually, + scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX, + scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY, + scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName, + objectControls = fabric.Object.prototype.controls; + + objectControls.ml = new fabric.Control({ + x: -0.5, + y: 0, + cursorStyleHandler: scaleSkewStyleHandler, + actionHandler: scalingXOrSkewingY, + getActionName: scaleOrSkewActionName, + }); + + objectControls.mr = new fabric.Control({ + x: 0.5, + y: 0, + cursorStyleHandler: scaleSkewStyleHandler, + actionHandler: scalingXOrSkewingY, + getActionName: scaleOrSkewActionName, + }); + + objectControls.mb = new fabric.Control({ + x: 0, + y: 0.5, + cursorStyleHandler: scaleSkewStyleHandler, + actionHandler: scalingYOrSkewingX, + getActionName: scaleOrSkewActionName, + }); + + objectControls.mt = new fabric.Control({ + x: 0, + y: -0.5, + cursorStyleHandler: scaleSkewStyleHandler, + actionHandler: scalingYOrSkewingX, + getActionName: scaleOrSkewActionName, + }); + + objectControls.tl = new fabric.Control({ + x: -0.5, + y: -0.5, + cursorStyleHandler: scaleStyleHandler, + actionHandler: scalingEqually + }); + + objectControls.tr = new fabric.Control({ + x: 0.5, + y: -0.5, + cursorStyleHandler: scaleStyleHandler, + actionHandler: scalingEqually + }); + + objectControls.bl = new fabric.Control({ + x: -0.5, + y: 0.5, + cursorStyleHandler: scaleStyleHandler, + actionHandler: scalingEqually + }); + + objectControls.br = new fabric.Control({ + x: 0.5, + y: 0.5, + cursorStyleHandler: scaleStyleHandler, + actionHandler: scalingEqually + }); + + objectControls.mtr = new fabric.Control({ + x: 0, + y: -0.5, + actionHandler: controlsUtils.rotationWithSnapping, + cursorStyleHandler: controlsUtils.rotationStyleHandler, + offsetY: -40, + withConnection: true, + actionName: 'rotate', + }); + + if (fabric.Textbox) { + // this is breaking the prototype inheritance, no time / ideas to fix it. + // is important to document that if you want to have all objects to have a + // specific custom control, you have to add it to Object prototype and to Textbox + // prototype. The controls are shared as references. So changes to control `tr` + // can still apply to all objects if needed. + var textBoxControls = fabric.Textbox.prototype.controls = { }; + + textBoxControls.mtr = objectControls.mtr; + textBoxControls.tr = objectControls.tr; + textBoxControls.br = objectControls.br; + textBoxControls.tl = objectControls.tl; + textBoxControls.bl = objectControls.bl; + textBoxControls.mt = objectControls.mt; + textBoxControls.mb = objectControls.mb; + + textBoxControls.mr = new fabric.Control({ + x: 0.5, + y: 0, + actionHandler: controlsUtils.changeWidth, + cursorStyleHandler: scaleSkewStyleHandler, + actionName: 'resizing', + }); + + textBoxControls.ml = new fabric.Control({ + x: -0.5, + y: 0, + actionHandler: controlsUtils.changeWidth, + cursorStyleHandler: scaleSkewStyleHandler, + actionName: 'resizing', + }); + } +})(); +(function () { + /** ERASER_START */ + + /** + * add `eraser` to enlivened props + */ + fabric.Object.ENLIVEN_PROPS.push('eraser'); + + var __drawClipPath = fabric.Object.prototype._drawClipPath; + var _needsItsOwnCache = fabric.Object.prototype.needsItsOwnCache; + var _toObject = fabric.Object.prototype.toObject; + var _getSvgCommons = fabric.Object.prototype.getSvgCommons; + var __createBaseClipPathSVGMarkup = fabric.Object.prototype._createBaseClipPathSVGMarkup; + var __createBaseSVGMarkup = fabric.Object.prototype._createBaseSVGMarkup; + /** + * @fires erasing:end + */ + fabric.util.object.extend(fabric.Object.prototype, { + /** + * Indicates whether this object can be erased by {@link fabric.EraserBrush} + * The `deep` option introduces fine grained control over a group's `erasable` property. + * When set to `deep` the eraser will erase nested objects if they are erasable, leaving the group and the other objects untouched. + * When set to `true` the eraser will erase the entire group. Once the group changes the eraser is propagated to its children for proper functionality. + * When set to `false` the eraser will leave all objects including the group untouched. + * @tutorial {@link http://fabricjs.com/erasing#erasable_property} + * @type boolean | 'deep' + * @default true + */ + erasable: true, + + /** + * @tutorial {@link http://fabricjs.com/erasing#eraser} + * @type fabric.Eraser + */ + eraser: undefined, + + /** + * @override + * @returns Boolean + */ + needsItsOwnCache: function () { + return _needsItsOwnCache.call(this) || !!this.eraser; + }, + + /** + * draw eraser above clip path + * @override + * @private + * @param {CanvasRenderingContext2D} ctx + * @param {fabric.Object} clipPath + */ + _drawClipPath: function (ctx, clipPath) { + __drawClipPath.call(this, ctx, clipPath); + if (this.eraser) { + // update eraser size to match instance + var size = this._getNonTransformedDimensions(); + this.eraser.isType('eraser') && this.eraser.set({ + width: size.x, + height: size.y + }); + __drawClipPath.call(this, ctx, this.eraser); + } + }, + + /** + * Returns an object representation of an instance + * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output + * @return {Object} Object representation of an instance + */ + toObject: function (propertiesToInclude) { + var object = _toObject.call(this, ['erasable'].concat(propertiesToInclude)); + if (this.eraser && !this.eraser.excludeFromExport) { + object.eraser = this.eraser.toObject(propertiesToInclude); + } + return object; + }, + + /* _TO_SVG_START_ */ + /** + * Returns id attribute for svg output + * @override + * @return {String} + */ + getSvgCommons: function () { + return _getSvgCommons.call(this) + (this.eraser ? 'mask="url(#' + this.eraser.clipPathId + ')" ' : ''); + }, + + /** + * create svg markup for eraser + * use to achieve erasing for svg, credit: https://travishorn.com/removing-parts-of-shapes-in-svg-b539a89e5649 + * must be called before object markup creation as it relies on the `clipPathId` property of the mask + * @param {Function} [reviver] + * @returns + */ + _createEraserSVGMarkup: function (reviver) { + if (this.eraser) { + this.eraser.clipPathId = 'MASK_' + fabric.Object.__uid++; + return [ + '', + this.eraser.toSVG(reviver), + '', '\n' + ].join(''); + } + return ''; + }, + + /** + * @private + */ + _createBaseClipPathSVGMarkup: function (objectMarkup, options) { + return [ + this._createEraserSVGMarkup(options && options.reviver), + __createBaseClipPathSVGMarkup.call(this, objectMarkup, options) + ].join(''); + }, + + /** + * @private + */ + _createBaseSVGMarkup: function (objectMarkup, options) { + return [ + this._createEraserSVGMarkup(options && options.reviver), + __createBaseSVGMarkup.call(this, objectMarkup, options) + ].join(''); + } + /* _TO_SVG_END_ */ + }); + + var __restoreObjectsState = fabric.Group.prototype._restoreObjectsState; + fabric.util.object.extend(fabric.Group.prototype, { + /** + * @private + * @param {fabric.Path} path + */ + _addEraserPathToObjects: function (path) { + this._objects.forEach(function (object) { + fabric.EraserBrush.prototype._addPathToObjectEraser.call( + fabric.EraserBrush.prototype, + object, + path + ); + }); + }, + + /** + * Applies the group's eraser to its objects + * @tutorial {@link http://fabricjs.com/erasing#erasable_property} + */ + applyEraserToObjects: function () { + var _this = this, eraser = this.eraser; + if (eraser) { + delete this.eraser; + var transform = _this.calcTransformMatrix(); + eraser.clone(function (eraser) { + var clipPath = _this.clipPath; + eraser.getObjects('path') + .forEach(function (path) { + // first we transform the path from the group's coordinate system to the canvas' + var originalTransform = fabric.util.multiplyTransformMatrices( + transform, + path.calcTransformMatrix() + ); + fabric.util.applyTransformToObject(path, originalTransform); + if (clipPath) { + clipPath.clone(function (_clipPath) { + var eraserPath = fabric.EraserBrush.prototype.applyClipPathToPath.call( + fabric.EraserBrush.prototype, + path, + _clipPath, + transform + ); + _this._addEraserPathToObjects(eraserPath); + }, ['absolutePositioned', 'inverted']); + } + else { + _this._addEraserPathToObjects(path); + } + }); + }); + } + }, + + /** + * Propagate the group's eraser to its objects, crucial for proper functionality of the eraser within the group and nested objects. + * @private + */ + _restoreObjectsState: function () { + this.erasable === true && this.applyEraserToObjects(); + return __restoreObjectsState.call(this); + } + }); + + /** + * An object's Eraser + * @private + * @class fabric.Eraser + * @extends fabric.Group + * @memberof fabric + */ + fabric.Eraser = fabric.util.createClass(fabric.Group, { + /** + * @readonly + * @static + */ + type: 'eraser', + + /** + * @default + */ + originX: 'center', + + /** + * @default + */ + originY: 'center', + + drawObject: function (ctx) { + ctx.save(); + ctx.fillStyle = 'black'; + ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height); + ctx.restore(); + this.callSuper('drawObject', ctx); + }, + + /** + * eraser should retain size + * dimensions should not change when paths are added or removed + * handled by {@link fabric.Object#_drawClipPath} + * @override + * @private + */ + _getBounds: function () { + // noop + }, + + /* _TO_SVG_START_ */ + /** + * Returns svg representation of an instance + * use to achieve erasing for svg, credit: https://travishorn.com/removing-parts-of-shapes-in-svg-b539a89e5649 + * for masking we need to add a white rect before all paths + * + * @param {Function} [reviver] Method for further parsing of svg representation. + * @return {String} svg representation of an instance + */ + _toSVG: function (reviver) { + var svgString = ['\n']; + var x = -this.width / 2, y = -this.height / 2; + var rectSvg = [ + '\n' + ].join(''); + svgString.push('\t\t', rectSvg); + for (var i = 0, len = this._objects.length; i < len; i++) { + svgString.push('\t\t', this._objects[i].toSVG(reviver)); + } + svgString.push('\n'); + return svgString; + }, + /* _TO_SVG_END_ */ + }); + + /** + * Returns {@link fabric.Eraser} instance from an object representation + * @static + * @memberOf fabric.Eraser + * @param {Object} object Object to create an Eraser from + * @param {Function} [callback] Callback to invoke when an eraser instance is created + */ + fabric.Eraser.fromObject = function (object, callback) { + var objects = object.objects; + fabric.util.enlivenObjects(objects, function (enlivenedObjects) { + var options = fabric.util.object.clone(object, true); + delete options.objects; + fabric.util.enlivenObjectEnlivables(object, options, function () { + callback && callback(new fabric.Eraser(enlivenedObjects, options, true)); + }); + }); + }; + + var __renderOverlay = fabric.Canvas.prototype._renderOverlay; + /** + * @fires erasing:start + * @fires erasing:end + */ + fabric.util.object.extend(fabric.Canvas.prototype, { + /** + * Used by {@link #renderAll} + * @returns boolean + */ + isErasing: function () { + return ( + this.isDrawingMode && + this.freeDrawingBrush && + this.freeDrawingBrush.type === 'eraser' && + this.freeDrawingBrush._isErasing + ); + }, + + /** + * While erasing the brush clips out the erasing path from canvas + * so we need to render it on top of canvas every render + * @param {CanvasRenderingContext2D} ctx + */ + _renderOverlay: function (ctx) { + __renderOverlay.call(this, ctx); + if (this.isErasing() && !this.freeDrawingBrush.inverted) { + this.freeDrawingBrush._render(); + } + } + }); + + /** + * EraserBrush class + * Supports selective erasing meaning that only erasable objects are affected by the eraser brush. + * Supports **inverted** erasing meaning that the brush can "undo" erasing. + * + * In order to support selective erasing, the brush clips the entire canvas + * and then draws all non-erasable objects over the erased path using a pattern brush so to speak (masking). + * If brush is **inverted** there is no need to clip canvas. The brush draws all erasable objects without their eraser. + * This achieves the desired effect of seeming to erase or unerase only erasable objects. + * After erasing is done the created path is added to all intersected objects' `eraser` property. + * + * In order to update the EraserBrush call `preparePattern`. + * It may come in handy when canvas changes during erasing (i.e animations) and you want the eraser to reflect the changes. + * + * @tutorial {@link http://fabricjs.com/erasing} + * @class fabric.EraserBrush + * @extends fabric.PencilBrush + * @memberof fabric + */ + fabric.EraserBrush = fabric.util.createClass( + fabric.PencilBrush, + /** @lends fabric.EraserBrush.prototype */ { + type: 'eraser', + + /** + * When set to `true` the brush will create a visual effect of undoing erasing + */ + inverted: false, + + /** + * @private + */ + _isErasing: false, + + /** + * + * @private + * @param {fabric.Object} object + * @returns boolean + */ + _isErasable: function (object) { + return object.erasable !== false; + }, + + /** + * @private + * This is designed to support erasing a collection with both erasable and non-erasable objects. + * Iterates over collections to allow nested selective erasing. + * Prepares the pattern brush that will draw on the top context to achieve the desired visual effect. + * If brush is **NOT** inverted render all non-erasable objects. + * If brush is inverted render all erasable objects that have been erased with their clip path inverted. + * This will render the erased parts as if they were not erased. + * + * @param {fabric.Collection} collection + * @param {CanvasRenderingContext2D} ctx + * @param {{ visibility: fabric.Object[], eraser: fabric.Object[], collection: fabric.Object[] }} restorationContext + */ + _prepareCollectionTraversal: function (collection, ctx, restorationContext) { + collection.forEachObject(function (obj) { + if (obj.forEachObject && obj.erasable === 'deep') { + // traverse + this._prepareCollectionTraversal(obj, ctx, restorationContext); + } + else if (!this.inverted && obj.erasable && obj.visible) { + // render only non-erasable objects + obj.visible = false; + collection.dirty = true; + restorationContext.visibility.push(obj); + restorationContext.collection.push(collection); + } + else if (this.inverted && obj.visible) { + // render only erasable objects that were erased + if (obj.erasable && obj.eraser) { + obj.eraser.inverted = true; + obj.dirty = true; + collection.dirty = true; + restorationContext.eraser.push(obj); + restorationContext.collection.push(collection); + } + else { + obj.visible = false; + collection.dirty = true; + restorationContext.visibility.push(obj); + restorationContext.collection.push(collection); + } + } + }, this); + }, + + /** + * Prepare the pattern for the erasing brush + * This pattern will be drawn on the top context, achieving a visual effect of erasing only erasable objects + * @todo decide how overlay color should behave when `inverted === true`, currently draws over it which is undesirable + * @private + */ + preparePattern: function () { + if (!this._patternCanvas) { + this._patternCanvas = fabric.util.createCanvasElement(); + } + var canvas = this._patternCanvas; + canvas.width = this.canvas.width; + canvas.height = this.canvas.height; + var patternCtx = canvas.getContext('2d'); + if (this.canvas._isRetinaScaling()) { + var retinaScaling = this.canvas.getRetinaScaling(); + this.canvas.__initRetinaScaling(retinaScaling, canvas, patternCtx); + } + var backgroundImage = this.canvas.backgroundImage, + bgErasable = backgroundImage && this._isErasable(backgroundImage), + overlayImage = this.canvas.overlayImage, + overlayErasable = overlayImage && this._isErasable(overlayImage); + if (!this.inverted && ((backgroundImage && !bgErasable) || !!this.canvas.backgroundColor)) { + if (bgErasable) { this.canvas.backgroundImage = undefined; } + this.canvas._renderBackground(patternCtx); + if (bgErasable) { this.canvas.backgroundImage = backgroundImage; } + } + else if (this.inverted && (backgroundImage && bgErasable)) { + var color = this.canvas.backgroundColor; + this.canvas.backgroundColor = undefined; + this.canvas._renderBackground(patternCtx); + this.canvas.backgroundColor = color; + } + patternCtx.save(); + patternCtx.transform.apply(patternCtx, this.canvas.viewportTransform); + var restorationContext = { visibility: [], eraser: [], collection: [] }; + this._prepareCollectionTraversal(this.canvas, patternCtx, restorationContext); + this.canvas._renderObjects(patternCtx, this.canvas._objects); + restorationContext.visibility.forEach(function (obj) { obj.visible = true; }); + restorationContext.eraser.forEach(function (obj) { + obj.eraser.inverted = false; + obj.dirty = true; + }); + restorationContext.collection.forEach(function (obj) { obj.dirty = true; }); + patternCtx.restore(); + if (!this.inverted && ((overlayImage && !overlayErasable) || !!this.canvas.overlayColor)) { + if (overlayErasable) { this.canvas.overlayImage = undefined; } + __renderOverlay.call(this.canvas, patternCtx); + if (overlayErasable) { this.canvas.overlayImage = overlayImage; } + } + else if (this.inverted && (overlayImage && overlayErasable)) { + var color = this.canvas.overlayColor; + this.canvas.overlayColor = undefined; + __renderOverlay.call(this.canvas, patternCtx); + this.canvas.overlayColor = color; + } + }, + + /** + * Sets brush styles + * @private + * @param {CanvasRenderingContext2D} ctx + */ + _setBrushStyles: function (ctx) { + this.callSuper('_setBrushStyles', ctx); + // ctx.strokeStyle = 'black'; + ctx.strokeStyle='rgba(0,0,0,0.2)'; + }, + + /** + * **Customiztion** + * + * if you need the eraser to update on each render (i.e animating during erasing) override this method by **adding** the following (performance may suffer): + * @example + * ``` + * if(ctx === this.canvas.contextTop) { + * this.preparePattern(); + * } + * ``` + * + * @override fabric.BaseBrush#_saveAndTransform + * @param {CanvasRenderingContext2D} ctx + */ + _saveAndTransform: function (ctx) { + ctx.strokeStyle='rgba(0,0,0,0.2)'; + this.callSuper('_saveAndTransform', ctx); + this._setBrushStyles(ctx); + ctx.globalCompositeOperation = ctx === this.canvas.getContext() ? 'destination-out' : 'source-over'; + }, + + /** + * We indicate {@link fabric.PencilBrush} to repaint itself if necessary + * @returns + */ + needsFullRender: function () { + return true; + }, + + /** + * + * @param {fabric.Point} pointer + * @param {fabric.IEvent} options + * @returns + */ + onMouseDown: function (pointer, options) { + if (!this.canvas._isMainEvent(options.e)) { + return; + } + this._prepareForDrawing(pointer); + // capture coordinates immediately + // this allows to draw dots (when movement never occurs) + this._captureDrawingPath(pointer); + + // prepare for erasing + this.preparePattern(); + this._isErasing = true; + this.canvas.fire('erasing:start'); + this._render(); + }, + + /** + * Rendering Logic: + * 1. Use brush to clip canvas by rendering it on top of canvas (unnecessary if `inverted === true`) + * 2. Render brush with canvas pattern on top context + * + */ + _render: function () { + var ctx; + if (!this.inverted) { + // clip canvas + ctx = this.canvas.getContext(); + this.callSuper('_render', ctx); + } + // render brush and mask it with image of non erasables + ctx = this.canvas.contextTop; + this.canvas.clearContext(ctx); + this.callSuper('_render', ctx); + ctx.save(); + var t = this.canvas.getRetinaScaling(), s = 1 / t; + ctx.scale(s, s); + // ctx.globalCompositeOperation = 'source-in'; + ctx.drawImage(this._patternCanvas, 0, 0); + ctx.restore(); + }, + + /** + * Creates fabric.Path object + * @override + * @private + * @param {(string|number)[][]} pathData Path data + * @return {fabric.Path} Path to add on canvas + * @returns + */ + createPath: function (pathData) { + var path = this.callSuper('createPath', pathData); + path.globalCompositeOperation = this.inverted ? 'source-over' : 'destination-out'; + path.stroke = this.inverted ? 'white' : 'black'; + return path; + }, + + /** + * Utility to apply a clip path to a path. + * Used to preserve clipping on eraser paths in nested objects. + * Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects. + * @param {fabric.Path} path The eraser path in canvas coordinate plane + * @param {fabric.Object} clipPath The clipPath to apply to the path + * @param {number[]} clipPathContainerTransformMatrix The transform matrix of the object that the clip path belongs to + * @returns {fabric.Path} path with clip path + */ + applyClipPathToPath: function (path, clipPath, clipPathContainerTransformMatrix) { + var pathInvTransform = fabric.util.invertTransform(path.calcTransformMatrix()), + clipPathTransform = clipPath.calcTransformMatrix(), + transform = clipPath.absolutePositioned ? + pathInvTransform : + fabric.util.multiplyTransformMatrices( + pathInvTransform, + clipPathContainerTransformMatrix + ); + // when passing down a clip path it becomes relative to the parent + // so we transform it acoordingly and set `absolutePositioned` to false + clipPath.absolutePositioned = false; + fabric.util.applyTransformToObject( + clipPath, + fabric.util.multiplyTransformMatrices( + transform, + clipPathTransform + ) + ); + // We need to clip `path` with both `clipPath` and it's own clip path if existing (`path.clipPath`) + // so in turn `path` erases an object only where it overlaps with all it's clip paths, regardless of how many there are. + // this is done because both clip paths may have nested clip paths of their own (this method walks down a collection => this may reccur), + // so we can't assign one to the other's clip path property. + path.clipPath = path.clipPath ? fabric.util.mergeClipPaths(clipPath, path.clipPath) : clipPath; + return path; + }, + + /** + * Utility to apply a clip path to a path. + * Used to preserve clipping on eraser paths in nested objects. + * Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects. + * @param {fabric.Path} path The eraser path + * @param {fabric.Object} object The clipPath to apply to path belongs to object + * @param {Function} callback Callback to be invoked with the cloned path after applying the clip path + */ + clonePathWithClipPath: function (path, object, callback) { + var objTransform = object.calcTransformMatrix(); + var clipPath = object.clipPath; + var _this = this; + path.clone(function (_path) { + clipPath.clone(function (_clipPath) { + callback(_this.applyClipPathToPath(_path, _clipPath, objTransform)); + }, ['absolutePositioned', 'inverted']); + }); + }, + + /** + * Adds path to object's eraser, walks down object's descendants if necessary + * + * @fires erasing:end on object + * @param {fabric.Object} obj + * @param {fabric.Path} path + */ + _addPathToObjectEraser: function (obj, path) { + var _this = this; + // object is collection, i.e group + if (obj.forEachObject && obj.erasable === 'deep') { + var targets = obj._objects.filter(function (_obj) { + return _obj.erasable; + }); + if (targets.length > 0 && obj.clipPath) { + this.clonePathWithClipPath(path, obj, function (_path) { + targets.forEach(function (_obj) { + _this._addPathToObjectEraser(_obj, _path); + }); + }); + } + else if (targets.length > 0) { + targets.forEach(function (_obj) { + _this._addPathToObjectEraser(_obj, path); + }); + } + return; + } + // prepare eraser + var eraser = obj.eraser; + if (!eraser) { + eraser = new fabric.Eraser(); + obj.eraser = eraser; + } + // clone and add path + path.clone(function (path) { + // http://fabricjs.com/using-transformations + var desiredTransform = fabric.util.multiplyTransformMatrices( + fabric.util.invertTransform( + obj.calcTransformMatrix() + ), + path.calcTransformMatrix() + ); + fabric.util.applyTransformToObject(path, desiredTransform); + eraser.addWithUpdate(path); + obj.set('dirty', true); + obj.fire('erasing:end', { + path: path + }); + if (obj.group && Array.isArray(_this.__subTargets)) { + _this.__subTargets.push(obj); + } + }); + }, + + /** + * Add the eraser path to canvas drawables' clip paths + * + * @param {fabric.Canvas} source + * @param {fabric.Canvas} path + * @returns {Object} canvas drawables that were erased by the path + */ + applyEraserToCanvas: function (path) { + var canvas = this.canvas; + var drawables = {}; + [ + 'backgroundImage', + 'overlayImage', + ].forEach(function (prop) { + var drawable = canvas[prop]; + if (drawable && drawable.erasable) { + this._addPathToObjectEraser(drawable, path); + drawables[prop] = drawable; + } + }, this); + return drawables; + }, + + /** + * On mouseup after drawing the path on contextTop canvas + * we use the points captured to create an new fabric path object + * and add it to every intersected erasable object. + */ + _finalizeAndAddPath: function () { + var ctx = this.canvas.contextTop, canvas = this.canvas; + ctx.closePath(); + if (this.decimate) { + this._points = this.decimatePoints(this._points, this.decimate); + } + + // clear + canvas.clearContext(canvas.contextTop); + this._isErasing = false; + + var pathData = this._points && this._points.length > 1 ? + this.convertPointsToSVGPath(this._points) : + null; + if (!pathData || this._isEmptySVGPath(pathData)) { + canvas.fire('erasing:end'); + // do not create 0 width/height paths, as they are + // rendered inconsistently across browsers + // Firefox 4, for example, renders a dot, + // whereas Chrome 10 renders nothing + canvas.requestRenderAll(); + return; + } + + var path = this.createPath(pathData); + // needed for `intersectsWithObject` + path.setCoords(); + // commense event sequence + canvas.fire('before:path:created', { path: path }); + + // finalize erasing + var drawables = this.applyEraserToCanvas(path); + var _this = this; + this.__subTargets = []; + var targets = []; + canvas.forEachObject(function (obj) { + if (obj.erasable && obj.intersectsWithObject(path, true, true)) { + _this._addPathToObjectEraser(obj, path); + targets.push(obj); + } + }); + // fire erasing:end + canvas.fire('erasing:end', { + path: path, + targets: targets, + subTargets: this.__subTargets, + drawables: drawables + }); + delete this.__subTargets; + + canvas.requestRenderAll(); + this._resetShadow(); + + // fire event 'path' created + canvas.fire('path:created', { path: path }); + } + } + ); + + /** ERASER_END */ +})(); diff --git a/src/assets/pdf-annotation/thirdjs/2.js b/src/assets/pdf-annotation/thirdjs/2.js new file mode 100755 index 0000000..0463479 --- /dev/null +++ b/src/assets/pdf-annotation/thirdjs/2.js @@ -0,0 +1,253 @@ +/*! FileSaver.js + * A saveAs() FileSaver implementation. + * 2014-01-24 + * + * By Eli Grey, http://eligrey.com + * License: X11/MIT + * See LICENSE.md + */ + +/*global self */ +/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ + +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ + +var saveAs = saveAs + // IE 10+ (native saveAs) + || (typeof navigator !== "undefined" && + navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator)) + // Everyone else + || (function(view) { + "use strict"; + // IE <10 is explicitly unsupported + if (typeof navigator !== "undefined" && + /MSIE [1-9]\./.test(navigator.userAgent)) { + return; + } + var + doc = view.document + // only get URL when necessary in case BlobBuilder.js hasn't overridden it yet + , get_URL = function() { + return view.URL || view.webkitURL || view; + } + , URL = view.URL || view.webkitURL || view + , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") + , can_use_save_link = !view.externalHost && "download" in save_link + , click = function(node) { + var event = doc.createEvent("MouseEvents"); + event.initMouseEvent( + "click", true, false, view, 0, 0, 0, 0, 0 + , false, false, false, false, 0, null + ); + node.dispatchEvent(event); + } + , webkit_req_fs = view.webkitRequestFileSystem + , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem + , throw_outside = function(ex) { + (view.setImmediate || view.setTimeout)(function() { + throw ex; + }, 0); + } + , force_saveable_type = "application/octet-stream" + , fs_min_size = 0 + , deletion_queue = [] + , process_deletion_queue = function() { + var i = deletion_queue.length; + while (i--) { + var file = deletion_queue[i]; + if (typeof file === "string") { // file is an object URL + URL.revokeObjectURL(file); + } else { // file is a File + file.remove(); + } + } + deletion_queue.length = 0; // clear queue + } + , dispatch = function(filesaver, event_types, event) { + event_types = [].concat(event_types); + var i = event_types.length; + while (i--) { + var listener = filesaver["on" + event_types[i]]; + if (typeof listener === "function") { + try { + listener.call(filesaver, event || filesaver); + } catch (ex) { + throw_outside(ex); + } + } + } + } + , FileSaver = function(blob, name) { + // First try a.download, then web filesystem, then object URLs + var + filesaver = this + , type = blob.type + , blob_changed = false + , object_url + , target_view + , get_object_url = function() { + var object_url = get_URL().createObjectURL(blob); + deletion_queue.push(object_url); + return object_url; + } + , dispatch_all = function() { + dispatch(filesaver, "writestart progress write writeend".split(" ")); + } + // on any filesys errors revert to saving with object URLs + , fs_error = function() { + // don't create more object URLs than needed + if (blob_changed || !object_url) { + object_url = get_object_url(blob); + } + if (target_view) { + target_view.location.href = object_url; + } else { + window.open(object_url, "_blank"); + } + filesaver.readyState = filesaver.DONE; + dispatch_all(); + } + , abortable = function(func) { + return function() { + if (filesaver.readyState !== filesaver.DONE) { + return func.apply(this, arguments); + } + }; + } + , create_if_not_found = {create: true, exclusive: false} + , slice + ; + filesaver.readyState = filesaver.INIT; + if (!name) { + name = "download"; + } + if (can_use_save_link) { + object_url = get_object_url(blob); + // FF for Android has a nasty garbage collection mechanism + // that turns all objects that are not pure javascript into 'deadObject' + // this means `doc` and `save_link` are unusable and need to be recreated + // `view` is usable though: + doc = view.document; + save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"); + save_link.href = object_url; + save_link.download = name; + var event = doc.createEvent("MouseEvents"); + event.initMouseEvent( + "click", true, false, view, 0, 0, 0, 0, 0 + , false, false, false, false, 0, null + ); + save_link.dispatchEvent(event); + filesaver.readyState = filesaver.DONE; + dispatch_all(); + return; + } + // Object and web filesystem URLs have a problem saving in Google Chrome when + // viewed in a tab, so I force save with application/octet-stream + // http://code.google.com/p/chromium/issues/detail?id=91158 + if (view.chrome && type && type !== force_saveable_type) { + slice = blob.slice || blob.webkitSlice; + blob = slice.call(blob, 0, blob.size, force_saveable_type); + blob_changed = true; + } + // Since I can't be sure that the guessed media type will trigger a download + // in WebKit, I append .download to the filename. + // https://bugs.webkit.org/show_bug.cgi?id=65440 + if (webkit_req_fs && name !== "download") { + name += ".download"; + } + if (type === force_saveable_type || webkit_req_fs) { + target_view = view; + } + if (!req_fs) { + fs_error(); + return; + } + fs_min_size += blob.size; + req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) { + fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) { + var save = function() { + dir.getFile(name, create_if_not_found, abortable(function(file) { + file.createWriter(abortable(function(writer) { + writer.onwriteend = function(event) { + target_view.location.href = file.toURL(); + deletion_queue.push(file); + filesaver.readyState = filesaver.DONE; + dispatch(filesaver, "writeend", event); + }; + writer.onerror = function() { + var error = writer.error; + if (error.code !== error.ABORT_ERR) { + fs_error(); + } + }; + "writestart progress write abort".split(" ").forEach(function(event) { + writer["on" + event] = filesaver["on" + event]; + }); + writer.write(blob); + filesaver.abort = function() { + writer.abort(); + filesaver.readyState = filesaver.DONE; + }; + filesaver.readyState = filesaver.WRITING; + }), fs_error); + }), fs_error); + }; + dir.getFile(name, {create: false}, abortable(function(file) { + // delete file if it already exists + file.remove(); + save(); + }), abortable(function(ex) { + if (ex.code === ex.NOT_FOUND_ERR) { + save(); + } else { + fs_error(); + } + })); + }), fs_error); + }), fs_error); + } + , FS_proto = FileSaver.prototype + , saveAs = function(blob, name) { + return new FileSaver(blob, name); + } + ; + FS_proto.abort = function() { + var filesaver = this; + filesaver.readyState = filesaver.DONE; + dispatch(filesaver, "abort"); + }; + FS_proto.readyState = FS_proto.INIT = 0; + FS_proto.WRITING = 1; + FS_proto.DONE = 2; + + FS_proto.error = + FS_proto.onwritestart = + FS_proto.onprogress = + FS_proto.onwrite = + FS_proto.onabort = + FS_proto.onerror = + FS_proto.onwriteend = + null; + + view.addEventListener("unload", process_deletion_queue, false); + saveAs.unload = function() { + process_deletion_queue(); + view.removeEventListener("unload", process_deletion_queue, false); + }; + return saveAs; +}( + typeof self !== "undefined" && self + || typeof window !== "undefined" && window + || this.content +)); +// `self` is undefined in Firefox for Android content script context +// while `this` is nsIContentFrameMessageManager +// with an attribute `content` that corresponds to the window + +if (typeof module !== "undefined" && module !== null) { + module.exports = saveAs; +} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) { + define([], function() { + return saveAs; + }); +} \ No newline at end of file diff --git a/src/assets/pdf-annotation/thirdjs/3.js b/src/assets/pdf-annotation/thirdjs/3.js new file mode 100755 index 0000000..7cc6dff --- /dev/null +++ b/src/assets/pdf-annotation/thirdjs/3.js @@ -0,0 +1,7 @@ +(function(){"undefined"==typeof Math.sgn&&(Math.sgn=function(a){return 0==a?0:a>0?1:-1});var a={subtract:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},dotProduct:function(a,b){return a.x*b.x+a.y*b.y},square:function(a){return Math.sqrt(a.x*a.x+a.y*a.y)},scale:function(a,b){return{x:a.x*b,y:a.y*b}}},b=64,c=Math.pow(2,-b-1),d=function(b,c){for(var d=[],e=f(b,c),h=c.length-1,i=2*h-1,j=g(e,i,d,0),k=a.subtract(b,c[0]),m=a.square(k),n=0,o=0;j>o;o++){k=a.subtract(b,l(c,h,d[o],null,null));var p=a.square(k);m>p&&(m=p,n=d[o])}return k=a.subtract(b,c[h]),p=a.square(k),m>p&&(m=p,n=1),{location:n,distance:m}},e=function(a,b){var c=d(a,b);return{point:l(b,b.length-1,c.location,null,null),location:c.location}},f=function(b,c){for(var d=c.length-1,e=2*d-1,f=[],g=[],h=[],i=[],k=[[1,.6,.3,.1],[.4,.6,.6,.4],[.1,.3,.6,1]],l=0;d>=l;l++)f[l]=a.subtract(c[l],b);for(var l=0;d-1>=l;l++)g[l]=a.subtract(c[l+1],c[l]),g[l]=a.scale(g[l],3);for(var m=0;d-1>=m;m++)for(var n=0;d>=n;n++)h[m]||(h[m]=[]),h[m][n]=a.dotProduct(g[m],f[n]);for(l=0;e>=l;l++)i[l]||(i[l]=[]),i[l].y=0,i[l].x=parseFloat(l)/e;for(var o=d,p=d-1,q=0;o+p>=q;q++){var r=Math.max(0,q-p),s=Math.min(q,o);for(l=r;s>=l;l++)j=q-l,i[l+j].y+=h[j][l]*k[j][l]}return i},g=function(a,c,d,e){var f,j,m=[],n=[],o=[],p=[];switch(h(a,c)){case 0:return 0;case 1:if(e>=b)return d[0]=(a[0].x+a[c].x)/2,1;if(i(a,c))return d[0]=k(a,c),1}l(a,c,.5,m,n),f=g(m,c,o,e+1),j=g(n,c,p,e+1);for(var q=0;f>q;q++)d[q]=o[q];for(var q=0;j>q;q++)d[q+f]=p[q];return f+j},h=function(a,b){var c,d,e=0;c=d=Math.sgn(a[0].y);for(var f=1;b>=f;f++)c=Math.sgn(a[f].y),c!=d&&e++,d=c;return e},i=function(a,b){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;i=a[0].y-a[b].y,j=a[b].x-a[0].x,k=a[0].x*a[b].y-a[b].x*a[0].y;for(var t=max_distance_below=0,u=1;b>u;u++){var v=i*a[u].x+j*a[u].y+k;v>t?t=v:vd?1:0},k=function(a,b){var c=1,d=0,e=a[b].x-a[0].x,f=a[b].y-a[0].y,g=a[0].x-0,h=a[0].y-0,i=e*d-f*c,j=1/i,k=(e*h-f*g)*j;return 0+c*k},l=function(a,b,c,d,e){for(var f=[[]],g=0;b>=g;g++)f[0][g]=a[g];for(var h=1;b>=h;h++)for(var g=0;b-h>=g;g++)f[h]||(f[h]=[]),f[h][g]||(f[h][g]={}),f[h][g].x=(1-c)*f[h-1][g].x+c*f[h-1][g+1].x,f[h][g].y=(1-c)*f[h-1][g].y+c*f[h-1][g+1].y;if(null!=d)for(g=0;b>=g;g++)d[g]=f[g][0];if(null!=e)for(g=0;b>=g;g++)e[g]=f[b-g][g];return f[b][0]},m={},n=function(a){var b=m[a];if(!b){b=[];var c=function(){return function(b){return Math.pow(b,a)}},d=function(){return function(b){return Math.pow(1-b,a)}},e=function(a){return function(b){return a}},f=function(){return function(a){return a}},g=function(){return function(a){return 1-a}},h=function(a){return function(b){for(var c=1,d=0;di;i++){for(var j=[new e(a)],k=0;a-i>k;k++)j.push(new f);for(var k=0;i>k;k++)j.push(new g);b.push(new h(j))}b.push(new d),m[a]=b}return b},o=function(a,b){for(var c=n(a.length-1),d=0,e=0,f=0;f0?1:-1,h=null;ed;)d+=.005*e,f=o(a,d),c+=p(f,b),b=f;return c},t=function(a,b,c){return r(a,b,c).point},u=function(a,b,c){return r(a,b,c).location},v=function(a,b){var c=o(a,b),d=o(a.slice(0,a.length-1),b),e=d.y-c.y,f=d.x-c.x;return 0==e?1/0:Math.atan(e/f)},w=function(a,b,c){var d=r(a,b,c);return d.location>1&&(d.location=1),d.location<0&&(d.location=0),v(a,d.location)},x=function(a,b,c,d){d=null==d?0:d;var e=r(a,b,d),f=v(a,e.location),g=Math.atan(-1/f),h=c/2*Math.sin(g),i=c/2*Math.cos(g);return[{x:e.point.x+i,y:e.point.y+h},{x:e.point.x-i,y:e.point.y-h}]},y=this.jsBezier={distanceFromCurve:d,gradientAtPoint:v,gradientAtPointAlongCurveFrom:w,nearestPointOnCurve:e,pointOnCurve:o,pointAlongCurveFrom:t,perpendicularToCurveAt:x,locationAlongCurveFrom:u,getLength:s,version:"0.9.0"};"undefined"!=typeof exports&&(exports.jsBezier=y)}).call("undefined"!=typeof window?window:this),function(){"use strict";var a=this,b=a.Biltong={version:"0.4.0"};"undefined"!=typeof exports&&(exports.Biltong=b);var c=function(a){return"[object Array]"===Object.prototype.toString.call(a)},d=function(a,b,d){return a=c(a)?a:[a.x,a.y],b=c(b)?b:[b.x,b.y],d(a,b)},e=b.gradient=function(a,b){return d(a,b,function(a,b){return b[0]==a[0]?b[1]>a[1]?1/0:-(1/0):b[1]==a[1]?b[0]>a[0]?0:-0:(b[1]-a[1])/(b[0]-a[0])})},f=(b.normal=function(a,b){return-1/e(a,b)},b.lineLength=function(a,b){return d(a,b,function(a,b){return Math.sqrt(Math.pow(b[1]-a[1],2)+Math.pow(b[0]-a[0],2))})},b.quadrant=function(a,b){return d(a,b,function(a,b){return b[0]>a[0]?b[1]>a[1]?2:1:b[0]==a[0]?b[1]>a[1]?2:1:b[1]>a[1]?3:4})}),g=(b.theta=function(a,b){return d(a,b,function(a,b){var c=e(a,b),d=Math.atan(c),g=f(a,b);return(4==g||3==g)&&(d+=Math.PI),0>d&&(d+=2*Math.PI),d})},b.intersects=function(a,b){var c=a.x,d=a.x+a.w,e=a.y,f=a.y+a.h,g=b.x,h=b.x+b.w,i=b.y,j=b.y+b.h;return g>=c&&d>=g&&i>=e&&f>=i||h>=c&&d>=h&&i>=e&&f>=i||g>=c&&d>=g&&j>=e&&f>=j||h>=c&&d>=g&&j>=e&&f>=j||c>=g&&h>=c&&e>=i&&j>=e||d>=g&&h>=d&&e>=i&&j>=e||c>=g&&h>=c&&f>=i&&j>=f||d>=g&&h>=c&&f>=i&&j>=f},b.encloses=function(a,b,c){var d=a.x,e=a.x+a.w,f=a.y,g=a.y+a.h,h=b.x,i=b.x+b.w,j=b.y,k=b.y+b.h,l=function(a,b,d,e){return c?b>=a&&d>=e:b>a&&d>e};return l(d,h,e,i)&&l(f,j,g,k)},[null,[1,-1],[1,1],[-1,1],[-1,-1]]),h=[null,[-1,-1],[-1,1],[1,1],[1,-1]];b.pointOnLine=function(a,b,c){var d=e(a,b),i=f(a,b),j=c>0?g[i]:h[i],k=Math.atan(d),l=Math.abs(c*Math.sin(k))*j[1],m=Math.abs(c*Math.cos(k))*j[0];return{x:a.x+m,y:a.y+l}},b.perpendicularLineTo=function(a,b,c){var d=e(a,b),f=Math.atan(-1/d),g=c/2*Math.sin(f),h=c/2*Math.cos(f);return[{x:b.x+h,y:b.y+g},{x:b.x-h,y:b.y-g}]}}.call("undefined"!=typeof window?window:this),function(){"use strict";function a(a,b,c,d,e,f,g,h){return new Touch({target:b,identifier:J(),pageX:c,pageY:d,screenX:e,screenY:f,clientX:g||e,clientY:h||f})}function b(){var a=[];return Array.prototype.push.apply(a,arguments),a.item=function(a){return this[a]},a}function c(c,d,e,f,g,h,i,j){return b(a.apply(null,arguments))}var d=this,e=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;ec&&a[c]!=b;c++);c-1&&9>x,z=function(a,b){if(null==a)return[0,0];var c=E(a),d=D(c,0);return[d[b+"X"],d[b+"Y"]]},A=function(a){return null==a?[0,0]:y?[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop]:z(a,"page")},B=function(a){return z(a,"screen")},C=function(a){return z(a,"client")},D=function(a,b){return a.item?a.item(b):a[b]},E=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},F=function(a){return E(a).length},G=function(a,b,c,d){if(k(a,b,c),d.__tauid=c.__tauid,a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent){var e=b+c.__tauid;a["e"+e]=c,a[e]=function(){a["e"+e]&&a["e"+e](window.event)},a.attachEvent("on"+b,a[e])}},H=function(a,b,c){null!=c&&I(a,function(){var d=f(this);if(l(d,b,c),null!=c.__tauid)if(d.removeEventListener)d.removeEventListener(b,c,!1),u&&w[b]&&d.removeEventListener(w[b],c,!1);else if(this.detachEvent){var e=b+c.__tauid;d[e]&&d.detachEvent("on"+b,d[e]),d[e]=null,d["e"+e]=null}c.__taTouchProxy&&H(a,c.__taTouchProxy[1],c.__taTouchProxy[0])})},I=function(a,b){if(null!=a){a="undefined"!=typeof Window&&"unknown"!=typeof a.top&&a==a.top?[a]:"string"!=typeof a&&null==a.tagName&&null!=a.length?a:"string"==typeof a?document.querySelectorAll(a):[a];for(var c=0;c-1&&9>i,m=9===i,n=function(a){if(l)return[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop];var b=p(a),c=o(b,0);return m?[c.pageX||c.clientX,c.pageY||c.clientY]:[c.pageX,c.pageY]},o=function(a,b){return a.item?a.item(b):a[b]},p=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},q={draggable:"katavorio-draggable",droppable:"katavorio-droppable",drag:"katavorio-drag",selected:"katavorio-drag-selected",active:"katavorio-drag-active",hover:"katavorio-drag-hover",noSelect:"katavorio-drag-no-select",ghostProxy:"katavorio-ghost-proxy",clonedDrag:"katavorio-clone-drag"},r="katavorio-drag-scope",s=["stop","start","drag","drop","over","out","beforeStart"],t=function(){},u=function(){return!0},v=function(a,b,c){for(var d=0;d1)for(var f=0;f0&&Z&&b.setPosition(J,Z),W.sort(H);for(var e=0;eb.rank?-1:0},I=function(a){return null==a?null:(a="string"==typeof a||a.constructor===String?document.getElementById(a):a,null==a?null:(a._katavorio=a._katavorio||G(),a))};a.Katavorio=function(a){var f=[],g={};this._dragsByScope={},this._dropsByScope={};var h=1,i=function(a,b){x(a,function(a){for(var c=0;c0},k=(this.getMatchingDroppables=function(a){for(var b=[],c={},d=0;d=0&&f.splice(d,1),j(a[b],c)&&x(a[b],function(a){a.destroy()}),delete a[b]}},B=function(a,b,c,d){a=I(a),a[b]&&a[b].off(c,d)};this.elementRemoved=function(a){this.destroyDraggable(a),this.destroyDroppable(a)},this.destroyDraggable=function(a,b,c){1===arguments.length?A(a,"_katavorioDrag",this._dragsByScope):B(a,"_katavorioDrag",b,c)},this.destroyDroppable=function(a,b,c){1===arguments.length?A(a,"_katavorioDrop",this._dropsByScope):B(a,"_katavorioDrop",b,c)},this.reset=function(){this._dragsByScope={},this._dropsByScope={},f=[],g={},C={}};var C={},D=function(a,c,d){var f=e(c)?c:c.id,g=e(c)?!0:c.active!==!1,h=C[f]||function(){var a={name:f,members:[]};return C[f]=a,a}();return x(a,function(a){if(a._katavorioDrag){if(d&&null!=a._katavorioDrag.posseRoles[h.name])return;b(h.members,a._katavorioDrag),b(a._katavorioDrag.posses,h.name),a._katavorioDrag.posseRoles[h.name]=g}}),h};this.addToPosse=function(a,b){for(var c=[],d=1;d0}function j(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}function k(b){if(c(b))return""+b;if(d(b))return!!b;if(g(b))return new Date(b.getTime());if(h(b))return b;if(a(b)){for(var e=[],i=0;i=f.length,i=function(){return e[g[1]]||function(){return e[g[1]]=[],e[g[1]]}()};if(h)g?i()[g[3]]=c:e[a]=c;else if(g){var j=i();e=j[g[3]]||function(){return j[g[3]]={},j[g[3]]}()}else e=e[a]||function(){return e[a]={},e[a]}();return""}),a}}function n(a,b,c){for(var d=0;d-1&&a.splice(c,1),-1!==c}function r(a,b){var c=a.indexOf(b);return c>-1&&a.splice(c,1),-1!==c}function s(a,b,c){-1===p(a,c)&&a.push(b)}function t(a,b,c,d){var e=a[b];return null==e&&(e=[],a[b]=e),e[d?"unshift":"push"](c),e}function u(a,b,c){return-1===a.indexOf(b)?(c?a.unshift(b):a.push(b),!0):!1}function v(b,c,d){var e;c=a(c)?c:[c];var f=function(a){for(var c=a.__proto__;null!=c;)if(null!=c.prototype){for(var d in c.prototype)c.prototype.hasOwnProperty(d)&&!b.prototype.hasOwnProperty(d)&&(b.prototype[d]=c.prototype[d]);c=c.prototype.__proto__}else c=null};for(e=0;e2)for(e=2;ee&&g!==!1;){if(this.eventsToDieOn[a])this._listeners[a][e].apply(this,[b,c]);else try{g=this._listeners[a][e].apply(this,[b,c])}catch(h){B("jsPlumb: fire failed for event "+a+" : "+h)}e++,(null==this._listeners||null==this._listeners[a])&&(f=!0)}}this.tick=!1,this._drain()}return this},this._drain=function(){var b=a.queue.pop();b&&a.fire.apply(a,b)},this.unbind=function(a,b){if(0===arguments.length)this._listeners={};else if(1===arguments.length){if("string"==typeof a)delete this._listeners[a];else if(a.__jsPlumb){var c=void 0;for(var d in a.__jsPlumb)c=a.__jsPlumb[d],r(this._listeners[c]||[],a)}}else 2===arguments.length&&r(this._listeners[a]||[],b);return this},this.getListener=function(b){return a._listeners[b]},this.setSuspendEvents=function(b){a.eventsSuspended=b},this.isSuspendEvents=function(){return a.eventsSuspended},this.silently=function(b){a.setSuspendEvents(!0);try{b()}catch(c){B("Cannot execute silent function "+c)}a.setSuspendEvents(!1)},this.cleanupListeners=function(){for(var b in a._listeners)a._listeners[b]=null}}return a}();E.isArray=a,E.isNumber=b,E.isString=c,E.isBoolean=d,E.isNull=e,E.isObject=f,E.isDate=g,E.isFunction=h,E.isNamedFunction=i,E.isEmpty=j,E.clone=k,E.merge=l,E.replace=m,E.functionChain=n,E.populate=o,E.findWithFunction=p,E.removeWithFunction=q,E.remove=r,E.addWithFunction=s,E.addToList=t,E.suggest=u,E.extend=v,E.uuid=w,E.fastTrim=x,E.each=y,E.map=z,E.mergeWithParents=A,E.logEnabled=F,E.log=B,E.wrap=C,E.EventGenerator=G}.call("undefined"!=typeof window?window:this),function(){"use strict";var a=this;a.jsPlumbUtil.matchesSelector=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;ef;f++)d&&d===e[f]||e[f].setHover(b,!0,c)},g=function(a){return null==a?null:a.split(" ")},h=function(a,b,c){for(var d in b)a[d]=c},i=function(a,c){c=b.isArray(c)||null!=c.length&&!b.isString(c)?c:[c];for(var d=0;dj;j++){var l=a._jsPlumb.types[j];if("__default"!==l){var m=a._jsPlumb.instance.getType(l,e);null!=m&&(i=b.merge(i,m,["cssClass"]),h(f,m,l))}}c&&(i=b.populate(i,c,"_")),a.applyType(i,d,f),d||a.repaint()}},k=a.jsPlumbUIComponent=function(a){b.EventGenerator.apply(this,arguments);var c=this,d=arguments,e=c.idPrefix,f=e+(new Date).getTime();this._jsPlumb={instance:a._jsPlumb,parameters:a.parameters||{},paintStyle:null,hoverPaintStyle:null,paintStyleInUse:null,hover:!1,beforeDetach:a.beforeDetach,beforeDrop:a.beforeDrop,overlayPlacements:[],hoverClass:a.hoverClass||a._jsPlumb.Defaults.HoverClass,types:[],typeCache:{}},this.cacheTypeItem=function(a,b,c){this._jsPlumb.typeCache[c]=this._jsPlumb.typeCache[c]||{},this._jsPlumb.typeCache[c][a]=b},this.getCachedTypeItem=function(a,b){return this._jsPlumb.typeCache[b]?this._jsPlumb.typeCache[b][a]:null},this.getId=function(){return f};var g=a.overlays||[],h={};if(this.defaultOverlayKeys){for(var i=0;if;f++)this.hasType(d[f])||(this._jsPlumb.types.push(d[f]),e=!0);e&&j(this,b,c)}},removeType:function(a,b,c){var d=g(a),e=!1,f=function(a){var b=this._jsPlumb.types.indexOf(a);return-1!==b?(l(this,b),this._jsPlumb.types.splice(b,1),!0):!1}.bind(this);if(null!=d){for(var h=0,i=d.length;i>h;h++)e=f(d[h])||e;e&&j(this,b,c)}},clearTypes:function(a,b){for(var c=this._jsPlumb.types.length,d=0;c>d;d++)l(this,0),this._jsPlumb.types.splice(0,1);j(this,a,b)},toggleType:function(a,b,c){var d=g(a);if(null!=d){for(var e=0,f=d.length;f>e;e++){var h=this._jsPlumb.types.indexOf(d[e]);-1!==h?(l(this,h),this._jsPlumb.types.splice(h,1)):this._jsPlumb.types.push(d[e])}j(this,b,c)}},applyType:function(a,b){if(this.setPaintStyle(a.paintStyle,b),this.setHoverPaintStyle(a.hoverPaintStyle,b),a.parameters)for(var c in a.parameters)this.setParameter(c,a.parameters[c]);this._jsPlumb.paintStyleInUse=this.getPaintStyle()},setPaintStyle:function(a,b){this._jsPlumb.paintStyle=a,this._jsPlumb.paintStyleInUse=this._jsPlumb.paintStyle,d(this),b||this.repaint()},getPaintStyle:function(){return this._jsPlumb.paintStyle},setHoverPaintStyle:function(a,b){this._jsPlumb.hoverPaintStyle=a,d(this),b||this.repaint()},getHoverPaintStyle:function(){return this._jsPlumb.hoverPaintStyle},destroy:function(a){(a||null==this.typeId)&&(this.cleanupListeners(),this.clone=null,this._jsPlumb=null)},isHover:function(){return this._jsPlumb.hover},setHover:function(a,b,d){if(this._jsPlumb&&!this._jsPlumb.instance.currentlyDragging&&!this._jsPlumb.instance.isHoverSuspended()){this._jsPlumb.hover=a;var e=a?"addClass":"removeClass";null!=this.canvas&&(null!=this._jsPlumb.instance.hoverClass&&this._jsPlumb.instance[e](this.canvas,this._jsPlumb.instance.hoverClass),null!=this._jsPlumb.hoverClass&&this._jsPlumb.instance[e](this.canvas,this._jsPlumb.hoverClass)),null!=this._jsPlumb.hoverPaintStyle&&(this._jsPlumb.paintStyleInUse=a?this._jsPlumb.hoverPaintStyle:this._jsPlumb.paintStyle,this._jsPlumb.instance.isSuspendDrawing()||(d=d||c(),this.repaint({timestamp:d,recalc:!1}))),this.getAttachedElements&&!b&&f(this,a,c(),this)}}});var m=0,n=function(){var a=m+1;return m++,a},o=a.jsPlumbInstance=function(d){this.version="2.8.0",this.Defaults={Anchor:"Bottom",Anchors:[null,null],ConnectionsDetachable:!0,ConnectionOverlays:[],Connector:"Bezier",Container:null,DoNotThrowErrors:!1,DragOptions:{},DropOptions:{},Endpoint:"Dot",EndpointOverlays:[],Endpoints:[null,null],EndpointStyle:{fill:"#456"},EndpointStyles:[null,null],EndpointHoverStyle:null,EndpointHoverStyles:[null,null],HoverPaintStyle:null,LabelStyle:{color:"black"},LogEnabled:!1,Overlays:[],MaxConnections:1,PaintStyle:{"stroke-width":4,stroke:"#456"},ReattachConnections:!1,RenderMode:"svg",Scope:"jsPlumb_DefaultScope"},d&&p.extend(this.Defaults,d),this.logEnabled=this.Defaults.LogEnabled,this._connectionTypes={},this._endpointTypes={},b.EventGenerator.apply(this);var f=this,g=n(),h=f.bind,j={},l=1,m=function(a){if(null==a)return null;if(3===a.nodeType||8===a.nodeType)return{el:a,text:!0};var c=f.getElement(a);return{el:c,id:b.isString(a)&&null==c?a:Y(c)}};this.getInstanceIndex=function(){return g},this.setZoom=function(a,b){return l=a,f.fire("zoom",l),b&&f.repaintEverything(),!0},this.getZoom=function(){return l};for(var o in this.Defaults)j[o]=this.Defaults[o];var q,r=[];this.unbindContainer=function(){if(null!=q&&r.length>0)for(var a=0;ae;e++)d.overlays.push(d.sourceEndpoint.connectorOverlays[e])}d.sourceEndpoint&&d.sourceEndpoint.scope&&(d.scope=d.sourceEndpoint.scope),!d["pointer-events"]&&d.sourceEndpoint&&d.sourceEndpoint.connectorPointerEvents&&(d["pointer-events"]=d.sourceEndpoint.connectorPointerEvents);var h=function(a,b,c){return f.addEndpoint(a,N(b,{anchor:d.anchors?d.anchors[c]:d.anchor,endpoint:d.endpoints?d.endpoints[c]:d.endpoint,paintStyle:d.endpointStyles?d.endpointStyles[c]:d.endpointStyle,hoverPaintStyle:d.endpointHoverStyles?d.endpointHoverStyles[c]:d.endpointHoverStyle}))},i=function(a,b,c,e){if(d[a]&&!d[a].endpoint&&!d[a+"Endpoint"]&&!d.newConnection){var f=Y(d[a]),g=c[f];if(g=g?g[e]:null){if(!g.enabled)return!1;var i=null!=g.endpoint&&g.endpoint._jsPlumb?g.endpoint:h(d[a],g.def,b);if(i.isFull())return!1;d[a+"Endpoint"]=i,!d.scope&&g.def.scope&&(d.scope=g.def.scope),g.uniqueEndpoint?g.endpoint?i.finalEndpoint=g.endpoint:(g.endpoint=i,i.setDeleteOnEmpty(!1)):i.setDeleteOnEmpty(!0),0===b&&g.def.connectorOverlays&&(d.overlays=d.overlays||[],Array.prototype.push.apply(d.overlays,g.def.connectorOverlays))}}};return i("source",0,this.sourceEndpointDefinitions,d.type||"default")!==!1&&i("target",1,this.targetEndpointDefinitions,d.type||"default")!==!1?(d.sourceEndpoint&&d.targetEndpoint&&(M(d.sourceEndpoint,d.targetEndpoint)||(d=null)),d):void 0}.bind(f),P=function(a){var b=f.Defaults.ConnectionType||f.getDefaultConnectionType();a._jsPlumb=f,a.newConnection=P,a.newEndpoint=R,a.endpointsByUUID=w,a.endpointsByElement=v,a.finaliseConnection=Q,a.id="con_"+H();var c=new b(a);return c.isDetachable()&&(c.endpoints[0].initDraggable("_jsPlumbSource"),c.endpoints[1].initDraggable("_jsPlumbTarget")),c},Q=f.finaliseConnection=function(a,b,c,d){if(b=b||{},a.suspendedEndpoint||u.push(a),a.pending=null,a.endpoints[0].isTemporarySource=!1,d!==!1&&f.anchorManager.newConnection(a),J(a.source),!b.doNotFireConnectionEvent&&b.fireEvent!==!1){var e={connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]};f.fire("connection",e,c)}},R=function(a,b){var c=f.Defaults.EndpointType||p.Endpoint,d=p.extend({},a);d._jsPlumb=f,d.newConnection=P,d.newEndpoint=R,d.endpointsByUUID=w,d.endpointsByElement=v,d.fireDetachEvent=_,d.elementId=b||Y(d.source);var e=new c(d);return e.id="ep_"+H(),sa(d.elementId,d.source),p.headless||f.getDragManager().endpointAdded(d.source,b),e},S=function(a,b,c){var d=v[a];if(d&&d.length)for(var e=0,f=d.length;f>e;e++){for(var g=0,h=d[e].connections.length;h>g;g++){var i=b(d[e].connections[g]);if(i)return}c&&c(d[e])}},T=function(a,b){return p.each(a,function(a){f.isDragSupported(a)&&(A[f.getAttribute(a,"id")]=b,f.setElementDraggable(a,b))})},U=function(a,b,c){b="block"===b;var d=null;c&&(d=function(a){a.setVisible(b,!0,!0)});var e=m(a);S(e.id,function(a){if(b&&c){var d=a.sourceId===e.id?1:0;a.endpoints[d].isVisible()&&a.setVisible(!0)}else a.setVisible(b)},d)},V=function(a){var b;return p.each(a,function(a){var c=f.getAttribute(a,"id");return b=null==A[c]?!1:A[c],b=!b,A[c]=b,f.setDraggable(a,b),b}.bind(this)),b},W=function(a,b){var c=null;b&&(c=function(a){var b=a.isVisible();a.setVisible(!b)}),S(a,function(a){var b=a.isVisible();a.setVisible(!b)},c)},X=function(a){var b=y[a];return b?{o:b,s:C[a]}:ta({elId:a})},Y=function(a,c,d){if(b.isString(a))return a;if(null==a)return null;var e=f.getAttribute(a,"id");return e&&"undefined"!==e||(2===arguments.length&&void 0!==arguments[1]?e=c:(1===arguments.length||3===arguments.length&&!arguments[2])&&(e="jsPlumb_"+g+"_"+H()),d||f.setAttribute(a,"id",e)),e};this.setConnectionBeingDragged=function(a){B=a},this.isConnectionBeingDragged=function(){return B},this.getManagedElements=function(){return x},this.connectorClass="jtk-connector",this.connectorOutlineClass="jtk-connector-outline",this.connectedClass="jtk-connected",this.hoverClass="jtk-hover",this.endpointClass="jtk-endpoint",this.endpointConnectedClass="jtk-endpoint-connected",this.endpointFullClass="jtk-endpoint-full",this.endpointDropAllowedClass="jtk-endpoint-drop-allowed",this.endpointDropForbiddenClass="jtk-endpoint-drop-forbidden",this.overlayClass="jtk-overlay",this.draggingClass="jtk-dragging",this.elementDraggingClass="jtk-element-dragging",this.sourceElementDraggingClass="jtk-source-element-dragging",this.targetElementDraggingClass="jtk-target-element-dragging",this.endpointAnchorClassPrefix="jtk-endpoint-anchor",this.hoverSourceClass="jtk-source-hover",this.hoverTargetClass="jtk-target-hover",this.dragSelectClass="jtk-drag-select",this.Anchors={},this.Connectors={svg:{}},this.Endpoints={svg:{}},this.Overlays={svg:{}},this.ConnectorRenderers={},this.SVG="svg",this.addEndpoint=function(a,c,d){d=d||{};var e=p.extend({},d);p.extend(e,c),e.endpoint=e.endpoint||f.Defaults.Endpoint,e.paintStyle=e.paintStyle||f.Defaults.EndpointStyle;for(var g=[],h=b.isArray(a)||null!=a.length&&!b.isString(a)?a:[a],i=0,j=h.length;j>i;i++){e.source=f.getElement(h[i]),qa(e.source);var k=Y(e.source),l=R(e,k),m=sa(k,e.source).info.o;b.addToList(v,k,l),D||l.paint({anchorLoc:l.anchor.compute({xy:[m.left,m.top],wh:C[k],element:l,timestamp:E}),timestamp:E}),g.push(l)}return 1===g.length?g[0]:g},this.addEndpoints=function(a,c,d){for(var e=[],g=0,h=c.length;h>g;g++){var i=f.addEndpoint(a,c[g],d);b.isArray(i)?Array.prototype.push.apply(e,i):e.push(i)}return e},this.animate=function(a,c,d){if(!this.animationSupported)return!1;d=d||{};var e=f.getElement(a),g=Y(e),h=p.animEvents.step,i=p.animEvents.complete;d[h]=b.wrap(d[h],function(){f.revalidate(g)}),d[i]=b.wrap(d[i],function(){f.revalidate(g)}),f.doAnimate(e,c,d)},this.checkCondition=function(a,c){var d=f.getListener(a),e=!0;if(d&&d.length>0){var g=Array.prototype.slice.call(arguments,1);try{for(var h=0,i=d.length;i>h;h++)e=e&&d[h].apply(d[h],g)}catch(j){b.log(f,"cannot check condition ["+a+"]"+j)}}return e},this.connect=function(a,c){var d,e=O(a,c);if(e){if(null==e.source&&null==e.sourceEndpoint)return void b.log("Cannot establish connection - source does not exist");if(null==e.target&&null==e.targetEndpoint)return void b.log("Cannot establish connection - target does not exist");qa(e.source),d=P(e),Q(d,e)}return d};var Z=[{el:"source",elId:"sourceId",epDefs:"sourceEndpointDefinitions"},{el:"target",elId:"targetId",epDefs:"targetEndpointDefinitions"}],$=function(a,b,c,d){var e,f,g,h=Z[c],i=a[h.elId],j=(a[h.el],a.endpoints[c]),k={index:c,originalSourceId:0===c?i:a.sourceId,newSourceId:a.sourceId,originalTargetId:1===c?i:a.targetId,newTargetId:a.targetId,connection:a};if(b.constructor===p.Endpoint)e=b,e.addConnection(a),b=e.element;else if(f=Y(b),g=this[h.epDefs][f],f===a[h.elId])e=null;else if(g)for(var l in g){if(!g[l].enabled)return;e=null!=g[l].endpoint&&g[l].endpoint._jsPlumb?g[l].endpoint:this.addEndpoint(b,g[l].def),g[l].uniqueEndpoint&&(g[l].endpoint=e),e.addConnection(a)}else e=a.makeEndpoint(0===c,b,f);return null!=e&&(j.detachFromConnection(a),a.endpoints[c]=e,a[h.el]=e.element,a[h.elId]=e.elementId,k[0===c?"newSourceId":"newTargetId"]=e.elementId,aa(k),d||a.repaint()),k.element=b,k}.bind(this);this.setSource=function(a,b,c){var d=$(a,b,0,c);this.anchorManager.sourceChanged(d.originalSourceId,d.newSourceId,a,d.el)},this.setTarget=function(a,b,c){var d=$(a,b,1,c);this.anchorManager.updateOtherEndpoint(d.originalSourceId,d.originalTargetId,d.newTargetId,a)},this.deleteEndpoint=function(a,b,c){var d="string"==typeof a?w[a]:a;return d&&f.deleteObject({endpoint:d,dontUpdateHover:b,deleteAttachedObjects:c}),f},this.deleteEveryEndpoint=function(){var a=f.setSuspendDrawing(!0);for(var b in v){var c=v[b];if(c&&c.length)for(var d=0,e=c.length;e>d;d++)f.deleteEndpoint(c[d],!0)}v={},x={},w={},y={},z={},f.anchorManager.reset();var g=f.getDragManager();return g&&g.reset(),a||f.setSuspendDrawing(!1),f};var _=function(a,b,c){var d=f.Defaults.ConnectionType||f.getDefaultConnectionType(),e=a.constructor===d,g=e?{connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]}:a;b&&f.fire("connectionDetached",g,c),f.fire("internal.connectionDetached",g,c),f.anchorManager.connectionDetached(g)},aa=f.fireMoveEvent=function(a,b){f.fire("connectionMoved",a,b)};this.unregisterEndpoint=function(a){a._jsPlumb.uuid&&(w[a._jsPlumb.uuid]=null),f.anchorManager.deleteEndpoint(a);for(var b in v){var c=v[b];if(c){for(var d=[],e=0,g=c.length;g>e;e++)c[e]!==a&&d.push(c[e]);v[b]=d}v[b].length<1&&delete v[b]}};var ba="isDetachAllowed",ca="beforeDetach",da="checkCondition";this.deleteConnection=function(a,c){return null!=a&&(c=c||{},c.force||b.functionChain(!0,!1,[[a.endpoints[0],ba,[a]],[a.endpoints[1],ba,[a]],[a,ba,[a]],[f,da,[ca,a]]]))?(a.setHover(!1),_(a,!a.pending&&c.fireEvent!==!1,c.originalEvent),a.endpoints[0].detachFromConnection(a),a.endpoints[1].detachFromConnection(a),b.removeWithFunction(u,function(b){return a.id===b.id}),a.cleanup(),a.destroy(),!0):!1},this.deleteEveryConnection=function(a){a=a||{};var b=u.length,c=0;return f.batch(function(){for(var d=0;b>d;d++)c+=f.deleteConnection(u[0],a)?1:0}),c},this.deleteConnectionsForElement=function(a,b){b=b||{},a=f.getElement(a);var c=Y(a),d=v[c];if(d&&d.length)for(var e=0,g=d.length;g>e;e++)d[e].deleteEveryConnection(b);return f},this.deleteObject=function(a){var c={endpoints:{},connections:{},endpointCount:0,connectionCount:0},d=a.deleteAttachedObjects!==!1,e=function(b){null!=b&&null==c.connections[b.id]&&(a.dontUpdateHover||null==b._jsPlumb||b.setHover(!1),c.connections[b.id]=b,c.connectionCount++)},g=function(b){if(null!=b&&null==c.endpoints[b.id]&&(a.dontUpdateHover||null==b._jsPlumb||b.setHover(!1),c.endpoints[b.id]=b,c.endpointCount++,d))for(var f=0;fe;e++)a[e][b].apply(a[e],c);return d(a)},fa=function(a,b,c){for(var d=[],e=0,f=a.length;f>e;e++)d.push([a[e][b].apply(a[e],c),a[e]]);return d},ga=function(a,b,c){return function(){return ea(a,b,arguments,c)}},ha=function(a,b){return function(){return fa(a,b,arguments)}},ia=function(a,b){var c=[];if(a)if("string"==typeof a){if("*"===a)return a;c.push(a)}else if(b)c=a;else if(a.length)for(var d=0,e=a.length;e>d;d++)c.push(m(a[d]).id);else c.push(m(a).id);return c},ja=function(a,b,c){return"*"===a?!0:a.length>0?-1!==a.indexOf(b):!c};this.getConnections=function(a,b){a?a.constructor===String&&(a={scope:a}):a={};for(var c=a.scope||f.getDefaultScope(),d=ia(c,!0),e=ia(a.source),g=ia(a.target),h=!b&&d.length>1?{}:[],i=function(a,c){if(!b&&d.length>1){var e=h[a];null==e&&(e=h[a]=[]),e.push(c)}else h.push(c)},j=0,k=u.length;k>j;j++){var l=u[j],m=l.proxies&&l.proxies[0]?l.proxies[0].originalEp.elementId:l.sourceId,n=l.proxies&&l.proxies[1]?l.proxies[1].originalEp.elementId:l.targetId;ja(d,l.scope)&&ja(e,m)&&ja(g,n)&&i(l.scope,l)}return h};var ka=function(a,b){return function(c){for(var d=0,e=a.length;e>d;d++)c(a[d]);return b(a)}},la=function(a){return function(b){return a[b]}},ma=function(a,b){var c,d,e={length:a.length,each:ka(a,b),get:la(a)},f=["setHover","removeAllOverlays","setLabel","addClass","addOverlay","removeOverlay","removeOverlays","showOverlay","hideOverlay","showOverlays","hideOverlays","setPaintStyle","setHoverPaintStyle","setSuspendEvents","setParameter","setParameters","setVisible","repaint","addType","toggleType","removeType","removeClass","setType","bind","unbind"],g=["getLabel","getOverlay","isHover","getParameter","getParameters","getPaintStyle","getHoverPaintStyle","isVisible","hasType","getType","isSuspendEvents"];for(c=0,d=f.length;d>c;c++)e[f[c]]=ga(a,f[c],b);for(c=0,d=g.length;d>c;c++)e[g[c]]=ha(a,g[c]);return e},na=function(a){var b=ma(a,na);return p.extend(b,{setDetachable:ga(a,"setDetachable",na),setReattach:ga(a,"setReattach",na),setConnector:ga(a,"setConnector",na),"delete":function(){for(var b=0,c=a.length;c>b;b++)f.deleteConnection(a[b])},isDetachable:ha(a,"isDetachable"),isReattach:ha(a,"isReattach") +})},oa=function(a){var b=ma(a,oa);return p.extend(b,{setEnabled:ga(a,"setEnabled",oa),setAnchor:ga(a,"setAnchor",oa),isEnabled:ha(a,"isEnabled"),deleteEveryConnection:function(){for(var b=0,c=a.length;c>b;b++)a[b].deleteEveryConnection()},"delete":function(){for(var b=0,c=a.length;c>b;b++)f.deleteEndpoint(a[b])}})};this.select=function(a){return a=a||{},a.scope=a.scope||"*",na(a.connections||f.getConnections(a,!0))},this.selectEndpoints=function(a){a=a||{},a.scope=a.scope||"*";var b=!a.element&&!a.source&&!a.target,c=b?"*":ia(a.element),d=b?"*":ia(a.source),e=b?"*":ia(a.target),f=ia(a.scope,!0),g=[];for(var h in v){var i=ja(c,h,!0),j=ja(d,h,!0),k="*"!==d,l=ja(e,h,!0),m="*"!==e;if(i||j||l)a:for(var n=0,o=v[h].length;o>n;n++){var p=v[h][n];if(ja(f,p.scope,!0)){var q=k&&d.length>0&&!p.isSource,r=m&&e.length>0&&!p.isTarget;if(q||r)continue a;g.push(p)}}}return oa(g)},this.getAllConnections=function(){return u},this.getDefaultScope=function(){return F},this.getEndpoint=K,this.getEndpoints=function(a){return v[m(a).id]||[]},this.getDefaultEndpointType=function(){return p.Endpoint},this.getDefaultConnectionType=function(){return p.Connection},this.getId=Y,this.appendElement=I;var pa=!1;this.isHoverSuspended=function(){return pa},this.setHoverSuspended=function(a){pa=a},this.hide=function(a,b){return U(a,"none",b),f},this.idstamp=H;var qa=function(a){if(!q&&a){var b=f.getElement(a);b.offsetParent&&f.setContainer(b.offsetParent)}},ra=function(){f.Defaults.Container&&f.setContainer(f.Defaults.Container)},sa=f.manage=function(a,b,c){return x[a]||(x[a]={el:b,endpoints:[],connections:[]},x[a].info=ta({elId:a,timestamp:E}),c||f.fire("manageElement",{id:a,info:x[a].info,el:b})),x[a]},ta=function(a){var b,c=a.timestamp,d=a.recalc,e=a.offset,g=a.elId;return D&&!c&&(c=E),!d&&c&&c===z[g]?{o:a.offset||y[g],s:C[g]}:(d||!e&&null==y[g]?(b=x[g]?x[g].el:null,null!=b&&(C[g]=f.getSize(b),y[g]=f.getOffset(b),z[g]=c)):(y[g]=e||y[g],null==C[g]&&(b=x[g].el,null!=b&&(C[g]=f.getSize(b))),z[g]=c),y[g]&&!y[g].right&&(y[g].right=y[g].left+C[g][0],y[g].bottom=y[g].top+C[g][1],y[g].width=C[g][0],y[g].height=C[g][1],y[g].centerx=y[g].left+y[g].width/2,y[g].centery=y[g].top+y[g].height/2),{o:y[g],s:C[g]})};this.updateOffset=ta,this.init=function(){t||(ra(),f.anchorManager=new a.jsPlumb.AnchorManager({jsPlumbInstance:f}),t=!0,f.fire("ready",f))}.bind(this),this.log=s,this.jsPlumbUIComponent=k,this.makeAnchor=function(){var c,d=function(b,c){if(a.jsPlumb.Anchors[b])return new a.jsPlumb.Anchors[b](c);if(!f.Defaults.DoNotThrowErrors)throw{msg:"jsPlumb: unknown anchor type '"+b+"'"}};if(0===arguments.length)return null;var e=arguments[0],g=arguments[1],h=(arguments[2],null);if(e.compute&&e.getOrientation)return e;if("string"==typeof e)h=d(arguments[0],{elementId:g,jsPlumbInstance:f});else if(b.isArray(e))if(b.isArray(e[0])||b.isString(e[0]))2===e.length&&b.isObject(e[1])?b.isString(e[0])?(c=a.jsPlumb.extend({elementId:g,jsPlumbInstance:f},e[1]),h=d(e[0],c)):(c=a.jsPlumb.extend({elementId:g,jsPlumbInstance:f,anchors:e[0]},e[1]),h=new a.jsPlumb.DynamicAnchor(c)):h=new p.DynamicAnchor({anchors:e,selector:null,elementId:g,jsPlumbInstance:f});else{var i={x:e[0],y:e[1],orientation:e.length>=4?[e[2],e[3]]:[0,0],offsets:e.length>=6?[e[4],e[5]]:[0,0],elementId:g,jsPlumbInstance:f,cssClass:7===e.length?e[6]:null};h=new a.jsPlumb.Anchor(i),h.clone=function(){return new a.jsPlumb.Anchor(i)}}return h.id||(h.id="anchor_"+H()),h},this.makeAnchors=function(c,d,e){for(var g=[],h=0,i=c.length;i>h;h++)"string"==typeof c[h]?g.push(a.jsPlumb.Anchors[c[h]]({elementId:d,jsPlumbInstance:e})):b.isArray(c[h])&&g.push(f.makeAnchor(c[h],d,e));return g},this.makeDynamicAnchor=function(b,c){return new a.jsPlumb.DynamicAnchor({anchors:b,selector:c,elementId:null,jsPlumbInstance:f})},this.targetEndpointDefinitions={},this.sourceEndpointDefinitions={};var ua=function(a,b,c,d,e){for(var f=a.target||a.srcElement,g=!1,h=d.getSelector(b,c),i=0;i0&&a>=c.def.maxConnections},element:c.el,elementId:c.id,isSource:g,isTarget:h,addClass:function(a){f.addClass(c.el,a)},removeClass:function(a){f.removeClass(c.el,a)},onDrop:function(a){var b=a.endpoints[0];b.anchor.unlock()},isDropAllowed:function(){return i.isDropAllowed.apply(i,arguments)},isRedrop:function(a){return null!=a.suspendedElement&&null!=a.suspendedEndpoint&&a.suspendedEndpoint.element===c.el},getEndpoint:function(b){var e=c.def.endpoint;if(null==e||null==e._jsPlumb){var g=f.deriveEndpointAndAnchorSpec(b.getType().join(" "),!0),h=g.endpoints?a.jsPlumb.extend(d,{endpoint:c.def.def.endpoint||g.endpoints[1]}):d;g.anchors&&(h=a.jsPlumb.extend(h,{anchor:c.def.def.anchor||g.anchors[1]})),e=f.addEndpoint(c.el,h),e._mtNew=!0}if(d.uniqueEndpoint&&(c.def.endpoint=e),e.setDeleteOnEmpty(!0),b.isDetachable()&&e.initDraggable(),null!=e.anchor.positionFinder){var i=f.getUIPosition(arguments,f.getZoom()),j=f.getOffset(c.el),k=f.getSize(c.el),l=null==i?[0,0]:e.anchor.positionFinder(i,j,k,e.anchor.constructorParams);e.anchor.x=l[0],e.anchor.y=l[1]}return e},maybeCleanup:function(a){a._mtNew&&0===a.connections.length?f.deleteObject({endpoint:a}):delete a._mtNew}}),l=a.jsPlumb.dragEvents.drop;return e.scope=e.scope||d.scope||f.Defaults.Scope,e[l]=b.wrap(e[l],j,!0),e.rank=d.rank||0,h&&(e[a.jsPlumb.dragEvents.over]=function(){return!0}),d.allowLoopback===!1&&(e.canDrop=function(a){var b=a.getDragElement()._jsPlumbRelatedElement;return b!==c.el}),f.initDroppable(c.el,e,"internal"),j};this.makeTarget=function(b,c,d){var e=a.jsPlumb.extend({_jsPlumb:this},d);a.jsPlumb.extend(e,c);for(var g=e.maxConnections||-1,h=function(b){var c=m(b),d=c.id,h=a.jsPlumb.extend({},e.dropOptions||{}),i=e.connectionType||"default";this.targetEndpointDefinitions[d]=this.targetEndpointDefinitions[d]||{},qa(d),c.el._isJsPlumbGroup&&null==h.rank&&(h.rank=-1);var j={def:a.jsPlumb.extend({},e),uniqueEndpoint:e.uniqueEndpoint,maxConnections:g,enabled:!0};e.createEndpoint&&(j.uniqueEndpoint=!0,j.endpoint=f.addEndpoint(b,j.def),j.endpoint.setDeleteOnEmpty(!1)),c.def=j,this.targetEndpointDefinitions[d][i]=j,va(c,e,h,e.isSource===!0,!0),c.el._katavorioDrop[c.el._katavorioDrop.length-1].targetDef=j}.bind(this),i=b.length&&b.constructor!==String?b:[b],j=0,k=i.length;k>j;j++)h(i[j]);return this},this.unmakeTarget=function(a,b){var c=m(a);return f.destroyDroppable(c.el,"internal"),b||delete this.targetEndpointDefinitions[c.id],this},this.makeSource=function(c,d,e){var g=a.jsPlumb.extend({_jsPlumb:this},e);a.jsPlumb.extend(g,d);var h=g.connectionType||"default",i=f.deriveEndpointAndAnchorSpec(h);g.endpoint=g.endpoint||i.endpoints[0],g.anchor=g.anchor||i.anchors[0];for(var j=g.maxConnections||-1,k=g.onMaxConnections,n=function(d){var e=d.id,i=this.getElement(d.el);this.sourceEndpointDefinitions[e]=this.sourceEndpointDefinitions[e]||{},qa(e);var m={def:a.jsPlumb.extend({},g),uniqueEndpoint:g.uniqueEndpoint,maxConnections:j,enabled:!0};g.createEndpoint&&(m.uniqueEndpoint=!0,m.endpoint=f.addEndpoint(c,m.def),m.endpoint.setDeleteOnEmpty(!1)),this.sourceEndpointDefinitions[e][h]=m,d.def=m;var n=a.jsPlumb.dragEvents.stop,o=a.jsPlumb.dragEvents.drag,p=a.jsPlumb.extend({},g.dragOptions||{}),q=p.drag,r=p.stop,s=null,t=!1;p.scope=p.scope||g.scope,p[o]=b.wrap(p[o],function(){q&&q.apply(this,arguments),t=!1}),p[n]=b.wrap(p[n],function(){if(r&&r.apply(this,arguments),this.currentlyDragging=!1,null!=s._jsPlumb){var a=g.anchor||this.Defaults.Anchor,b=s.anchor,c=s.connections[0],d=this.makeAnchor(a,e,this),h=s.element;if(null!=d.positionFinder){var i=f.getOffset(h),j=this.getSize(h),k={left:i.left+b.x*j[0],top:i.top+b.y*j[1]},l=d.positionFinder(k,i,j,d.constructorParams);d.x=l[0],d.y=l[1]}s.setAnchor(d,!0),s.repaint(),this.repaint(s.elementId),null!=c&&this.repaint(c.targetId)}}.bind(this));var u=function(c){if(3!==c.which&&2!==c.button){var m=this.sourceEndpointDefinitions[e][h];if(m.enabled){if(e=this.getId(this.getElement(d.el)),g.filter){var n=b.isString(g.filter)?ua(c,d.el,g.filter,this,g.filterExclude):g.filter(c,d.el);if(n===!1)return}var o=this.select({source:e}).length;if(m.maxConnections>=0&&o>=m.maxConnections)return k&&k({element:d.el,maxConnections:j},c),!1;var q=a.jsPlumb.getPositionOnElement(c,i,l),r={};a.jsPlumb.extend(r,g),r.isTemporarySource=!0,r.anchor=[q[0],q[1],0,0],r.dragOptions=p,m.def.scope&&(r.scope=m.def.scope),s=this.addEndpoint(e,r),t=!0,s.setDeleteOnEmpty(!0),m.uniqueEndpoint&&(m.endpoint?s.finalEndpoint=m.endpoint:(m.endpoint=s,s.setDeleteOnEmpty(!1)));var u=function(){f.off(s.canvas,"mouseup",u),f.off(d.el,"mouseup",u),t&&(t=!1,f.deleteEndpoint(s))};f.on(s.canvas,"mouseup",u),f.on(d.el,"mouseup",u);var v={};if(m.def.extract)for(var w in m.def.extract){var x=(c.srcElement||c.target).getAttribute(w);x&&(v[m.def.extract[w]]=x)}f.trigger(s.canvas,"mousedown",c,v),b.consume(c)}}}.bind(this);this.on(d.el,"mousedown",u),m.trigger=u,g.filter&&(b.isString(g.filter)||b.isFunction(g.filter))&&f.setDragFilter(d.el,g.filter);var v=a.jsPlumb.extend({},g.dropOptions||{});va(d,g,v,!0,g.isTarget===!0)}.bind(this),o=c.length&&c.constructor!==String?c:[c],p=0,q=o.length;q>p;p++)n(m(o[p]));return this},this.unmakeSource=function(a,b,c){var d=m(a);f.destroyDroppable(d.el,"internal");var e=this.sourceEndpointDefinitions[d.id];if(e)for(var g in e)if(null==b||b===g){var h=e[g].trigger;h&&f.off(d.el,"mousedown",h),c||delete this.sourceEndpointDefinitions[d.id][g]}return this},this.unmakeEverySource=function(){for(var a in this.sourceEndpointDefinitions)f.unmakeSource(a,null,!0);return this.sourceEndpointDefinitions={},this};var wa=function(a,c,d){c=b.isArray(c)?c:[c];var e=Y(a);d=d||"default";for(var f=0;fl;l++)i=m(c[l]),k[i.id]&&k[i.id][g]&&(h[l]=k[i.id][g].enabled,j=e?!h[l]:d,k[i.id][g].enabled=j,f[j?"removeClass":"addClass"](i.el,"jtk-"+a+"-disabled"))}else{i=m(c);var o=i.id;k[o]&&k[o][g]&&(h=k[o][g].enabled,j=e?!h:d,k[o][g].enabled=j,f[j?"removeClass":"addClass"](i.el,"jtk-"+a+"-disabled"))}return h}.bind(this),za=function(a,c){return b.isString(a)||!a.length?c.apply(this,[a]):a.length?c.apply(this,[a[0]]):void 0}.bind(this);this.toggleSourceEnabled=function(a,b){return ya("source",a,null,!0,b),this.isSourceEnabled(a,b)},this.setSourceEnabled=function(a,b,c){return ya("source",a,b,null,c)},this.isSource=function(a,b){return b=b||"default",za(a,function(a){var c=this.sourceEndpointDefinitions[m(a).id];return null!=c&&null!=c[b]}.bind(this))},this.isSourceEnabled=function(a,b){return b=b||"default",za(a,function(a){var c=this.sourceEndpointDefinitions[m(a).id];return c&&c[b]&&c[b].enabled===!0}.bind(this))},this.toggleTargetEnabled=function(a,b){return ya("target",a,null,!0,b),this.isTargetEnabled(a,b)},this.isTarget=function(a,b){return b=b||"default",za(a,function(a){var c=this.targetEndpointDefinitions[m(a).id];return null!=c&&null!=c[b]}.bind(this))},this.isTargetEnabled=function(a,b){return b=b||"default",za(a,function(a){var c=this.targetEndpointDefinitions[m(a).id];return c&&c[b]&&c[b].enabled===!0}.bind(this))},this.setTargetEnabled=function(a,b,c){return ya("target",a,b,null,c)},this.ready=function(a){f.bind("ready",a)};var Aa=function(a,b){if("object"==typeof a&&a.length)for(var c=0,d=a.length;d>c;c++)b(a[c]);else b(a);return f};this.repaint=function(a,b,c){return Aa(a,function(a){J(a,b,c)})},this.revalidate=function(a,b,c){return Aa(a,function(a){var d=c?a:f.getId(a);f.updateOffset({elId:d,recalc:!0,timestamp:b});var e=f.getDragManager();e&&e.updateOffsets(d),f.repaint(a)})},this.repaintEverything=function(){var a,b=c();for(a in v)f.updateOffset({elId:a,recalc:!0,timestamp:b});for(a in v)J(a,null,b);return this},this.removeAllEndpoints=function(a,b,c){c=c||[];var d=function(a){var e,g,h=m(a),i=v[h.id];if(i)for(c.push(h),e=0,g=i.length;g>e;e++)f.deleteEndpoint(i[e],!1);if(delete v[h.id],b&&h.el&&3!==h.el.nodeType&&8!==h.el.nodeType)for(e=0,g=h.el.childNodes.length;g>e;e++)d(h.el.childNodes[e])};return d(a),this};var Ba=function(a,b){f.removeAllEndpoints(a.id,!0,b);for(var c=f.getDragManager(),d=function(a){c&&c.elementRemoved(a.id),f.anchorManager.clearFor(a.id),f.anchorManager.removeFloatingConnection(a.id),f.isSource(a.el)&&f.unmakeSource(a.el),f.isTarget(a.el)&&f.unmakeTarget(a.el),f.destroyDraggable(a.el),f.destroyDroppable(a.el),delete f.floatingConnections[a.id],delete x[a.id],delete y[a.id],a.el&&(f.removeElement(a.el),a.el._jsPlumb=null)},e=1;e0;)d(e.el.childNodes[0]);b||Ba(e,c)}};return f.batch(function(){d(a,!0)},b===!1),f},this.reset=function(a){f.silently(function(){pa=!1,f.removeAllGroups(),f.removeGroupManager(),f.deleteEveryEndpoint(),a||f.unbind(),this.targetEndpointDefinitions={},this.sourceEndpointDefinitions={},u.length=0,this.doReset&&this.doReset()}.bind(this))};var Ca=function(a){a.canvas&&a.canvas.parentNode&&a.canvas.parentNode.removeChild(a.canvas),a.cleanup(),a.destroy()};this.clear=function(){f.select().each(Ca),f.selectEndpoints().each(Ca),v={},w={}},this.setDefaultScope=function(a){return F=a,f},this.setDraggable=T,this.deriveEndpointAndAnchorSpec=function(a,b){for(var c=((b?"":"default ")+a).split(/[\s]/),d=null,e=null,g=null,h=null,i=0;ih;h++)v[c][h].setElementId(c),v[c][h].setReferenceElement(a);delete v[e],this.sourceEndpointDefinitions[c]=this.sourceEndpointDefinitions[e],delete this.sourceEndpointDefinitions[e],this.targetEndpointDefinitions[c]=this.targetEndpointDefinitions[e],delete this.targetEndpointDefinitions[e],this.anchorManager.changeId(e,c);var j=this.getDragManager();j&&j.changeId(e,c),x[c]=x[e],delete x[e];var k=function(b,d,e){for(var f=0,g=b.length;g>f;f++)b[f].endpoints[d].setElementId(c),b[f].endpoints[d].setReferenceElement(a),b[f][e+"Id"]=c,b[f][e]=a};k(f,0,"source"),k(g,1,"target"),this.repaint(c)},this.setDebugLog=function(a){s=a},this.setSuspendDrawing=function(a,b){var c=D;return D=a,E=a?(new Date).getTime():null,b&&this.repaintEverything(),c},this.isSuspendDrawing=function(){return D},this.getSuspendedAt=function(){return E},this.batch=function(a,c){var d=this.isSuspendDrawing();d||this.setSuspendDrawing(!0);try{a()}catch(e){b.log("Function run while suspended failed",e)}d||this.setSuspendDrawing(!1,!c)},this.doWhileSuspended=this.batch,this.getCachedData=X,this.timestamp=c,this.show=function(a,b){return U(a,"block",b),f},this.toggleVisible=W,this.toggleDraggable=V,this.addListener=this.bind;var Da=[];this.registerFloatingConnection=function(a,c,d){Da[a.id]=c,b.addToList(v,a.id,d)},this.getFloatingConnectionFor=function(a){return Da[a]}};b.extend(a.jsPlumbInstance,b.EventGenerator,{setAttribute:function(a,b,c){this.setAttribute(a,b,c)},getAttribute:function(b,c){return this.getAttribute(a.jsPlumb.getElement(b),c)},convertToFullOverlaySpec:function(a){return b.isString(a)&&(a=[a,{}]),a[1].id=a[1].id||b.uuid(),a},registerConnectionType:function(b,c){if(this._connectionTypes[b]=a.jsPlumb.extend({},c),c.overlays){for(var d={},e=0;e0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},i=function(a){var b={},c=[],d={},e={},f={};this.register=function(g){var h,i=a.getId(g);b[i]||(b[i]=g,c.push(g),d[i]={});var j=function(b){if(b)for(var c=0;c0){h||(h=a.getOffset(g));var m=a.getOffset(k);d[i][l]={id:l,offset:{left:m.left-h.left,top:m.top-h.top}},f[l]=i}j(b.childNodes[c])}};j(g)},this.updateOffsets=function(b,c){if(null!=b){c=c||{};var e,g=jsPlumb.getElement(b),h=a.getId(g),i=d[h];if(i)for(var j in i)if(i.hasOwnProperty(j)){var k=jsPlumb.getElement(j),l=c[j]||a.getOffset(k);if(null==k.offsetParent&&null!=d[h][j])continue;e||(e=a.getOffset(g)),d[h][j]={id:j,offset:{left:l.left-e.left,top:l.top-e.top}},f[j]=h}}},this.endpointAdded=function(c,g){g=g||a.getId(c);var h=document.body,i=c.parentNode;for(e[g]=e[g]?e[g]+1:1;null!=i&&i!==h;){var j=a.getId(i,null,!0);if(j&&b[j]){var k=a.getOffset(i);if(null==d[j][g]){var l=a.getOffset(c);d[j][g]={id:g,offset:{left:l.left-k.left,top:l.top-k.top}},f[g]=j}break}i=i.parentNode}},this.endpointDeleted=function(a){if(e[a.elementId]&&(e[a.elementId]--,e[a.elementId]<=0))for(var b in d)d.hasOwnProperty(b)&&d[b]&&(delete d[b][a.elementId],delete f[a.elementId])},this.changeId=function(a,b){d[b]=d[a],d[a]={},f[b]=f[a],f[a]=null},this.getElementsForDraggable=function(a){return d[a]},this.elementRemoved=function(a){var b=f[a];b&&(delete d[b][a],delete f[a])},this.reset=function(){b={},c=[],d={},e={}},this.dragEnded=function(b){if(null!=b.offsetParent){var c=a.getId(b),d=f[c];d&&this.updateOffsets(d)}},this.setParent=function(b,c,e,g,h){var i=f[c];d[g]||(d[g]={});var j=a.getOffset(e),k=h||a.getOffset(b);i&&d[i]&&delete d[i][c],d[g][c]={id:c,offset:{left:k.left-j.left,top:k.top-j.top}},f[c]=g},this.clearParent=function(a,b){var c=f[b];c&&(delete d[c][b],delete f[b])},this.revalidateParent=function(b,c,d){var e=f[c];if(e){var g={};g[c]=d,this.updateOffsets(e,g),a.revalidate(e)}},this.getDragAncestor=function(b){var c=jsPlumb.getElement(b),d=a.getId(c),e=f[d];return e?jsPlumb.getElement(e):null}},j=function(a){return null==a?null:a.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},k=function(a,b,c){b=j(b),"undefined"!=typeof a.className.baseVal?a.className.baseVal=b:a.className=b;try{var d=a.classList;if(null!=d){for(;d.length>0;)d.remove(d.item(0));for(var e=0;e0||a.scrollLeft>0)&&(d.left-=a.scrollLeft,d.top-=a.scrollTop)}.bind(this);null!=e;)d.left+=e.offsetLeft,d.top+=e.offsetTop,f(e),e=b?e.offsetParent:e.offsetParent===c?null:e.offsetParent;if(null!=c&&!b&&(c.scrollTop>0||c.scrollLeft>0)){var g=null!=a.offsetParent?this.getStyle(a.offsetParent,"position"):"static",h=this.getStyle(a,"position");"absolute"!==h&&"fixed"!==h&&"absolute"!==g&&"fixed"!==g&&(d.left-=c.scrollLeft,d.top-=c.scrollTop)}return d},getPositionOnElement:function(a,b,c){var d="undefined"!=typeof b.getBoundingClientRect?b.getBoundingClientRect():{left:0,top:0,width:0,height:0},e=document.body,f=document.documentElement,g=window.pageYOffset||f.scrollTop||e.scrollTop,h=window.pageXOffset||f.scrollLeft||e.scrollLeft,i=f.clientTop||e.clientTop||0,j=f.clientLeft||e.clientLeft||0,k=0,l=0,m=d.top+g-i+k*c,n=d.left+h-j+l*c,o=jsPlumb.pageLocation(a),p=d.width||b.offsetWidth*c,q=d.height||b.offsetHeight*c,r=(o[0]-n)/p,s=(o[1]-m)/q;return[r,s]},getAbsolutePosition:function(a){var b=function(b){var c=a.style[b];return c?parseFloat(c.substring(0,c.length-2)):void 0};return[b("left"),b("top")]},setAbsolutePosition:function(a,b,c,d){c?this.animate(a,{left:"+="+(b[0]-c[0]),top:"+="+(b[1]-c[1])},d):(a.style.left=b[0]+"px",a.style.top=b[1]+"px")},getSize:function(a){return[a.offsetWidth,a.offsetHeight]},getWidth:function(a){return a.offsetWidth},getHeight:function(a){return a.offsetHeight},getRenderMode:function(){return"svg"}})}.call("undefined"!=typeof window?window:this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d="__label",e=function(a,c){var e={cssClass:c.cssClass,labelStyle:a.labelStyle,id:d,component:a,_jsPlumb:a._jsPlumb.instance},f=b.extend(e,c);return new(b.Overlays[a._jsPlumb.instance.getRenderMode()].Label)(f)},f=function(a,d){var e=null;if(c.isArray(d)){var f=d[0],g=b.extend({component:a,_jsPlumb:a._jsPlumb.instance},d[1]);3===d.length&&b.extend(g,d[2]),e=new(b.Overlays[a._jsPlumb.instance.getRenderMode()][f])(g)}else e=d.constructor===String?new(b.Overlays[a._jsPlumb.instance.getRenderMode()][d])({component:a,_jsPlumb:a._jsPlumb.instance}):d;return e.id=e.id||c.uuid(),a.cacheTypeItem("overlay",e,e.id),a._jsPlumb.overlays[e.id]=e,e};b.OverlayCapableJsPlumbUIComponent=function(b){a.jsPlumbUIComponent.apply(this,arguments),this._jsPlumb.overlays={},this._jsPlumb.overlayPositions={},b.label&&(this.getDefaultType().overlays[d]=["Label",{label:b.label,location:b.labelLocation||this.defaultLabelLocation||.5,labelStyle:b.labelStyle||this._jsPlumb.instance.Defaults.LabelStyle,id:d}]),this.setListenerComponent=function(a){if(this._jsPlumb)for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].setListenerComponent(a)}},b.OverlayCapableJsPlumbUIComponent.applyType=function(a,b){if(b.overlays){var c,d={};for(c in b.overlays){var e=a._jsPlumb.overlays[b.overlays[c][1].id];if(e)e.updateFrom(b.overlays[c][1]),d[b.overlays[c][1].id]=!0;else{var f=a.getCachedTypeItem("overlay",b.overlays[c][1].id);null!=f?(f.reattach(a._jsPlumb.instance,a),f.setVisible(!0),f.updateFrom(b.overlays[c][1]),a._jsPlumb.overlays[f.id]=f):f=a.addOverlay(b.overlays[c],!0),d[f.id]=!0}}for(c in a._jsPlumb.overlays)null==d[a._jsPlumb.overlays[c].id]&&a.removeOverlay(a._jsPlumb.overlays[c].id,!0)}},c.extend(b.OverlayCapableJsPlumbUIComponent,a.jsPlumbUIComponent,{setHover:function(a,b){if(this._jsPlumb&&!this._jsPlumb.instance.isConnectionBeingDragged())for(var c in this._jsPlumb.overlays)this._jsPlumb.overlays[c][a?"addClass":"removeClass"](this._jsPlumb.instance.hoverClass)},addOverlay:function(a,b){var c=f(this,a);return b||this.repaint(),c},getOverlay:function(a){return this._jsPlumb.overlays[a]},getOverlays:function(){return this._jsPlumb.overlays},hideOverlay:function(a){var b=this.getOverlay(a);b&&b.hide()},hideOverlays:function(){for(var a in this._jsPlumb.overlays)this._jsPlumb.overlays[a].hide()},showOverlay:function(a){var b=this.getOverlay(a);b&&b.show()},showOverlays:function(){for(var a in this._jsPlumb.overlays)this._jsPlumb.overlays[a].show()},removeAllOverlays:function(a){for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].cleanup&&this._jsPlumb.overlays[b].cleanup();this._jsPlumb.overlays={},this._jsPlumb.overlayPositions=null,this._jsPlumb.overlayPlacements={},a||this.repaint()},removeOverlay:function(a,b){var c=this._jsPlumb.overlays[a];c&&(c.setVisible(!1),!b&&c.cleanup&&c.cleanup(),delete this._jsPlumb.overlays[a],this._jsPlumb.overlayPositions&&delete this._jsPlumb.overlayPositions[a],this._jsPlumb.overlayPlacements&&delete this._jsPlumb.overlayPlacements[a])},removeOverlays:function(){for(var a=0,b=arguments.length;b>a;a++)this.removeOverlay(arguments[a])},moveParent:function(a){if(this.bgCanvas&&(this.bgCanvas.parentNode.removeChild(this.bgCanvas),a.appendChild(this.bgCanvas)),this.canvas&&this.canvas.parentNode){this.canvas.parentNode.removeChild(this.canvas),a.appendChild(this.canvas);for(var b in this._jsPlumb.overlays)if(this._jsPlumb.overlays[b].isAppendedAtTopLevel){var c=this._jsPlumb.overlays[b].getElement();c.parentNode.removeChild(c),a.appendChild(c)}}},getLabel:function(){var a=this.getOverlay(d);return null!=a?a.getLabel():null},getLabelOverlay:function(){return this.getOverlay(d)},setLabel:function(a){var b=this.getOverlay(d);if(b)a.constructor===String||a.constructor===Function?b.setLabel(a):(a.label&&b.setLabel(a.label),a.location&&b.setLocation(a.location));else{var c=a.constructor===String||a.constructor===Function?{label:a}:a;b=e(this,c),this._jsPlumb.overlays[d]=b}this._jsPlumb.instance.isSuspendDrawing()||this.repaint()},cleanup:function(a){for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].cleanup(a),this._jsPlumb.overlays[b].destroy(a);a&&(this._jsPlumb.overlays={},this._jsPlumb.overlayPositions=null)},setVisible:function(a){this[a?"showOverlays":"hideOverlays"]()},setAbsoluteOverlayPosition:function(a,b){this._jsPlumb.overlayPositions[a.id]=b},getAbsoluteOverlayPosition:function(a){return this._jsPlumb.overlayPositions?this._jsPlumb.overlayPositions[a.id]:null},_clazzManip:function(a,b,c){if(!c)for(var d in this._jsPlumb.overlays)this._jsPlumb.overlays[d][a+"Class"](b)},addClass:function(a,b){this._clazzManip("add",a,b)},removeClass:function(a,b){this._clazzManip("remove",a,b)}})}.call("undefined"!=typeof window?window:this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=function(a,b,c){var d=!1;return{drag:function(){if(d)return d=!1,!0;if(b.element){var e=c.getUIPosition(arguments,c.getZoom());null!=e&&c.setPosition(b.element,e),c.repaint(b.element,e),a.paint({anchorPoint:a.anchor.getCurrentLocation({element:a})})}},stopDrag:function(){d=!0}}},e=function(a,b,c,d){var e=b.createElement("div",{position:"absolute"});b.appendElement(e);var f=b.getId(e);b.setPosition(e,c),e.style.width=d[0]+"px",e.style.height=d[1]+"px",b.manage(f,e,!0),a.id=f,a.element=e},f=function(a,c,d,e,f,g,h,i){var j=new b.FloatingAnchor({reference:c,referenceCanvas:e,jsPlumbInstance:g});return h({paintStyle:a,endpoint:d,anchor:j,source:f,scope:i})},g=["connectorStyle","connectorHoverStyle","connectorOverlays","connector","connectionType","connectorClass","connectorHoverClass"],h=function(a,b){var c=0;if(null!=b)for(var d=0;d0)for(var b=0;b0?"add":"remove")+"Class"](i.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](i.endpointFullClass)},this.detachFromConnection=function(a,b,c){b=null==b?this.connections.indexOf(a):b,b>=0&&(this.connections.splice(b,1),this[(this.connections.length>0?"add":"remove")+"Class"](i.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](i.endpointFullClass)),!c&&m&&0===this.connections.length&&i.deleteObject({endpoint:this,fireEvent:!1,deleteAttachedObjects:c!==!0})},this.deleteEveryConnection=function(a){for(var b=this.connections.length,c=0;b>c;c++)i.deleteConnection(this.connections[0],a)},this.detachFrom=function(a,b,c){for(var d=[],e=0;ef;f++)i.deleteConnection(d[0]);return this},this.getElement=function(){return this.element},this.setElement=function(d){var e=this._jsPlumb.instance.getId(d),f=this.elementId;return c.removeWithFunction(a.endpointsByElement[this.elementId],function(a){return a.id===this.id}.bind(this)),this.element=b.getElement(d),this.elementId=i.getId(this.element),i.anchorManager.rehomeEndpoint(this,f,this.element),i.dragManager.endpointAdded(this.element),c.addToList(a.endpointsByElement,e,this),this},this.makeInPlaceCopy=function(){var b=this.anchor.getCurrentLocation({element:this}),c=this.anchor.getOrientation(this),d=this.anchor.getCssClass(),e={bind:function(){},compute:function(){return[b[0],b[1]]},getCurrentLocation:function(){return[b[0],b[1]]},getOrientation:function(){return c},getCssClass:function(){return d}};return k({dropOptions:a.dropOptions,anchor:e,source:this.element,paintStyle:this.getPaintStyle(),endpoint:a.hideOnDrag?"Blank":this.endpoint,_transient:!0,scope:this.scope,reference:this})},this.connectorSelector=function(){return this.connections[0]},this.setStyle=this.setPaintStyle,this.paint=function(a){a=a||{};var b=a.timestamp,c=!(a.recalc===!1);if(!b||this.timestamp!==b){var d=i.updateOffset({elId:this.elementId,timestamp:b}),e=a.offset?a.offset.o:d.o;if(null!=e){var f=a.anchorPoint,g=a.connectorPaintStyle;if(null==f){var j=a.dimensions||d.s,k={xy:[e.left,e.top],wh:j,element:this,timestamp:b};if(c&&this.anchor.isDynamic&&this.connections.length>0){var l=h(this,a.elementWithPrecedence),m=l.endpoints[0]===this?1:0,n=0===m?l.sourceId:l.targetId,o=i.getCachedData(n),p=o.o,q=o.s;k.index=0===m?1:0,k.connection=l,k.txy=[p.left,p.top],k.twh=q,k.tElement=l.endpoints[m]}else this.connections.length>0&&(k.connection=this.connections[0]);f=this.anchor.compute(k)}this.endpoint.compute(f,this.anchor.getOrientation(this),this._jsPlumb.paintStyleInUse,g||this.paintStyleInUse),this.endpoint.paint(this._jsPlumb.paintStyleInUse,this.anchor),this.timestamp=b;for(var r in this._jsPlumb.overlays)if(this._jsPlumb.overlays.hasOwnProperty(r)){var s=this._jsPlumb.overlays[r];s.isVisible()&&(this._jsPlumb.overlayPlacements[r]=s.draw(this.endpoint,this._jsPlumb.paintStyleInUse),s.paint(this._jsPlumb.overlayPlacements[r]))}}}},this.getTypeDescriptor=function(){return"endpoint"},this.isVisible=function(){return this._jsPlumb.visible},this.repaint=this.paint;var p=!1;this.initDraggable=function(){if(!p&&b.isDragSupported(this.element)){var g,h={id:null,element:null},m=null,n=!1,o=null,q=d(this,h,i),r=a.dragOptions||{},s={},t=b.dragEvents.start,u=b.dragEvents.stop,v=b.dragEvents.drag,w=b.dragEvents.beforeStart,x=function(a){g=a.e.payload||{}},y=function(c){m=this.connectorSelector();var d=!0;this.isEnabled()||(d=!1),null!=m||this.isSource||this.isTemporarySource||(d=!1),!this.isSource||!this.isFull()||null!=m&&this.dragAllowedWhenFull||(d=!1),null==m||m.isDetachable(this)||(this.isFull()?d=!1:m=null);var l=i.checkCondition(null==m?"beforeDrag":"beforeStartDetach",{endpoint:this,source:this.element,sourceId:this.elementId,connection:m});if(l===!1?d=!1:"object"==typeof l?b.extend(l,g||{}):l=g||{},d===!1)return i.stopDrag&&i.stopDrag(this.canvas),q.stopDrag(),!1;for(var p=0;p0}.bind(this),i.initDraggable(this.canvas,r,"internal"),this.canvas._jsPlumbRelatedElement=this.element,p=!0}};var q=a.endpoint||this._jsPlumb.instance.Defaults.Endpoint||b.Defaults.Endpoint;this.setEndpoint(q,!0);var r=a.anchor?a.anchor:a.anchors?a.anchors:i.Defaults.Anchor||"Top";this.setAnchor(r,!0);var s=["default",a.type||""].join(" ");this.addType(s,a.data,!0),this.canvas=this.endpoint.canvas,this.canvas._jsPlumb=this,this.initDraggable();var t=function(d,e,f,g){if(b.isDropSupported(this.element)){var h=a.dropOptions||i.Defaults.DropOptions||b.Defaults.DropOptions;h=b.extend({},h),h.scope=h.scope||this.scope;var j=b.dragEvents.drop,k=b.dragEvents.over,l=b.dragEvents.out,m=this,n=i.EndpointDropHandler({getEndpoint:function(){return m},jsPlumb:i,enabled:function(){return null!=f?f.isEnabled():!0},isFull:function(){return f.isFull()},element:this.element,elementId:this.elementId,isSource:this.isSource,isTarget:this.isTarget,addClass:function(a){m.addClass(a)},removeClass:function(a){m.removeClass(a)},isDropAllowed:function(){return m.isDropAllowed.apply(m,arguments)},reference:g,isRedrop:function(a,b){return a.suspendedEndpoint&&b.reference&&a.suspendedEndpoint.id===b.reference.id}});h[j]=c.wrap(h[j],n,!0),h[k]=c.wrap(h[k],function(){var a=b.getDragObject(arguments),c=i.getAttribute(b.getElement(a),"dragId"),d=i.getFloatingConnectionFor(c);if(null!=d){var e=i.getFloatingAnchorIndex(d),f=this.isTarget&&0!==e||d.suspendedEndpoint&&this.referenceEndpoint&&this.referenceEndpoint.id===d.suspendedEndpoint.id;if(f){var g=i.checkCondition("checkDropAllowed",{sourceEndpoint:d.endpoints[e],targetEndpoint:this,connection:d});this[(g?"add":"remove")+"Class"](i.endpointDropAllowedClass),this[(g?"remove":"add")+"Class"](i.endpointDropForbiddenClass),d.endpoints[e].anchor.over(this.anchor,this)}}}.bind(this)),h[l]=c.wrap(h[l],function(){var a=b.getDragObject(arguments),c=null==a?null:i.getAttribute(b.getElement(a),"dragId"),d=c?i.getFloatingConnectionFor(c):null;if(null!=d){var e=i.getFloatingAnchorIndex(d),f=this.isTarget&&0!==e||d.suspendedEndpoint&&this.referenceEndpoint&&this.referenceEndpoint.id===d.suspendedEndpoint.id;f&&(this.removeClass(i.endpointDropAllowedClass),this.removeClass(i.endpointDropForbiddenClass),d.endpoints[e].anchor.out())}}.bind(this)),i.initDroppable(d,h,"internal",e)}}.bind(this);return this.anchor.isFloating||t(this.canvas,!(a._transient||this.anchor.isFloating),this,a.reference),this},c.extend(b.Endpoint,b.OverlayCapableJsPlumbUIComponent,{setVisible:function(a,b,c){if(this._jsPlumb.visible=a,this.canvas&&(this.canvas.style.display=a?"block":"none"),this[a?"showOverlays":"hideOverlays"](),!b)for(var d=0;dc[0][0],d===!1?-1:1}},o=function(a,b){var c=a[0][0]<0?-Math.PI-a[0][0]:Math.PI-a[0][0],d=b[0][0]<0?-Math.PI-b[0][0]:Math.PI-b[0][0];return c>d?1:-1},p={top:function(a,b){return a[0]>b[0]?1:-1},right:n(!0),bottom:n(!0),left:o},q=function(a,b){return a.sort(b)},r=function(a,b){var c=k.getCachedData(a),d=c.s,f=c.o,h=function(b,c,d,f,h,i,j){if(f.length>0)for(var k=q(f,p[b]),l="right"===b||"top"===b,n=m(b,c,d,k,h,i,l),o=function(a,b){e[a.id]=[b[0],b[1],b[2],b[3]],g[a.id]=j},r=0;r-1&&(h[d].splice(i,1),b.addToList(h,e,[f,f.endpoints[0],f.endpoints[0].anchor.constructor===c.DynamicAnchor])),f.updateConnectedClass()},this.sourceChanged=function(a,d,e,f){if(a!==d){e.sourceId=d,e.source=f,b.removeWithFunction(h[a],function(a){return a[0].id===e.id});var g=b.findWithFunction(h[e.targetId],function(a){return a[0].id===e.id});g>-1&&(h[e.targetId][g][0]=e,h[e.targetId][g][1]=e.endpoints[0],h[e.targetId][g][2]=e.endpoints[0].anchor.constructor===c.DynamicAnchor),b.addToList(h,d,[e,e.endpoints[1],e.endpoints[1].anchor.constructor===c.DynamicAnchor]),e.endpoints[1].anchor.isContinuous&&(e.source===e.target?e._jsPlumb.instance.removeElement(e.endpoints[1].canvas):null==e.endpoints[1].canvas.parentNode&&e._jsPlumb.instance.appendElement(e.endpoints[1].canvas)),e.updateConnectedClass()}},this.rehomeEndpoint=function(a,b,c){var e=d[b]||[],f=k.getId(c);if(f!==b){var g=e.indexOf(a);if(g>-1){var h=e.splice(g,1)[0];i.add(h,f)}}for(var j=0;jb.dist?1:0});for(var o=k[0].source,p=k[0].target,q=0;q0?this.anchors[0]:null,f=e,g=this,h=function(a,b,c,d,e){var f=d[0]+a.x*e[0],g=d[1]+a.y*e[1],h=d[0]+e[0]/2,i=d[1]+e[1]/2;return Math.sqrt(Math.pow(b-f,2)+Math.pow(c-g,2))+Math.sqrt(Math.pow(h-f,2)+Math.pow(i-g,2))},i=a.selector||function(a,b,c,d,e){for(var f=c[0]+d[0]/2,g=c[1]+d[1]/2,i=-1,j=1/0,k=0;kl&&(i=k+0,j=l)}return e[i]};this.compute=function(a){var b=a.xy,c=a.wh,d=a.txy,h=a.twh;this.timestamp=a.timestamp;var j=g.getUserDefinedLocation();return null!=j?j:this.isLocked()||null==d||null==h?e.compute(a):(a.timestamp=null,e=i(b,c,d,h,this.anchors),this.x=e.x,this.y=e.y,e!==f&&this.fire("anchorChanged",e),f=e,e.compute(a))},this.getCurrentLocation=function(a){return this.getUserDefinedLocation()||(null!=e?e.getCurrentLocation(a):null)},this.getOrientation=function(a){return null!=e?e.getOrientation(a):[0,0]},this.over=function(a,b){null!=e&&e.over(a,b)},this.out=function(){null!=e&&e.out()},this.setAnchor=function(a){e=a},this.getCssClass=function(){return e&&e.getCssClass()||""},this.setAnchorCoordinates=function(a){var b=jsPlumbUtil.findWithFunction(this.anchors,function(b){return b.x===a[0]&&b.y===a[1]});return-1!==b?(this.setAnchor(this.anchors[b]),!0):!1}},b.extend(c.DynamicAnchor,c.Anchor);var e=function(a,b,d,e,f,g){c.Anchors[f]=function(c){var h=c.jsPlumbInstance.makeAnchor([a,b,d,e,0,0],c.elementId,c.jsPlumbInstance);return h.type=f,g&&g(h,c),h}};e(.5,0,0,-1,"TopCenter"),e(.5,1,0,1,"BottomCenter"),e(0,.5,-1,0,"LeftMiddle"),e(1,.5,1,0,"RightMiddle"),e(.5,0,0,-1,"Top"),e(.5,1,0,1,"Bottom"),e(0,.5,-1,0,"Left"),e(1,.5,1,0,"Right"),e(.5,.5,0,0,"Center"),e(1,0,0,-1,"TopRight"),e(1,1,0,1,"BottomRight"),e(0,0,0,-1,"TopLeft"),e(0,1,0,1,"BottomLeft"),c.Defaults.DynamicAnchors=function(a){return a.jsPlumbInstance.makeAnchors(["TopCenter","RightMiddle","BottomCenter","LeftMiddle"],a.elementId,a.jsPlumbInstance)},c.Anchors.AutoDefault=function(a){var b=a.jsPlumbInstance.makeDynamicAnchor(c.Defaults.DynamicAnchors(a));return b.type="AutoDefault",b};var f=function(a,b){c.Anchors[a]=function(c){var d=c.jsPlumbInstance.makeAnchor(["Continuous",{faces:b}],c.elementId,c.jsPlumbInstance);return d.type=a,d}};c.Anchors.Continuous=function(a){return a.jsPlumbInstance.continuousAnchorFactory.get(a)},f("ContinuousLeft",["left"]),f("ContinuousTop",["top"]),f("ContinuousBottom",["bottom"]),f("ContinuousRight",["right"]),e(0,0,0,0,"Assign",function(a,b){var c=b.position||"Fixed";a.positionFinder=c.constructor===String?b.jsPlumbInstance.AnchorPositionFinders[c]:c,a.constructorParams=b}),a.jsPlumbInstance.prototype.AnchorPositionFinders={Fixed:function(a,b,c){return[(a.left-b.left)/c[0],(a.top-b.top)/c[1]]},Grid:function(a,b,c,d){var e=a.left-b.left,f=a.top-b.top,g=c[0]/d.grid[0],h=c[1]/d.grid[1],i=Math.floor(e/g),j=Math.floor(f/h);return[(i*g+g/2)/c[0],(j*h+h/2)/c[1]]}},c.Anchors.Perimeter=function(a){a=a||{};var b=a.anchorCount||60,c=a.shape;if(!c)throw new Error("no shape supplied to Perimeter Anchor type");var d=function(){for(var a=.5,c=2*Math.PI/b,d=0,e=[],f=0;b>f;f++){var g=a+a*Math.sin(d),h=a+a*Math.cos(d);e.push([g,h,0,0]),d+=c}return e},e=function(a){for(var c=b/a.length,d=[],e=function(a,e,f,g,h){c=b*h;for(var i=(f-a)/c,j=(g-e)/c,k=0;c>k;k++)d.push([a+i*k,e+j*k,0,0])},f=0;f0?a:c+a:a*c;return d.pointOnLine({x:g,y:i},{x:h,y:j},e)}return{x:h,y:j}}return{x:g,y:i}},this.gradientAtPoint=function(a){return e},this.pointAlongPathFrom=function(a,b,c){var e=this.pointOnPath(a,c),f=0>=b?{x:g,y:i}:{x:h,y:j};return 0>=b&&Math.abs(b)>1&&(b*=-1),d.pointOnLine(e,f,b)};var l=function(a,b,c){return c>=Math.min(a,b)&&c<=Math.max(a,b)},m=function(a,b,c){return Math.abs(c-a)a-b?b:k>c-a?c:a};this.pointOnPath=function(b,c){if(0===b)return{x:this.x1,y:this.y1,theta:this.startAngle};if(1===b)return{x:this.x2,y:this.y2,theta:this.endAngle};c&&(b/=j);var d=e(this,b),f=a.cx+a.r*Math.cos(d),g=a.cy+a.r*Math.sin(d);return{x:l(f),y:l(g),theta:d}},this.gradientAtPoint=function(b,c){var e=this.pointOnPath(b,c),f=d.normal([a.cx,a.cy],[e.x,e.y]);return this.anticlockwise||f!==1/0&&f!==-(1/0)||(f*=-1),f},this.pointAlongPathFrom=function(b,c,d){var e=this.pointOnPath(b,d),f=c/h*2*Math.PI,g=this.anticlockwise?-1:1,i=e.theta+g*f,j=a.cx+this.radius*Math.cos(i),k=a.cy+this.radius*Math.sin(i);return{x:j,y:k}}},Bezier:function(c){this.curve=[{x:c.x1,y:c.y1},{x:c.cp1x,y:c.cp1y},{x:c.cp2x,y:c.cp2y},{x:c.x2,y:c.y2}];b.Segments.AbstractSegment.apply(this,arguments);this.bounds={minX:Math.min(c.x1,c.x2,c.cp1x,c.cp2x),minY:Math.min(c.y1,c.y2,c.cp1y,c.cp2y),maxX:Math.max(c.x1,c.x2,c.cp1x,c.cp2x),maxY:Math.max(c.y1,c.y2,c.cp1y,c.cp2y)},this.type="Bezier";var d=function(b,c,d){return d&&(c=a.jsBezier.locationAlongCurveFrom(b,c>0?0:1,c)),c};this.pointOnPath=function(b,c){return b=d(this.curve,b,c),a.jsBezier.pointOnCurve(this.curve,b)},this.gradientAtPoint=function(b,c){return b=d(this.curve,b,c),a.jsBezier.gradientAtPoint(this.curve,b)},this.pointAlongPathFrom=function(b,c,e){return b=d(this.curve,b,e),a.jsBezier.pointAlongCurveFrom(this.curve,b,c)},this.getLength=function(){return a.jsBezier.getLength(this.curve)},this.getBounds=function(){return this.bounds}}},b.SegmentRenderer={getPath:function(a,b){return{Straight:function(b){var c=a.getCoordinates();return(b?"M "+c.x1+" "+c.y1+" ":"")+"L "+c.x2+" "+c.y2},Bezier:function(b){var c=a.params;return(b?"M "+c.x2+" "+c.y2+" ":"")+"C "+c.cp2x+" "+c.cp2y+" "+c.cp1x+" "+c.cp1y+" "+c.x1+" "+c.y1},Arc:function(b){var c=a.params,d=a.sweep>Math.PI?1:0,e=a.anticlockwise?0:1;return(b?"M"+a.x1+" "+a.y1+" ":"")+"A "+a.radius+" "+c.r+" 0 "+d+","+e+" "+a.x2+" "+a.y2}}[a.type](b)}};var e=function(){this.resetBounds=function(){this.bounds={minX:1/0,minY:1/0,maxX:-(1/0),maxY:-(1/0)}},this.resetBounds()};b.Connectors.AbstractConnector=function(a){e.apply(this,arguments);var f=[],g=0,h=[],i=[],j=a.stub||0,k=c.isArray(j)?j[0]:j,l=c.isArray(j)?j[1]:j,m=a.gap||0,n=c.isArray(m)?m[0]:m,o=c.isArray(m)?m[1]:m,p=null,q=null;this.getPathData=function(){for(var a="",c=0;c0?a/g:(g+a)/g);for(var c=h.length-1,d=1,e=0;e=a){c=e,d=1===a?1:0===a?0:(a-h[e][0])/i[e];break}return{segment:f[c],proportion:d,index:c}},t=function(a,c,d){if(d.x1!==d.x2||d.y1!==d.y2){var e=new b.Segments[c](d);f.push(e),g+=e.getLength(),a.updateBounds(e)}},u=function(){g=f.length=h.length=i.length=0};this.setSegments=function(a){p=[],g=0;for(var b=0;bp?0:1,r=[1,0][q];g=[],h=[],g[q]=a.sourcePos[q]>a.targetPos[q]?-1:1,h[q]=a.sourcePos[q]>a.targetPos[q]?1:-1,g[r]=0,h[r]=0}var s=c?m+n*g[0]:n*g[0],t=e?p+n*g[1]:n*g[1],u=c?o*h[0]:m+o*h[0],v=e?o*h[1]:p+o*h[1],w=g[0]*h[0]+g[1]*h[1],x={sx:s,sy:t,tx:u,ty:v,lw:f,xSpan:Math.abs(u-s),ySpan:Math.abs(v-t),mx:(s+u)/2,my:(t+v)/2,so:g,to:h,x:i,y:j,w:m,h:p,segment:b,startStubX:s+g[0]*k,startStubY:t+g[1]*k,endStubX:u+h[0]*l,endStubY:v+h[1]*l,isXGreaterThanStubTimes2:Math.abs(s-u)>k+l,isYGreaterThanStubTimes2:Math.abs(t-v)>k+l,opposite:-1===w,perpendicular:0===w,orthogonal:1===w,sourceAxis:0===g[0]?"y":"x",points:[i,j,m,p,s,t,u,v],stubs:[k,l]};return x.anchorOrientation=x.opposite?"opposite":x.orthogonal?"orthogonal":"perpendicular",x};this.getSegments=function(){return f},this.updateBounds=function(a){var b=a.getBounds();this.bounds.minX=Math.min(this.bounds.minX,b.minX),this.bounds.maxX=Math.max(this.bounds.maxX,b.maxX),this.bounds.minY=Math.min(this.bounds.minY,b.minY),this.bounds.maxY=Math.max(this.bounds.maxY,b.maxY)};return this.pointOnPath=function(a,b){var c=s(a,b);return c.segment&&c.segment.pointOnPath(c.proportion,!1)||[0,0]},this.gradientAtPoint=function(a,b){var c=s(a,b);return c.segment&&c.segment.gradientAtPoint(c.proportion,!1)||0},this.pointAlongPathFrom=function(a,b,c){var d=s(a,c);return d.segment&&d.segment.pointAlongPathFrom(d.proportion,b,!1)||[0,0]},this.compute=function(a){q=v.call(this,a),u(),this._compute(q,a),this.x=q.points[0],this.y=q.points[1],this.w=q.points[2],this.h=q.points[3],this.segment=q.segment,r()},{addSegment:t,prepareCompute:v,sourceStub:k,targetStub:l,maxStub:Math.max(k,l),sourceGap:n,targetGap:o,maxGap:Math.max(n,o)}},c.extend(b.Connectors.AbstractConnector,e),b.Endpoints.AbstractEndpoint=function(a){e.apply(this,arguments);var b=this.compute=function(a,b,c,d){var e=this._compute.apply(this,arguments);return this.x=e[0],this.y=e[1],this.w=e[2],this.h=e[3],this.bounds.minX=this.x,this.bounds.minY=this.y,this.bounds.maxX=this.x+this.w,this.bounds.maxY=this.y+this.h,e};return{compute:b,cssClass:a.cssClass}},c.extend(b.Endpoints.AbstractEndpoint,e),b.Endpoints.Dot=function(a){this.type="Dot";b.Endpoints.AbstractEndpoint.apply(this,arguments);a=a||{},this.radius=a.radius||10,this.defaultOffset=.5*this.radius,this.defaultInnerRadius=this.radius/3,this._compute=function(a,b,c,d){this.radius=c.radius||this.radius;var e=a[0]-this.radius,f=a[1]-this.radius,g=2*this.radius,h=2*this.radius;if(c.stroke){var i=c.strokeWidth||1;e-=i,f-=i,g+=2*i,h+=2*i}return[e,f,g,h,this.radius]}},c.extend(b.Endpoints.Dot,b.Endpoints.AbstractEndpoint),b.Endpoints.Rectangle=function(a){this.type="Rectangle";b.Endpoints.AbstractEndpoint.apply(this,arguments);a=a||{},this.width=a.width||20,this.height=a.height||20,this._compute=function(a,b,c,d){var e=c.width||this.width,f=c.height||this.height,g=a[0]-e/2,h=a[1]-f/2;return[g,h,e,f]}},c.extend(b.Endpoints.Rectangle,b.Endpoints.AbstractEndpoint);var f=function(a){b.jsPlumbUIComponent.apply(this,arguments),this._jsPlumb.displayElements=[]};c.extend(f,b.jsPlumbUIComponent,{getDisplayElements:function(){return this._jsPlumb.displayElements},appendDisplayElement:function(a){this._jsPlumb.displayElements.push(a)}}),b.Endpoints.Image=function(d){this.type="Image",f.apply(this,arguments),b.Endpoints.AbstractEndpoint.apply(this,arguments);var e=d.onload,g=d.src||d.url,h=d.cssClass?" "+d.cssClass:"";this._jsPlumb.img=new Image,this._jsPlumb.ready=!1,this._jsPlumb.initialized=!1,this._jsPlumb.deleted=!1,this._jsPlumb.widthToUse=d.width,this._jsPlumb.heightToUse=d.height,this._jsPlumb.endpoint=d.endpoint,this._jsPlumb.img.onload=function(){null!=this._jsPlumb&&(this._jsPlumb.ready=!0,this._jsPlumb.widthToUse=this._jsPlumb.widthToUse||this._jsPlumb.img.width,this._jsPlumb.heightToUse=this._jsPlumb.heightToUse||this._jsPlumb.img.height,e&&e(this))}.bind(this),this._jsPlumb.endpoint.setImage=function(a,b){var c=a.constructor===String?a:a.src;e=b,this._jsPlumb.img.src=c,null!=this.canvas&&this.canvas.setAttribute("src",this._jsPlumb.img.src)}.bind(this),this._jsPlumb.endpoint.setImage(g,e),this._compute=function(a,b,c,d){return this.anchorPoint=a,this._jsPlumb.ready?[a[0]-this._jsPlumb.widthToUse/2,a[1]-this._jsPlumb.heightToUse/2,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse]:[0,0,0,0]},this.canvas=b.createElement("img",{position:"absolute",margin:0,padding:0,outline:0},this._jsPlumb.instance.endpointClass+h),this._jsPlumb.widthToUse&&this.canvas.setAttribute("width",this._jsPlumb.widthToUse),this._jsPlumb.heightToUse&&this.canvas.setAttribute("height",this._jsPlumb.heightToUse),this._jsPlumb.instance.appendElement(this.canvas),this.actuallyPaint=function(a,b,d){if(!this._jsPlumb.deleted){this._jsPlumb.initialized||(this.canvas.setAttribute("src",this._jsPlumb.img.src),this.appendDisplayElement(this.canvas),this._jsPlumb.initialized=!0);var e=this.anchorPoint[0]-this._jsPlumb.widthToUse/2,f=this.anchorPoint[1]-this._jsPlumb.heightToUse/2;c.sizeElement(this.canvas,e,f,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse)}},this.paint=function(b,c){null!=this._jsPlumb&&(this._jsPlumb.ready?this.actuallyPaint(b,c):a.setTimeout(function(){this.paint(b,c)}.bind(this),200))}},c.extend(b.Endpoints.Image,[f,b.Endpoints.AbstractEndpoint],{cleanup:function(a){a&&(this._jsPlumb.deleted=!0,this.canvas&&this.canvas.parentNode.removeChild(this.canvas),this.canvas=null)}}),b.Endpoints.Blank=function(a){b.Endpoints.AbstractEndpoint.apply(this,arguments);this.type="Blank",f.apply(this,arguments),this._compute=function(a,b,c,d){return[a[0],a[1],10,0]};var d=a.cssClass?" "+a.cssClass:"";this.canvas=b.createElement("div",{display:"block",width:"1px",height:"1px",background:"transparent",position:"absolute"},this._jsPlumb.instance.endpointClass+d),this._jsPlumb.instance.appendElement(this.canvas),this.paint=function(a,b){c.sizeElement(this.canvas,this.x,this.y,this.w,this.h)}},c.extend(b.Endpoints.Blank,[b.Endpoints.AbstractEndpoint,f],{cleanup:function(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)}}),b.Endpoints.Triangle=function(a){this.type="Triangle",b.Endpoints.AbstractEndpoint.apply(this,arguments);var c=this;a=a||{},a.width=a.width||55,a.height=a.height||55,this.width=a.width,this.height=a.height,this._compute=function(a,b,d,e){var f=d.width||c.width,g=d.height||c.height,h=a[0]-f/2,i=a[1]-g/2;return[h,i,f,g]}};var g=b.Overlays.AbstractOverlay=function(a){this.visible=!0,this.isAppendedAtTopLevel=!0,this.component=a.component,this.loc=null==a.location?.5:a.location,this.endpointLoc=null==a.endpointLocation?[.5,.5]:a.endpointLocation,this.visible=a.visible!==!1};g.prototype={cleanup:function(a){a&&(this.component=null,this.canvas=null,this.endpointLoc=null)},reattach:function(a,b){},setVisible:function(a){this.visible=a,this.component.repaint()},isVisible:function(){return this.visible},hide:function(){this.setVisible(!1)},show:function(){this.setVisible(!0)},incrementLocation:function(a){this.loc+=a,this.component.repaint()},setLocation:function(a){this.loc=a,this.component.repaint()},getLocation:function(){return this.loc},updateFrom:function(){} +},b.Overlays.Arrow=function(a){this.type="Arrow",g.apply(this,arguments),this.isAppendedAtTopLevel=!1,a=a||{};var e=this;this.length=a.length||20,this.width=a.width||20,this.id=a.id;var f=(a.direction||1)<0?-1:1,h=a.paintStyle||{"stroke-width":1},i=a.foldback||.623;this.computeMaxSize=function(){return 1.5*e.width},this.elementCreated=function(c,d){if(this.path=c,a.events)for(var e in a.events)b.on(c,e,a.events[e])},this.draw=function(a,b){var e,g,j,k,l;if(a.pointAlongPathFrom){if(c.isString(this.loc)||this.loc>1||this.loc<0){var m=parseInt(this.loc,10),n=this.loc<0?1:0;e=a.pointAlongPathFrom(n,m,!1),g=a.pointAlongPathFrom(n,m-f*this.length/2,!1),j=d.pointOnLine(e,g,this.length)}else if(1===this.loc){if(e=a.pointOnPath(this.loc),g=a.pointAlongPathFrom(this.loc,-this.length),j=d.pointOnLine(e,g,this.length),-1===f){var o=j;j=e,e=o}}else if(0===this.loc){if(j=a.pointOnPath(this.loc),g=a.pointAlongPathFrom(this.loc,this.length),e=d.pointOnLine(j,g,this.length),-1===f){var p=j;j=e,e=p}}else e=a.pointAlongPathFrom(this.loc,f*this.length/2),g=a.pointOnPath(this.loc),j=d.pointOnLine(e,g,this.length);k=d.perpendicularLineTo(e,j,this.width),l=d.pointOnLine(e,j,i*this.length);var q={hxy:e,tail:k,cxy:l},r=h.stroke||b.stroke,s=h.fill||b.stroke,t=h.strokeWidth||b.strokeWidth;return{component:a,d:q,"stroke-width":t,stroke:r,fill:s,minX:Math.min(e.x,k[0].x,k[1].x),maxX:Math.max(e.x,k[0].x,k[1].x),minY:Math.min(e.y,k[0].y,k[1].y),maxY:Math.max(e.y,k[0].y,k[1].y)}}return{component:a,minX:0,maxX:0,minY:0,maxY:0}}},c.extend(b.Overlays.Arrow,g,{updateFrom:function(a){this.length=a.length||this.length,this.width=a.width||this.width,this.direction=null!=a.direction?a.direction:this.direction,this.foldback=a.foldback||this.foldback},cleanup:function(){this.path&&this.canvas&&this.canvas.removeChild(this.path)}}),b.Overlays.PlainArrow=function(a){a=a||{};var c=b.extend(a,{foldback:1});b.Overlays.Arrow.call(this,c),this.type="PlainArrow"},c.extend(b.Overlays.PlainArrow,b.Overlays.Arrow),b.Overlays.Diamond=function(a){a=a||{};var c=a.length||40,d=b.extend(a,{length:c/2,foldback:2});b.Overlays.Arrow.call(this,d),this.type="Diamond"},c.extend(b.Overlays.Diamond,b.Overlays.Arrow);var h=function(a,b){return(null==a._jsPlumb.cachedDimensions||b)&&(a._jsPlumb.cachedDimensions=a.getDimensions()),a._jsPlumb.cachedDimensions},i=function(a){b.jsPlumbUIComponent.apply(this,arguments),g.apply(this,arguments);var d=this.fire;this.fire=function(){d.apply(this,arguments),this.component&&this.component.fire.apply(this.component,arguments)},this.detached=!1,this.id=a.id,this._jsPlumb.div=null,this._jsPlumb.initialised=!1,this._jsPlumb.component=a.component,this._jsPlumb.cachedDimensions=null,this._jsPlumb.create=a.create,this._jsPlumb.initiallyInvisible=a.visible===!1,this.getElement=function(){if(null==this._jsPlumb.div){var c=this._jsPlumb.div=b.getElement(this._jsPlumb.create(this._jsPlumb.component));c.style.position="absolute",c.className=this._jsPlumb.instance.overlayClass+" "+(this.cssClass?this.cssClass:a.cssClass?a.cssClass:""),this._jsPlumb.instance.appendElement(c),this._jsPlumb.instance.getId(c),this.canvas=c;var d="translate(-50%, -50%)";c.style.webkitTransform=d,c.style.mozTransform=d,c.style.msTransform=d,c.style.oTransform=d,c.style.transform=d,c._jsPlumb=this,a.visible===!1&&(c.style.display="none")}return this._jsPlumb.div},this.draw=function(a,b,d){var e=h(this);if(null!=e&&2===e.length){var f={x:0,y:0};if(d)f={x:d[0],y:d[1]};else if(a.pointOnPath){var g=this.loc,i=!1;(c.isString(this.loc)||this.loc<0||this.loc>1)&&(g=parseInt(this.loc,10),i=!0),f=a.pointOnPath(g,i)}else{var j=this.loc.constructor===Array?this.loc:this.endpointLoc;f={x:j[0]*a.w,y:j[1]*a.h}}var k=f.x-e[0]/2,l=f.y-e[1]/2;return{component:a,d:{minx:k,miny:l,td:e,cxy:f},minX:k,maxX:k+e[0],minY:l,maxY:l+e[1]}}return{minX:0,maxX:0,minY:0,maxY:0}}};c.extend(i,[b.jsPlumbUIComponent,g],{getDimensions:function(){return[1,1]},setVisible:function(a){this._jsPlumb.div&&(this._jsPlumb.div.style.display=a?"block":"none",a&&this._jsPlumb.initiallyInvisible&&(h(this,!0),this.component.repaint(),this._jsPlumb.initiallyInvisible=!1))},clearCachedDimensions:function(){this._jsPlumb.cachedDimensions=null},cleanup:function(a){a?null!=this._jsPlumb.div&&(this._jsPlumb.div._jsPlumb=null,this._jsPlumb.instance.removeElement(this._jsPlumb.div)):(this._jsPlumb&&this._jsPlumb.div&&this._jsPlumb.div.parentNode&&this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div),this.detached=!0)},reattach:function(a,b){null!=this._jsPlumb.div&&a.getContainer().appendChild(this._jsPlumb.div),this.detached=!1},computeMaxSize:function(){var a=h(this);return Math.max(a[0],a[1])},paint:function(a,b){this._jsPlumb.initialised||(this.getElement(),a.component.appendDisplayElement(this._jsPlumb.div),this._jsPlumb.initialised=!0,this.detached&&this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div)),this._jsPlumb.div.style.left=a.component.x+a.d.minx+"px",this._jsPlumb.div.style.top=a.component.y+a.d.miny+"px"}}),b.Overlays.Custom=function(a){this.type="Custom",i.apply(this,arguments)},c.extend(b.Overlays.Custom,i),b.Overlays.GuideLines=function(){var a=this;a.length=50,a.strokeWidth=5,this.type="GuideLines",g.apply(this,arguments),b.jsPlumbUIComponent.apply(this,arguments),this.draw=function(b,c){var e=b.pointAlongPathFrom(a.loc,a.length/2),f=b.pointOnPath(a.loc),g=d.pointOnLine(e,f,a.length),h=d.perpendicularLineTo(e,g,40),i=d.perpendicularLineTo(g,e,20);return{connector:b,head:e,tail:g,headLine:i,tailLine:h,minX:Math.min(e.x,g.x,i[0].x,i[1].x),minY:Math.min(e.y,g.y,i[0].y,i[1].y),maxX:Math.max(e.x,g.x,i[0].x,i[1].x),maxY:Math.max(e.y,g.y,i[0].y,i[1].y)}}},b.Overlays.Label=function(a){this.labelStyle=a.labelStyle;this.cssClass=null!=this.labelStyle?this.labelStyle.cssClass:null;var c=b.extend({create:function(){return b.createElement("div")}},a);if(b.Overlays.Custom.call(this,c),this.type="Label",this.label=a.label||"",this.labelText=null,this.labelStyle){var d=this.getElement();if(this.labelStyle.font=this.labelStyle.font||"12px sans-serif",d.style.font=this.labelStyle.font,d.style.color=this.labelStyle.color||"black",this.labelStyle.fill&&(d.style.background=this.labelStyle.fill),this.labelStyle.borderWidth>0){var e=this.labelStyle.borderStyle?this.labelStyle.borderStyle:"black";d.style.border=this.labelStyle.borderWidth+"px solid "+e}this.labelStyle.padding&&(d.style.padding=this.labelStyle.padding)}},c.extend(b.Overlays.Label,b.Overlays.Custom,{cleanup:function(a){a&&(this.div=null,this.label=null,this.labelText=null,this.cssClass=null,this.labelStyle=null)},getLabel:function(){return this.label},setLabel:function(a){this.label=a,this.labelText=null,this.clearCachedDimensions(),this.update(),this.component.repaint()},getDimensions:function(){return this.update(),i.prototype.getDimensions.apply(this,arguments)},update:function(){if("function"==typeof this.label){var a=this.label(this);this.getElement().innerHTML=a.replace(/\r\n/g,"
")}else null==this.labelText&&(this.labelText=this.label,this.getElement().innerHTML=this.labelText.replace(/\r\n/g,"
"))},updateFrom:function(a){null!=a.label&&this.setLabel(a.label)}})}.call("undefined"!=typeof window?window:this),function(){"use strict";var a=this,b=a.jsPlumb,c=function(b){var c=b._mottle;return c||(c=b._mottle=new a.Mottle),c};b.extend(a.jsPlumbInstance.prototype,{getEventManager:function(){return c(this)},on:function(a,b,c){return this.getEventManager().on.apply(this,arguments),this},off:function(a,b,c){return this.getEventManager().off.apply(this,arguments),this}})}.call("undefined"!=typeof window?window:this),function(){"use strict";var a=this,b=a.jsPlumbUtil,c=a.jsPlumbInstance,d="jtk-group-collapsed",e="jtk-group-expanded",f="[jtk-group-content]",g="elementDraggable",h="stop",i="revert",j="_groupManager",k="_jsPlumbGroup",l="_jsPlumbGroupDrag",m="group:addMember",n="group:removeMember",o="group:add",p="group:remove",q="group:expand",r="group:collapse",s="groupDragStop",t="connectionMoved",u="internal.connectionDetached",v="removeAll",w="orphanAll",x="show",y="hide",z=function(a){function c(a){delete a.proxies;var c,d=i[a.id];null!=d&&(c=function(b){return b.id===a.id},b.removeWithFunction(d.connections.source,c),b.removeWithFunction(d.connections.target,c),delete i[a.id]),d=j[a.id],null!=d&&(c=function(b){return b.id===a.id},b.removeWithFunction(d.connections.source,c),b.removeWithFunction(d.connections.target,c),delete j[a.id])}function f(b,c){for(var d=b.getMembers(),e=0;e0&&h0&&j0?a[0]:u},w=d.ghost===!0,x=w||d.constrain===!0,y=d.revert!==!1,z=d.orphan===!0,A=d.prune===!0,B=d.dropOverride===!0,C=d.proxied!==!1,D=[];if(this.connections={source:[],target:[],internal:[]},this.getAnchor=function(a,b){return d.anchor||"Continuous"},this.getEndpoint=function(a,b){return d.endpoint||["Dot",{radius:10}]},this.collapsed=!1,d.draggable!==!1){var E={stop:function(a){c.fire(s,jsPlumb.extend(a,{group:t}))},scope:l};d.dragOptions&&a.jsPlumb.extend(E,d.dragOptions),c.draggable(d.el,E)}d.droppable!==!1&&c.droppable(d.el,{drop:function(a){var b=a.drag.el;if(!b._isJsPlumbGroup){var d=b._jsPlumbGroup;if(d!==t){if(null!=d&&d.overrideDrop(b,t))return;c.getGroupManager().addToGroup(t,b,!1)}}}});var F=function(a,b){for(var c=null==a.nodeType?a:[a],d=0;dd;d++){var f=D[0];t.remove(f,a,b,!0),c.remove(f,!0)}D.length=0,c.getGroupManager().updateConnectionsForGroup(t)},this.orphanAll=function(){for(var a={},b=0;ba?-1:0===a?0:1}),n=function(a){return[m(a[2]-a[0]),m(a[3]-a[1])]},o=function(a,b,c,d){if(j!==b||k!==c){var e=null==j?d.sx:j,f=null==k?d.sy:k,g=e===b?"v":"h";j=b,k=c,a.push([e,f,b,c,g])}},p=function(a){return Math.sqrt(Math.pow(a[0]-a[2],2)+Math.pow(a[1]-a[3],2))},q=function(a){var b=[];return b.push.apply(b,a),b},r=function(a,b,c){for(var f,h,i,j=null,k=0;k0&&j[4]!==f[4]){var m=Math.min(p(j),p(f)),o=Math.min(l,m/2);j[2]-=h[0]*o,j[3]-=h[1]*o,f[0]+=i[0]*o,f[1]+=i[1]*o;var r=h[1]===i[0]&&1===i[0]||h[1]===i[0]&&0===i[0]&&h[0]!==i[1]||h[1]===i[0]&&-1===i[0],s=f[1]>j[3]?1:-1,t=f[0]>j[2]?1:-1,u=s===t,v=u&&r||!u&&!r?f[0]:j[2],w=u&&r||!u&&!r?j[3]:f[1];g.addSegment(a,d,{x1:j[0],y1:j[1],x2:j[2],y2:j[3]}),g.addSegment(a,e,{r:o,x1:j[2],y1:j[3],x2:f[0],y2:f[1],cx:v,cy:w,ac:r})}else{var x=j[2]===j[0]?0:j[2]>j[0]?c.lw/2:-(c.lw/2),y=j[3]===j[1]?0:j[3]>j[1]?c.lw/2:-(c.lw/2);g.addSegment(a,d,{x1:j[0]-x,y1:j[1]-y,x2:j[2]+x,y2:j[3]+y})}j=f}null!=f&&g.addSegment(a,d,{x1:f[0],y1:f[1],x2:f[2],y2:f[3]})};this._compute=function(a,b){c=[],j=null,k=null,f=null;var d=function(){return[a.startStubX,a.startStubY,a.endStubX,a.endStubY]},e={perpendicular:d,orthogonal:d,opposite:function(b){var c=a,d="x"===b?0:1,e={x:function(){return 1===c.so[d]&&(c.startStubX>c.endStubX&&c.tx>c.startStubX||c.sx>c.endStubX&&c.tx>c.sx)||-1===c.so[d]&&(c.startStubXc.endStubY&&c.ty>c.startStubY||c.sy>c.endStubY&&c.ty>c.sy)||-1===c.so[d]&&(c.startStubYj[b][0],p=e[b][m][0],q=e[b][m][1],r=d[b][m][n];return c.segment===r[3]||c.segment===r[2]&&o?f[b]:c.segment===r[2]&&p>q?g[b]:c.segment===r[2]&&q>=p||c.segment===r[1]&&!o?i[b]:c.segment===r[0]||c.segment===r[1]&&o?h[b]:void 0},orthogonal:function(b,c,d,e,f){var g=a,h={x:-1===g.so[0]?Math.min(c,e):Math.max(c,e),y:-1===g.so[1]?Math.min(c,e):Math.max(c,e)}[b];return{x:[[h,d],[h,f],[e,f]],y:[[d,h],[f,h],[f,e]]}[b]},opposite:function(c,d,e,f){var h=a,i={x:"y",y:"x"}[c],j={x:"height",y:"width"}[c],k=h["is"+c.toUpperCase()+"GreaterThanStubTimes2"];if(b.sourceEndpoint.elementId===b.targetEndpoint.elementId){var l=e+(1-b.sourceEndpoint.anchor[i])*b.sourceInfo[j]+g.maxStub;return{x:[[d,l],[f,l]],y:[[l,d],[l,f]]}[c]}return!k||1===h.so[m]&&d>f||-1===h.so[m]&&f>d?{x:[[d,v],[f,v]],y:[[u,d],[u,f]]}[c]:1===h.so[m]&&f>d||-1===h.so[m]&&d>f?{x:[[u,h.sy],[u,h.ty]],y:[[h.sx,v],[h.tx,v]]}[c]:void 0}},y=x[a.anchorOrientation](a.sourceAxis,p,q,s,t);if(y)for(var z=0;z=a&&b>=d?1:c>=a&&d>=b?2:a>=c&&d>=b?3:4},e=function(a,b,c,d,e,f,g,h,i){return i>=h?[a,b]:1===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:2===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+f,b+-1*g]:3===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:4===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+f,b+-1*g]:void 0},f=function(a){a=a||{},this.type="StateMachine";var c,f=b.Connectors.AbstractBezierConnector.apply(this,arguments),g=a.curviness||10,h=a.margin||5,i=a.proximityLimit||80;a.orientation&&"clockwise"===a.orientation;this._computeBezier=function(a,b,j,k,l,m){var n=b.sourcePos[0]c?a.insertBefore(b,a.childNodes[c]):a.appendChild(b)};c.svg={node:t,attr:s,pos:u};var z=function(a){var d=a.pointerEventsSpec||"all",e={};b.jsPlumbUIComponent.apply(this,a.originalArgs),this.canvas=null,this.path=null,this.svg=null,this.bgCanvas=null;var f=a.cssClass+" "+(a.originalArgs[0].cssClass||""),g={style:"",width:0,height:0,"pointer-events":d,position:"absolute"};this.svg=t("svg",g),a.useDivWrapper?(this.canvas=b.createElement("div",{position:"absolute"}),c.sizeElement(this.canvas,0,0,1,1),this.canvas.className=f):(s(this.svg,{"class":f}),this.canvas=this.svg),a._jsPlumb.appendElement(this.canvas,a.originalArgs[0].parent),a.useDivWrapper&&this.canvas.appendChild(this.svg);var h=[this.canvas];return this.getDisplayElements=function(){return h},this.appendDisplayElement=function(a){h.push(a)},this.paint=function(b,d,f){if(null!=b){var g,h=[this.x,this.y],i=[this.w,this.h];null!=f&&(f.xmin<0&&(h[0]+=f.xmin),f.ymin<0&&(h[1]+=f.ymin),i[0]=f.xmax+(f.xmin<0?-f.xmin:0),i[1]=f.ymax+(f.ymin<0?-f.ymin:0)),a.useDivWrapper?(c.sizeElement(this.canvas,h[0],h[1],i[0],i[1]),h[0]=0,h[1]=0,g=u([0,0])):g=u([h[0],h[1]]),e.paint.apply(this,arguments),s(this.svg,{style:g,width:i[0]||0,height:i[1]||0})}},{renderer:e}};c.extend(z,b.jsPlumbUIComponent,{cleanup:function(a){a||null==this.typeId?(this.canvas&&(this.canvas._jsPlumb=null),this.svg&&(this.svg._jsPlumb=null),this.bgCanvas&&(this.bgCanvas._jsPlumb=null),this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.bgCanvas&&this.bgCanvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.svg=null,this.canvas=null,this.path=null,this.group=null):(this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.bgCanvas&&this.bgCanvas.parentNode&&this.bgCanvas.parentNode.removeChild(this.bgCanvas))},reattach:function(a){var b=a.getContainer();this.canvas&&null==this.canvas.parentNode&&b.appendChild(this.canvas),this.bgCanvas&&null==this.bgCanvas.parentNode&&b.appendChild(this.bgCanvas)},setVisible:function(a){this.canvas&&(this.canvas.style.display=a?"block":"none")}}),b.ConnectorRenderers.svg=function(a){var c=this,d=z.apply(this,[{cssClass:a._jsPlumb.connectorClass,originalArgs:arguments,pointerEventsSpec:"none",_jsPlumb:a._jsPlumb}]);d.renderer.paint=function(d,e,f){var g=c.getSegments(),h="",i=[0,0];if(f.xmin<0&&(i[0]=-f.xmin),f.ymin<0&&(i[1]=-f.ymin),g.length>0){h=c.getPathData();var j={d:h,transform:"translate("+i[0]+","+i[1]+")","pointer-events":a["pointer-events"]||"visibleStroke"},k=null,l=[c.x,c.y,c.w,c.h];if(d.outlineStroke){var m=d.outlineWidth||1,n=d.strokeWidth+2*m;k=b.extend({},d),delete k.gradient,k.stroke=d.outlineStroke,k.strokeWidth=n,null==c.bgPath?(c.bgPath=t("path",j),b.addClass(c.bgPath,b.connectorOutlineClass),y(c.svg,c.bgPath,0)):s(c.bgPath,j),x(c.svg,c.bgPath,k,l,c)}null==c.path?(c.path=t("path",j),y(c.svg,c.path,d.outlineStroke?1:0)):s(c.path,j),x(c.svg,c.path,d,l,c)}}},c.extend(b.ConnectorRenderers.svg,z);var A=b.SvgEndpoint=function(a){var c=z.apply(this,[{cssClass:a._jsPlumb.endpointClass,originalArgs:arguments,pointerEventsSpec:"all",useDivWrapper:!0,_jsPlumb:a._jsPlumb}]);c.renderer.paint=function(a){var c=b.extend({},a);c.outlineStroke&&(c.stroke=c.outlineStroke),null==this.node?(this.node=this.makeNode(c),this.svg.appendChild(this.node)):null!=this.updateNode&&this.updateNode(this.node),x(this.svg,this.node,c,[this.x,this.y,this.w,this.h],this),u(this.node,[this.x,this.y])}.bind(this)};c.extend(A,z),b.Endpoints.svg.Dot=function(){b.Endpoints.Dot.apply(this,arguments),A.apply(this,arguments),this.makeNode=function(a){return t("circle",{cx:this.w/2,cy:this.h/2,r:this.radius})},this.updateNode=function(a){s(a,{cx:this.w/2,cy:this.h/2,r:this.radius})}},c.extend(b.Endpoints.svg.Dot,[b.Endpoints.Dot,A]),b.Endpoints.svg.Rectangle=function(){b.Endpoints.Rectangle.apply(this,arguments),A.apply(this,arguments),this.makeNode=function(a){ +return t("rect",{width:this.w,height:this.h})},this.updateNode=function(a){s(a,{width:this.w,height:this.h})}},c.extend(b.Endpoints.svg.Rectangle,[b.Endpoints.Rectangle,A]),b.Endpoints.svg.Image=b.Endpoints.Image,b.Endpoints.svg.Blank=b.Endpoints.Blank,b.Overlays.svg.Label=b.Overlays.Label,b.Overlays.svg.Custom=b.Overlays.Custom;var B=function(a,c){a.apply(this,c),b.jsPlumbUIComponent.apply(this,c),this.isAppendedAtTopLevel=!1;this.path=null,this.paint=function(a,b){if(a.component.svg&&b){null==this.path&&(this.path=t("path",{"pointer-events":"all"}),a.component.svg.appendChild(this.path),this.elementCreated&&this.elementCreated(this.path,a.component),this.canvas=a.component.svg);var e=c&&1===c.length?c[0].cssClass||"":"",f=[0,0];b.xmin<0&&(f[0]=-b.xmin),b.ymin<0&&(f[1]=-b.ymin),s(this.path,{d:d(a.d),"class":e,stroke:a.stroke?a.stroke:null,fill:a.fill?a.fill:null,transform:"translate("+f[0]+","+f[1]+")"})}};var d=function(a){return isNaN(a.cxy.x)||isNaN(a.cxy.y)?"":"M"+a.hxy.x+","+a.hxy.y+" L"+a.tail[0].x+","+a.tail[0].y+" L"+a.cxy.x+","+a.cxy.y+" L"+a.tail[1].x+","+a.tail[1].y+" L"+a.hxy.x+","+a.hxy.y};this.transfer=function(a){a.canvas&&this.path&&this.path.parentNode&&(this.path.parentNode.removeChild(this.path),a.canvas.appendChild(this.path))}};c.extend(B,[b.jsPlumbUIComponent,b.Overlays.AbstractOverlay],{cleanup:function(a){null!=this.path&&(a?this._jsPlumb.instance.removeElement(this.path):this.path.parentNode&&this.path.parentNode.removeChild(this.path))},reattach:function(a,b){this.path&&b.canvas&&b.canvas.appendChild(this.path)},setVisible:function(a){null!=this.path&&(this.path.style.display=a?"block":"none")}}),b.Overlays.svg.Arrow=function(){B.apply(this,[b.Overlays.Arrow,arguments])},c.extend(b.Overlays.svg.Arrow,[b.Overlays.Arrow,B]),b.Overlays.svg.PlainArrow=function(){B.apply(this,[b.Overlays.PlainArrow,arguments])},c.extend(b.Overlays.svg.PlainArrow,[b.Overlays.PlainArrow,B]),b.Overlays.svg.Diamond=function(){B.apply(this,[b.Overlays.Diamond,arguments])},c.extend(b.Overlays.svg.Diamond,[b.Overlays.Diamond,B]),b.Overlays.svg.GuideLines=function(){var a,c,d=null,e=this;b.Overlays.GuideLines.apply(this,arguments),this.paint=function(b,g){null==d&&(d=t("path"),b.connector.svg.appendChild(d),e.attachListeners(d,b.connector),e.attachListeners(d,e),a=t("path"),b.connector.svg.appendChild(a),e.attachListeners(a,b.connector),e.attachListeners(a,e),c=t("path"),b.connector.svg.appendChild(c),e.attachListeners(c,b.connector),e.attachListeners(c,e));var h=[0,0];g.xmin<0&&(h[0]=-g.xmin),g.ymin<0&&(h[1]=-g.ymin),s(d,{d:f(b.head,b.tail),stroke:"red",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),s(a,{d:f(b.tailLine[0],b.tailLine[1]),stroke:"blue",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),s(c,{d:f(b.headLine[0],b.headLine[1]),stroke:"green",fill:null,transform:"translate("+h[0]+","+h[1]+")"})};var f=function(a,b){return"M "+a.x+","+a.y+" L"+b.x+","+b.y}},c.extend(b.Overlays.svg.GuideLines,b.Overlays.GuideLines)}.call("undefined"!=typeof window?window:this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=a.Katavorio,e=a.Biltong,f=function(a,c){c=c||"main";var f="_katavorio_"+c,g=a[f],h=a.getEventManager();return g||(g=new d({bind:h.on,unbind:h.off,getSize:b.getSize,getConstrainingRectangle:function(a){return[a.parentNode.scrollWidth,a.parentNode.scrollHeight]},getPosition:function(b,c){var d=a.getOffset(b,c,b._katavorioDrag?b.offsetParent:null);return[d.left,d.top]},setPosition:function(a,b){a.style.left=b[0]+"px",a.style.top=b[1]+"px"},addClass:b.addClass,removeClass:b.removeClass,intersects:e.intersects,indexOf:function(a,b){return a.indexOf(b)},scope:a.getDefaultScope(),css:{noSelect:a.dragSelectClass,droppable:"jtk-droppable",draggable:"jtk-draggable",drag:"jtk-drag",selected:"jtk-drag-selected",active:"jtk-drag-active",hover:"jtk-drag-hover",ghostProxy:"jtk-ghost-proxy"}}),g.setZoom(a.getZoom()),a[f]=g,a.bind("zoom",g.setZoom)),g},g=function(a,b){var d=function(d){if(null!=b[d]){if(c.isString(b[d])){var e=b[d].match(/-=/)?-1:1,f=b[d].substring(2);return a[d]+e*f}return b[d]}return a[d]};return[d("left"),d("top")]};b.extend(a.jsPlumbInstance.prototype,{animationSupported:!0,getElement:function(a){return null==a?null:(a="string"==typeof a?a:null!=a.length&&null==a.enctype?a[0]:a,"string"==typeof a?document.getElementById(a):a)},removeElement:function(a){f(this).elementRemoved(a),this.getEventManager().remove(a)},doAnimate:function(a,c,d){d=d||{};var e=this.getOffset(a),f=g(e,c),h=f[0]-e.left,i=f[1]-e.top,j=d.duration||250,k=15,l=j/k,m=k/j*h,n=k/j*i,o=0,p=setInterval(function(){b.setPosition(a,{left:e.left+m*(o+1),top:e.top+n*(o+1)}),null!=d.step&&d.step(o,Math.ceil(l)),o++,o>=l&&(window.clearInterval(p),null!=d.complete&&d.complete())},k)},destroyDraggable:function(a,b){f(this,b).destroyDraggable(a)},unbindDraggable:function(a,b,c,d){f(this,d).destroyDraggable(a,b,c)},destroyDroppable:function(a,b){f(this,b).destroyDroppable(a)},unbindDroppable:function(a,b,c,d){f(this,d).destroyDroppable(a,b,c)},initDraggable:function(a,b,c){f(this,c).draggable(a,b)},initDroppable:function(a,b,c){f(this,c).droppable(a,b)},isAlreadyDraggable:function(a){return null!=a._katavorioDrag},isDragSupported:function(a,b){return!0},isDropSupported:function(a,b){return!0},isElementDraggable:function(a){return a=b.getElement(a),a._katavorioDrag&&a._katavorioDrag.isEnabled()},getDragObject:function(a){return a[0].drag.getDragElement()},getDragScope:function(a){return a._katavorioDrag&&a._katavorioDrag.scopes.join(" ")||""},getDropEvent:function(a){return a[0].e},getUIPosition:function(a,b){var c=a[0].el;if(null==c.offsetParent)return null;var d=a[0].finalPos||a[0].pos,e={left:d[0],top:d[1]};if(c._katavorioDrag&&c.offsetParent!==this.getContainer()){var f=this.getOffset(c.offsetParent);e.left+=f.left,e.top+=f.top}return e},setDragFilter:function(a,b,c){a._katavorioDrag&&a._katavorioDrag.setFilter(b,c)},setElementDraggable:function(a,c){a=b.getElement(a),a._katavorioDrag&&a._katavorioDrag.setEnabled(c)},setDragScope:function(a,b){a._katavorioDrag&&a._katavorioDrag.k.setDragScope(a,b)},setDropScope:function(a,b){a._katavorioDrop&&a._katavorioDrop.length>0&&a._katavorioDrop[0].k.setDropScope(a,b)},addToPosse:function(a,c){var d=Array.prototype.slice.call(arguments,1),e=f(this);b.each(a,function(a){a=[b.getElement(a)],a.push.apply(a,d),e.addToPosse.apply(e,a)})},setPosse:function(a,c){var d=Array.prototype.slice.call(arguments,1),e=f(this);b.each(a,function(a){a=[b.getElement(a)],a.push.apply(a,d),e.setPosse.apply(e,a)})},removeFromPosse:function(a,c){var d=Array.prototype.slice.call(arguments,1),e=f(this);b.each(a,function(a){a=[b.getElement(a)],a.push.apply(a,d),e.removeFromPosse.apply(e,a)})},removeFromAllPosses:function(a){var c=f(this);b.each(a,function(a){c.removeFromAllPosses(b.getElement(a))})},setPosseState:function(a,c,d){var e=f(this);b.each(a,function(a){e.setPosseState(b.getElement(a),c,d)})},dragEvents:{start:"start",stop:"stop",drag:"drag",step:"step",over:"over",out:"out",drop:"drop",complete:"complete",beforeStart:"beforeStart"},animEvents:{step:"step",complete:"complete"},stopDrag:function(a){a._katavorioDrag&&a._katavorioDrag.abort()},addToDragSelection:function(a){f(this).select(a)},removeFromDragSelection:function(a){f(this).deselect(a)},clearDragSelection:function(){f(this).deselectAll()},trigger:function(a,b,c,d){this.getEventManager().trigger(a,b,c,d)},doReset:function(){for(var a in this)0===a.indexOf("_katavorio_")&&this[a].reset()}});var h=function(a){var b=function(){/complete|loaded|interactive/.test(document.readyState)&&"undefined"!=typeof document.body&&null!=document.body?a():setTimeout(b,9)};b()};h(b.init)}.call("undefined"!=typeof window?window:this); \ No newline at end of file diff --git a/src/assets/pdf-annotation/thirdjs/4.js b/src/assets/pdf-annotation/thirdjs/4.js new file mode 100755 index 0000000..7d7c78e --- /dev/null +++ b/src/assets/pdf-annotation/thirdjs/4.js @@ -0,0 +1,39674 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.PDFLib = {})); +}(this, (function (exports) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + } + + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + + function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + } + + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } + + /* + * The `chars`, `lookup`, `encode`, and `decode` members of this file are + * licensed under the following: + * + * base64-arraybuffer + * https://github.com/niklasvh/base64-arraybuffer + * + * Copyright (c) 2012 Niklas von Hertzen + * Licensed under the MIT license. + * + */ + var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // Use a lookup table to find the index. + var lookup = new Uint8Array(256); + for (var i = 0; i < chars.length; i++) { + lookup[chars.charCodeAt(i)] = i; + } + var encodeToBase64 = function (bytes) { + var base64 = ''; + var len = bytes.length; + for (var i = 0; i < len; i += 3) { + base64 += chars[bytes[i] >> 2]; + base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)]; + base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)]; + base64 += chars[bytes[i + 2] & 63]; + } + if (len % 3 === 2) { + base64 = base64.substring(0, base64.length - 1) + '='; + } + else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + '=='; + } + return base64; + }; + var decodeFromBase64 = function (base64) { + var bufferLength = base64.length * 0.75; + var len = base64.length; + var i; + var p = 0; + var encoded1; + var encoded2; + var encoded3; + var encoded4; + if (base64[base64.length - 1] === '=') { + bufferLength--; + if (base64[base64.length - 2] === '=') { + bufferLength--; + } + } + var bytes = new Uint8Array(bufferLength); + for (i = 0; i < len; i += 4) { + encoded1 = lookup[base64.charCodeAt(i)]; + encoded2 = lookup[base64.charCodeAt(i + 1)]; + encoded3 = lookup[base64.charCodeAt(i + 2)]; + encoded4 = lookup[base64.charCodeAt(i + 3)]; + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } + return bytes; + }; + // This regex is designed to be as flexible as possible. It will parse certain + // invalid data URIs. + var DATA_URI_PREFIX_REGEX = /^(data)?:?([\w\/\+]+)?;?(charset=[\w-]+|base64)?.*,/i; + /** + * If the `dataUri` input is a data URI, then the data URI prefix must not be + * longer than 100 characters, or this function will fail to decode it. + * + * @param dataUri a base64 data URI or plain base64 string + * @returns a Uint8Array containing the decoded input + */ + var decodeFromBase64DataUri = function (dataUri) { + var trimmedUri = dataUri.trim(); + var prefix = trimmedUri.substring(0, 100); + var res = prefix.match(DATA_URI_PREFIX_REGEX); + // Assume it's not a data URI - just a plain base64 string + if (!res) + return decodeFromBase64(trimmedUri); + // Remove the data URI prefix and parse the remainder as a base64 string + var fullMatch = res[0]; + var data = trimmedUri.substring(fullMatch.length); + return decodeFromBase64(data); + }; + + var toCharCode = function (character) { return character.charCodeAt(0); }; + var toCodePoint = function (character) { return character.codePointAt(0); }; + var toHexStringOfMinLength = function (num, minLength) { + return padStart(num.toString(16), minLength, '0').toUpperCase(); + }; + var toHexString = function (num) { return toHexStringOfMinLength(num, 2); }; + var charFromCode = function (code) { return String.fromCharCode(code); }; + var charFromHexCode = function (hex) { return charFromCode(parseInt(hex, 16)); }; + var padStart = function (value, length, padChar) { + var padding = ''; + for (var idx = 0, len = length - value.length; idx < len; idx++) { + padding += padChar; + } + return padding + value; + }; + var copyStringIntoBuffer = function (str, buffer, offset) { + var length = str.length; + for (var idx = 0; idx < length; idx++) { + buffer[offset++] = str.charCodeAt(idx); + } + return length; + }; + var addRandomSuffix = function (prefix, suffixLength) { + if (suffixLength === void 0) { suffixLength = 4; } + return prefix + "-" + Math.floor(Math.random() * Math.pow(10, suffixLength)); + }; + var escapeRegExp = function (str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }; + var cleanText = function (text) { + return text.replace(/\t|\u0085|\u2028|\u2029/g, ' ').replace(/[\b\v]/g, ''); + }; + var escapedNewlineChars = ['\\n', '\\f', '\\r', '\\u000B']; + var newlineChars = ['\n', '\f', '\r', '\u000B']; + var isNewlineChar = function (text) { return /^[\n\f\r\u000B]$/.test(text); }; + var lineSplit = function (text) { return text.split(/[\n\f\r\u000B]/); }; + var mergeLines = function (text) { + return text.replace(/[\n\f\r\u000B]/g, ' '); + }; + // JavaScript's String.charAt() method doesn work on strings containing UTF-16 + // characters (with high and low surrogate pairs), such as 💩 (poo emoji). This + // `charAtIndex()` function does. + // + // Credit: https://github.com/mathiasbynens/String.prototype.at/blob/master/at.js#L14-L48 + var charAtIndex = function (text, index) { + // Get the first code unit and code unit value + var cuFirst = text.charCodeAt(index); + var cuSecond; + var nextIndex = index + 1; + var length = 1; + if ( + // Check if it's the start of a surrogate pair. + cuFirst >= 0xd800 && + cuFirst <= 0xdbff && // high surrogate + text.length > nextIndex // there is a next code unit + ) { + cuSecond = text.charCodeAt(nextIndex); + if (cuSecond >= 0xdc00 && cuSecond <= 0xdfff) + length = 2; // low surrogate + } + return [text.slice(index, index + length), length]; + }; + var charSplit = function (text) { + var chars = []; + for (var idx = 0, len = text.length; idx < len;) { + var _a = charAtIndex(text, idx), c = _a[0], cLen = _a[1]; + chars.push(c); + idx += cLen; + } + return chars; + }; + var buildWordBreakRegex = function (wordBreaks) { + var newlineCharUnion = escapedNewlineChars.join('|'); + var escapedRules = ['$']; + for (var idx = 0, len = wordBreaks.length; idx < len; idx++) { + var wordBreak = wordBreaks[idx]; + if (isNewlineChar(wordBreak)) { + throw new TypeError("`wordBreak` must not include " + newlineCharUnion); + } + escapedRules.push(wordBreak === '' ? '.' : escapeRegExp(wordBreak)); + } + var breakRules = escapedRules.join('|'); + return new RegExp("(" + newlineCharUnion + ")|((.*?)(" + breakRules + "))", 'gm'); + }; + var breakTextIntoLines = function (text, wordBreaks, maxWidth, computeWidthOfText) { + var regex = buildWordBreakRegex(wordBreaks); + var words = cleanText(text).match(regex); + var currLine = ''; + var currWidth = 0; + var lines = []; + var pushCurrLine = function () { + if (currLine !== '') + lines.push(currLine); + currLine = ''; + currWidth = 0; + }; + for (var idx = 0, len = words.length; idx < len; idx++) { + var word = words[idx]; + if (isNewlineChar(word)) { + pushCurrLine(); + } + else { + var width = computeWidthOfText(word); + if (currWidth + width > maxWidth) + pushCurrLine(); + currLine += word; + currWidth += width; + } + } + pushCurrLine(); + return lines; + }; + // See section "7.9.4 Dates" of the PDF specification + var dateRegex = /^D:(\d\d\d\d)(\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?([+\-Z])?(\d\d)?'?(\d\d)?'?$/; + var parseDate = function (dateStr) { + var match = dateStr.match(dateRegex); + if (!match) + return undefined; + var year = match[1], _a = match[2], month = _a === void 0 ? '01' : _a, _b = match[3], day = _b === void 0 ? '01' : _b, _c = match[4], hours = _c === void 0 ? '00' : _c, _d = match[5], mins = _d === void 0 ? '00' : _d, _e = match[6], secs = _e === void 0 ? '00' : _e, _f = match[7], offsetSign = _f === void 0 ? 'Z' : _f, _g = match[8], offsetHours = _g === void 0 ? '00' : _g, _h = match[9], offsetMins = _h === void 0 ? '00' : _h; + // http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15 + var tzOffset = offsetSign === 'Z' ? 'Z' : "" + offsetSign + offsetHours + ":" + offsetMins; + var date = new Date(year + "-" + month + "-" + day + "T" + hours + ":" + mins + ":" + secs + tzOffset); + return date; + }; + var findLastMatch = function (value, regex) { + var _a; + var position = 0; + var lastMatch; + while (position < value.length) { + var match = value.substring(position).match(regex); + if (!match) + return { match: lastMatch, pos: position }; + lastMatch = match; + position += ((_a = match.index) !== null && _a !== void 0 ? _a : 0) + match[0].length; + } + return { match: lastMatch, pos: position }; + }; + + var last = function (array) { return array[array.length - 1]; }; + // export const dropLast = (array: T[]): T[] => + // array.slice(0, array.length - 1); + var typedArrayFor = function (value) { + if (value instanceof Uint8Array) + return value; + var length = value.length; + var typedArray = new Uint8Array(length); + for (var idx = 0; idx < length; idx++) { + typedArray[idx] = value.charCodeAt(idx); + } + return typedArray; + }; + var mergeIntoTypedArray = function () { + var arrays = []; + for (var _i = 0; _i < arguments.length; _i++) { + arrays[_i] = arguments[_i]; + } + var arrayCount = arrays.length; + var typedArrays = []; + for (var idx = 0; idx < arrayCount; idx++) { + var element = arrays[idx]; + typedArrays[idx] = + element instanceof Uint8Array ? element : typedArrayFor(element); + } + var totalSize = 0; + for (var idx = 0; idx < arrayCount; idx++) { + totalSize += arrays[idx].length; + } + var merged = new Uint8Array(totalSize); + var offset = 0; + for (var arrIdx = 0; arrIdx < arrayCount; arrIdx++) { + var arr = typedArrays[arrIdx]; + for (var byteIdx = 0, arrLen = arr.length; byteIdx < arrLen; byteIdx++) { + merged[offset++] = arr[byteIdx]; + } + } + return merged; + }; + var mergeUint8Arrays = function (arrays) { + var totalSize = 0; + for (var idx = 0, len = arrays.length; idx < len; idx++) { + totalSize += arrays[idx].length; + } + var mergedBuffer = new Uint8Array(totalSize); + var offset = 0; + for (var idx = 0, len = arrays.length; idx < len; idx++) { + var array = arrays[idx]; + mergedBuffer.set(array, offset); + offset += array.length; + } + return mergedBuffer; + }; + var arrayAsString = function (array) { + var str = ''; + for (var idx = 0, len = array.length; idx < len; idx++) { + str += charFromCode(array[idx]); + } + return str; + }; + var byAscendingId = function (a, b) { return a.id - b.id; }; + var sortedUniq = function (array, indexer) { + var uniq = []; + for (var idx = 0, len = array.length; idx < len; idx++) { + var curr = array[idx]; + var prev = array[idx - 1]; + if (idx === 0 || indexer(curr) !== indexer(prev)) { + uniq.push(curr); + } + } + return uniq; + }; + // Arrays and TypedArrays in JS both have .reverse() methods, which would seem + // to negate the need for this function. However, not all runtimes support this + // method (e.g. React Native). This function compensates for that fact. + var reverseArray = function (array) { + var arrayLen = array.length; + for (var idx = 0, len = Math.floor(arrayLen / 2); idx < len; idx++) { + var leftIdx = idx; + var rightIdx = arrayLen - idx - 1; + var temp = array[idx]; + array[leftIdx] = array[rightIdx]; + array[rightIdx] = temp; + } + return array; + }; + var sum = function (array) { + var total = 0; + for (var idx = 0, len = array.length; idx < len; idx++) { + total += array[idx]; + } + return total; + }; + var range = function (start, end) { + var arr = new Array(end - start); + for (var idx = 0, len = arr.length; idx < len; idx++) { + arr[idx] = start + idx; + } + return arr; + }; + var pluckIndices = function (arr, indices) { + var plucked = new Array(indices.length); + for (var idx = 0, len = indices.length; idx < len; idx++) { + plucked[idx] = arr[indices[idx]]; + } + return plucked; + }; + var canBeConvertedToUint8Array = function (input) { + return input instanceof Uint8Array || + input instanceof ArrayBuffer || + typeof input === 'string'; + }; + var toUint8Array = function (input) { + if (typeof input === 'string') { + return decodeFromBase64DataUri(input); + } + else if (input instanceof ArrayBuffer) { + return new Uint8Array(input); + } + else if (input instanceof Uint8Array) { + return input; + } + else { + throw new TypeError('`input` must be one of `string | ArrayBuffer | Uint8Array`'); + } + }; + + /** + * Returns a Promise that resolves after at least one tick of the + * Macro Task Queue occurs. + */ + var waitForTick = function () { + return new Promise(function (resolve) { + setTimeout(function () { return resolve(); }, 0); + }); + }; + + /** + * Encodes a string to UTF-8. + * + * @param input The string to be encoded. + * @param byteOrderMark Whether or not a byte order marker (BOM) should be added + * to the start of the encoding. (default `true`) + * @returns A Uint8Array containing the UTF-8 encoding of the input string. + * + * ----------------------------------------------------------------------------- + * + * JavaScript strings are composed of Unicode code points. Code points are + * integers in the range 0 to 1,114,111 (0x10FFFF). When serializing a string, + * it must be encoded as a sequence of words. A word is typically 8, 16, or 32 + * bytes in size. As such, Unicode defines three encoding forms: UTF-8, UTF-16, + * and UTF-32. These encoding forms are described in the Unicode standard [1]. + * This function implements the UTF-8 encoding form. + * + * ----------------------------------------------------------------------------- + * + * In UTF-8, each code point is mapped to a sequence of 1, 2, 3, or 4 bytes. + * Note that the logic which defines this mapping is slightly convoluted, and + * not as straightforward as the mapping logic for UTF-16 or UTF-32. The UTF-8 + * mapping logic is as follows [2]: + * + * • If a code point is in the range U+0000..U+007F, then view it as a 7-bit + * integer: 0bxxxxxxx. Map the code point to 1 byte with the first high order + * bit set to 0: + * + * b1=0b0xxxxxxx + * + * • If a code point is in the range U+0080..U+07FF, then view it as an 11-bit + * integer: 0byyyyyxxxxxx. Map the code point to 2 bytes with the first 5 bits + * of the code point stored in the first byte, and the last 6 bits stored in + * the second byte: + * + * b1=0b110yyyyy b2=0b10xxxxxx + * + * • If a code point is in the range U+0800..U+FFFF, then view it as a 16-bit + * integer, 0bzzzzyyyyyyxxxxxx. Map the code point to 3 bytes with the first + * 4 bits stored in the first byte, the next 6 bits stored in the second byte, + * and the last 6 bits in the third byte: + * + * b1=0b1110zzzz b2=0b10yyyyyy b3=0b10xxxxxx + * + * • If a code point is in the range U+10000...U+10FFFF, then view it as a + * 21-bit integer, 0bvvvzzzzzzyyyyyyxxxxxx. Map the code point to 4 bytes with + * the first 3 bits stored in the first byte, the next 6 bits stored in the + * second byte, the next 6 bits stored in the third byte, and the last 6 bits + * stored in the fourth byte: + * + * b1=0b11110xxx b2=0b10zzzzzz b3=0b10yyyyyy b4=0b10xxxxxx + * + * ----------------------------------------------------------------------------- + * + * It is important to note, when iterating through the code points of a string + * in JavaScript, that if a character is encoded as a surrogate pair it will + * increase the string's length by 2 instead of 1 [4]. For example: + * + * ``` + * > 'a'.length + * 1 + * > '💩'.length + * 2 + * > '語'.length + * 1 + * > 'a💩語'.length + * 4 + * ``` + * + * The results of the above example are explained by the fact that the + * characters 'a' and '語' are not represented by surrogate pairs, but '💩' is. + * + * Because of this idiosyncrasy in JavaScript's string implementation and APIs, + * we must "jump" an extra index after encoding a character as a surrogate + * pair. In practice, this means we must increment the index of our for loop by + * 2 if we encode a surrogate pair, and 1 in all other cases. + * + * ----------------------------------------------------------------------------- + * + * References: + * - [1] https://www.unicode.org/versions/Unicode12.0.0/UnicodeStandard-12.0.pdf + * 3.9 Unicode Encoding Forms - UTF-8 + * - [2] http://www.herongyang.com/Unicode/UTF-8-UTF-8-Encoding.html + * - [3] http://www.herongyang.com/Unicode/UTF-8-UTF-8-Encoding-Algorithm.html + * - [4] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length#Description + * + */ + var utf8Encode = function (input, byteOrderMark) { + if (byteOrderMark === void 0) { byteOrderMark = true; } + var encoded = []; + if (byteOrderMark) + encoded.push(0xef, 0xbb, 0xbf); + for (var idx = 0, len = input.length; idx < len;) { + var codePoint = input.codePointAt(idx); + // One byte encoding + if (codePoint < 0x80) { + var byte1 = codePoint & 0x7f; + encoded.push(byte1); + idx += 1; + } + // Two byte encoding + else if (codePoint < 0x0800) { + var byte1 = ((codePoint >> 6) & 0x1f) | 0xc0; + var byte2 = (codePoint & 0x3f) | 0x80; + encoded.push(byte1, byte2); + idx += 1; + } + // Three byte encoding + else if (codePoint < 0x010000) { + var byte1 = ((codePoint >> 12) & 0x0f) | 0xe0; + var byte2 = ((codePoint >> 6) & 0x3f) | 0x80; + var byte3 = (codePoint & 0x3f) | 0x80; + encoded.push(byte1, byte2, byte3); + idx += 1; + } + // Four byte encoding (surrogate pair) + else if (codePoint < 0x110000) { + var byte1 = ((codePoint >> 18) & 0x07) | 0xf0; + var byte2 = ((codePoint >> 12) & 0x3f) | 0x80; + var byte3 = ((codePoint >> 6) & 0x3f) | 0x80; + var byte4 = ((codePoint >> 0) & 0x3f) | 0x80; + encoded.push(byte1, byte2, byte3, byte4); + idx += 2; + } + // Should never reach this case + else + throw new Error("Invalid code point: 0x" + toHexString(codePoint)); + } + return new Uint8Array(encoded); + }; + /** + * Encodes a string to UTF-16. + * + * @param input The string to be encoded. + * @param byteOrderMark Whether or not a byte order marker (BOM) should be added + * to the start of the encoding. (default `true`) + * @returns A Uint16Array containing the UTF-16 encoding of the input string. + * + * ----------------------------------------------------------------------------- + * + * JavaScript strings are composed of Unicode code points. Code points are + * integers in the range 0 to 1,114,111 (0x10FFFF). When serializing a string, + * it must be encoded as a sequence of words. A word is typically 8, 16, or 32 + * bytes in size. As such, Unicode defines three encoding forms: UTF-8, UTF-16, + * and UTF-32. These encoding forms are described in the Unicode standard [1]. + * This function implements the UTF-16 encoding form. + * + * ----------------------------------------------------------------------------- + * + * In UTF-16, each code point is mapped to one or two 16-bit integers. The + * UTF-16 mapping logic is as follows [2]: + * + * • If a code point is in the range U+0000..U+FFFF, then map the code point to + * a 16-bit integer with the most significant byte first. + * + * • If a code point is in the range U+10000..U+10000, then map the code point + * to two 16-bit integers. The first integer should contain the high surrogate + * and the second integer should contain the low surrogate. Both surrogates + * should be written with the most significant byte first. + * + * ----------------------------------------------------------------------------- + * + * It is important to note, when iterating through the code points of a string + * in JavaScript, that if a character is encoded as a surrogate pair it will + * increase the string's length by 2 instead of 1 [4]. For example: + * + * ``` + * > 'a'.length + * 1 + * > '💩'.length + * 2 + * > '語'.length + * 1 + * > 'a💩語'.length + * 4 + * ``` + * + * The results of the above example are explained by the fact that the + * characters 'a' and '語' are not represented by surrogate pairs, but '💩' is. + * + * Because of this idiosyncrasy in JavaScript's string implementation and APIs, + * we must "jump" an extra index after encoding a character as a surrogate + * pair. In practice, this means we must increment the index of our for loop by + * 2 if we encode a surrogate pair, and 1 in all other cases. + * + * ----------------------------------------------------------------------------- + * + * References: + * - [1] https://www.unicode.org/versions/Unicode12.0.0/UnicodeStandard-12.0.pdf + * 3.9 Unicode Encoding Forms - UTF-8 + * - [2] http://www.herongyang.com/Unicode/UTF-16-UTF-16-Encoding.html + * - [3] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length#Description + * + */ + var utf16Encode = function (input, byteOrderMark) { + if (byteOrderMark === void 0) { byteOrderMark = true; } + var encoded = []; + if (byteOrderMark) + encoded.push(0xfeff); + for (var idx = 0, len = input.length; idx < len;) { + var codePoint = input.codePointAt(idx); + // Two byte encoding + if (codePoint < 0x010000) { + encoded.push(codePoint); + idx += 1; + } + // Four byte encoding (surrogate pair) + else if (codePoint < 0x110000) { + encoded.push(highSurrogate(codePoint), lowSurrogate(codePoint)); + idx += 2; + } + // Should never reach this case + else + throw new Error("Invalid code point: 0x" + toHexString(codePoint)); + } + return new Uint16Array(encoded); + }; + /** + * Returns `true` if the `codePoint` is within the + * Basic Multilingual Plane (BMP). Code points inside the BMP are not encoded + * with surrogate pairs. + * @param codePoint The code point to be evaluated. + * + * Reference: https://en.wikipedia.org/wiki/UTF-16#Description + */ + var isWithinBMP = function (codePoint) { + return codePoint >= 0 && codePoint <= 0xffff; + }; + /** + * Returns `true` if the given `codePoint` is valid and must be represented + * with a surrogate pair when encoded. + * @param codePoint The code point to be evaluated. + * + * Reference: https://en.wikipedia.org/wiki/UTF-16#Description + */ + var hasSurrogates = function (codePoint) { + return codePoint >= 0x010000 && codePoint <= 0x10ffff; + }; + // From Unicode 3.0 spec, section 3.7: + // http://unicode.org/versions/Unicode3.0.0/ch03.pdf + var highSurrogate = function (codePoint) { + return Math.floor((codePoint - 0x10000) / 0x400) + 0xd800; + }; + // From Unicode 3.0 spec, section 3.7: + // http://unicode.org/versions/Unicode3.0.0/ch03.pdf + var lowSurrogate = function (codePoint) { + return ((codePoint - 0x10000) % 0x400) + 0xdc00; + }; + var ByteOrder; + (function (ByteOrder) { + ByteOrder["BigEndian"] = "BigEndian"; + ByteOrder["LittleEndian"] = "LittleEndian"; + })(ByteOrder || (ByteOrder = {})); + var REPLACEMENT = '�'.codePointAt(0); + /** + * Decodes a Uint8Array of data to a string using UTF-16. + * + * Note that this function attempts to recover from erronous input by + * inserting the replacement character (�) to mark invalid code points + * and surrogate pairs. + * + * @param input A Uint8Array containing UTF-16 encoded data + * @param byteOrderMark Whether or not a byte order marker (BOM) should be read + * at the start of the encoding. (default `true`) + * @returns The decoded string. + */ + var utf16Decode = function (input, byteOrderMark) { + if (byteOrderMark === void 0) { byteOrderMark = true; } + // Need at least 2 bytes of data in UTF-16 encodings + if (input.length <= 1) + return String.fromCodePoint(REPLACEMENT); + var byteOrder = byteOrderMark ? readBOM(input) : ByteOrder.BigEndian; + // Skip byte order mark if needed + var idx = byteOrderMark ? 2 : 0; + var codePoints = []; + while (input.length - idx >= 2) { + var first = decodeValues(input[idx++], input[idx++], byteOrder); + if (isHighSurrogate(first)) { + if (input.length - idx < 2) { + // Need at least 2 bytes left for the low surrogate that is required + codePoints.push(REPLACEMENT); + } + else { + var second = decodeValues(input[idx++], input[idx++], byteOrder); + if (isLowSurrogate(second)) { + codePoints.push(first, second); + } + else { + // Low surrogates should always follow high surrogates + codePoints.push(REPLACEMENT); + } + } + } + else if (isLowSurrogate(first)) { + // High surrogates should always come first since `decodeValues()` + // accounts for the byte ordering + idx += 2; + codePoints.push(REPLACEMENT); + } + else { + codePoints.push(first); + } + } + // There shouldn't be extra byte(s) left over + if (idx < input.length) + codePoints.push(REPLACEMENT); + return String.fromCodePoint.apply(String, codePoints); + }; + /** + * Returns `true` if the given `codePoint` is a high surrogate. + * @param codePoint The code point to be evaluated. + * + * Reference: https://en.wikipedia.org/wiki/UTF-16#Description + */ + var isHighSurrogate = function (codePoint) { + return codePoint >= 0xd800 && codePoint <= 0xdbff; + }; + /** + * Returns `true` if the given `codePoint` is a low surrogate. + * @param codePoint The code point to be evaluated. + * + * Reference: https://en.wikipedia.org/wiki/UTF-16#Description + */ + var isLowSurrogate = function (codePoint) { + return codePoint >= 0xdc00 && codePoint <= 0xdfff; + }; + /** + * Decodes the given utf-16 values first and second using the specified + * byte order. + * @param first The first byte of the encoding. + * @param second The second byte of the encoding. + * @param byteOrder The byte order of the encoding. + * Reference: https://en.wikipedia.org/wiki/UTF-16#Examples + */ + var decodeValues = function (first, second, byteOrder) { + // Append the binary representation of the preceding byte by shifting the + // first one 8 to the left and than applying a bitwise or-operator to append + // the second one. + if (byteOrder === ByteOrder.LittleEndian) + return (second << 8) | first; + if (byteOrder === ByteOrder.BigEndian) + return (first << 8) | second; + throw new Error("Invalid byteOrder: " + byteOrder); + }; + /** + * Returns whether the given array contains a byte order mark for the + * UTF-16BE or UTF-16LE encoding. If it has neither, BigEndian is assumed. + * + * Reference: https://en.wikipedia.org/wiki/Byte_order_mark#UTF-16 + * + * @param bytes The byte array to be evaluated. + */ + // prettier-ignore + var readBOM = function (bytes) { return (hasUtf16BigEndianBOM(bytes) ? ByteOrder.BigEndian + : hasUtf16LittleEndianBOM(bytes) ? ByteOrder.LittleEndian + : ByteOrder.BigEndian); }; + var hasUtf16BigEndianBOM = function (bytes) { + return bytes[0] === 0xfe && bytes[1] === 0xff; + }; + var hasUtf16LittleEndianBOM = function (bytes) { + return bytes[0] === 0xff && bytes[1] === 0xfe; + }; + var hasUtf16BOM = function (bytes) { + return hasUtf16BigEndianBOM(bytes) || hasUtf16LittleEndianBOM(bytes); + }; + + // tslint:disable radix + /** + * Converts a number to its string representation in decimal. This function + * differs from simply converting a number to a string with `.toString()` + * because this function's output string will **not** contain exponential + * notation. + * + * Credit: https://stackoverflow.com/a/46545519 + */ + var numberToString = function (num) { + var numStr = String(num); + if (Math.abs(num) < 1.0) { + var e = parseInt(num.toString().split('e-')[1]); + if (e) { + var negative = num < 0; + if (negative) + num *= -1; + num *= Math.pow(10, e - 1); + numStr = '0.' + new Array(e).join('0') + num.toString().substring(2); + if (negative) + numStr = '-' + numStr; + } + } + else { + var e = parseInt(num.toString().split('+')[1]); + if (e > 20) { + e -= 20; + num /= Math.pow(10, e); + numStr = num.toString() + new Array(e + 1).join('0'); + } + } + return numStr; + }; + var sizeInBytes = function (n) { return Math.ceil(n.toString(2).length / 8); }; + /** + * Converts a number into its constituent bytes and returns them as + * a number[]. + * + * Returns most significant byte as first element in array. It may be necessary + * to call .reverse() to get the bits in the desired order. + * + * Example: + * bytesFor(0x02A41E) => [ 0b10, 0b10100100, 0b11110 ] + * + * Credit for algorithm: https://stackoverflow.com/a/1936865 + */ + var bytesFor = function (n) { + var bytes = new Uint8Array(sizeInBytes(n)); + for (var i = 1; i <= bytes.length; i++) { + bytes[i - 1] = n >> ((bytes.length - i) * 8); + } + return bytes; + }; + + var error = function (msg) { + throw new Error(msg); + }; + + function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; + } + + function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); + } + + var common = createCommonjsModule(function (module, exports) { + + + var TYPED_OK = (typeof Uint8Array !== 'undefined') && + (typeof Uint16Array !== 'undefined') && + (typeof Int32Array !== 'undefined'); + + function _has(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + } + + exports.assign = function (obj /*from1, from2, from3, ...*/) { + var sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + var source = sources.shift(); + if (!source) { continue; } + + if (typeof source !== 'object') { + throw new TypeError(source + 'must be non-object'); + } + + for (var p in source) { + if (_has(source, p)) { + obj[p] = source[p]; + } + } + } + + return obj; + }; + + + // reduce buffer size, avoiding mem copy + exports.shrinkBuf = function (buf, size) { + if (buf.length === size) { return buf; } + if (buf.subarray) { return buf.subarray(0, size); } + buf.length = size; + return buf; + }; + + + var fnTyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + if (src.subarray && dest.subarray) { + dest.set(src.subarray(src_offs, src_offs + len), dest_offs); + return; + } + // Fallback to ordinary array + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + var i, l, len, pos, chunk, result; + + // calculate data length + len = 0; + for (i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + + // join chunks + result = new Uint8Array(len); + pos = 0; + for (i = 0, l = chunks.length; i < l; i++) { + chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } + + return result; + } + }; + + var fnUntyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + return [].concat.apply([], chunks); + } + }; + + + // Enable/Disable typed arrays use, for testing + // + exports.setTyped = function (on) { + if (on) { + exports.Buf8 = Uint8Array; + exports.Buf16 = Uint16Array; + exports.Buf32 = Int32Array; + exports.assign(exports, fnTyped); + } else { + exports.Buf8 = Array; + exports.Buf16 = Array; + exports.Buf32 = Array; + exports.assign(exports, fnUntyped); + } + }; + + exports.setTyped(TYPED_OK); + }); + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + /* eslint-disable space-unary-ops */ + + + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + //var Z_FILTERED = 1; + //var Z_HUFFMAN_ONLY = 2; + //var Z_RLE = 3; + var Z_FIXED = 4; + //var Z_DEFAULT_STRATEGY = 0; + + /* Possible values of the data_type field (though see inflate()) */ + var Z_BINARY = 0; + var Z_TEXT = 1; + //var Z_ASCII = 1; // = Z_TEXT + var Z_UNKNOWN = 2; + + /*============================================================================*/ + + + function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + + // From zutil.h + + var STORED_BLOCK = 0; + var STATIC_TREES = 1; + var DYN_TREES = 2; + /* The three kinds of block type */ + + var MIN_MATCH = 3; + var MAX_MATCH = 258; + /* The minimum and maximum match lengths */ + + // From deflate.h + /* =========================================================================== + * Internal compression state. + */ + + var LENGTH_CODES = 29; + /* number of length codes, not counting the special END_BLOCK code */ + + var LITERALS = 256; + /* number of literal bytes 0..255 */ + + var L_CODES = LITERALS + 1 + LENGTH_CODES; + /* number of Literal or Length codes, including the END_BLOCK code */ + + var D_CODES = 30; + /* number of distance codes */ + + var BL_CODES = 19; + /* number of codes used to transfer the bit lengths */ + + var HEAP_SIZE = 2 * L_CODES + 1; + /* maximum heap size */ + + var MAX_BITS = 15; + /* All codes must not exceed MAX_BITS bits */ + + var Buf_size = 16; + /* size of bit buffer in bi_buf */ + + + /* =========================================================================== + * Constants + */ + + var MAX_BL_BITS = 7; + /* Bit length codes must not exceed MAX_BL_BITS bits */ + + var END_BLOCK = 256; + /* end of block literal code */ + + var REP_3_6 = 16; + /* repeat previous bit length 3-6 times (2 bits of repeat count) */ + + var REPZ_3_10 = 17; + /* repeat a zero length 3-10 times (3 bits of repeat count) */ + + var REPZ_11_138 = 18; + /* repeat a zero length 11-138 times (7 bits of repeat count) */ + + /* eslint-disable comma-spacing,array-bracket-spacing */ + var extra_lbits = /* extra bits for each length code */ + [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + + var extra_dbits = /* extra bits for each distance code */ + [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + + var extra_blbits = /* extra bits for each bit length code */ + [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + + var bl_order = + [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; + /* eslint-enable comma-spacing,array-bracket-spacing */ + + /* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + + /* =========================================================================== + * Local data. These are initialized only once. + */ + + // We pre-fill arrays with 0 to avoid uninitialized gaps + + var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + + // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 + var static_ltree = new Array((L_CODES + 2) * 2); + zero(static_ltree); + /* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + + var static_dtree = new Array(D_CODES * 2); + zero(static_dtree); + /* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + + var _dist_code = new Array(DIST_CODE_LEN); + zero(_dist_code); + /* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + + var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); + zero(_length_code); + /* length code for each normalized match length (0 == MIN_MATCH) */ + + var base_length = new Array(LENGTH_CODES); + zero(base_length); + /* First normalized length for each code (0 = MIN_MATCH) */ + + var base_dist = new Array(D_CODES); + zero(base_dist); + /* First normalized distance for each code (0 = distance of 1) */ + + + function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { + + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ + + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; + } + + + var static_l_desc; + var static_d_desc; + var static_bl_desc; + + + function TreeDesc(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ + } + + + + function d_code(dist) { + return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; + } + + + /* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ + function put_short(s, w) { + // put_byte(s, (uch)((w) & 0xff)); + // put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; + } + + + /* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + function send_bits(s, value, length) { + if (s.bi_valid > (Buf_size - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short(s, s.bi_buf); + s.bi_buf = value >> (Buf_size - s.bi_valid); + s.bi_valid += length - Buf_size; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; + } + } + + + function send_code(s, c, tree) { + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); + } + + + /* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + function bi_reverse(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; + } + + + /* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ + function bi_flush(s) { + if (s.bi_valid === 16) { + put_short(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; + + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } + } + + + /* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + function gen_bitlen(s, desc) + // deflate_state *s; + // tree_desc *desc; /* the tree descriptor */ + { + var tree = desc.dyn_tree; + var max_code = desc.max_code; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var extra = desc.stat_desc.extra_bits; + var base = desc.stat_desc.extra_base; + var max_length = desc.stat_desc.max_length; + var h; /* heap index */ + var n, m; /* iterate over the tree elements */ + var bits; /* bit length */ + var xbits; /* extra bits */ + var f; /* frequency */ + var overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) { + s.bl_count[bits] = 0; + } + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) { continue; } /* not a leaf node */ + + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } + + // Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } + } + + + /* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + function gen_codes(tree, max_code, bl_count) + // ct_data *tree; /* the tree to decorate */ + // int max_code; /* largest code with non zero frequency */ + // ushf *bl_count; /* number of codes at each bit length */ + { + var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ + var code = 0; /* running code value */ + var bits; /* bit index */ + var n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits - 1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES - 1; code++) { + base_length[code] = length; + for (n = 0; n < (1 << extra_lbits[code]); n++) { + _length_code[length++] = code; + } + } + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1 << extra_dbits[code]); n++) { + _dist_code[dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { + _dist_code[256 + dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) { + bl_count[bits] = 0; + } + + n = 0; + while (n <= 143) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes(static_ltree, L_CODES + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n * 2 + 1]/*.Len*/ = 5; + static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); + } + + // Now data ready and we can init static trees + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); + static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); + + //static_init_done = true; + } + + + /* =========================================================================== + * Initialize a new block. + */ + function init_block(s) { + var n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + + s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.last_lit = s.matches = 0; + } + + + /* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ + function bi_windup(s) + { + if (s.bi_valid > 8) { + put_short(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; + } + s.bi_buf = 0; + s.bi_valid = 0; + } + + /* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ + function copy_block(s, buf, len, header) + //DeflateState *s; + //charf *buf; /* the input data */ + //unsigned len; /* its length */ + //int header; /* true if block header must be written */ + { + bi_windup(s); /* align on byte boundary */ + + if (header) { + put_short(s, len); + put_short(s, ~len); + } + // while (len--) { + // put_byte(s, *buf++); + // } + common.arraySet(s.pending_buf, s.window, buf, len, s.pending); + s.pending += len; + } + + /* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + function smaller(tree, n, m, depth) { + var _n2 = n * 2; + var _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); + } + + /* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + function pqdownheap(s, tree, k) + // deflate_state *s; + // ct_data *tree; /* the tree to restore */ + // int k; /* node to move down */ + { + var v = s.heap[k]; + var j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s.heap[j], s.depth)) { break; } + + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; + } + + + // inlined manually + // var SMALLEST = 1; + + /* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ + function compress_block(s, ltree, dtree) + // deflate_state *s; + // const ct_data *ltree; /* literal tree */ + // const ct_data *dtree; /* distance tree */ + { + var dist; /* distance of matched string */ + var lc; /* match length or unmatched char (if dist == 0) */ + var lx = 0; /* running index in l_buf */ + var code; /* the code to send */ + var extra; /* number of extra bits to send */ + + if (s.last_lit !== 0) { + do { + dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); + lc = s.pending_buf[s.l_buf + lx]; + lx++; + + if (dist === 0) { + send_code(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra !== 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + //Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra !== 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + // "pendingBuf overflow"); + + } while (lx < s.last_lit); + } + + send_code(s, END_BLOCK, ltree); + } + + + /* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ + function build_tree(s, desc) + // deflate_state *s; + // tree_desc *desc; /* the tree descriptor */ + { + var tree = desc.dyn_tree; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var elems = desc.stat_desc.elems; + var n, m; /* iterate over heap elements */ + var max_code = -1; /* largest code with non zero frequency */ + var node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; + + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; + } + /* node is 0 or 1 so it does not have extra bits */ + } + desc.max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap(s, tree, 1/*SMALLEST*/); + /***/ + + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ + + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; + + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap(s, tree, 1/*SMALLEST*/); + + } while (s.heap_len >= 2); + + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes(tree, max_code, s.bl_count); + } + + + /* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ + function scan_tree(s, tree, max_code) + // deflate_state *s; + // ct_data *tree; /* the tree to be scanned */ + // int max_code; /* and its largest code of non zero frequency */ + { + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ + + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; + + } else if (curlen !== 0) { + + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6 * 2]/*.Freq*/++; + + } else if (count <= 10) { + s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; + + } else { + s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; + } + + count = 0; + prevlen = curlen; + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } + } + + + /* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + function send_tree(s, tree, max_code) + // deflate_state *s; + // ct_data *tree; /* the tree to be scanned */ + // int max_code; /* and its largest code of non zero frequency */ + { + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ + + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); + + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s.bl_tree); + send_bits(s, count - 3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s.bl_tree); + send_bits(s, count - 3, 3); + + } else { + send_code(s, REPZ_11_138, s.bl_tree); + send_bits(s, count - 11, 7); + } + + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } + } + + + /* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + function build_bl_tree(s) { + var max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree(s, s.dyn_dtree, s.d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); + + return max_blindex; + } + + + /* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + function send_all_trees(s, lcodes, dcodes, blcodes) + // deflate_state *s; + // int lcodes, dcodes, blcodes; /* number of codes for each tree */ + { + var rank; /* index in bl_order */ + + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); + } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); + } + + + /* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ + function detect_data_type(s) { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + var black_mask = 0xf3ffc07f; + var n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>>= 1) { + if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY; + } + } + + /* Check for textual ("white-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + for (n = 32; n < LITERALS; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + } + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; + } + + + var static_init_done = false; + + /* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ + function _tr_init(s) + { + + if (!static_init_done) { + tr_static_init(); + static_init_done = true; + } + + s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); + s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); + s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); + + s.bi_buf = 0; + s.bi_valid = 0; + + /* Initialize the first block of the first file: */ + init_block(s); + } + + + /* =========================================================================== + * Send a stored block + */ + function _tr_stored_block(s, buf, stored_len, last) + //DeflateState *s; + //charf *buf; /* input block */ + //ulg stored_len; /* length of input block */ + //int last; /* one if this is the last block for a file */ + { + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ + copy_block(s, buf, stored_len, true); /* with header */ + } + + + /* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ + function _tr_align(s) { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); + } + + + /* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + function _tr_flush_block(s, buf, stored_len, last) + //DeflateState *s; + //charf *buf; /* input block, or NULL if too old */ + //ulg stored_len; /* length of input block */ + //int last; /* one if this is the last block for a file */ + { + var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + var max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { + + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN) { + s.strm.data_type = detect_data_type(s); + } + + /* Construct the literal and distance trees */ + build_tree(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + + build_tree(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; + + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->last_lit)); + + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + + } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { + + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); + compress_block(s, static_ltree, static_dtree); + + } else { + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block(s, s.dyn_ltree, s.dyn_dtree); + } + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); + } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); + } + + /* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + function _tr_tally(s, dist, lc) + // deflate_state *s; + // unsigned dist; /* distance of matched string */ + // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ + { + //var out_length, in_length, dcode; + + s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; + s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; + + s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; + s.last_lit++; + + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; + } + + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + + //#ifdef TRUNCATE_BLOCK + // /* Try to guess if it is profitable to stop the current block here */ + // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { + // /* Compute an upper bound for the compressed length */ + // out_length = s.last_lit*8; + // in_length = s.strstart - s.block_start; + // + // for (dcode = 0; dcode < D_CODES; dcode++) { + // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); + // } + // out_length >>>= 3; + // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + // // s->last_lit, in_length, out_length, + // // 100L - out_length*100L/in_length)); + // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { + // return true; + // } + // } + //#endif + + return (s.last_lit === s.lit_bufsize - 1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + } + + var _tr_init_1 = _tr_init; + var _tr_stored_block_1 = _tr_stored_block; + var _tr_flush_block_1 = _tr_flush_block; + var _tr_tally_1 = _tr_tally; + var _tr_align_1 = _tr_align; + + var trees = { + _tr_init: _tr_init_1, + _tr_stored_block: _tr_stored_block_1, + _tr_flush_block: _tr_flush_block_1, + _tr_tally: _tr_tally_1, + _tr_align: _tr_align_1 + }; + + // Note: adler32 takes 12% for level 0 and 2% for level 6. + // It isn't worth it to make additional optimizations as in original. + // Small size is preferable. + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function adler32(adler, buf, len, pos) { + var s1 = (adler & 0xffff) |0, + s2 = ((adler >>> 16) & 0xffff) |0, + n = 0; + + while (len !== 0) { + // Set limit ~ twice less than 5552, to keep + // s2 in 31-bits, because we force signed ints. + // in other case %= will fail. + n = len > 2000 ? 2000 : len; + len -= n; + + do { + s1 = (s1 + buf[pos++]) |0; + s2 = (s2 + s1) |0; + } while (--n); + + s1 %= 65521; + s2 %= 65521; + } + + return (s1 | (s2 << 16)) |0; + } + + + var adler32_1 = adler32; + + // Note: we can't get significant speed boost here. + // So write code to minimize size - no pregenerated tables + // and array tools dependencies. + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + // Use ordinary array, since untyped makes no boost here + function makeTable() { + var c, table = []; + + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); + } + table[n] = c; + } + + return table; + } + + // Create table on load. Just 255 signed longs. Not a problem. + var crcTable = makeTable(); + + + function crc32(crc, buf, len, pos) { + var t = crcTable, + end = pos + len; + + crc ^= -1; + + for (var i = pos; i < end; i++) { + crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + } + + return (crc ^ (-1)); // >>> 0; + } + + + var crc32_1 = crc32; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + var messages = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + + + + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + /* Allowed flush values; see deflate() and inflate() below for details */ + var Z_NO_FLUSH = 0; + var Z_PARTIAL_FLUSH = 1; + //var Z_SYNC_FLUSH = 2; + var Z_FULL_FLUSH = 3; + var Z_FINISH = 4; + var Z_BLOCK = 5; + //var Z_TREES = 6; + + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + var Z_OK = 0; + var Z_STREAM_END = 1; + //var Z_NEED_DICT = 2; + //var Z_ERRNO = -1; + var Z_STREAM_ERROR = -2; + var Z_DATA_ERROR = -3; + //var Z_MEM_ERROR = -4; + var Z_BUF_ERROR = -5; + //var Z_VERSION_ERROR = -6; + + + /* compression levels */ + //var Z_NO_COMPRESSION = 0; + //var Z_BEST_SPEED = 1; + //var Z_BEST_COMPRESSION = 9; + var Z_DEFAULT_COMPRESSION = -1; + + + var Z_FILTERED = 1; + var Z_HUFFMAN_ONLY = 2; + var Z_RLE = 3; + var Z_FIXED$1 = 4; + var Z_DEFAULT_STRATEGY = 0; + + /* Possible values of the data_type field (though see inflate()) */ + //var Z_BINARY = 0; + //var Z_TEXT = 1; + //var Z_ASCII = 1; // = Z_TEXT + var Z_UNKNOWN$1 = 2; + + + /* The deflate compression method */ + var Z_DEFLATED = 8; + + /*============================================================================*/ + + + var MAX_MEM_LEVEL = 9; + /* Maximum value for memLevel in deflateInit2 */ + var MAX_WBITS = 15; + /* 32K LZ77 window */ + var DEF_MEM_LEVEL = 8; + + + var LENGTH_CODES$1 = 29; + /* number of length codes, not counting the special END_BLOCK code */ + var LITERALS$1 = 256; + /* number of literal bytes 0..255 */ + var L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; + /* number of Literal or Length codes, including the END_BLOCK code */ + var D_CODES$1 = 30; + /* number of distance codes */ + var BL_CODES$1 = 19; + /* number of codes used to transfer the bit lengths */ + var HEAP_SIZE$1 = 2 * L_CODES$1 + 1; + /* maximum heap size */ + var MAX_BITS$1 = 15; + /* All codes must not exceed MAX_BITS bits */ + + var MIN_MATCH$1 = 3; + var MAX_MATCH$1 = 258; + var MIN_LOOKAHEAD = (MAX_MATCH$1 + MIN_MATCH$1 + 1); + + var PRESET_DICT = 0x20; + + var INIT_STATE = 42; + var EXTRA_STATE = 69; + var NAME_STATE = 73; + var COMMENT_STATE = 91; + var HCRC_STATE = 103; + var BUSY_STATE = 113; + var FINISH_STATE = 666; + + var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ + var BS_BLOCK_DONE = 2; /* block flush performed */ + var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ + var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ + + var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. + + function err(strm, errorCode) { + strm.msg = messages[errorCode]; + return errorCode; + } + + function rank(f) { + return ((f) << 1) - ((f) > 4 ? 9 : 0); + } + + function zero$1(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + + + /* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->output buffer and copying into it. + * (See also read_buf()). + */ + function flush_pending(strm) { + var s = strm.state; + + //_tr_flush_bits(s); + var len = s.pending; + if (len > strm.avail_out) { + len = strm.avail_out; + } + if (len === 0) { return; } + + common.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); + strm.next_out += len; + s.pending_out += len; + strm.total_out += len; + strm.avail_out -= len; + s.pending -= len; + if (s.pending === 0) { + s.pending_out = 0; + } + } + + + function flush_block_only(s, last) { + trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); + s.block_start = s.strstart; + flush_pending(s.strm); + } + + + function put_byte(s, b) { + s.pending_buf[s.pending++] = b; + } + + + /* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ + function putShortMSB(s, b) { + // put_byte(s, (Byte)(b >> 8)); + // put_byte(s, (Byte)(b & 0xff)); + s.pending_buf[s.pending++] = (b >>> 8) & 0xff; + s.pending_buf[s.pending++] = b & 0xff; + } + + + /* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->input buffer and copying from it. + * (See also flush_pending()). + */ + function read_buf(strm, buf, start, size) { + var len = strm.avail_in; + + if (len > size) { len = size; } + if (len === 0) { return 0; } + + strm.avail_in -= len; + + // zmemcpy(buf, strm->next_in, len); + common.arraySet(buf, strm.input, strm.next_in, len, start); + if (strm.state.wrap === 1) { + strm.adler = adler32_1(strm.adler, buf, len, start); + } + + else if (strm.state.wrap === 2) { + strm.adler = crc32_1(strm.adler, buf, len, start); + } + + strm.next_in += len; + strm.total_in += len; + + return len; + } + + + /* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ + function longest_match(s, cur_match) { + var chain_length = s.max_chain_length; /* max hash chain length */ + var scan = s.strstart; /* current string */ + var match; /* matched string */ + var len; /* length of current match */ + var best_len = s.prev_length; /* best match length so far */ + var nice_match = s.nice_match; /* stop if match long enough */ + var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? + s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; + + var _win = s.window; // shortcut + + var wmask = s.w_mask; + var prev = s.prev; + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + + var strend = s.strstart + MAX_MATCH$1; + var scan_end1 = _win[scan + best_len - 1]; + var scan_end = _win[scan + best_len]; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s.prev_length >= s.good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if (nice_match > s.lookahead) { nice_match = s.lookahead; } + + // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + // Assert(cur_match < s->strstart, "no future"); + match = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ + + if (_win[match + best_len] !== scan_end || + _win[match + best_len - 1] !== scan_end1 || + _win[match] !== _win[scan] || + _win[++match] !== _win[scan + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2; + match++; + // Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + /*jshint noempty:false*/ + } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + scan < strend); + + // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH$1 - (strend - scan); + scan = strend - MAX_MATCH$1; + + if (len > best_len) { + s.match_start = cur_match; + best_len = len; + if (len >= nice_match) { + break; + } + scan_end1 = _win[scan + best_len - 1]; + scan_end = _win[scan + best_len]; + } + } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); + + if (best_len <= s.lookahead) { + return best_len; + } + return s.lookahead; + } + + + /* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ + function fill_window(s) { + var _w_size = s.w_size; + var p, n, m, more, str; + + //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = s.window_size - s.lookahead - s.strstart; + + // JS ints have 32 bit, block below not needed + /* Deal with !@#$% 64K limit: */ + //if (sizeof(int) <= 2) { + // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + // more = wsize; + // + // } else if (more == (unsigned)(-1)) { + // /* Very unlikely, but possible on 16 bit machine if + // * strstart == 0 && lookahead == 1 (input done a byte at time) + // */ + // more--; + // } + //} + + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { + + common.arraySet(s.window, s.window, _w_size, _w_size, 0); + s.match_start -= _w_size; + s.strstart -= _w_size; + /* we now have strstart >= MAX_DIST */ + s.block_start -= _w_size; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + + n = s.hash_size; + p = n; + do { + m = s.head[--p]; + s.head[p] = (m >= _w_size ? m - _w_size : 0); + } while (--n); + + n = _w_size; + p = n; + do { + m = s.prev[--p]; + s.prev[p] = (m >= _w_size ? m - _w_size : 0); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); + + more += _w_size; + } + if (s.strm.avail_in === 0) { + break; + } + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + //Assert(more >= 2, "more < 2"); + n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); + s.lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s.lookahead + s.insert >= MIN_MATCH$1) { + str = s.strstart - s.insert; + s.ins_h = s.window[str]; + + /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; + //#if MIN_MATCH != 3 + // Call update_hash() MIN_MATCH-3 more times + //#endif + while (s.insert) { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$1 - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = str; + str++; + s.insert--; + if (s.lookahead + s.insert < MIN_MATCH$1) { + break; + } + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + // if (s.high_water < s.window_size) { + // var curr = s.strstart + s.lookahead; + // var init = 0; + // + // if (s.high_water < curr) { + // /* Previous high water mark below current data -- zero WIN_INIT + // * bytes or up to end of window, whichever is less. + // */ + // init = s.window_size - curr; + // if (init > WIN_INIT) + // init = WIN_INIT; + // zmemzero(s->window + curr, (unsigned)init); + // s->high_water = curr + init; + // } + // else if (s->high_water < (ulg)curr + WIN_INIT) { + // /* High water mark at or above current data, but below current data + // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + // * to end of window, whichever is less. + // */ + // init = (ulg)curr + WIN_INIT - s->high_water; + // if (init > s->window_size - s->high_water) + // init = s->window_size - s->high_water; + // zmemzero(s->window + s->high_water, (unsigned)init); + // s->high_water += init; + // } + // } + // + // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + // "not enough room for search"); + } + + /* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ + function deflate_stored(s, flush) { + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + var max_block_size = 0xffff; + + if (max_block_size > s.pending_buf_size - 5) { + max_block_size = s.pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s.lookahead <= 1) { + + //Assert(s->strstart < s->w_size+MAX_DIST(s) || + // s->block_start >= (long)s->w_size, "slide too late"); + // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || + // s.block_start >= s.w_size)) { + // throw new Error("slide too late"); + // } + + fill_window(s); + if (s.lookahead === 0 && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + + if (s.lookahead === 0) { + break; + } + /* flush the current block */ + } + //Assert(s->block_start >= 0L, "block gone"); + // if (s.block_start < 0) throw new Error("block gone"); + + s.strstart += s.lookahead; + s.lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + var max_start = s.block_start + max_block_size; + + if (s.strstart === 0 || s.strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s.lookahead = s.strstart - max_start; + s.strstart = max_start; + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + + + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + + s.insert = 0; + + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + + if (s.strstart > s.block_start) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + return BS_NEED_MORE; + } + + /* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + function deflate_fast(s, flush) { + var hash_head; /* head of the hash chain */ + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { + break; /* flush the current block */ + } + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH$1) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + } + if (s.match_length >= MIN_MATCH$1) { + // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only + + /*** _tr_tally_dist(s, s.strstart - s.match_start, + s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$1); + + s.lookahead -= s.match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$1) { + s.match_length--; /* string at strstart already in table */ + do { + s.strstart++; + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s.match_length !== 0); + s.strstart++; + } else + { + s.strstart += s.match_length; + s.match_length = 0; + s.ins_h = s.window[s.strstart]; + /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s.window[s.strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = ((s.strstart < (MIN_MATCH$1 - 1)) ? s.strstart : MIN_MATCH$1 - 1); + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; + } + + /* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + function deflate_slow(s, flush) { + var hash_head; /* head of hash chain */ + var bflush; /* set if current block must be flushed */ + + var max_insert; + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH$1) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + */ + s.prev_length = s.match_length; + s.prev_match = s.match_start; + s.match_length = MIN_MATCH$1 - 1; + + if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && + s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + + if (s.match_length <= 5 && + (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH$1 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s.match_length = MIN_MATCH$1 - 1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s.prev_length >= MIN_MATCH$1 && s.match_length <= s.prev_length) { + max_insert = s.strstart + s.lookahead - MIN_MATCH$1; + /* Do not insert strings in hash table beyond this. */ + + //check_match(s, s.strstart-1, s.prev_match, s.prev_length); + + /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, + s.prev_length - MIN_MATCH, bflush);***/ + bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$1); + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s.lookahead -= s.prev_length - 1; + s.prev_length -= 2; + do { + if (++s.strstart <= max_insert) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$1 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + } while (--s.prev_length !== 0); + s.match_available = 0; + s.match_length = MIN_MATCH$1 - 1; + s.strstart++; + + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + } else if (s.match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); + + if (bflush) { + /*** FLUSH_BLOCK_ONLY(s, 0) ***/ + flush_block_only(s, false); + /***/ + } + s.strstart++; + s.lookahead--; + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s.match_available = 1; + s.strstart++; + s.lookahead--; + } + } + //Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s.match_available) { + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); + + s.match_available = 0; + } + s.insert = s.strstart < MIN_MATCH$1 - 1 ? s.strstart : MIN_MATCH$1 - 1; + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + return BS_BLOCK_DONE; + } + + + /* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ + function deflate_rle(s, flush) { + var bflush; /* set if current block must be flushed */ + var prev; /* byte at distance one to match */ + var scan, strend; /* scan goes up to strend for length of run */ + + var _win = s.window; + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s.lookahead <= MAX_MATCH$1) { + fill_window(s); + if (s.lookahead <= MAX_MATCH$1 && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s.match_length = 0; + if (s.lookahead >= MIN_MATCH$1 && s.strstart > 0) { + scan = s.strstart - 1; + prev = _win[scan]; + if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { + strend = s.strstart + MAX_MATCH$1; + do { + /*jshint noempty:false*/ + } while (prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + scan < strend); + s.match_length = MAX_MATCH$1 - (strend - scan); + if (s.match_length > s.lookahead) { + s.match_length = s.lookahead; + } + } + //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s.match_length >= MIN_MATCH$1) { + //check_match(s, s.strstart, s.strstart - 1, s.match_length); + + /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH$1); + + s.lookahead -= s.match_length; + s.strstart += s.match_length; + s.match_length = 0; + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; + } + + /* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ + function deflate_huff(s, flush) { + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s.lookahead === 0) { + fill_window(s); + if (s.lookahead === 0) { + if (flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s.match_length = 0; + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees._tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; + } + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + function Config(good_length, max_lazy, nice_length, max_chain, func) { + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; + } + + var configuration_table; + + configuration_table = [ + /* good lazy nice chain */ + new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ + new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ + new Config(4, 5, 16, 8, deflate_fast), /* 2 */ + new Config(4, 6, 32, 32, deflate_fast), /* 3 */ + + new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ + new Config(8, 16, 32, 32, deflate_slow), /* 5 */ + new Config(8, 16, 128, 128, deflate_slow), /* 6 */ + new Config(8, 32, 128, 256, deflate_slow), /* 7 */ + new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ + new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ + ]; + + + /* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ + function lm_init(s) { + s.window_size = 2 * s.w_size; + + /*** CLEAR_HASH(s); ***/ + zero$1(s.head); // Fill with NIL (= 0); + + /* Set the default configuration parameters: + */ + s.max_lazy_match = configuration_table[s.level].max_lazy; + s.good_match = configuration_table[s.level].good_length; + s.nice_match = configuration_table[s.level].nice_length; + s.max_chain_length = configuration_table[s.level].max_chain; + + s.strstart = 0; + s.block_start = 0; + s.lookahead = 0; + s.insert = 0; + s.match_length = s.prev_length = MIN_MATCH$1 - 1; + s.match_available = 0; + s.ins_h = 0; + } + + + function DeflateState() { + this.strm = null; /* pointer back to this zlib stream */ + this.status = 0; /* as the name implies */ + this.pending_buf = null; /* output still pending */ + this.pending_buf_size = 0; /* size of pending_buf */ + this.pending_out = 0; /* next pending byte to output to the stream */ + this.pending = 0; /* nb of bytes in the pending buffer */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.gzhead = null; /* gzip header information to write */ + this.gzindex = 0; /* where in extra, name, or comment */ + this.method = Z_DEFLATED; /* can only be DEFLATED */ + this.last_flush = -1; /* value of flush param for previous deflate call */ + + this.w_size = 0; /* LZ77 window size (32K by default) */ + this.w_bits = 0; /* log2(w_size) (8..16) */ + this.w_mask = 0; /* w_size - 1 */ + + this.window = null; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. + */ + + this.window_size = 0; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + this.prev = null; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + this.head = null; /* Heads of the hash chains or NIL. */ + + this.ins_h = 0; /* hash index of string to be inserted */ + this.hash_size = 0; /* number of elements in hash table */ + this.hash_bits = 0; /* log2(hash_size) */ + this.hash_mask = 0; /* hash_size-1 */ + + this.hash_shift = 0; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + this.block_start = 0; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + this.match_length = 0; /* length of best match */ + this.prev_match = 0; /* previous match */ + this.match_available = 0; /* set if previous match exists */ + this.strstart = 0; /* start of string to insert */ + this.match_start = 0; /* start of matching string */ + this.lookahead = 0; /* number of valid bytes ahead in window */ + + this.prev_length = 0; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + this.max_chain_length = 0; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + this.max_lazy_match = 0; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ + // That's alias to max_lazy_match, don't use directly + //this.max_insert_length = 0; + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + this.level = 0; /* compression level (1..9) */ + this.strategy = 0; /* favor or force Huffman coding*/ + + this.good_match = 0; + /* Use a faster search when the previous match is longer than this */ + + this.nice_match = 0; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + + /* Didn't use ct_data typedef below to suppress compiler warning */ + + // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + // Use flat array of DOUBLE size, with interleaved fata, + // because JS does not support effective + this.dyn_ltree = new common.Buf16(HEAP_SIZE$1 * 2); + this.dyn_dtree = new common.Buf16((2 * D_CODES$1 + 1) * 2); + this.bl_tree = new common.Buf16((2 * BL_CODES$1 + 1) * 2); + zero$1(this.dyn_ltree); + zero$1(this.dyn_dtree); + zero$1(this.bl_tree); + + this.l_desc = null; /* desc. for literal tree */ + this.d_desc = null; /* desc. for distance tree */ + this.bl_desc = null; /* desc. for bit length tree */ + + //ush bl_count[MAX_BITS+1]; + this.bl_count = new common.Buf16(MAX_BITS$1 + 1); + /* number of codes at each bit length for an optimal tree */ + + //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + this.heap = new common.Buf16(2 * L_CODES$1 + 1); /* heap used to build the Huffman trees */ + zero$1(this.heap); + + this.heap_len = 0; /* number of elements in the heap */ + this.heap_max = 0; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + this.depth = new common.Buf16(2 * L_CODES$1 + 1); //uch depth[2*L_CODES+1]; + zero$1(this.depth); + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + this.l_buf = 0; /* buffer index for literals or lengths */ + + this.lit_bufsize = 0; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + this.last_lit = 0; /* running index in l_buf */ + + this.d_buf = 0; + /* Buffer index for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + this.opt_len = 0; /* bit length of current block with optimal trees */ + this.static_len = 0; /* bit length of current block with static trees */ + this.matches = 0; /* number of string matches in current block */ + this.insert = 0; /* bytes at end of window left to insert */ + + + this.bi_buf = 0; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + this.bi_valid = 0; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + // Used for window memory init. We safely ignore it for JS. That makes + // sense only for pointers and memory check tools. + //this.high_water = 0; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + } + + + function deflateResetKeep(strm) { + var s; + + if (!strm || !strm.state) { + return err(strm, Z_STREAM_ERROR); + } + + strm.total_in = strm.total_out = 0; + strm.data_type = Z_UNKNOWN$1; + + s = strm.state; + s.pending = 0; + s.pending_out = 0; + + if (s.wrap < 0) { + s.wrap = -s.wrap; + /* was made negative by deflate(..., Z_FINISH); */ + } + s.status = (s.wrap ? INIT_STATE : BUSY_STATE); + strm.adler = (s.wrap === 2) ? + 0 // crc32(0, Z_NULL, 0) + : + 1; // adler32(0, Z_NULL, 0) + s.last_flush = Z_NO_FLUSH; + trees._tr_init(s); + return Z_OK; + } + + + function deflateReset(strm) { + var ret = deflateResetKeep(strm); + if (ret === Z_OK) { + lm_init(strm.state); + } + return ret; + } + + + function deflateSetHeader(strm, head) { + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } + strm.state.gzhead = head; + return Z_OK; + } + + + function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { + if (!strm) { // === Z_NULL + return Z_STREAM_ERROR; + } + var wrap = 1; + + if (level === Z_DEFAULT_COMPRESSION) { + level = 6; + } + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } + + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } + + + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED$1) { + return err(strm, Z_STREAM_ERROR); + } + + + if (windowBits === 8) { + windowBits = 9; + } + /* until 256-byte window bug fixed */ + + var s = new DeflateState(); + + strm.state = s; + s.strm = strm; + + s.wrap = wrap; + s.gzhead = null; + s.w_bits = windowBits; + s.w_size = 1 << s.w_bits; + s.w_mask = s.w_size - 1; + + s.hash_bits = memLevel + 7; + s.hash_size = 1 << s.hash_bits; + s.hash_mask = s.hash_size - 1; + s.hash_shift = ~~((s.hash_bits + MIN_MATCH$1 - 1) / MIN_MATCH$1); + + s.window = new common.Buf8(s.w_size * 2); + s.head = new common.Buf16(s.hash_size); + s.prev = new common.Buf16(s.w_size); + + // Don't need mem init magic for JS. + //s.high_water = 0; /* nothing written to s->window yet */ + + s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + s.pending_buf_size = s.lit_bufsize * 4; + + //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + //s->pending_buf = (uchf *) overlay; + s.pending_buf = new common.Buf8(s.pending_buf_size); + + // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) + //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s.d_buf = 1 * s.lit_bufsize; + + //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s.l_buf = (1 + 2) * s.lit_bufsize; + + s.level = level; + s.strategy = strategy; + s.method = method; + + return deflateReset(strm); + } + + function deflateInit(strm, level) { + return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); + } + + + function deflate(strm, flush) { + var old_flush, s; + var beg, val; // for gzip header write only + + if (!strm || !strm.state || + flush > Z_BLOCK || flush < 0) { + return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; + } + + s = strm.state; + + if (!strm.output || + (!strm.input && strm.avail_in !== 0) || + (s.status === FINISH_STATE && flush !== Z_FINISH)) { + return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); + } + + s.strm = strm; /* just in case */ + old_flush = s.last_flush; + s.last_flush = flush; + + /* Write the header */ + if (s.status === INIT_STATE) { + + if (s.wrap === 2) { // GZIP header + strm.adler = 0; //crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (!s.gzhead) { // s->gzhead == Z_NULL + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s.status = BUSY_STATE; + } + else { + put_byte(s, (s.gzhead.text ? 1 : 0) + + (s.gzhead.hcrc ? 2 : 0) + + (!s.gzhead.extra ? 0 : 4) + + (!s.gzhead.name ? 0 : 8) + + (!s.gzhead.comment ? 0 : 16) + ); + put_byte(s, s.gzhead.time & 0xff); + put_byte(s, (s.gzhead.time >> 8) & 0xff); + put_byte(s, (s.gzhead.time >> 16) & 0xff); + put_byte(s, (s.gzhead.time >> 24) & 0xff); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, s.gzhead.os & 0xff); + if (s.gzhead.extra && s.gzhead.extra.length) { + put_byte(s, s.gzhead.extra.length & 0xff); + put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); + } + if (s.gzhead.hcrc) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); + } + s.gzindex = 0; + s.status = EXTRA_STATE; + } + } + else // DEFLATE header + { + var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; + var level_flags = -1; + + if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { + level_flags = 0; + } else if (s.level < 6) { + level_flags = 1; + } else if (s.level === 6) { + level_flags = 2; + } else { + level_flags = 3; + } + header |= (level_flags << 6); + if (s.strstart !== 0) { header |= PRESET_DICT; } + header += 31 - (header % 31); + + s.status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s.strstart !== 0) { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } + strm.adler = 1; // adler32(0L, Z_NULL, 0); + } + } + + //#ifdef GZIP + if (s.status === EXTRA_STATE) { + if (s.gzhead.extra/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + + while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + break; + } + } + put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); + s.gzindex++; + } + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (s.gzindex === s.gzhead.extra.length) { + s.gzindex = 0; + s.status = NAME_STATE; + } + } + else { + s.status = NAME_STATE; + } + } + if (s.status === NAME_STATE) { + if (s.gzhead.name/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; + + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.name.length) { + val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.gzindex = 0; + s.status = COMMENT_STATE; + } + } + else { + s.status = COMMENT_STATE; + } + } + if (s.status === COMMENT_STATE) { + if (s.gzhead.comment/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; + + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.comment.length) { + val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.status = HCRC_STATE; + } + } + else { + s.status = HCRC_STATE; + } + } + if (s.status === HCRC_STATE) { + if (s.gzhead.hcrc) { + if (s.pending + 2 > s.pending_buf_size) { + flush_pending(strm); + } + if (s.pending + 2 <= s.pending_buf_size) { + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + strm.adler = 0; //crc32(0L, Z_NULL, 0); + s.status = BUSY_STATE; + } + } + else { + s.status = BUSY_STATE; + } + } + //#endif + + /* Flush as much pending output as possible */ + if (s.pending !== 0) { + flush_pending(strm); + if (strm.avail_out === 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s.last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && + flush !== Z_FINISH) { + return err(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s.status === FINISH_STATE && strm.avail_in !== 0) { + return err(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm.avail_in !== 0 || s.lookahead !== 0 || + (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { + var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : + (s.strategy === Z_RLE ? deflate_rle(s, flush) : + configuration_table[s.level].func(s, flush)); + + if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { + s.status = FINISH_STATE; + } + if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { + if (strm.avail_out === 0) { + s.last_flush = -1; + /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate === BS_BLOCK_DONE) { + if (flush === Z_PARTIAL_FLUSH) { + trees._tr_align(s); + } + else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + + trees._tr_stored_block(s, 0, 0, false); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush === Z_FULL_FLUSH) { + /*** CLEAR_HASH(s); ***/ /* forget history */ + zero$1(s.head); // Fill with NIL (= 0); + + if (s.lookahead === 0) { + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + } + } + flush_pending(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + //Assert(strm->avail_out > 0, "bug2"); + //if (strm.avail_out <= 0) { throw new Error("bug2");} + + if (flush !== Z_FINISH) { return Z_OK; } + if (s.wrap <= 0) { return Z_STREAM_END; } + + /* Write the trailer */ + if (s.wrap === 2) { + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + put_byte(s, (strm.adler >> 16) & 0xff); + put_byte(s, (strm.adler >> 24) & 0xff); + put_byte(s, strm.total_in & 0xff); + put_byte(s, (strm.total_in >> 8) & 0xff); + put_byte(s, (strm.total_in >> 16) & 0xff); + put_byte(s, (strm.total_in >> 24) & 0xff); + } + else + { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } + + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s.wrap > 0) { s.wrap = -s.wrap; } + /* write the trailer only once! */ + return s.pending !== 0 ? Z_OK : Z_STREAM_END; + } + + function deflateEnd(strm) { + var status; + + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR; + } + + status = strm.state.status; + if (status !== INIT_STATE && + status !== EXTRA_STATE && + status !== NAME_STATE && + status !== COMMENT_STATE && + status !== HCRC_STATE && + status !== BUSY_STATE && + status !== FINISH_STATE + ) { + return err(strm, Z_STREAM_ERROR); + } + + strm.state = null; + + return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; + } + + + /* ========================================================================= + * Initializes the compression dictionary from the given byte + * sequence without producing any compressed output. + */ + function deflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + + var s; + var str, n; + var wrap; + var avail; + var next; + var input; + var tmpDict; + + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR; + } + + s = strm.state; + wrap = s.wrap; + + if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { + return Z_STREAM_ERROR; + } + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap === 1) { + /* adler32(strm->adler, dictionary, dictLength); */ + strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); + } + + s.wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s.w_size) { + if (wrap === 0) { /* already empty otherwise */ + /*** CLEAR_HASH(s); ***/ + zero$1(s.head); // Fill with NIL (= 0); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + /* use the tail */ + // dictionary = dictionary.slice(dictLength - s.w_size); + tmpDict = new common.Buf8(s.w_size); + common.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + /* insert dictionary into window and hash */ + avail = strm.avail_in; + next = strm.next_in; + input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window(s); + while (s.lookahead >= MIN_MATCH$1) { + str = s.strstart; + n = s.lookahead - (MIN_MATCH$1 - 1); + do { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$1 - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + + s.head[s.ins_h] = str; + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH$1 - 1; + fill_window(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH$1 - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK; + } + + + var deflateInit_1 = deflateInit; + var deflateInit2_1 = deflateInit2; + var deflateReset_1 = deflateReset; + var deflateResetKeep_1 = deflateResetKeep; + var deflateSetHeader_1 = deflateSetHeader; + var deflate_2 = deflate; + var deflateEnd_1 = deflateEnd; + var deflateSetDictionary_1 = deflateSetDictionary; + var deflateInfo = 'pako deflate (from Nodeca project)'; + + /* Not implemented + exports.deflateBound = deflateBound; + exports.deflateCopy = deflateCopy; + exports.deflateParams = deflateParams; + exports.deflatePending = deflatePending; + exports.deflatePrime = deflatePrime; + exports.deflateTune = deflateTune; + */ + + var deflate_1 = { + deflateInit: deflateInit_1, + deflateInit2: deflateInit2_1, + deflateReset: deflateReset_1, + deflateResetKeep: deflateResetKeep_1, + deflateSetHeader: deflateSetHeader_1, + deflate: deflate_2, + deflateEnd: deflateEnd_1, + deflateSetDictionary: deflateSetDictionary_1, + deflateInfo: deflateInfo + }; + + // Quick check if we can use fast array to bin string conversion + // + // - apply(Array) can fail on Android 2.2 + // - apply(Uint8Array) can fail on iOS 5.1 Safari + // + var STR_APPLY_OK = true; + var STR_APPLY_UIA_OK = true; + + try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; } + try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } + + + // Table with utf8 lengths (calculated by first byte of sequence) + // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, + // because max possible codepoint is 0x10ffff + var _utf8len = new common.Buf8(256); + for (var q = 0; q < 256; q++) { + _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); + } + _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start + + + // convert string to array (typed, when possible) + var string2buf = function (str) { + var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; + + // count binary size + for (m_pos = 0; m_pos < str_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; + } + + // allocate buffer + buf = new common.Buf8(buf_len); + + // convert + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + if (c < 0x80) { + /* one byte */ + buf[i++] = c; + } else if (c < 0x800) { + /* two bytes */ + buf[i++] = 0xC0 | (c >>> 6); + buf[i++] = 0x80 | (c & 0x3f); + } else if (c < 0x10000) { + /* three bytes */ + buf[i++] = 0xE0 | (c >>> 12); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } else { + /* four bytes */ + buf[i++] = 0xf0 | (c >>> 18); + buf[i++] = 0x80 | (c >>> 12 & 0x3f); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } + } + + return buf; + }; + + // Helper (used in 2 places) + function buf2binstring(buf, len) { + // On Chrome, the arguments in a function call that are allowed is `65534`. + // If the length of the buffer is smaller than that, we can use this optimization, + // otherwise we will take a slower path. + if (len < 65534) { + if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) { + return String.fromCharCode.apply(null, common.shrinkBuf(buf, len)); + } + } + + var result = ''; + for (var i = 0; i < len; i++) { + result += String.fromCharCode(buf[i]); + } + return result; + } + + + // Convert byte array to binary string + var buf2binstring_1 = function (buf) { + return buf2binstring(buf, buf.length); + }; + + + // Convert binary string (typed, when possible) + var binstring2buf = function (str) { + var buf = new common.Buf8(str.length); + for (var i = 0, len = buf.length; i < len; i++) { + buf[i] = str.charCodeAt(i); + } + return buf; + }; + + + // convert array to string + var buf2string = function (buf, max) { + var i, out, c, c_len; + var len = max || buf.length; + + // Reserve max possible length (2 words per char) + // NB: by unknown reasons, Array is significantly faster for + // String.fromCharCode.apply than Uint16Array. + var utf16buf = new Array(len * 2); + + for (out = 0, i = 0; i < len;) { + c = buf[i++]; + // quick process ascii + if (c < 0x80) { utf16buf[out++] = c; continue; } + + c_len = _utf8len[c]; + // skip 5 & 6 byte codes + if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } + + // apply mask on first byte + c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; + // join the rest + while (c_len > 1 && i < len) { + c = (c << 6) | (buf[i++] & 0x3f); + c_len--; + } + + // terminated by end of string? + if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } + + if (c < 0x10000) { + utf16buf[out++] = c; + } else { + c -= 0x10000; + utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); + utf16buf[out++] = 0xdc00 | (c & 0x3ff); + } + } + + return buf2binstring(utf16buf, out); + }; + + + // Calculate max possible position in utf8 buffer, + // that will not break sequence. If that's not possible + // - (very small limits) return max size as is. + // + // buf[] - utf8 bytes array + // max - length limit (mandatory); + var utf8border = function (buf, max) { + var pos; + + max = max || buf.length; + if (max > buf.length) { max = buf.length; } + + // go back from last position, until start of sequence found + pos = max - 1; + while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } + + // Very small and broken sequence, + // return max, because we should return something anyway. + if (pos < 0) { return max; } + + // If we came to start of buffer - that means buffer is too small, + // return max too. + if (pos === 0) { return max; } + + return (pos + _utf8len[buf[pos]] > max) ? pos : max; + }; + + var strings = { + string2buf: string2buf, + buf2binstring: buf2binstring_1, + binstring2buf: binstring2buf, + buf2string: buf2string, + utf8border: utf8border + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function ZStream() { + /* next input byte */ + this.input = null; // JS specific, because we have no pointers + this.next_in = 0; + /* number of bytes available at input */ + this.avail_in = 0; + /* total number of input bytes read so far */ + this.total_in = 0; + /* next output byte should be put there */ + this.output = null; // JS specific, because we have no pointers + this.next_out = 0; + /* remaining free space at output */ + this.avail_out = 0; + /* total number of bytes output so far */ + this.total_out = 0; + /* last error message, NULL if no error */ + this.msg = ''/*Z_NULL*/; + /* not visible by applications */ + this.state = null; + /* best guess about the data type: binary or text */ + this.data_type = 2/*Z_UNKNOWN*/; + /* adler32 value of the uncompressed data */ + this.adler = 0; + } + + var zstream = ZStream; + + var toString = Object.prototype.toString; + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + var Z_NO_FLUSH$1 = 0; + var Z_FINISH$1 = 4; + + var Z_OK$1 = 0; + var Z_STREAM_END$1 = 1; + var Z_SYNC_FLUSH = 2; + + var Z_DEFAULT_COMPRESSION$1 = -1; + + var Z_DEFAULT_STRATEGY$1 = 0; + + var Z_DEFLATED$1 = 8; + + /* ===========================================================================*/ + + + /** + * class Deflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[deflate]], + * [[deflateRaw]] and [[gzip]]. + **/ + + /* internal + * Deflate.chunks -> Array + * + * Chunks of output data, if [[Deflate#onData]] not overridden. + **/ + + /** + * Deflate.result -> Uint8Array|Array + * + * Compressed result, generated by default [[Deflate#onData]] + * and [[Deflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Deflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ + + /** + * Deflate.err -> Number + * + * Error code after deflate finished. 0 (Z_OK) on success. + * You will not need it in real life, because deflate errors + * are possible only on wrong options or bad `onData` / `onEnd` + * custom handlers. + **/ + + /** + * Deflate.msg -> String + * + * Error message, if [[Deflate.err]] != 0 + **/ + + + /** + * new Deflate(options) + * - options (Object): zlib deflate options. + * + * Creates new deflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `level` + * - `windowBits` + * - `memLevel` + * - `strategy` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw deflate + * - `gzip` (Boolean) - create gzip wrapper + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * - `header` (Object) - custom header for gzip + * - `text` (Boolean) - true if compressed data believed to be text + * - `time` (Number) - modification time, unix timestamp + * - `os` (Number) - operation system code + * - `extra` (Array) - array of bytes with extra data (max 65536) + * - `name` (String) - file name (binary string) + * - `comment` (String) - comment (binary string) + * - `hcrc` (Boolean) - true if header crc should be added + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var deflate = new pako.Deflate({ level: 3}); + * + * deflate.push(chunk1, false); + * deflate.push(chunk2, true); // true -> last chunk + * + * if (deflate.err) { throw new Error(deflate.err); } + * + * console.log(deflate.result); + * ``` + **/ + function Deflate(options) { + if (!(this instanceof Deflate)) return new Deflate(options); + + this.options = common.assign({ + level: Z_DEFAULT_COMPRESSION$1, + method: Z_DEFLATED$1, + chunkSize: 16384, + windowBits: 15, + memLevel: 8, + strategy: Z_DEFAULT_STRATEGY$1, + to: '' + }, options || {}); + + var opt = this.options; + + if (opt.raw && (opt.windowBits > 0)) { + opt.windowBits = -opt.windowBits; + } + + else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { + opt.windowBits += 16; + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream(); + this.strm.avail_out = 0; + + var status = deflate_1.deflateInit2( + this.strm, + opt.level, + opt.method, + opt.windowBits, + opt.memLevel, + opt.strategy + ); + + if (status !== Z_OK$1) { + throw new Error(messages[status]); + } + + if (opt.header) { + deflate_1.deflateSetHeader(this.strm, opt.header); + } + + if (opt.dictionary) { + var dict; + // Convert data if needed + if (typeof opt.dictionary === 'string') { + // If we need to compress text, change encoding to utf8. + dict = strings.string2buf(opt.dictionary); + } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(opt.dictionary); + } else { + dict = opt.dictionary; + } + + status = deflate_1.deflateSetDictionary(this.strm, dict); + + if (status !== Z_OK$1) { + throw new Error(messages[status]); + } + + this._dict_set = true; + } + } + + /** + * Deflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be + * converted to utf8 byte sequence. + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with + * new compressed chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the compression context. + * + * On fail call [[Deflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * array format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ + Deflate.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var status, _mode; + + if (this.ended) { return false; } + + _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH$1 : Z_NO_FLUSH$1); + + // Convert data if needed + if (typeof data === 'string') { + // If we need to compress text, change encoding to utf8. + strm.input = strings.string2buf(data); + } else if (toString.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + do { + if (strm.avail_out === 0) { + strm.output = new common.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + status = deflate_1.deflate(strm, _mode); /* no bad return value */ + + if (status !== Z_STREAM_END$1 && status !== Z_OK$1) { + this.onEnd(status); + this.ended = true; + return false; + } + if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH$1 || _mode === Z_SYNC_FLUSH))) { + if (this.options.to === 'string') { + this.onData(strings.buf2binstring(common.shrinkBuf(strm.output, strm.next_out))); + } else { + this.onData(common.shrinkBuf(strm.output, strm.next_out)); + } + } + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END$1); + + // Finalize on the last chunk. + if (_mode === Z_FINISH$1) { + status = deflate_1.deflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === Z_OK$1; + } + + // callback interim results if Z_SYNC_FLUSH. + if (_mode === Z_SYNC_FLUSH) { + this.onEnd(Z_OK$1); + strm.avail_out = 0; + return true; + } + + return true; + }; + + + /** + * Deflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): output data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ + Deflate.prototype.onData = function (chunk) { + this.chunks.push(chunk); + }; + + + /** + * Deflate#onEnd(status) -> Void + * - status (Number): deflate status. 0 (Z_OK) on success, + * other if not. + * + * Called once after you tell deflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ + Deflate.prototype.onEnd = function (status) { + // On success - join + if (status === Z_OK$1) { + if (this.options.to === 'string') { + this.result = this.chunks.join(''); + } else { + this.result = common.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; + }; + + + /** + * deflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * Compress `data` with deflate algorithm and `options`. + * + * Supported options are: + * + * - level + * - windowBits + * - memLevel + * - strategy + * - dictionary + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , data = Uint8Array([1,2,3,4,5,6,7,8,9]); + * + * console.log(pako.deflate(data)); + * ``` + **/ + function deflate$1(input, options) { + var deflator = new Deflate(options); + + deflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (deflator.err) { throw deflator.msg || messages[deflator.err]; } + + return deflator.result; + } + + + /** + * deflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ + function deflateRaw(input, options) { + options = options || {}; + options.raw = true; + return deflate$1(input, options); + } + + + /** + * gzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but create gzip wrapper instead of + * deflate one. + **/ + function gzip(input, options) { + options = options || {}; + options.gzip = true; + return deflate$1(input, options); + } + + + var Deflate_1 = Deflate; + var deflate_2$1 = deflate$1; + var deflateRaw_1 = deflateRaw; + var gzip_1 = gzip; + + var deflate_1$1 = { + Deflate: Deflate_1, + deflate: deflate_2$1, + deflateRaw: deflateRaw_1, + gzip: gzip_1 + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + // See state defs from inflate.js + var BAD = 30; /* got a data error -- remain here until reset */ + var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ + + /* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state.mode === LEN + strm.avail_in >= 6 + strm.avail_out >= 258 + start >= strm.avail_out + state.bits < 8 + + On return, state.mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm.avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm.avail_out >= 258 for each loop to avoid checking for + output space. + */ + var inffast = function inflate_fast(strm, start) { + var state; + var _in; /* local strm.input */ + var last; /* have enough input while in < last */ + var _out; /* local strm.output */ + var beg; /* inflate()'s initial strm.output */ + var end; /* while out < end, enough space available */ + //#ifdef INFLATE_STRICT + var dmax; /* maximum distance from zlib header */ + //#endif + var wsize; /* window size or zero if not using window */ + var whave; /* valid bytes in the window */ + var wnext; /* window write index */ + // Use `s_window` instead `window`, avoid conflict with instrumentation tools + var s_window; /* allocated sliding window, if wsize != 0 */ + var hold; /* local strm.hold */ + var bits; /* local strm.bits */ + var lcode; /* local strm.lencode */ + var dcode; /* local strm.distcode */ + var lmask; /* mask for first level of length codes */ + var dmask; /* mask for first level of distance codes */ + var here; /* retrieved table entry */ + var op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + var len; /* match length, unused bytes */ + var dist; /* match distance */ + var from; /* where to copy match from */ + var from_source; + + + var input, output; // JS specific, because we have no pointers + + /* copy state to local variables */ + state = strm.state; + //here = state.here; + _in = strm.next_in; + input = strm.input; + last = _in + (strm.avail_in - 5); + _out = strm.next_out; + output = strm.output; + beg = _out - (start - strm.avail_out); + end = _out + (strm.avail_out - 257); + //#ifdef INFLATE_STRICT + dmax = state.dmax; + //#endif + wsize = state.wsize; + whave = state.whave; + wnext = state.wnext; + s_window = state.window; + hold = state.hold; + bits = state.bits; + lcode = state.lencode; + dcode = state.distcode; + lmask = (1 << state.lenbits) - 1; + dmask = (1 << state.distbits) - 1; + + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + top: + do { + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + + here = lcode[hold & lmask]; + + dolen: + for (;;) { // Goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + if (op === 0) { /* literal */ + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + output[_out++] = here & 0xffff/*here.val*/; + } + else if (op & 16) { /* length base */ + len = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + len += hold & ((1 << op) - 1); + hold >>>= op; + bits -= op; + } + //Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = dcode[hold & dmask]; + + dodist: + for (;;) { // goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + + if (op & 16) { /* distance base */ + dist = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + } + dist += hold & ((1 << op) - 1); + //#ifdef INFLATE_STRICT + if (dist > dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break top; + } + //#endif + hold >>>= op; + bits -= op; + //Tracevv((stderr, "inflate: distance %u\n", dist)); + op = _out - beg; /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break top; + } + + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + // if (len <= op - whave) { + // do { + // output[_out++] = 0; + // } while (--len); + // continue top; + // } + // len -= op - whave; + // do { + // output[_out++] = 0; + // } while (--op > whave); + // if (op === 0) { + // from = _out - dist; + // do { + // output[_out++] = output[from++]; + // } while (--len); + // continue top; + // } + //#endif + } + from = 0; // window index + from_source = s_window; + if (wnext === 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = 0; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + while (len > 2) { + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + len -= 3; + } + if (len) { + output[_out++] = from_source[from++]; + if (len > 1) { + output[_out++] = from_source[from++]; + } + } + } + else { + from = _out - dist; /* copy direct from output */ + do { /* minimum length is three */ + output[_out++] = output[from++]; + output[_out++] = output[from++]; + output[_out++] = output[from++]; + len -= 3; + } while (len > 2); + if (len) { + output[_out++] = output[from++]; + if (len > 1) { + output[_out++] = output[from++]; + } + } + } + } + else if ((op & 64) === 0) { /* 2nd level distance code */ + here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dodist; + } + else { + strm.msg = 'invalid distance code'; + state.mode = BAD; + break top; + } + + break; // need to emulate goto via "continue" + } + } + else if ((op & 64) === 0) { /* 2nd level length code */ + here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dolen; + } + else if (op & 32) { /* end-of-block */ + //Tracevv((stderr, "inflate: end of block\n")); + state.mode = TYPE; + break top; + } + else { + strm.msg = 'invalid literal/length code'; + state.mode = BAD; + break top; + } + + break; // need to emulate goto via "continue" + } + } while (_in < last && _out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + _in -= len; + bits -= len << 3; + hold &= (1 << bits) - 1; + + /* update state and return */ + strm.next_in = _in; + strm.next_out = _out; + strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); + strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); + state.hold = hold; + state.bits = bits; + return; + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + var MAXBITS = 15; + var ENOUGH_LENS = 852; + var ENOUGH_DISTS = 592; + //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + + var CODES = 0; + var LENS = 1; + var DISTS = 2; + + var lbase = [ /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 + ]; + + var lext = [ /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 + ]; + + var dbase = [ /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0 + ]; + + var dext = [ /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64 + ]; + + var inftrees = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) + { + var bits = opts.bits; + //here = opts.here; /* table entry for duplication */ + + var len = 0; /* a code's length in bits */ + var sym = 0; /* index of code symbols */ + var min = 0, max = 0; /* minimum and maximum code lengths */ + var root = 0; /* number of index bits for root table */ + var curr = 0; /* number of index bits for current table */ + var drop = 0; /* code bits to drop for sub-table */ + var left = 0; /* number of prefix codes available */ + var used = 0; /* code entries in table used */ + var huff = 0; /* Huffman code */ + var incr; /* for incrementing code, index */ + var fill; /* index for replicating entries */ + var low; /* low bits for current root entry */ + var mask; /* mask for low root bits */ + var next; /* next available space in table */ + var base = null; /* base value table to use */ + var base_index = 0; + // var shoextra; /* extra bits table to use */ + var end; /* use base and extra for symbol > end */ + var count = new common.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ + var offs = new common.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ + var extra = null; + var extra_index = 0; + + var here_bits, here_op, here_val; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + + /* bound code lengths, force root to be within code lengths */ + root = bits; + for (max = MAXBITS; max >= 1; max--) { + if (count[max] !== 0) { break; } + } + if (root > max) { + root = max; + } + if (max === 0) { /* no symbols to code at all */ + //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ + //table.bits[opts.table_index] = 1; //here.bits = (var char)1; + //table.val[opts.table_index++] = 0; //here.val = (var short)0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + + //table.op[opts.table_index] = 64; + //table.bits[opts.table_index] = 1; + //table.val[opts.table_index++] = 0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + opts.bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { break; } + } + if (root < min) { + root = min; + } + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } /* over-subscribed */ + } + if (left > 0 && (type === CODES || max !== 1)) { + return -1; /* incomplete set */ + } + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) { + offs[len + 1] = offs[len] + count[len]; + } + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + // poor man optimization - use if-else instead of switch, + // to avoid deopts in old v8 + if (type === CODES) { + base = extra = work; /* dummy value--not used */ + end = 19; + + } else if (type === LENS) { + base = lbase; + base_index -= 257; + extra = lext; + extra_index -= 257; + end = 256; + + } else { /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize opts for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = table_index; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = -1; /* trigger new sub-table when len > root */ + used = 1 << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here_bits = len - drop; + if (work[sym] < end) { + here_op = 0; + here_val = work[sym]; + } + else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base[base_index + work[sym]]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1 << (len - drop); + fill = 1 << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; + } while (fill !== 0); + + /* backwards increment the len-bit code huff */ + incr = 1 << (len - 1); + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) !== low) { + /* if first time, transition to sub-tables */ + if (drop === 0) { + drop = root; + } + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { break; } + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1 << curr; + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } + + /* point entry in root table to sub-table */ + low = huff & mask; + /*table.op[low] = curr; + table.bits[low] = root; + table.val[low] = next - opts.table_index;*/ + table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff !== 0) { + //table.op[next + huff] = 64; /* invalid code marker */ + //table.bits[next + huff] = len - drop; + //table.val[next + huff] = 0; + table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + } + + /* set return parameters */ + //opts.table_index += used; + opts.bits = root; + return 0; + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + + + + + var CODES$1 = 0; + var LENS$1 = 1; + var DISTS$1 = 2; + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + /* Allowed flush values; see deflate() and inflate() below for details */ + //var Z_NO_FLUSH = 0; + //var Z_PARTIAL_FLUSH = 1; + //var Z_SYNC_FLUSH = 2; + //var Z_FULL_FLUSH = 3; + var Z_FINISH$2 = 4; + var Z_BLOCK$1 = 5; + var Z_TREES = 6; + + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + var Z_OK$2 = 0; + var Z_STREAM_END$2 = 1; + var Z_NEED_DICT = 2; + //var Z_ERRNO = -1; + var Z_STREAM_ERROR$1 = -2; + var Z_DATA_ERROR$1 = -3; + var Z_MEM_ERROR = -4; + var Z_BUF_ERROR$1 = -5; + //var Z_VERSION_ERROR = -6; + + /* The deflate compression method */ + var Z_DEFLATED$2 = 8; + + + /* STATES ====================================================================*/ + /* ===========================================================================*/ + + + var HEAD = 1; /* i: waiting for magic header */ + var FLAGS = 2; /* i: waiting for method and flags (gzip) */ + var TIME = 3; /* i: waiting for modification time (gzip) */ + var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ + var EXLEN = 5; /* i: waiting for extra length (gzip) */ + var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ + var NAME = 7; /* i: waiting for end of file name (gzip) */ + var COMMENT = 8; /* i: waiting for end of comment (gzip) */ + var HCRC = 9; /* i: waiting for header crc (gzip) */ + var DICTID = 10; /* i: waiting for dictionary check value */ + var DICT = 11; /* waiting for inflateSetDictionary() call */ + var TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */ + var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ + var STORED = 14; /* i: waiting for stored size (length and complement) */ + var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ + var COPY = 16; /* i/o: waiting for input or output to copy stored block */ + var TABLE = 17; /* i: waiting for dynamic block table lengths */ + var LENLENS = 18; /* i: waiting for code length code lengths */ + var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ + var LEN_ = 20; /* i: same as LEN below, but only first time in */ + var LEN = 21; /* i: waiting for length/lit/eob code */ + var LENEXT = 22; /* i: waiting for length extra bits */ + var DIST = 23; /* i: waiting for distance code */ + var DISTEXT = 24; /* i: waiting for distance extra bits */ + var MATCH = 25; /* o: waiting for output space to copy string */ + var LIT = 26; /* o: waiting for output space to write literal */ + var CHECK = 27; /* i: waiting for 32-bit check value */ + var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ + var DONE = 29; /* finished check, done -- remain here until reset */ + var BAD$1 = 30; /* got a data error -- remain here until reset */ + var MEM = 31; /* got an inflate() memory error -- remain here until reset */ + var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ + + /* ===========================================================================*/ + + + + var ENOUGH_LENS$1 = 852; + var ENOUGH_DISTS$1 = 592; + //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + + var MAX_WBITS$1 = 15; + /* 32K LZ77 window */ + var DEF_WBITS = MAX_WBITS$1; + + + function zswap32(q) { + return (((q >>> 24) & 0xff) + + ((q >>> 8) & 0xff00) + + ((q & 0xff00) << 8) + + ((q & 0xff) << 24)); + } + + + function InflateState() { + this.mode = 0; /* current inflate mode */ + this.last = false; /* true if processing last block */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.havedict = false; /* true if dictionary provided */ + this.flags = 0; /* gzip header method and flags (0 if zlib) */ + this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ + this.check = 0; /* protected copy of check value */ + this.total = 0; /* protected copy of output count */ + // TODO: may be {} + this.head = null; /* where to save gzip header information */ + + /* sliding window */ + this.wbits = 0; /* log base 2 of requested window size */ + this.wsize = 0; /* window size or zero if not using window */ + this.whave = 0; /* valid bytes in the window */ + this.wnext = 0; /* window write index */ + this.window = null; /* allocated sliding window, if needed */ + + /* bit accumulator */ + this.hold = 0; /* input bit accumulator */ + this.bits = 0; /* number of bits in "in" */ + + /* for string and stored block copying */ + this.length = 0; /* literal or length of data to copy */ + this.offset = 0; /* distance back to copy string from */ + + /* for table and code decoding */ + this.extra = 0; /* extra bits needed */ + + /* fixed and dynamic code tables */ + this.lencode = null; /* starting table for length/literal codes */ + this.distcode = null; /* starting table for distance codes */ + this.lenbits = 0; /* index bits for lencode */ + this.distbits = 0; /* index bits for distcode */ + + /* dynamic table building */ + this.ncode = 0; /* number of code length code lengths */ + this.nlen = 0; /* number of length code lengths */ + this.ndist = 0; /* number of distance code lengths */ + this.have = 0; /* number of code lengths in lens[] */ + this.next = null; /* next available space in codes[] */ + + this.lens = new common.Buf16(320); /* temporary storage for code lengths */ + this.work = new common.Buf16(288); /* work area for code table building */ + + /* + because we don't have pointers in js, we use lencode and distcode directly + as buffers so we don't need codes + */ + //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ + this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ + this.distdyn = null; /* dynamic table for distance codes (JS specific) */ + this.sane = 0; /* if false, allow invalid distance too far */ + this.back = 0; /* bits back of last unprocessed length/lit */ + this.was = 0; /* initial length of match */ + } + + function inflateResetKeep(strm) { + var state; + + if (!strm || !strm.state) { return Z_STREAM_ERROR$1; } + state = strm.state; + strm.total_in = strm.total_out = state.total = 0; + strm.msg = ''; /*Z_NULL*/ + if (state.wrap) { /* to support ill-conceived Java test suite */ + strm.adler = state.wrap & 1; + } + state.mode = HEAD; + state.last = 0; + state.havedict = 0; + state.dmax = 32768; + state.head = null/*Z_NULL*/; + state.hold = 0; + state.bits = 0; + //state.lencode = state.distcode = state.next = state.codes; + state.lencode = state.lendyn = new common.Buf32(ENOUGH_LENS$1); + state.distcode = state.distdyn = new common.Buf32(ENOUGH_DISTS$1); + + state.sane = 1; + state.back = -1; + //Tracev((stderr, "inflate: reset\n")); + return Z_OK$2; + } + + function inflateReset(strm) { + var state; + + if (!strm || !strm.state) { return Z_STREAM_ERROR$1; } + state = strm.state; + state.wsize = 0; + state.whave = 0; + state.wnext = 0; + return inflateResetKeep(strm); + + } + + function inflateReset2(strm, windowBits) { + var wrap; + var state; + + /* get the state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR$1; } + state = strm.state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; + if (windowBits < 48) { + windowBits &= 15; + } + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) { + return Z_STREAM_ERROR$1; + } + if (state.window !== null && state.wbits !== windowBits) { + state.window = null; + } + + /* update state and reset the rest of it */ + state.wrap = wrap; + state.wbits = windowBits; + return inflateReset(strm); + } + + function inflateInit2(strm, windowBits) { + var ret; + var state; + + if (!strm) { return Z_STREAM_ERROR$1; } + //strm.msg = Z_NULL; /* in case we return an error */ + + state = new InflateState(); + + //if (state === Z_NULL) return Z_MEM_ERROR; + //Tracev((stderr, "inflate: allocated\n")); + strm.state = state; + state.window = null/*Z_NULL*/; + ret = inflateReset2(strm, windowBits); + if (ret !== Z_OK$2) { + strm.state = null/*Z_NULL*/; + } + return ret; + } + + function inflateInit(strm) { + return inflateInit2(strm, DEF_WBITS); + } + + + /* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ + var virgin = true; + + var lenfix, distfix; // We have no pointers in JS, so keep tables separate + + function fixedtables(state) { + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + var sym; + + lenfix = new common.Buf32(512); + distfix = new common.Buf32(32); + + /* literal/length table */ + sym = 0; + while (sym < 144) { state.lens[sym++] = 8; } + while (sym < 256) { state.lens[sym++] = 9; } + while (sym < 280) { state.lens[sym++] = 7; } + while (sym < 288) { state.lens[sym++] = 8; } + + inftrees(LENS$1, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); + + /* distance table */ + sym = 0; + while (sym < 32) { state.lens[sym++] = 5; } + + inftrees(DISTS$1, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); + + /* do this just once */ + virgin = false; + } + + state.lencode = lenfix; + state.lenbits = 9; + state.distcode = distfix; + state.distbits = 5; + } + + + /* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ + function updatewindow(strm, src, end, copy) { + var dist; + var state = strm.state; + + /* if it hasn't been done already, allocate space for the window */ + if (state.window === null) { + state.wsize = 1 << state.wbits; + state.wnext = 0; + state.whave = 0; + + state.window = new common.Buf8(state.wsize); + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state.wsize) { + common.arraySet(state.window, src, end - state.wsize, state.wsize, 0); + state.wnext = 0; + state.whave = state.wsize; + } + else { + dist = state.wsize - state.wnext; + if (dist > copy) { + dist = copy; + } + //zmemcpy(state->window + state->wnext, end - copy, dist); + common.arraySet(state.window, src, end - copy, dist, state.wnext); + copy -= dist; + if (copy) { + //zmemcpy(state->window, end - copy, copy); + common.arraySet(state.window, src, end - copy, copy, 0); + state.wnext = copy; + state.whave = state.wsize; + } + else { + state.wnext += dist; + if (state.wnext === state.wsize) { state.wnext = 0; } + if (state.whave < state.wsize) { state.whave += dist; } + } + } + return 0; + } + + function inflate(strm, flush) { + var state; + var input, output; // input/output buffers + var next; /* next input INDEX */ + var put; /* next output INDEX */ + var have, left; /* available input and output */ + var hold; /* bit buffer */ + var bits; /* bits in bit buffer */ + var _in, _out; /* save starting available input and output */ + var copy; /* number of stored or match bytes to copy */ + var from; /* where to copy match bytes from */ + var from_source; + var here = 0; /* current decoding table entry */ + var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) + //var last; /* parent table entry */ + var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) + var len; /* length to copy for repeats, bits to drop */ + var ret; /* return code */ + var hbuf = new common.Buf8(4); /* buffer for gzip header crc calculation */ + var opts; + + var n; // temporary var for NEED_BITS + + var order = /* permutation of code lengths */ + [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; + + + if (!strm || !strm.state || !strm.output || + (!strm.input && strm.avail_in !== 0)) { + return Z_STREAM_ERROR$1; + } + + state = strm.state; + if (state.mode === TYPE$1) { state.mode = TYPEDO; } /* skip check */ + + + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + _in = have; + _out = left; + ret = Z_OK$2; + + inf_leave: // goto emulation + for (;;) { + switch (state.mode) { + case HEAD: + if (state.wrap === 0) { + state.mode = TYPEDO; + break; + } + //=== NEEDBITS(16); + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ + state.check = 0/*crc32(0L, Z_NULL, 0)*/; + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = FLAGS; + break; + } + state.flags = 0; /* expect zlib header */ + if (state.head) { + state.head.done = false; + } + if (!(state.wrap & 1) || /* check if zlib header allowed */ + (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { + strm.msg = 'incorrect header check'; + state.mode = BAD$1; + break; + } + if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$2) { + strm.msg = 'unknown compression method'; + state.mode = BAD$1; + break; + } + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + len = (hold & 0x0f)/*BITS(4)*/ + 8; + if (state.wbits === 0) { + state.wbits = len; + } + else if (len > state.wbits) { + strm.msg = 'invalid window size'; + state.mode = BAD$1; + break; + } + state.dmax = 1 << len; + //Tracev((stderr, "inflate: zlib header ok\n")); + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = hold & 0x200 ? DICTID : TYPE$1; + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + break; + case FLAGS: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.flags = hold; + if ((state.flags & 0xff) !== Z_DEFLATED$2) { + strm.msg = 'unknown compression method'; + state.mode = BAD$1; + break; + } + if (state.flags & 0xe000) { + strm.msg = 'unknown header flags set'; + state.mode = BAD$1; + break; + } + if (state.head) { + state.head.text = ((hold >> 8) & 1); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = TIME; + /* falls through */ + case TIME: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.time = hold; + } + if (state.flags & 0x0200) { + //=== CRC4(state.check, hold) + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + hbuf[2] = (hold >>> 16) & 0xff; + hbuf[3] = (hold >>> 24) & 0xff; + state.check = crc32_1(state.check, hbuf, 4, 0); + //=== + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = OS; + /* falls through */ + case OS: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.xflags = (hold & 0xff); + state.head.os = (hold >> 8); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = EXLEN; + /* falls through */ + case EXLEN: + if (state.flags & 0x0400) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length = hold; + if (state.head) { + state.head.extra_len = hold; + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + else if (state.head) { + state.head.extra = null/*Z_NULL*/; + } + state.mode = EXTRA; + /* falls through */ + case EXTRA: + if (state.flags & 0x0400) { + copy = state.length; + if (copy > have) { copy = have; } + if (copy) { + if (state.head) { + len = state.head.extra_len - state.length; + if (!state.head.extra) { + // Use untyped array for more convenient processing later + state.head.extra = new Array(state.head.extra_len); + } + common.arraySet( + state.head.extra, + input, + next, + // extra field is limited to 65536 bytes + // - no need for additional size check + copy, + /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ + len + ); + //zmemcpy(state.head.extra + len, next, + // len + copy > state.head.extra_max ? + // state.head.extra_max - len : copy); + } + if (state.flags & 0x0200) { + state.check = crc32_1(state.check, input, copy, next); + } + have -= copy; + next += copy; + state.length -= copy; + } + if (state.length) { break inf_leave; } + } + state.length = 0; + state.mode = NAME; + /* falls through */ + case NAME: + if (state.flags & 0x0800) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + // TODO: 2 or 1 bytes? + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.name_max*/)) { + state.head.name += String.fromCharCode(len); + } + } while (len && copy < have); + + if (state.flags & 0x0200) { + state.check = crc32_1(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.name = null; + } + state.length = 0; + state.mode = COMMENT; + /* falls through */ + case COMMENT: + if (state.flags & 0x1000) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.comm_max*/)) { + state.head.comment += String.fromCharCode(len); + } + } while (len && copy < have); + if (state.flags & 0x0200) { + state.check = crc32_1(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.comment = null; + } + state.mode = HCRC; + /* falls through */ + case HCRC: + if (state.flags & 0x0200) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.check & 0xffff)) { + strm.msg = 'header crc mismatch'; + state.mode = BAD$1; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + if (state.head) { + state.head.hcrc = ((state.flags >> 9) & 1); + state.head.done = true; + } + strm.adler = state.check = 0; + state.mode = TYPE$1; + break; + case DICTID: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + strm.adler = state.check = zswap32(hold); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = DICT; + /* falls through */ + case DICT: + if (state.havedict === 0) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + return Z_NEED_DICT; + } + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = TYPE$1; + /* falls through */ + case TYPE$1: + if (flush === Z_BLOCK$1 || flush === Z_TREES) { break inf_leave; } + /* falls through */ + case TYPEDO: + if (state.last) { + //--- BYTEBITS() ---// + hold >>>= bits & 7; + bits -= bits & 7; + //---// + state.mode = CHECK; + break; + } + //=== NEEDBITS(3); */ + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.last = (hold & 0x01)/*BITS(1)*/; + //--- DROPBITS(1) ---// + hold >>>= 1; + bits -= 1; + //---// + + switch ((hold & 0x03)/*BITS(2)*/) { + case 0: /* stored block */ + //Tracev((stderr, "inflate: stored block%s\n", + // state.last ? " (last)" : "")); + state.mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + //Tracev((stderr, "inflate: fixed codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = LEN_; /* decode codes */ + if (flush === Z_TREES) { + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break inf_leave; + } + break; + case 2: /* dynamic block */ + //Tracev((stderr, "inflate: dynamic codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = TABLE; + break; + case 3: + strm.msg = 'invalid block type'; + state.mode = BAD$1; + } + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break; + case STORED: + //--- BYTEBITS() ---// /* go to byte boundary */ + hold >>>= bits & 7; + bits -= bits & 7; + //---// + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { + strm.msg = 'invalid stored block lengths'; + state.mode = BAD$1; + break; + } + state.length = hold & 0xffff; + //Tracev((stderr, "inflate: stored length %u\n", + // state.length)); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = COPY_; + if (flush === Z_TREES) { break inf_leave; } + /* falls through */ + case COPY_: + state.mode = COPY; + /* falls through */ + case COPY: + copy = state.length; + if (copy) { + if (copy > have) { copy = have; } + if (copy > left) { copy = left; } + if (copy === 0) { break inf_leave; } + //--- zmemcpy(put, next, copy); --- + common.arraySet(output, input, next, copy, put); + //---// + have -= copy; + next += copy; + left -= copy; + put += copy; + state.length -= copy; + break; + } + //Tracev((stderr, "inflate: stored end\n")); + state.mode = TYPE$1; + break; + case TABLE: + //=== NEEDBITS(14); */ + while (bits < 14) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + //#ifndef PKZIP_BUG_WORKAROUND + if (state.nlen > 286 || state.ndist > 30) { + strm.msg = 'too many length or distance symbols'; + state.mode = BAD$1; + break; + } + //#endif + //Tracev((stderr, "inflate: table sizes ok\n")); + state.have = 0; + state.mode = LENLENS; + /* falls through */ + case LENLENS: + while (state.have < state.ncode) { + //=== NEEDBITS(3); + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + while (state.have < 19) { + state.lens[order[state.have++]] = 0; + } + // We have separate tables & no pointers. 2 commented lines below not needed. + //state.next = state.codes; + //state.lencode = state.next; + // Switch to use dynamic table + state.lencode = state.lendyn; + state.lenbits = 7; + + opts = { bits: state.lenbits }; + ret = inftrees(CODES$1, state.lens, 0, 19, state.lencode, 0, state.work, opts); + state.lenbits = opts.bits; + + if (ret) { + strm.msg = 'invalid code lengths set'; + state.mode = BAD$1; + break; + } + //Tracev((stderr, "inflate: code lengths ok\n")); + state.have = 0; + state.mode = CODELENS; + /* falls through */ + case CODELENS: + while (state.have < state.nlen + state.ndist) { + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_val < 16) { + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.lens[state.have++] = here_val; + } + else { + if (here_val === 16) { + //=== NEEDBITS(here.bits + 2); + n = here_bits + 2; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + if (state.have === 0) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD$1; + break; + } + len = state.lens[state.have - 1]; + copy = 3 + (hold & 0x03);//BITS(2); + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + } + else if (here_val === 17) { + //=== NEEDBITS(here.bits + 3); + n = here_bits + 3; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 3 + (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + else { + //=== NEEDBITS(here.bits + 7); + n = here_bits + 7; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 11 + (hold & 0x7f);//BITS(7); + //--- DROPBITS(7) ---// + hold >>>= 7; + bits -= 7; + //---// + } + if (state.have + copy > state.nlen + state.ndist) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD$1; + break; + } + while (copy--) { + state.lens[state.have++] = len; + } + } + } + + /* handle error breaks in while */ + if (state.mode === BAD$1) { break; } + + /* check for end-of-block code (better have one) */ + if (state.lens[256] === 0) { + strm.msg = 'invalid code -- missing end-of-block'; + state.mode = BAD$1; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state.lenbits = 9; + + opts = { bits: state.lenbits }; + ret = inftrees(LENS$1, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.lenbits = opts.bits; + // state.lencode = state.next; + + if (ret) { + strm.msg = 'invalid literal/lengths set'; + state.mode = BAD$1; + break; + } + + state.distbits = 6; + //state.distcode.copy(state.codes); + // Switch to use dynamic table + state.distcode = state.distdyn; + opts = { bits: state.distbits }; + ret = inftrees(DISTS$1, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.distbits = opts.bits; + // state.distcode = state.next; + + if (ret) { + strm.msg = 'invalid distances set'; + state.mode = BAD$1; + break; + } + //Tracev((stderr, 'inflate: codes ok\n')); + state.mode = LEN_; + if (flush === Z_TREES) { break inf_leave; } + /* falls through */ + case LEN_: + state.mode = LEN; + /* falls through */ + case LEN: + if (have >= 6 && left >= 258) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + inffast(strm, _out); + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + if (state.mode === TYPE$1) { + state.back = -1; + } + break; + } + state.back = 0; + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if (here_bits <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_op && (here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.lencode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + state.length = here_val; + if (here_op === 0) { + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + state.mode = LIT; + break; + } + if (here_op & 32) { + //Tracevv((stderr, "inflate: end of block\n")); + state.back = -1; + state.mode = TYPE$1; + break; + } + if (here_op & 64) { + strm.msg = 'invalid literal/length code'; + state.mode = BAD$1; + break; + } + state.extra = here_op & 15; + state.mode = LENEXT; + /* falls through */ + case LENEXT: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //Tracevv((stderr, "inflate: length %u\n", state.length)); + state.was = state.length; + state.mode = DIST; + /* falls through */ + case DIST: + for (;;) { + here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if ((here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.distcode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + if (here_op & 64) { + strm.msg = 'invalid distance code'; + state.mode = BAD$1; + break; + } + state.offset = here_val; + state.extra = (here_op) & 15; + state.mode = DISTEXT; + /* falls through */ + case DISTEXT: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //#ifdef INFLATE_STRICT + if (state.offset > state.dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$1; + break; + } + //#endif + //Tracevv((stderr, "inflate: distance %u\n", state.offset)); + state.mode = MATCH; + /* falls through */ + case MATCH: + if (left === 0) { break inf_leave; } + copy = _out - left; + if (state.offset > copy) { /* copy from window */ + copy = state.offset - copy; + if (copy > state.whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$1; + break; + } + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + // Trace((stderr, "inflate.c too far\n")); + // copy -= state.whave; + // if (copy > state.length) { copy = state.length; } + // if (copy > left) { copy = left; } + // left -= copy; + // state.length -= copy; + // do { + // output[put++] = 0; + // } while (--copy); + // if (state.length === 0) { state.mode = LEN; } + // break; + //#endif + } + if (copy > state.wnext) { + copy -= state.wnext; + from = state.wsize - copy; + } + else { + from = state.wnext - copy; + } + if (copy > state.length) { copy = state.length; } + from_source = state.window; + } + else { /* copy from output */ + from_source = output; + from = put - state.offset; + copy = state.length; + } + if (copy > left) { copy = left; } + left -= copy; + state.length -= copy; + do { + output[put++] = from_source[from++]; + } while (--copy); + if (state.length === 0) { state.mode = LEN; } + break; + case LIT: + if (left === 0) { break inf_leave; } + output[put++] = state.length; + left--; + state.mode = LEN; + break; + case CHECK: + if (state.wrap) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + // Use '|' instead of '+' to make sure that result is signed + hold |= input[next++] << bits; + bits += 8; + } + //===// + _out -= left; + strm.total_out += _out; + state.total += _out; + if (_out) { + strm.adler = state.check = + /*UPDATE(state.check, put - _out, _out);*/ + (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out)); + + } + _out = left; + // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too + if ((state.flags ? hold : zswap32(hold)) !== state.check) { + strm.msg = 'incorrect data check'; + state.mode = BAD$1; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: check matches trailer\n")); + } + state.mode = LENGTH; + /* falls through */ + case LENGTH: + if (state.wrap && state.flags) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.total & 0xffffffff)) { + strm.msg = 'incorrect length check'; + state.mode = BAD$1; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: length matches trailer\n")); + } + state.mode = DONE; + /* falls through */ + case DONE: + ret = Z_STREAM_END$2; + break inf_leave; + case BAD$1: + ret = Z_DATA_ERROR$1; + break inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + /* falls through */ + default: + return Z_STREAM_ERROR$1; + } + } + + // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + + if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$1 && + (state.mode < CHECK || flush !== Z_FINISH$2))) { + if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if (state.wrap && _out) { + strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ + (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out)); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + + (state.mode === TYPE$1 ? 128 : 0) + + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); + if (((_in === 0 && _out === 0) || flush === Z_FINISH$2) && ret === Z_OK$2) { + ret = Z_BUF_ERROR$1; + } + return ret; + } + + function inflateEnd(strm) { + + if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { + return Z_STREAM_ERROR$1; + } + + var state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK$2; + } + + function inflateGetHeader(strm, head) { + var state; + + /* check state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR$1; } + state = strm.state; + if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; } + + /* save header structure */ + state.head = head; + head.done = false; + return Z_OK$2; + } + + function inflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + + var state; + var dictid; + var ret; + + /* check state */ + if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; } + state = strm.state; + + if (state.wrap !== 0 && state.mode !== DICT) { + return Z_STREAM_ERROR$1; + } + + /* check for correct dictionary identifier */ + if (state.mode === DICT) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32_1(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR$1; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM; + return Z_MEM_ERROR; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK$2; + } + + var inflateReset_1 = inflateReset; + var inflateReset2_1 = inflateReset2; + var inflateResetKeep_1 = inflateResetKeep; + var inflateInit_1 = inflateInit; + var inflateInit2_1 = inflateInit2; + var inflate_2 = inflate; + var inflateEnd_1 = inflateEnd; + var inflateGetHeader_1 = inflateGetHeader; + var inflateSetDictionary_1 = inflateSetDictionary; + var inflateInfo = 'pako inflate (from Nodeca project)'; + + /* Not implemented + exports.inflateCopy = inflateCopy; + exports.inflateGetDictionary = inflateGetDictionary; + exports.inflateMark = inflateMark; + exports.inflatePrime = inflatePrime; + exports.inflateSync = inflateSync; + exports.inflateSyncPoint = inflateSyncPoint; + exports.inflateUndermine = inflateUndermine; + */ + + var inflate_1 = { + inflateReset: inflateReset_1, + inflateReset2: inflateReset2_1, + inflateResetKeep: inflateResetKeep_1, + inflateInit: inflateInit_1, + inflateInit2: inflateInit2_1, + inflate: inflate_2, + inflateEnd: inflateEnd_1, + inflateGetHeader: inflateGetHeader_1, + inflateSetDictionary: inflateSetDictionary_1, + inflateInfo: inflateInfo + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + var constants = { + + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_TREES: 6, + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + //Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + //Z_VERSION_ERROR: -6, + + /* compression levels */ + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + + + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + + /* Possible values of the data_type field (though see inflate()) */ + Z_BINARY: 0, + Z_TEXT: 1, + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function GZheader() { + /* true if compressed data believed to be text */ + this.text = 0; + /* modification time */ + this.time = 0; + /* extra flags (not used when writing a gzip file) */ + this.xflags = 0; + /* operating system */ + this.os = 0; + /* pointer to extra field or Z_NULL if none */ + this.extra = null; + /* extra field length (valid if extra != Z_NULL) */ + this.extra_len = 0; // Actually, we don't need it in JS, + // but leave for few code modifications + + // + // Setup limits is not necessary because in js we should not preallocate memory + // for inflate use constant limit in 65536 bytes + // + + /* space at extra (only when reading header) */ + // this.extra_max = 0; + /* pointer to zero-terminated file name or Z_NULL */ + this.name = ''; + /* space at name (only when reading header) */ + // this.name_max = 0; + /* pointer to zero-terminated comment or Z_NULL */ + this.comment = ''; + /* space at comment (only when reading header) */ + // this.comm_max = 0; + /* true if there was or will be a header crc */ + this.hcrc = 0; + /* true when done reading gzip header (not used when writing a gzip file) */ + this.done = false; + } + + var gzheader = GZheader; + + var toString$1 = Object.prototype.toString; + + /** + * class Inflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[inflate]] + * and [[inflateRaw]]. + **/ + + /* internal + * inflate.chunks -> Array + * + * Chunks of output data, if [[Inflate#onData]] not overridden. + **/ + + /** + * Inflate.result -> Uint8Array|Array|String + * + * Uncompressed result, generated by default [[Inflate#onData]] + * and [[Inflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Inflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ + + /** + * Inflate.err -> Number + * + * Error code after inflate finished. 0 (Z_OK) on success. + * Should be checked if broken data possible. + **/ + + /** + * Inflate.msg -> String + * + * Error message, if [[Inflate.err]] != 0 + **/ + + + /** + * new Inflate(options) + * - options (Object): zlib inflate options. + * + * Creates new inflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `windowBits` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw inflate + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * By default, when no options set, autodetect deflate/gzip data format via + * wrapper header. + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var inflate = new pako.Inflate({ level: 3}); + * + * inflate.push(chunk1, false); + * inflate.push(chunk2, true); // true -> last chunk + * + * if (inflate.err) { throw new Error(inflate.err); } + * + * console.log(inflate.result); + * ``` + **/ + function Inflate(options) { + if (!(this instanceof Inflate)) return new Inflate(options); + + this.options = common.assign({ + chunkSize: 16384, + windowBits: 0, + to: '' + }, options || {}); + + var opt = this.options; + + // Force window size for `raw` data, if not set directly, + // because we have no header for autodetect. + if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { + opt.windowBits = -opt.windowBits; + if (opt.windowBits === 0) { opt.windowBits = -15; } + } + + // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate + if ((opt.windowBits >= 0) && (opt.windowBits < 16) && + !(options && options.windowBits)) { + opt.windowBits += 32; + } + + // Gzip header has no info about windows size, we can do autodetect only + // for deflate. So, if window size not set, force it to max when gzip possible + if ((opt.windowBits > 15) && (opt.windowBits < 48)) { + // bit 3 (16) -> gzipped data + // bit 4 (32) -> autodetect gzip/deflate + if ((opt.windowBits & 15) === 0) { + opt.windowBits |= 15; + } + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream(); + this.strm.avail_out = 0; + + var status = inflate_1.inflateInit2( + this.strm, + opt.windowBits + ); + + if (status !== constants.Z_OK) { + throw new Error(messages[status]); + } + + this.header = new gzheader(); + + inflate_1.inflateGetHeader(this.strm, this.header); + + // Setup dictionary + if (opt.dictionary) { + // Convert data if needed + if (typeof opt.dictionary === 'string') { + opt.dictionary = strings.string2buf(opt.dictionary); + } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') { + opt.dictionary = new Uint8Array(opt.dictionary); + } + if (opt.raw) { //In raw mode we need to set the dictionary early + status = inflate_1.inflateSetDictionary(this.strm, opt.dictionary); + if (status !== constants.Z_OK) { + throw new Error(messages[status]); + } + } + } + } + + /** + * Inflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with + * new output chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the decompression context. + * + * On fail call [[Inflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ + Inflate.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var dictionary = this.options.dictionary; + var status, _mode; + var next_out_utf8, tail, utf8str; + + // Flag to properly process Z_BUF_ERROR on testing inflate call + // when we check that all output data was flushed. + var allowBufError = false; + + if (this.ended) { return false; } + _mode = (mode === ~~mode) ? mode : ((mode === true) ? constants.Z_FINISH : constants.Z_NO_FLUSH); + + // Convert data if needed + if (typeof data === 'string') { + // Only binary strings can be decompressed on practice + strm.input = strings.binstring2buf(data); + } else if (toString$1.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + do { + if (strm.avail_out === 0) { + strm.output = new common.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + + status = inflate_1.inflate(strm, constants.Z_NO_FLUSH); /* no bad return value */ + + if (status === constants.Z_NEED_DICT && dictionary) { + status = inflate_1.inflateSetDictionary(this.strm, dictionary); + } + + if (status === constants.Z_BUF_ERROR && allowBufError === true) { + status = constants.Z_OK; + allowBufError = false; + } + + if (status !== constants.Z_STREAM_END && status !== constants.Z_OK) { + this.onEnd(status); + this.ended = true; + return false; + } + + if (strm.next_out) { + if (strm.avail_out === 0 || status === constants.Z_STREAM_END || (strm.avail_in === 0 && (_mode === constants.Z_FINISH || _mode === constants.Z_SYNC_FLUSH))) { + + if (this.options.to === 'string') { + + next_out_utf8 = strings.utf8border(strm.output, strm.next_out); + + tail = strm.next_out - next_out_utf8; + utf8str = strings.buf2string(strm.output, next_out_utf8); + + // move tail + strm.next_out = tail; + strm.avail_out = chunkSize - tail; + if (tail) { common.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } + + this.onData(utf8str); + + } else { + this.onData(common.shrinkBuf(strm.output, strm.next_out)); + } + } + } + + // When no more input data, we should check that internal inflate buffers + // are flushed. The only way to do it when avail_out = 0 - run one more + // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. + // Here we set flag to process this error properly. + // + // NOTE. Deflate does not return error in this case and does not needs such + // logic. + if (strm.avail_in === 0 && strm.avail_out === 0) { + allowBufError = true; + } + + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== constants.Z_STREAM_END); + + if (status === constants.Z_STREAM_END) { + _mode = constants.Z_FINISH; + } + + // Finalize on the last chunk. + if (_mode === constants.Z_FINISH) { + status = inflate_1.inflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === constants.Z_OK; + } + + // callback interim results if Z_SYNC_FLUSH. + if (_mode === constants.Z_SYNC_FLUSH) { + this.onEnd(constants.Z_OK); + strm.avail_out = 0; + return true; + } + + return true; + }; + + + /** + * Inflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): output data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ + Inflate.prototype.onData = function (chunk) { + this.chunks.push(chunk); + }; + + + /** + * Inflate#onEnd(status) -> Void + * - status (Number): inflate status. 0 (Z_OK) on success, + * other if not. + * + * Called either after you tell inflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ + Inflate.prototype.onEnd = function (status) { + // On success - join + if (status === constants.Z_OK) { + if (this.options.to === 'string') { + // Glue & convert here, until we teach pako to send + // utf8 aligned strings to onData + this.result = this.chunks.join(''); + } else { + this.result = common.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; + }; + + + /** + * inflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Decompress `data` with inflate/ungzip and `options`. Autodetect + * format via wrapper header by default. That's why we don't provide + * separate `ungzip` method. + * + * Supported options are: + * + * - windowBits + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) + * , output; + * + * try { + * output = pako.inflate(input); + * } catch (err) + * console.log(err); + * } + * ``` + **/ + function inflate$1(input, options) { + var inflator = new Inflate(options); + + inflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (inflator.err) { throw inflator.msg || messages[inflator.err]; } + + return inflator.result; + } + + + /** + * inflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * The same as [[inflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ + function inflateRaw(input, options) { + options = options || {}; + options.raw = true; + return inflate$1(input, options); + } + + + /** + * ungzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Just shortcut to [[inflate]], because it autodetects format + * by header.content. Done for convenience. + **/ + + + var Inflate_1 = Inflate; + var inflate_2$1 = inflate$1; + var inflateRaw_1 = inflateRaw; + var ungzip = inflate$1; + + var inflate_1$1 = { + Inflate: Inflate_1, + inflate: inflate_2$1, + inflateRaw: inflateRaw_1, + ungzip: ungzip + }; + + var assign = common.assign; + + + + + + var pako = {}; + + assign(pako, deflate_1$1, inflate_1$1, constants); + + var pako_1 = pako; + + /* + * The `chars`, `lookup`, and `decodeFromBase64` members of this file are + * licensed under the following: + * + * base64-arraybuffer + * https://github.com/niklasvh/base64-arraybuffer + * + * Copyright (c) 2012 Niklas von Hertzen + * Licensed under the MIT license. + * + */ + var chars$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // Use a lookup table to find the index. + var lookup$1 = new Uint8Array(256); + for (var i$1 = 0; i$1 < chars$1.length; i$1++) { + lookup$1[chars$1.charCodeAt(i$1)] = i$1; + } + var decodeFromBase64$1 = function (base64) { + var bufferLength = base64.length * 0.75; + var len = base64.length; + var i; + var p = 0; + var encoded1; + var encoded2; + var encoded3; + var encoded4; + if (base64[base64.length - 1] === '=') { + bufferLength--; + if (base64[base64.length - 2] === '=') { + bufferLength--; + } + } + var bytes = new Uint8Array(bufferLength); + for (i = 0; i < len; i += 4) { + encoded1 = lookup$1[base64.charCodeAt(i)]; + encoded2 = lookup$1[base64.charCodeAt(i + 1)]; + encoded3 = lookup$1[base64.charCodeAt(i + 2)]; + encoded4 = lookup$1[base64.charCodeAt(i + 3)]; + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } + return bytes; + }; + var arrayToString = function (array) { + var str = ''; + for (var i = 0; i < array.length; i++) { + str += String.fromCharCode(array[i]); + } + return str; + }; + var decompressJson = function (compressedJson) { + return arrayToString(pako_1.inflate(decodeFromBase64$1(compressedJson))); + }; + var padStart$1 = function (value, length, padChar) { + var padding = ''; + for (var idx = 0, len = length - value.length; idx < len; idx++) { + padding += padChar; + } + return padding + value; + }; + + var CourierBoldCompressed = "eJyFWdtyGjkQ/RVqnnar8Bb4lpg3jEnCxgEvGDtxKg9iphm01oyILrZxKv++mrGd3az6KC8UnNa0+nrUGr5lI11VVLtskF198FaU1Dns9w9OOkf7/ePDrJu90bWbiorCgpH2RpLZO9WqaCReqZ8lnReJqKTa/SwL8DXJctPs9Lxs4oSS+bAuVVjXC7/tG/lAxYV0+SYbOOOpm402wojckVlQ8+T4wVFdUDHXlaifrTs91Q/Z4PNeMLu7t3/U6746POm+7vW/dLNlWGuUrOlCW+mkrrPBXr/X+4/gciPz25qszQbhyeyKjG2XZb3ewR+9Xi/sMdVO5k+ebHemcaHzW/57p3/y+qQbPk967We//TxoP191hoVeUWexs44q25nUuTZbbYSj4o9OZ6hUZ97osZ05WTJ3AQ37jMOqQtblIt9QG7lWycKJuhCmeJGGhSOxffccyqPj/W728eXX4cFJNxvavAmRyQbH++HnGf34vdc/etXNFq54d50NXh+2X6/C137v+CnQH8gZmYdQfP6WXX8MCppQTYMlditCBL53/wfTQ65EFeNfvQ6erlQsqX21akJc1rGs0EoJE+NbMnlToZFAVEFkQ3iABW2uGH3CUK1ojUTgMWEbjfaWeUp5G6N5aCwRw5vddkOM98EVqRlPrBJ2E8OPZHSM6prJkrtnVrqNIWbtOjQrg8o7Zq2VDwxId5x3xMe0lpzBuVaa0WGpkkCkmgaON/3qBVODpaHQiIybXz3ZliTi3DO2D2PoNIZGMXQWQ+MYehNDb2PoXQxNYujPGHofQ+cx9CGGpjE0i6GLGPorhuYxtIihyxhaxtBVDF3H0McY+hRDNzG0CqfQLTmeNlZBBvr0+TnIKbmUuTS5Z1jUN6xtw8nBtEjLb7wxDOesmB5j+JfpIIYLmIZiWC6GZAz9HUMMvTItzESL6VqG9rZMKGOI4QaGXpjY+xi6i6H7GGKYdMeQPl9foBBW3GHark9Vo5OqgEd9oe+ZOPOnc3NcqmZgiUuomehYnt1xZ8daaSPZ8wBoyb0Jx3jOBLBtGyvbiRNOLXw0Sy+DpNKAAhpxq/gXYhD6NdMda6bwwyTH0kwhypI70p5wdhR7Gjia3JEhpvfDLCRKI7YcqYXJnxgv/g3vSthEhNNSEKIfCQByUkpurWQaNXjqNtqjSfHp0OdLOwSAG31E7h03uLRMvlbEtDPoq0rkhqvhlSFu40I7kfP9VoRLFrH+G7YLcypCQLkJ1delML5SwjPb6DIMmQxL54L1gyq+YIfMyKNNsQ4zHj8UnoMDdoZwfoMqkJxX7A6Cj3czWzLdqcC+GuGM9tCa4RobSp5J2gTnk0D5CVA0Pp1RAqn7hC0o5J3kqvkTsGyY6gwBHlqmHtqBh2x77UI9QimVS75PljgMAjXDEljn0QNjvMlZIAju/pF0NH95VcFshSgnB3Ug+LhMkwYoVKOAUS+T2kZIG2DVcYInLXDTQkKUYHelH6kuGcEcbPE26aRPNklKOEQpNcCQHPp6k4jc5UYbRtkM7T4HcVsAvADWLtEGnq/M9t2G9e2Aw8xEM1CCQ4QDWq28cnKrmDHTAwcvgYNh1HJSqEKumdvVDlPDFOwjU8UyTpZZ4tTBohzYUSMaRAmdggBNgKLmzVsYGLjXbyujb6lm70CGSmnB1PsWJHuSYhQfupq/ioxBTRngkEaRuQEP3ICIPb/kAq/Axo6ZUEaQFFSStxwa/eDpiARDND4kqhIE+BG1Btp7hjKCjh6UKYt2xk7MkmMJ8PCMlGNy5XiSdvc6wYjYtIp5pSGBRTo9Z45R6Asw4bQ8HgrYhEJmTFsk6pWvyPfJOj4HiXNGFFQJw1hOCVaYgChNUOGcA6tD0DZCMSdDczMBDa5TFVWDqWn5i/yB+BByqARcGhx6ziqXVD4Ii2TqZmnLi8AS3L8dGqRoBIzwkM0LmXNpOAOKTNKbKciPBvg8XdZJ6RDoHEKO5meuGdDzmOiQMTrt0d63SVfAIDBJtgIwwaUvN7ps8l1r7v0I5lKPRUEV+rcqfaHlDvJH4FSdVBVCjk8IiXp87Jv/Ib90s/dk6gshTfPv8Zfv/wDUfBK2"; + + var CourierBoldObliqueCompressed = "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"; + + var CourierObliqueCompressed = "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"; + + var CourierCompressed = "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"; + + var HelveticaBoldCompressed = "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"; + + var HelveticaBoldObliqueCompressed = "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"; + + var HelveticaObliqueCompressed = "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"; + + var HelveticaCompressed = "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"; + + var TimesBoldCompressed = "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"; + + var TimesBoldItalicCompressed = "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"; + + var TimesItalicCompressed = "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"; + + var TimesRomanCompressed = "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"; + + var SymbolCompressed = "eJx9WFlv2zgQ/iuGnnYBt5DkS85bmk13g27SoEkPbNEHWqIlIhSpklSuov99R7JIkSLtFyGZjxzN8c0h/4oueF1jpqKz6Mt1K1GJZ4s4S+PZYrvdbqJ59J4zdYNqDAfuXuodp52spdSToZrQl6n0KyZl1Sm/xgVpa5BcKURJfs5KCgdj+F++J8+4uCUqr6IzJVo8jy4qJFCusLjD3d27BucE0cGYd+/4c3T2/U2SxfM36XYxT+JtDI8k/jGPPrMCC0oYvuWSKMJZdPYmiWMLuK9I/sCwlNHZCuRfsJD9sSiOk7dxnMFbbrgieefGBW9eROfA7I/8z1myzVbz7rnpn9vuCW/unpvZecF3eHb3IhWu5eyK5Vw0XCCFi7ezc0pnvRo5E1hi8QhCeM0lHCoIK+/yCvdR67zrfd2THPA7VfzzNTrbpv2fX+BPeH8fm2usBMnBg++/oq/forO08+QGNMgGgeG/5wfxYrE4iPFzTlFt5JtkkLeMPIL/EFoNreJBE2vrXReako3YcqvVEXCTKWJdzPS7Gizyjk/mZZvsAKC66d7FCgMtF4NC2eaVqpDyLW+QwIzi/TGoD6tvPQL7BJEPNVKVb39DW2mkJnY5FALyD9eEhU6DL4SPrqTaS0mRrHyDXrHgvpQz7AvVU+CkqgQOnN3zVgSkkFVfKslzQIgfMfPFOBxWRiyDjcs5p5wFIoFr4kImprQrP59WP1ubiVpcCgxlNLq5XC4PwM8Wy77EvSs5ZyU0EpuFaXqAzmlTjVlerzcH8TuskH/4oiLj0WQQ/oWpdXadJAfxZSOJ7exmPfD01lYSD8K/kU0288JLS7Mh+hW337dINCPA5MRX8QE1jXU8Wx/E/6J6V4zyLBtCdd36Km4Cso+QTOG4N6T5dvRusxxsu6/scK5Wgw2fKovZ20HxHSnrQDjv0WjEejvw7/MkxmMD6ZQkvnEfa1xayperg/ibZfN2kN1K4lvxHw4lZAfD6QErpy1lOt2QF4H3XATa8HDP7VnrVWY6SoNZQfKWokBRt90Ak7mt2GACwTVE8bNPE+Tw3VTIzkmQqRuLqsvtUGaFw3cTcjzJxSod3tjYSnQgS4fvpgyc8KaDZuLwXR8FtYlv8YPD9rHBuGxfbQYG1q1vL2v9+3zC9nF0EF+BqoLBFBbbjRfSYbsJprLYboxtpx1Fj23esXoMhqlx7rB9uR2OPxP/aCMDmX61/Vhm8cha7HA91bzbWUR1z0/m8tLUKSyJ1qWNHqeXrTUf16lb76Or6XIzTmWFA4mHyeLOkUS3+H23UpJQPAnbE0bUS2CSUi6IdWM13Mhpu/OlBUE1t/YbA1QYCeWLYVsrRh+SeDm0RCQEf9pxa3Xpds4RcpJhqNVDbXPkzqTpOJcK/mT1VO17gUtn57C3J3cpMlUucW77Px3hRwZ83VJFGvriJ6YRHJboLmnWPUNXWAC7FbQg+/0IrjUL4RMFBxhYkEdSBLxiXB0xD8TkEZorywPXoP0I/jxhXGzWKEoJUFgeiTvs3srq2eO9Hq2Aeq92S9eDIgeYwIeawKoVY+KyVOumuBmpY0r+CgrgQVn7ohl9n6aIoc4TJjB0lEDWvmaGa05ETrGfPRd3lm1jI64b9SKtBJlbhAFTgEhuqWoUvlhCFdwRBW613cNWqnGYyDAdj+OQfdnugpBWHUa14jAKbbN2tlDrfR6mXUT9p7F3peyGvHNBb0UCl933GHgmyN6Hc/0R6+KZxiG7Ba6ReJjg6RiAos0DpTRsHWNz1s284Mr58DI+UF52N8B7vyIGzP4+nGJcWLXiNMtiR0/0S0BPtExAj3ZNwE42zh11e6duTZS/YlZaK6DebfrkOsb4aURMnsqiA+viHpPowDrwsoX1y6moRTZ20cMXtmpOgFYf8sGd8kFrRw4ptuCQagu2lJvwmpXEUu2DNSlOoEf12vY4aXOZkG6WY8OC4hzrwHRcjVhWepjd4KdYKK7jrx5H89WjRxPWoycydlS3jZ/I2VS/G9yp9gB6PG1T1aY4YAp3LfPHPPqABbtFRHS/jf34/T82FAfb"; + + var ZapfDingbatsCompressed = "eJxtmNtu20YQhl+F4FULyMGeD7pz3AY1ChtG7NpFA18w1NomIlECSRcxgrx7SVk7+wOdG8H5OJydf2Z2d5gf9cV+t0v9VK/r+6vXsXlOlbHe28paq229qj/t++m62aXZ4J/m8PRb1z9/baZxefK63Z6eXN5dVMvTCh83u277xr/6kLrnl2XNq7TpXnczuZyabdee98/b2VzM/x4/dd/T5qab2pd6PQ2vaVVfvDRD005puE3Lu7eH1HbN9hTjx4/77/X6y5lcnUmjVzHIVVDicVX/1W/SsO36dLMfu6nb9/X6TAoBD+5euvZbn8axXtuZ36dhPJrVQqgPQoh5hev91LWLkIv94W1Ygq9+aX+tZAx2tfz64284/sblN/rqfLP/mqrbt3FKu7G67Nv9cNgPzZQ2H6rz7bb6vLgZq89pTMO/M/xfEqturJpqSM/d7GJIm2oamk3aNcO3av80O5xh3yyKmm1193ZIT02bqovTKjP+MAf++7zsZvZ3276kYyWWXB0z99S18/PbafPHQ71W4fjn/fxnFO+ZvkrT0LVzTr78qB/+nk38bHM9exgP8zr1z9U7jt6840YW5uSJKcZOCaBBnKgm5mU8MVNYyMwWFvO7Ukagkmgg6sDWQ5yFFqjzUrLEaQ3BEmiwNsMSaZS0vgWfOkPHWQowNeTUc0kumnxZvsgPxlGai6VTGUqAVCTQ6QkWnc77DKEiLktSUBJKqHIQZ86d8gCpHYoiEzMsb1ubYy8vW50DChB5ZhGqrijD0EqUIeiaEHIfCg5Kpuu0ApiToaGPSY0uaQsyr65L2oKi1yFt1PLaQ3lzfXTgXodGoJYzglndSLDMPg1sTPJpQJHJigw0QrGERqD9YhyTOgONQDUyuF1zaxuokc/BW2ztXCMrGZ9WMW1oQZHIXWNBkSCfRZEL5BMUiZw6CzVSFCfUSGZFNjIldoKDkonTKQiJIGzWmFd3BizJJ9SINoLDriOfUCOZS+zg+KGD1qGiLNMLxtJD1/ns00ON6EzyUCM6vbxhoBKaqbG3DFQCNiL1iHccBPV0DHhQH/JW8EW90dkyFKGywCJU0WkVSvSGeiSUODWFFD0HYdPQVoiRgfPMA+/nnRgiAyNYSjpWNQcNSMrtFCUH4ZIRpSCWocFCSuhCEY6hoUClc0WC52BJlCYYLQdhN+hygRRRlo5BKRRLS6oihSqh+ZzzRGG1Mo4Iz1LoP0qsxDGFzk0JE42ji0jCPejomJKCuwil4m5CiRMEUMVSzVLDUstSx1Juc0oVWMpqY295qVltmtWmWW2a1aZZbZrVplltmtWmWW2G1WZYbYbVZlhthtVmWG2G1WZYbYbVZlhtltVmWW2W1WZZbZbVZlltltVmWW2W1QYjQCh7E2aAQHeGhCFgPoNoy8KNb2wxBhmGKBxoUZXlLGsLI6AsftEDHV0wIURVbANLcTKlGGBIKPOAxCmhePCKUwFzAmpDFRQvjA9R06Hq8TONvshgKDCuRAZTXigUxjxNFfKRo3CLhnIJBMFRvMZpqpNBMlQJzGT5WFQMVQI/AikPMIhEU1aDjqJvQwmjSHB05cC9jbYwc5UtAHNLhDw41ha+lEqF4JaH3gmB61SYcqInxTDmQK8v08vjqv4zDf1N0w3Lf4A8/vwPpfK11w=="; + + // prettier-ignore + var compressedJsonForFontName = { + 'Courier': CourierCompressed, + 'Courier-Bold': CourierBoldCompressed, + 'Courier-Oblique': CourierObliqueCompressed, + 'Courier-BoldOblique': CourierBoldObliqueCompressed, + 'Helvetica': HelveticaCompressed, + 'Helvetica-Bold': HelveticaBoldCompressed, + 'Helvetica-Oblique': HelveticaObliqueCompressed, + 'Helvetica-BoldOblique': HelveticaBoldObliqueCompressed, + 'Times-Roman': TimesRomanCompressed, + 'Times-Bold': TimesBoldCompressed, + 'Times-Italic': TimesItalicCompressed, + 'Times-BoldItalic': TimesBoldItalicCompressed, + 'Symbol': SymbolCompressed, + 'ZapfDingbats': ZapfDingbatsCompressed, + }; + var FontNames; + (function (FontNames) { + FontNames["Courier"] = "Courier"; + FontNames["CourierBold"] = "Courier-Bold"; + FontNames["CourierOblique"] = "Courier-Oblique"; + FontNames["CourierBoldOblique"] = "Courier-BoldOblique"; + FontNames["Helvetica"] = "Helvetica"; + FontNames["HelveticaBold"] = "Helvetica-Bold"; + FontNames["HelveticaOblique"] = "Helvetica-Oblique"; + FontNames["HelveticaBoldOblique"] = "Helvetica-BoldOblique"; + FontNames["TimesRoman"] = "Times-Roman"; + FontNames["TimesRomanBold"] = "Times-Bold"; + FontNames["TimesRomanItalic"] = "Times-Italic"; + FontNames["TimesRomanBoldItalic"] = "Times-BoldItalic"; + FontNames["Symbol"] = "Symbol"; + FontNames["ZapfDingbats"] = "ZapfDingbats"; + })(FontNames || (FontNames = {})); + var fontCache = {}; + var Font = /** @class */ (function () { + function Font() { + var _this = this; + this.getWidthOfGlyph = function (glyphName) { + return _this.CharWidths[glyphName]; + }; + this.getXAxisKerningForPair = function (leftGlyphName, rightGlyphName) { + return (_this.KernPairXAmounts[leftGlyphName] || {})[rightGlyphName]; + }; + } + Font.load = function (fontName) { + var cachedFont = fontCache[fontName]; + if (cachedFont) + return cachedFont; + var json = decompressJson(compressedJsonForFontName[fontName]); + var font = Object.assign(new Font(), JSON.parse(json)); + font.CharWidths = font.CharMetrics.reduce(function (acc, metric) { + acc[metric.N] = metric.WX; + return acc; + }, {}); + font.KernPairXAmounts = font.KernPairs.reduce(function (acc, _a) { + var name1 = _a[0], name2 = _a[1], width = _a[2]; + if (!acc[name1]) + acc[name1] = {}; + acc[name1][name2] = width; + return acc; + }, {}); + fontCache[fontName] = font; + return font; + }; + return Font; + }()); + + var AllEncodingsCompressed = "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"; + + /* tslint:disable max-classes-per-file */ + var decompressedEncodings = decompressJson(AllEncodingsCompressed); + var allUnicodeMappings = JSON.parse(decompressedEncodings); + var Encoding = /** @class */ (function () { + function Encoding(name, unicodeMappings) { + var _this = this; + this.canEncodeUnicodeCodePoint = function (codePoint) { + return codePoint in _this.unicodeMappings; + }; + this.encodeUnicodeCodePoint = function (codePoint) { + var mapped = _this.unicodeMappings[codePoint]; + if (!mapped) { + var str = String.fromCharCode(codePoint); + var hexCode = "0x" + padStart$1(codePoint.toString(16), 4, '0'); + var msg = _this.name + " cannot encode \"" + str + "\" (" + hexCode + ")"; + throw new Error(msg); + } + return { code: mapped[0], name: mapped[1] }; + }; + this.name = name; + this.supportedCodePoints = Object.keys(unicodeMappings) + .map(Number) + .sort(function (a, b) { return a - b; }); + this.unicodeMappings = unicodeMappings; + } + return Encoding; + }()); + var Encodings = { + Symbol: new Encoding('Symbol', allUnicodeMappings.symbol), + ZapfDingbats: new Encoding('ZapfDingbats', allUnicodeMappings.zapfdingbats), + WinAnsi: new Encoding('WinAnsi', allUnicodeMappings.win1252), + }; + + var values = function (obj) { return Object.keys(obj).map(function (k) { return obj[k]; }); }; + var StandardFontValues = values(FontNames); + var isStandardFont = function (input) { + return StandardFontValues.includes(input); + }; + var rectanglesAreEqual = function (a, b) { return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; }; + + /* tslint:disable:ban-types */ + var backtick = function (val) { return "`" + val + "`"; }; + var singleQuote = function (val) { return "'" + val + "'"; }; + // prettier-ignore + var formatValue = function (value) { + var type = typeof value; + if (type === 'string') + return singleQuote(value); + else if (type === 'undefined') + return backtick(value); + else + return value; + }; + var createValueErrorMsg = function (value, valueName, values) { + var allowedValues = new Array(values.length); + for (var idx = 0, len = values.length; idx < len; idx++) { + var v = values[idx]; + allowedValues[idx] = formatValue(v); + } + var joinedValues = allowedValues.join(' or '); + // prettier-ignore + return backtick(valueName) + " must be one of " + joinedValues + ", but was actually " + formatValue(value); + }; + var assertIsOneOf = function (value, valueName, allowedValues) { + if (!Array.isArray(allowedValues)) { + allowedValues = values(allowedValues); + } + for (var idx = 0, len = allowedValues.length; idx < len; idx++) { + if (value === allowedValues[idx]) + return; + } + throw new TypeError(createValueErrorMsg(value, valueName, allowedValues)); + }; + var assertIsOneOfOrUndefined = function (value, valueName, allowedValues) { + if (!Array.isArray(allowedValues)) { + allowedValues = values(allowedValues); + } + assertIsOneOf(value, valueName, allowedValues.concat(undefined)); + }; + var assertIsSubset = function (values$1, valueName, allowedValues) { + if (!Array.isArray(allowedValues)) { + allowedValues = values(allowedValues); + } + for (var idx = 0, len = values$1.length; idx < len; idx++) { + assertIsOneOf(values$1[idx], valueName, allowedValues); + } + }; + var getType = function (val) { + if (val === null) + return 'null'; + if (val === undefined) + return 'undefined'; + if (typeof val === 'string') + return 'string'; + if (isNaN(val)) + return 'NaN'; + if (typeof val === 'number') + return 'number'; + if (typeof val === 'boolean') + return 'boolean'; + if (typeof val === 'symbol') + return 'symbol'; + if (typeof val === 'bigint') + return 'bigint'; + if (val.constructor && val.constructor.name) + return val.constructor.name; + if (val.name) + return val.name; + if (val.constructor) + return String(val.constructor); + return String(val); + }; + var isType = function (value, type) { + if (type === 'null') + return value === null; + if (type === 'undefined') + return value === undefined; + if (type === 'string') + return typeof value === 'string'; + if (type === 'number') + return typeof value === 'number' && !isNaN(value); + if (type === 'boolean') + return typeof value === 'boolean'; + if (type === 'symbol') + return typeof value === 'symbol'; + if (type === 'bigint') + return typeof value === 'bigint'; + if (type === Date) + return value instanceof Date; + if (type === Array) + return value instanceof Array; + if (type === Uint8Array) + return value instanceof Uint8Array; + if (type === ArrayBuffer) + return value instanceof ArrayBuffer; + if (type === Function) + return value instanceof Function; + return value instanceof type[0]; + }; + var createTypeErrorMsg = function (value, valueName, types) { + var allowedTypes = new Array(types.length); + for (var idx = 0, len = types.length; idx < len; idx++) { + var type = types[idx]; + if (type === 'null') + allowedTypes[idx] = backtick('null'); + if (type === 'undefined') + allowedTypes[idx] = backtick('undefined'); + if (type === 'string') + allowedTypes[idx] = backtick('string'); + else if (type === 'number') + allowedTypes[idx] = backtick('number'); + else if (type === 'boolean') + allowedTypes[idx] = backtick('boolean'); + else if (type === 'symbol') + allowedTypes[idx] = backtick('symbol'); + else if (type === 'bigint') + allowedTypes[idx] = backtick('bigint'); + else if (type === Array) + allowedTypes[idx] = backtick('Array'); + else if (type === Uint8Array) + allowedTypes[idx] = backtick('Uint8Array'); + else if (type === ArrayBuffer) + allowedTypes[idx] = backtick('ArrayBuffer'); + else + allowedTypes[idx] = backtick(type[1]); + } + var joinedTypes = allowedTypes.join(' or '); + // prettier-ignore + return backtick(valueName) + " must be of type " + joinedTypes + ", but was actually of type " + backtick(getType(value)); + }; + var assertIs = function (value, valueName, types) { + for (var idx = 0, len = types.length; idx < len; idx++) { + if (isType(value, types[idx])) + return; + } + throw new TypeError(createTypeErrorMsg(value, valueName, types)); + }; + var assertOrUndefined = function (value, valueName, types) { + assertIs(value, valueName, types.concat('undefined')); + }; + var assertEachIs = function (values, valueName, types) { + for (var idx = 0, len = values.length; idx < len; idx++) { + assertIs(values[idx], valueName, types); + } + }; + var assertRange = function (value, valueName, min, max) { + assertIs(value, valueName, ['number']); + assertIs(min, 'min', ['number']); + assertIs(max, 'max', ['number']); + max = Math.max(min, max); + if (value < min || value > max) { + // prettier-ignore + throw new Error(backtick(valueName) + " must be at least " + min + " and at most " + max + ", but was actually " + value); + } + }; + var assertRangeOrUndefined = function (value, valueName, min, max) { + assertIs(value, valueName, ['number', 'undefined']); + if (typeof value === 'number') + assertRange(value, valueName, min, max); + }; + var assertMultiple = function (value, valueName, multiplier) { + assertIs(value, valueName, ['number']); + if (value % multiplier !== 0) { + // prettier-ignore + throw new Error(backtick(valueName) + " must be a multiple of " + multiplier + ", but was actually " + value); + } + }; + var assertInteger = function (value, valueName) { + if (!Number.isInteger(value)) { + throw new Error(backtick(valueName) + " must be an integer, but was actually " + value); + } + }; + var assertPositive = function (value, valueName) { + if (![1, 0].includes(Math.sign(value))) { + // prettier-ignore + throw new Error(backtick(valueName) + " must be a positive number or 0, but was actually " + value); + } + }; + + // Mapping from PDFDocEncoding to Unicode code point + var pdfDocEncodingToUnicode = new Uint16Array(256); + // Initialize the code points which are the same + for (var idx = 0; idx < 256; idx++) { + pdfDocEncodingToUnicode[idx] = idx; + } + // Set differences (see "Table D.2 – PDFDocEncoding Character Set" of the PDF spec) + pdfDocEncodingToUnicode[0x16] = toCharCode('\u0017'); // SYNCRONOUS IDLE + pdfDocEncodingToUnicode[0x18] = toCharCode('\u02D8'); // BREVE + pdfDocEncodingToUnicode[0x19] = toCharCode('\u02C7'); // CARON + pdfDocEncodingToUnicode[0x1a] = toCharCode('\u02C6'); // MODIFIER LETTER CIRCUMFLEX ACCENT + pdfDocEncodingToUnicode[0x1b] = toCharCode('\u02D9'); // DOT ABOVE + pdfDocEncodingToUnicode[0x1c] = toCharCode('\u02DD'); // DOUBLE ACUTE ACCENT + pdfDocEncodingToUnicode[0x1d] = toCharCode('\u02DB'); // OGONEK + pdfDocEncodingToUnicode[0x1e] = toCharCode('\u02DA'); // RING ABOVE + pdfDocEncodingToUnicode[0x1f] = toCharCode('\u02DC'); // SMALL TILDE + pdfDocEncodingToUnicode[0x7f] = toCharCode('\uFFFD'); // REPLACEMENT CHARACTER (box with questionmark) + pdfDocEncodingToUnicode[0x80] = toCharCode('\u2022'); // BULLET + pdfDocEncodingToUnicode[0x81] = toCharCode('\u2020'); // DAGGER + pdfDocEncodingToUnicode[0x82] = toCharCode('\u2021'); // DOUBLE DAGGER + pdfDocEncodingToUnicode[0x83] = toCharCode('\u2026'); // HORIZONTAL ELLIPSIS + pdfDocEncodingToUnicode[0x84] = toCharCode('\u2014'); // EM DASH + pdfDocEncodingToUnicode[0x85] = toCharCode('\u2013'); // EN DASH + pdfDocEncodingToUnicode[0x86] = toCharCode('\u0192'); // LATIN SMALL LETTER SCRIPT F + pdfDocEncodingToUnicode[0x87] = toCharCode('\u2044'); // FRACTION SLASH (solidus) + pdfDocEncodingToUnicode[0x88] = toCharCode('\u2039'); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK + pdfDocEncodingToUnicode[0x89] = toCharCode('\u203A'); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + pdfDocEncodingToUnicode[0x8a] = toCharCode('\u2212'); // MINUS SIGN + pdfDocEncodingToUnicode[0x8b] = toCharCode('\u2030'); // PER MILLE SIGN + pdfDocEncodingToUnicode[0x8c] = toCharCode('\u201E'); // DOUBLE LOW-9 QUOTATION MARK (quotedblbase) + pdfDocEncodingToUnicode[0x8d] = toCharCode('\u201C'); // LEFT DOUBLE QUOTATION MARK (quotedblleft) + pdfDocEncodingToUnicode[0x8e] = toCharCode('\u201D'); // RIGHT DOUBLE QUOTATION MARK (quotedblright) + pdfDocEncodingToUnicode[0x8f] = toCharCode('\u2018'); // LEFT SINGLE QUOTATION MARK (quoteleft) + pdfDocEncodingToUnicode[0x90] = toCharCode('\u2019'); // RIGHT SINGLE QUOTATION MARK (quoteright) + pdfDocEncodingToUnicode[0x91] = toCharCode('\u201A'); // SINGLE LOW-9 QUOTATION MARK (quotesinglbase) + pdfDocEncodingToUnicode[0x92] = toCharCode('\u2122'); // TRADE MARK SIGN + pdfDocEncodingToUnicode[0x93] = toCharCode('\uFB01'); // LATIN SMALL LIGATURE FI + pdfDocEncodingToUnicode[0x94] = toCharCode('\uFB02'); // LATIN SMALL LIGATURE FL + pdfDocEncodingToUnicode[0x95] = toCharCode('\u0141'); // LATIN CAPITAL LETTER L WITH STROKE + pdfDocEncodingToUnicode[0x96] = toCharCode('\u0152'); // LATIN CAPITAL LIGATURE OE + pdfDocEncodingToUnicode[0x97] = toCharCode('\u0160'); // LATIN CAPITAL LETTER S WITH CARON + pdfDocEncodingToUnicode[0x98] = toCharCode('\u0178'); // LATIN CAPITAL LETTER Y WITH DIAERESIS + pdfDocEncodingToUnicode[0x99] = toCharCode('\u017D'); // LATIN CAPITAL LETTER Z WITH CARON + pdfDocEncodingToUnicode[0x9a] = toCharCode('\u0131'); // LATIN SMALL LETTER DOTLESS I + pdfDocEncodingToUnicode[0x9b] = toCharCode('\u0142'); // LATIN SMALL LETTER L WITH STROKE + pdfDocEncodingToUnicode[0x9c] = toCharCode('\u0153'); // LATIN SMALL LIGATURE OE + pdfDocEncodingToUnicode[0x9d] = toCharCode('\u0161'); // LATIN SMALL LETTER S WITH CARON + pdfDocEncodingToUnicode[0x9e] = toCharCode('\u017E'); // LATIN SMALL LETTER Z WITH CARON + pdfDocEncodingToUnicode[0x9f] = toCharCode('\uFFFD'); // REPLACEMENT CHARACTER (box with questionmark) + pdfDocEncodingToUnicode[0xa0] = toCharCode('\u20AC'); // EURO SIGN + pdfDocEncodingToUnicode[0xad] = toCharCode('\uFFFD'); // REPLACEMENT CHARACTER (box with questionmark) + /** + * Decode a byte array into a string using PDFDocEncoding. + * + * @param bytes a byte array (decimal representation) containing a string + * encoded with PDFDocEncoding. + */ + var pdfDocEncodingDecode = function (bytes) { + var codePoints = new Array(bytes.length); + for (var idx = 0, len = bytes.length; idx < len; idx++) { + codePoints[idx] = pdfDocEncodingToUnicode[bytes[idx]]; + } + return String.fromCodePoint.apply(String, codePoints); + }; + + var Cache = /** @class */ (function () { + function Cache(populate) { + this.populate = populate; + this.value = undefined; + } + Cache.prototype.getValue = function () { + return this.value; + }; + Cache.prototype.access = function () { + if (!this.value) + this.value = this.populate(); + return this.value; + }; + Cache.prototype.invalidate = function () { + this.value = undefined; + }; + Cache.populatedBy = function (populate) { return new Cache(populate); }; + return Cache; + }()); + + var MethodNotImplementedError = /** @class */ (function (_super) { + __extends(MethodNotImplementedError, _super); + function MethodNotImplementedError(className, methodName) { + var _this = this; + var msg = "Method " + className + "." + methodName + "() not implemented"; + _this = _super.call(this, msg) || this; + return _this; + } + return MethodNotImplementedError; + }(Error)); + var PrivateConstructorError = /** @class */ (function (_super) { + __extends(PrivateConstructorError, _super); + function PrivateConstructorError(className) { + var _this = this; + var msg = "Cannot construct " + className + " - it has a private constructor"; + _this = _super.call(this, msg) || this; + return _this; + } + return PrivateConstructorError; + }(Error)); + var UnexpectedObjectTypeError = /** @class */ (function (_super) { + __extends(UnexpectedObjectTypeError, _super); + function UnexpectedObjectTypeError(expected, actual) { + var _this = this; + var name = function (t) { var _a, _b; return (_a = t === null || t === void 0 ? void 0 : t.name) !== null && _a !== void 0 ? _a : (_b = t === null || t === void 0 ? void 0 : t.constructor) === null || _b === void 0 ? void 0 : _b.name; }; + var expectedTypes = Array.isArray(expected) + ? expected.map(name) + : [name(expected)]; + var msg = "Expected instance of " + expectedTypes.join(' or ') + ", " + + ("but got instance of " + (actual ? name(actual) : actual)); + _this = _super.call(this, msg) || this; + return _this; + } + return UnexpectedObjectTypeError; + }(Error)); + var UnsupportedEncodingError = /** @class */ (function (_super) { + __extends(UnsupportedEncodingError, _super); + function UnsupportedEncodingError(encoding) { + var _this = this; + var msg = encoding + " stream encoding not supported"; + _this = _super.call(this, msg) || this; + return _this; + } + return UnsupportedEncodingError; + }(Error)); + var ReparseError = /** @class */ (function (_super) { + __extends(ReparseError, _super); + function ReparseError(className, methodName) { + var _this = this; + var msg = "Cannot call " + className + "." + methodName + "() more than once"; + _this = _super.call(this, msg) || this; + return _this; + } + return ReparseError; + }(Error)); + var MissingCatalogError = /** @class */ (function (_super) { + __extends(MissingCatalogError, _super); + function MissingCatalogError(ref) { + var _this = this; + var msg = "Missing catalog (ref=" + ref + ")"; + _this = _super.call(this, msg) || this; + return _this; + } + return MissingCatalogError; + }(Error)); + var MissingPageContentsEmbeddingError = /** @class */ (function (_super) { + __extends(MissingPageContentsEmbeddingError, _super); + function MissingPageContentsEmbeddingError() { + var _this = this; + var msg = "Can't embed page with missing Contents"; + _this = _super.call(this, msg) || this; + return _this; + } + return MissingPageContentsEmbeddingError; + }(Error)); + var UnrecognizedStreamTypeError = /** @class */ (function (_super) { + __extends(UnrecognizedStreamTypeError, _super); + function UnrecognizedStreamTypeError(stream) { + var _a, _b, _c; + var _this = this; + var streamType = (_c = (_b = (_a = stream === null || stream === void 0 ? void 0 : stream.contructor) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : stream === null || stream === void 0 ? void 0 : stream.name) !== null && _c !== void 0 ? _c : stream; + var msg = "Unrecognized stream type: " + streamType; + _this = _super.call(this, msg) || this; + return _this; + } + return UnrecognizedStreamTypeError; + }(Error)); + var PageEmbeddingMismatchedContextError = /** @class */ (function (_super) { + __extends(PageEmbeddingMismatchedContextError, _super); + function PageEmbeddingMismatchedContextError() { + var _this = this; + var msg = "Found mismatched contexts while embedding pages. All pages in the array passed to `PDFDocument.embedPages()` must be from the same document."; + _this = _super.call(this, msg) || this; + return _this; + } + return PageEmbeddingMismatchedContextError; + }(Error)); + var PDFArrayIsNotRectangleError = /** @class */ (function (_super) { + __extends(PDFArrayIsNotRectangleError, _super); + function PDFArrayIsNotRectangleError(size) { + var _this = this; + var msg = "Attempted to convert PDFArray with " + size + " elements to rectangle, but must have exactly 4 elements."; + _this = _super.call(this, msg) || this; + return _this; + } + return PDFArrayIsNotRectangleError; + }(Error)); + var InvalidPDFDateStringError = /** @class */ (function (_super) { + __extends(InvalidPDFDateStringError, _super); + function InvalidPDFDateStringError(value) { + var _this = this; + var msg = "Attempted to convert \"" + value + "\" to a date, but it does not match the PDF date string format."; + _this = _super.call(this, msg) || this; + return _this; + } + return InvalidPDFDateStringError; + }(Error)); + var InvalidTargetIndexError = /** @class */ (function (_super) { + __extends(InvalidTargetIndexError, _super); + function InvalidTargetIndexError(targetIndex, Count) { + var _this = this; + var msg = "Invalid targetIndex specified: targetIndex=" + targetIndex + " must be less than Count=" + Count; + _this = _super.call(this, msg) || this; + return _this; + } + return InvalidTargetIndexError; + }(Error)); + var CorruptPageTreeError = /** @class */ (function (_super) { + __extends(CorruptPageTreeError, _super); + function CorruptPageTreeError(targetIndex, operation) { + var _this = this; + var msg = "Failed to " + operation + " at targetIndex=" + targetIndex + " due to corrupt page tree: It is likely that one or more 'Count' entries are invalid"; + _this = _super.call(this, msg) || this; + return _this; + } + return CorruptPageTreeError; + }(Error)); + var IndexOutOfBoundsError = /** @class */ (function (_super) { + __extends(IndexOutOfBoundsError, _super); + function IndexOutOfBoundsError(index, min, max) { + var _this = this; + var msg = "index should be at least " + min + " and at most " + max + ", but was actually " + index; + _this = _super.call(this, msg) || this; + return _this; + } + return IndexOutOfBoundsError; + }(Error)); + var InvalidAcroFieldValueError = /** @class */ (function (_super) { + __extends(InvalidAcroFieldValueError, _super); + function InvalidAcroFieldValueError() { + var _this = this; + var msg = "Attempted to set invalid field value"; + _this = _super.call(this, msg) || this; + return _this; + } + return InvalidAcroFieldValueError; + }(Error)); + var MultiSelectValueError = /** @class */ (function (_super) { + __extends(MultiSelectValueError, _super); + function MultiSelectValueError() { + var _this = this; + var msg = "Attempted to select multiple values for single-select field"; + _this = _super.call(this, msg) || this; + return _this; + } + return MultiSelectValueError; + }(Error)); + var MissingDAEntryError = /** @class */ (function (_super) { + __extends(MissingDAEntryError, _super); + function MissingDAEntryError(fieldName) { + var _this = this; + var msg = "No /DA (default appearance) entry found for field: " + fieldName; + _this = _super.call(this, msg) || this; + return _this; + } + return MissingDAEntryError; + }(Error)); + var MissingTfOperatorError = /** @class */ (function (_super) { + __extends(MissingTfOperatorError, _super); + function MissingTfOperatorError(fieldName) { + var _this = this; + var msg = "No Tf operator found for DA of field: " + fieldName; + _this = _super.call(this, msg) || this; + return _this; + } + return MissingTfOperatorError; + }(Error)); + var NumberParsingError = /** @class */ (function (_super) { + __extends(NumberParsingError, _super); + function NumberParsingError(pos, value) { + var _this = this; + var msg = "Failed to parse number " + + ("(line:" + pos.line + " col:" + pos.column + " offset=" + pos.offset + "): \"" + value + "\""); + _this = _super.call(this, msg) || this; + return _this; + } + return NumberParsingError; + }(Error)); + var PDFParsingError = /** @class */ (function (_super) { + __extends(PDFParsingError, _super); + function PDFParsingError(pos, details) { + var _this = this; + var msg = "Failed to parse PDF document " + + ("(line:" + pos.line + " col:" + pos.column + " offset=" + pos.offset + "): " + details); + _this = _super.call(this, msg) || this; + return _this; + } + return PDFParsingError; + }(Error)); + var NextByteAssertionError = /** @class */ (function (_super) { + __extends(NextByteAssertionError, _super); + function NextByteAssertionError(pos, expectedByte, actualByte) { + var _this = this; + var msg = "Expected next byte to be " + expectedByte + " but it was actually " + actualByte; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return NextByteAssertionError; + }(PDFParsingError)); + var PDFObjectParsingError = /** @class */ (function (_super) { + __extends(PDFObjectParsingError, _super); + function PDFObjectParsingError(pos, byte) { + var _this = this; + var msg = "Failed to parse PDF object starting with the following byte: " + byte; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return PDFObjectParsingError; + }(PDFParsingError)); + var PDFInvalidObjectParsingError = /** @class */ (function (_super) { + __extends(PDFInvalidObjectParsingError, _super); + function PDFInvalidObjectParsingError(pos) { + var _this = this; + var msg = "Failed to parse invalid PDF object"; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return PDFInvalidObjectParsingError; + }(PDFParsingError)); + var PDFStreamParsingError = /** @class */ (function (_super) { + __extends(PDFStreamParsingError, _super); + function PDFStreamParsingError(pos) { + var _this = this; + var msg = "Failed to parse PDF stream"; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return PDFStreamParsingError; + }(PDFParsingError)); + var UnbalancedParenthesisError = /** @class */ (function (_super) { + __extends(UnbalancedParenthesisError, _super); + function UnbalancedParenthesisError(pos) { + var _this = this; + var msg = "Failed to parse PDF literal string due to unbalanced parenthesis"; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return UnbalancedParenthesisError; + }(PDFParsingError)); + var StalledParserError = /** @class */ (function (_super) { + __extends(StalledParserError, _super); + function StalledParserError(pos) { + var _this = this; + var msg = "Parser stalled"; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return StalledParserError; + }(PDFParsingError)); + var MissingPDFHeaderError = /** @class */ (function (_super) { + __extends(MissingPDFHeaderError, _super); + function MissingPDFHeaderError(pos) { + var _this = this; + var msg = "No PDF header found"; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return MissingPDFHeaderError; + }(PDFParsingError)); + var MissingKeywordError = /** @class */ (function (_super) { + __extends(MissingKeywordError, _super); + function MissingKeywordError(pos, keyword) { + var _this = this; + var msg = "Did not find expected keyword '" + arrayAsString(keyword) + "'"; + _this = _super.call(this, pos, msg) || this; + return _this; + } + return MissingKeywordError; + }(PDFParsingError)); + + var CharCodes; + (function (CharCodes) { + CharCodes[CharCodes["Null"] = 0] = "Null"; + CharCodes[CharCodes["Backspace"] = 8] = "Backspace"; + CharCodes[CharCodes["Tab"] = 9] = "Tab"; + CharCodes[CharCodes["Newline"] = 10] = "Newline"; + CharCodes[CharCodes["FormFeed"] = 12] = "FormFeed"; + CharCodes[CharCodes["CarriageReturn"] = 13] = "CarriageReturn"; + CharCodes[CharCodes["Space"] = 32] = "Space"; + CharCodes[CharCodes["ExclamationPoint"] = 33] = "ExclamationPoint"; + CharCodes[CharCodes["Hash"] = 35] = "Hash"; + CharCodes[CharCodes["Percent"] = 37] = "Percent"; + CharCodes[CharCodes["LeftParen"] = 40] = "LeftParen"; + CharCodes[CharCodes["RightParen"] = 41] = "RightParen"; + CharCodes[CharCodes["Plus"] = 43] = "Plus"; + CharCodes[CharCodes["Minus"] = 45] = "Minus"; + CharCodes[CharCodes["Dash"] = 45] = "Dash"; + CharCodes[CharCodes["Period"] = 46] = "Period"; + CharCodes[CharCodes["ForwardSlash"] = 47] = "ForwardSlash"; + CharCodes[CharCodes["Zero"] = 48] = "Zero"; + CharCodes[CharCodes["One"] = 49] = "One"; + CharCodes[CharCodes["Two"] = 50] = "Two"; + CharCodes[CharCodes["Three"] = 51] = "Three"; + CharCodes[CharCodes["Four"] = 52] = "Four"; + CharCodes[CharCodes["Five"] = 53] = "Five"; + CharCodes[CharCodes["Six"] = 54] = "Six"; + CharCodes[CharCodes["Seven"] = 55] = "Seven"; + CharCodes[CharCodes["Eight"] = 56] = "Eight"; + CharCodes[CharCodes["Nine"] = 57] = "Nine"; + CharCodes[CharCodes["LessThan"] = 60] = "LessThan"; + CharCodes[CharCodes["GreaterThan"] = 62] = "GreaterThan"; + CharCodes[CharCodes["A"] = 65] = "A"; + CharCodes[CharCodes["D"] = 68] = "D"; + CharCodes[CharCodes["E"] = 69] = "E"; + CharCodes[CharCodes["F"] = 70] = "F"; + CharCodes[CharCodes["O"] = 79] = "O"; + CharCodes[CharCodes["P"] = 80] = "P"; + CharCodes[CharCodes["R"] = 82] = "R"; + CharCodes[CharCodes["LeftSquareBracket"] = 91] = "LeftSquareBracket"; + CharCodes[CharCodes["BackSlash"] = 92] = "BackSlash"; + CharCodes[CharCodes["RightSquareBracket"] = 93] = "RightSquareBracket"; + CharCodes[CharCodes["a"] = 97] = "a"; + CharCodes[CharCodes["b"] = 98] = "b"; + CharCodes[CharCodes["d"] = 100] = "d"; + CharCodes[CharCodes["e"] = 101] = "e"; + CharCodes[CharCodes["f"] = 102] = "f"; + CharCodes[CharCodes["i"] = 105] = "i"; + CharCodes[CharCodes["j"] = 106] = "j"; + CharCodes[CharCodes["l"] = 108] = "l"; + CharCodes[CharCodes["m"] = 109] = "m"; + CharCodes[CharCodes["n"] = 110] = "n"; + CharCodes[CharCodes["o"] = 111] = "o"; + CharCodes[CharCodes["r"] = 114] = "r"; + CharCodes[CharCodes["s"] = 115] = "s"; + CharCodes[CharCodes["t"] = 116] = "t"; + CharCodes[CharCodes["u"] = 117] = "u"; + CharCodes[CharCodes["x"] = 120] = "x"; + CharCodes[CharCodes["LeftCurly"] = 123] = "LeftCurly"; + CharCodes[CharCodes["RightCurly"] = 125] = "RightCurly"; + CharCodes[CharCodes["Tilde"] = 126] = "Tilde"; + })(CharCodes || (CharCodes = {})); + var CharCodes$1 = CharCodes; + + var common$1 = createCommonjsModule(function (module, exports) { + + + var TYPED_OK = (typeof Uint8Array !== 'undefined') && + (typeof Uint16Array !== 'undefined') && + (typeof Int32Array !== 'undefined'); + + function _has(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + } + + exports.assign = function (obj /*from1, from2, from3, ...*/) { + var sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + var source = sources.shift(); + if (!source) { continue; } + + if (typeof source !== 'object') { + throw new TypeError(source + 'must be non-object'); + } + + for (var p in source) { + if (_has(source, p)) { + obj[p] = source[p]; + } + } + } + + return obj; + }; + + + // reduce buffer size, avoiding mem copy + exports.shrinkBuf = function (buf, size) { + if (buf.length === size) { return buf; } + if (buf.subarray) { return buf.subarray(0, size); } + buf.length = size; + return buf; + }; + + + var fnTyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + if (src.subarray && dest.subarray) { + dest.set(src.subarray(src_offs, src_offs + len), dest_offs); + return; + } + // Fallback to ordinary array + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + var i, l, len, pos, chunk, result; + + // calculate data length + len = 0; + for (i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + + // join chunks + result = new Uint8Array(len); + pos = 0; + for (i = 0, l = chunks.length; i < l; i++) { + chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } + + return result; + } + }; + + var fnUntyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + return [].concat.apply([], chunks); + } + }; + + + // Enable/Disable typed arrays use, for testing + // + exports.setTyped = function (on) { + if (on) { + exports.Buf8 = Uint8Array; + exports.Buf16 = Uint16Array; + exports.Buf32 = Int32Array; + exports.assign(exports, fnTyped); + } else { + exports.Buf8 = Array; + exports.Buf16 = Array; + exports.Buf32 = Array; + exports.assign(exports, fnUntyped); + } + }; + + exports.setTyped(TYPED_OK); + }); + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + /* eslint-disable space-unary-ops */ + + + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + //var Z_FILTERED = 1; + //var Z_HUFFMAN_ONLY = 2; + //var Z_RLE = 3; + var Z_FIXED$2 = 4; + //var Z_DEFAULT_STRATEGY = 0; + + /* Possible values of the data_type field (though see inflate()) */ + var Z_BINARY$1 = 0; + var Z_TEXT$1 = 1; + //var Z_ASCII = 1; // = Z_TEXT + var Z_UNKNOWN$2 = 2; + + /*============================================================================*/ + + + function zero$2(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + + // From zutil.h + + var STORED_BLOCK$1 = 0; + var STATIC_TREES$1 = 1; + var DYN_TREES$1 = 2; + /* The three kinds of block type */ + + var MIN_MATCH$2 = 3; + var MAX_MATCH$2 = 258; + /* The minimum and maximum match lengths */ + + // From deflate.h + /* =========================================================================== + * Internal compression state. + */ + + var LENGTH_CODES$2 = 29; + /* number of length codes, not counting the special END_BLOCK code */ + + var LITERALS$2 = 256; + /* number of literal bytes 0..255 */ + + var L_CODES$2 = LITERALS$2 + 1 + LENGTH_CODES$2; + /* number of Literal or Length codes, including the END_BLOCK code */ + + var D_CODES$2 = 30; + /* number of distance codes */ + + var BL_CODES$2 = 19; + /* number of codes used to transfer the bit lengths */ + + var HEAP_SIZE$2 = 2 * L_CODES$2 + 1; + /* maximum heap size */ + + var MAX_BITS$2 = 15; + /* All codes must not exceed MAX_BITS bits */ + + var Buf_size$1 = 16; + /* size of bit buffer in bi_buf */ + + + /* =========================================================================== + * Constants + */ + + var MAX_BL_BITS$1 = 7; + /* Bit length codes must not exceed MAX_BL_BITS bits */ + + var END_BLOCK$1 = 256; + /* end of block literal code */ + + var REP_3_6$1 = 16; + /* repeat previous bit length 3-6 times (2 bits of repeat count) */ + + var REPZ_3_10$1 = 17; + /* repeat a zero length 3-10 times (3 bits of repeat count) */ + + var REPZ_11_138$1 = 18; + /* repeat a zero length 11-138 times (7 bits of repeat count) */ + + /* eslint-disable comma-spacing,array-bracket-spacing */ + var extra_lbits$1 = /* extra bits for each length code */ + [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + + var extra_dbits$1 = /* extra bits for each distance code */ + [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + + var extra_blbits$1 = /* extra bits for each bit length code */ + [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + + var bl_order$1 = + [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; + /* eslint-enable comma-spacing,array-bracket-spacing */ + + /* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + + /* =========================================================================== + * Local data. These are initialized only once. + */ + + // We pre-fill arrays with 0 to avoid uninitialized gaps + + var DIST_CODE_LEN$1 = 512; /* see definition of array dist_code below */ + + // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 + var static_ltree$1 = new Array((L_CODES$2 + 2) * 2); + zero$2(static_ltree$1); + /* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + + var static_dtree$1 = new Array(D_CODES$2 * 2); + zero$2(static_dtree$1); + /* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + + var _dist_code$1 = new Array(DIST_CODE_LEN$1); + zero$2(_dist_code$1); + /* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + + var _length_code$1 = new Array(MAX_MATCH$2 - MIN_MATCH$2 + 1); + zero$2(_length_code$1); + /* length code for each normalized match length (0 == MIN_MATCH) */ + + var base_length$1 = new Array(LENGTH_CODES$2); + zero$2(base_length$1); + /* First normalized length for each code (0 = MIN_MATCH) */ + + var base_dist$1 = new Array(D_CODES$2); + zero$2(base_dist$1); + /* First normalized distance for each code (0 = distance of 1) */ + + + function StaticTreeDesc$1(static_tree, extra_bits, extra_base, elems, max_length) { + + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ + + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; + } + + + var static_l_desc$1; + var static_d_desc$1; + var static_bl_desc$1; + + + function TreeDesc$1(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ + } + + + + function d_code$1(dist) { + return dist < 256 ? _dist_code$1[dist] : _dist_code$1[256 + (dist >>> 7)]; + } + + + /* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ + function put_short$1(s, w) { + // put_byte(s, (uch)((w) & 0xff)); + // put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; + } + + + /* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + function send_bits$1(s, value, length) { + if (s.bi_valid > (Buf_size$1 - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short$1(s, s.bi_buf); + s.bi_buf = value >> (Buf_size$1 - s.bi_valid); + s.bi_valid += length - Buf_size$1; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; + } + } + + + function send_code$1(s, c, tree) { + send_bits$1(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); + } + + + /* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + function bi_reverse$1(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; + } + + + /* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ + function bi_flush$1(s) { + if (s.bi_valid === 16) { + put_short$1(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; + + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } + } + + + /* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + function gen_bitlen$1(s, desc) + // deflate_state *s; + // tree_desc *desc; /* the tree descriptor */ + { + var tree = desc.dyn_tree; + var max_code = desc.max_code; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var extra = desc.stat_desc.extra_bits; + var base = desc.stat_desc.extra_base; + var max_length = desc.stat_desc.max_length; + var h; /* heap index */ + var n, m; /* iterate over the tree elements */ + var bits; /* bit length */ + var xbits; /* extra bits */ + var f; /* frequency */ + var overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS$2; bits++) { + s.bl_count[bits] = 0; + } + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + + for (h = s.heap_max + 1; h < HEAP_SIZE$2; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) { continue; } /* not a leaf node */ + + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } + + // Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } + } + + + /* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + function gen_codes$1(tree, max_code, bl_count) + // ct_data *tree; /* the tree to decorate */ + // int max_code; /* largest code with non zero frequency */ + // ushf *bl_count; /* number of codes at each bit length */ + { + var next_code = new Array(MAX_BITS$2 + 1); /* next code value for each bit length */ + var code = 0; /* running code value */ + var bits; /* bit index */ + var n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS$2; bits++) { + next_code[bits] = code = (code + bl_count[bits - 1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES$2 - 1; code++) { + base_length$1[code] = length; + for (n = 0; n < (1 << extra_lbits$1[code]); n++) { + _length_code$1[length++] = code; + } + } + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code$1[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist$1[code] = dist; + for (n = 0; n < (1 << extra_dbits$1[code]); n++) { + _dist_code$1[dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES$2; code++) { + base_dist$1[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits$1[code] - 7)); n++) { + _dist_code$1[256 + dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS$2; bits++) { + bl_count[bits] = 0; + } + + n = 0; + while (n <= 143) { + static_ltree$1[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree$1[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree$1[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree$1[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes$1(static_ltree$1, L_CODES$2 + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES$2; n++) { + static_dtree$1[n * 2 + 1]/*.Len*/ = 5; + static_dtree$1[n * 2]/*.Code*/ = bi_reverse$1(n, 5); + } + + // Now data ready and we can init static trees + static_l_desc$1 = new StaticTreeDesc$1(static_ltree$1, extra_lbits$1, LITERALS$2 + 1, L_CODES$2, MAX_BITS$2); + static_d_desc$1 = new StaticTreeDesc$1(static_dtree$1, extra_dbits$1, 0, D_CODES$2, MAX_BITS$2); + static_bl_desc$1 = new StaticTreeDesc$1(new Array(0), extra_blbits$1, 0, BL_CODES$2, MAX_BL_BITS$1); + + //static_init_done = true; + } + + + /* =========================================================================== + * Initialize a new block. + */ + function init_block$1(s) { + var n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES$2; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES$2; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES$2; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + + s.dyn_ltree[END_BLOCK$1 * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.last_lit = s.matches = 0; + } + + + /* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ + function bi_windup$1(s) + { + if (s.bi_valid > 8) { + put_short$1(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; + } + s.bi_buf = 0; + s.bi_valid = 0; + } + + /* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ + function copy_block$1(s, buf, len, header) + //DeflateState *s; + //charf *buf; /* the input data */ + //unsigned len; /* its length */ + //int header; /* true if block header must be written */ + { + bi_windup$1(s); /* align on byte boundary */ + + if (header) { + put_short$1(s, len); + put_short$1(s, ~len); + } + // while (len--) { + // put_byte(s, *buf++); + // } + common$1.arraySet(s.pending_buf, s.window, buf, len, s.pending); + s.pending += len; + } + + /* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + function smaller$1(tree, n, m, depth) { + var _n2 = n * 2; + var _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); + } + + /* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + function pqdownheap$1(s, tree, k) + // deflate_state *s; + // ct_data *tree; /* the tree to restore */ + // int k; /* node to move down */ + { + var v = s.heap[k]; + var j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller$1(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller$1(tree, v, s.heap[j], s.depth)) { break; } + + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; + } + + + // inlined manually + // var SMALLEST = 1; + + /* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ + function compress_block$1(s, ltree, dtree) + // deflate_state *s; + // const ct_data *ltree; /* literal tree */ + // const ct_data *dtree; /* distance tree */ + { + var dist; /* distance of matched string */ + var lc; /* match length or unmatched char (if dist == 0) */ + var lx = 0; /* running index in l_buf */ + var code; /* the code to send */ + var extra; /* number of extra bits to send */ + + if (s.last_lit !== 0) { + do { + dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); + lc = s.pending_buf[s.l_buf + lx]; + lx++; + + if (dist === 0) { + send_code$1(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code$1[lc]; + send_code$1(s, code + LITERALS$2 + 1, ltree); /* send the length code */ + extra = extra_lbits$1[code]; + if (extra !== 0) { + lc -= base_length$1[code]; + send_bits$1(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code$1(dist); + //Assert (code < D_CODES, "bad d_code"); + + send_code$1(s, code, dtree); /* send the distance code */ + extra = extra_dbits$1[code]; + if (extra !== 0) { + dist -= base_dist$1[code]; + send_bits$1(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + // "pendingBuf overflow"); + + } while (lx < s.last_lit); + } + + send_code$1(s, END_BLOCK$1, ltree); + } + + + /* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ + function build_tree$1(s, desc) + // deflate_state *s; + // tree_desc *desc; /* the tree descriptor */ + { + var tree = desc.dyn_tree; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var elems = desc.stat_desc.elems; + var n, m; /* iterate over heap elements */ + var max_code = -1; /* largest code with non zero frequency */ + var node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE$2; + + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; + + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; + } + /* node is 0 or 1 so it does not have extra bits */ + } + desc.max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap$1(s, tree, n); } + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap$1(s, tree, 1/*SMALLEST*/); + /***/ + + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ + + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; + + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap$1(s, tree, 1/*SMALLEST*/); + + } while (s.heap_len >= 2); + + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen$1(s, desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes$1(tree, max_code, s.bl_count); + } + + + /* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ + function scan_tree$1(s, tree, max_code) + // deflate_state *s; + // ct_data *tree; /* the tree to be scanned */ + // int max_code; /* and its largest code of non zero frequency */ + { + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ + + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; + + } else if (curlen !== 0) { + + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6$1 * 2]/*.Freq*/++; + + } else if (count <= 10) { + s.bl_tree[REPZ_3_10$1 * 2]/*.Freq*/++; + + } else { + s.bl_tree[REPZ_11_138$1 * 2]/*.Freq*/++; + } + + count = 0; + prevlen = curlen; + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } + } + + + /* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + function send_tree$1(s, tree, max_code) + // deflate_state *s; + // ct_data *tree; /* the tree to be scanned */ + // int max_code; /* and its largest code of non zero frequency */ + { + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ + + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + do { send_code$1(s, curlen, s.bl_tree); } while (--count !== 0); + + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code$1(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code$1(s, REP_3_6$1, s.bl_tree); + send_bits$1(s, count - 3, 2); + + } else if (count <= 10) { + send_code$1(s, REPZ_3_10$1, s.bl_tree); + send_bits$1(s, count - 3, 3); + + } else { + send_code$1(s, REPZ_11_138$1, s.bl_tree); + send_bits$1(s, count - 11, 7); + } + + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } + } + + + /* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + function build_bl_tree$1(s) { + var max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree$1(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree$1(s, s.dyn_dtree, s.d_desc.max_code); + + /* Build the bit length tree: */ + build_tree$1(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES$2 - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order$1[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); + + return max_blindex; + } + + + /* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + function send_all_trees$1(s, lcodes, dcodes, blcodes) + // deflate_state *s; + // int lcodes, dcodes, blcodes; /* number of codes for each tree */ + { + var rank; /* index in bl_order */ + + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits$1(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits$1(s, dcodes - 1, 5); + send_bits$1(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits$1(s, s.bl_tree[bl_order$1[rank] * 2 + 1]/*.Len*/, 3); + } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree$1(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree$1(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); + } + + + /* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ + function detect_data_type$1(s) { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + var black_mask = 0xf3ffc07f; + var n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>>= 1) { + if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY$1; + } + } + + /* Check for textual ("white-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT$1; + } + for (n = 32; n < LITERALS$2; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT$1; + } + } + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY$1; + } + + + var static_init_done$1 = false; + + /* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ + function _tr_init$1(s) + { + + if (!static_init_done$1) { + tr_static_init$1(); + static_init_done$1 = true; + } + + s.l_desc = new TreeDesc$1(s.dyn_ltree, static_l_desc$1); + s.d_desc = new TreeDesc$1(s.dyn_dtree, static_d_desc$1); + s.bl_desc = new TreeDesc$1(s.bl_tree, static_bl_desc$1); + + s.bi_buf = 0; + s.bi_valid = 0; + + /* Initialize the first block of the first file: */ + init_block$1(s); + } + + + /* =========================================================================== + * Send a stored block + */ + function _tr_stored_block$1(s, buf, stored_len, last) + //DeflateState *s; + //charf *buf; /* input block */ + //ulg stored_len; /* length of input block */ + //int last; /* one if this is the last block for a file */ + { + send_bits$1(s, (STORED_BLOCK$1 << 1) + (last ? 1 : 0), 3); /* send block type */ + copy_block$1(s, buf, stored_len, true); /* with header */ + } + + + /* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ + function _tr_align$1(s) { + send_bits$1(s, STATIC_TREES$1 << 1, 3); + send_code$1(s, END_BLOCK$1, static_ltree$1); + bi_flush$1(s); + } + + + /* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + function _tr_flush_block$1(s, buf, stored_len, last) + //DeflateState *s; + //charf *buf; /* input block, or NULL if too old */ + //ulg stored_len; /* length of input block */ + //int last; /* one if this is the last block for a file */ + { + var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + var max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { + + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN$2) { + s.strm.data_type = detect_data_type$1(s); + } + + /* Construct the literal and distance trees */ + build_tree$1(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + + build_tree$1(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree$1(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; + + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->last_lit)); + + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block$1(s, buf, stored_len, last); + + } else if (s.strategy === Z_FIXED$2 || static_lenb === opt_lenb) { + + send_bits$1(s, (STATIC_TREES$1 << 1) + (last ? 1 : 0), 3); + compress_block$1(s, static_ltree$1, static_dtree$1); + + } else { + send_bits$1(s, (DYN_TREES$1 << 1) + (last ? 1 : 0), 3); + send_all_trees$1(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block$1(s, s.dyn_ltree, s.dyn_dtree); + } + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block$1(s); + + if (last) { + bi_windup$1(s); + } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); + } + + /* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + function _tr_tally$1(s, dist, lc) + // deflate_state *s; + // unsigned dist; /* distance of matched string */ + // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ + { + //var out_length, in_length, dcode; + + s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; + s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; + + s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; + s.last_lit++; + + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s.dyn_ltree[(_length_code$1[lc] + LITERALS$2 + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code$1(dist) * 2]/*.Freq*/++; + } + + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + + //#ifdef TRUNCATE_BLOCK + // /* Try to guess if it is profitable to stop the current block here */ + // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { + // /* Compute an upper bound for the compressed length */ + // out_length = s.last_lit*8; + // in_length = s.strstart - s.block_start; + // + // for (dcode = 0; dcode < D_CODES; dcode++) { + // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); + // } + // out_length >>>= 3; + // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + // // s->last_lit, in_length, out_length, + // // 100L - out_length*100L/in_length)); + // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { + // return true; + // } + // } + //#endif + + return (s.last_lit === s.lit_bufsize - 1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + } + + var _tr_init_1$1 = _tr_init$1; + var _tr_stored_block_1$1 = _tr_stored_block$1; + var _tr_flush_block_1$1 = _tr_flush_block$1; + var _tr_tally_1$1 = _tr_tally$1; + var _tr_align_1$1 = _tr_align$1; + + var trees$1 = { + _tr_init: _tr_init_1$1, + _tr_stored_block: _tr_stored_block_1$1, + _tr_flush_block: _tr_flush_block_1$1, + _tr_tally: _tr_tally_1$1, + _tr_align: _tr_align_1$1 + }; + + // Note: adler32 takes 12% for level 0 and 2% for level 6. + // It isn't worth it to make additional optimizations as in original. + // Small size is preferable. + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function adler32$1(adler, buf, len, pos) { + var s1 = (adler & 0xffff) |0, + s2 = ((adler >>> 16) & 0xffff) |0, + n = 0; + + while (len !== 0) { + // Set limit ~ twice less than 5552, to keep + // s2 in 31-bits, because we force signed ints. + // in other case %= will fail. + n = len > 2000 ? 2000 : len; + len -= n; + + do { + s1 = (s1 + buf[pos++]) |0; + s2 = (s2 + s1) |0; + } while (--n); + + s1 %= 65521; + s2 %= 65521; + } + + return (s1 | (s2 << 16)) |0; + } + + + var adler32_1$1 = adler32$1; + + // Note: we can't get significant speed boost here. + // So write code to minimize size - no pregenerated tables + // and array tools dependencies. + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + // Use ordinary array, since untyped makes no boost here + function makeTable$1() { + var c, table = []; + + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); + } + table[n] = c; + } + + return table; + } + + // Create table on load. Just 255 signed longs. Not a problem. + var crcTable$1 = makeTable$1(); + + + function crc32$1(crc, buf, len, pos) { + var t = crcTable$1, + end = pos + len; + + crc ^= -1; + + for (var i = pos; i < end; i++) { + crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + } + + return (crc ^ (-1)); // >>> 0; + } + + + var crc32_1$1 = crc32$1; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + var messages$1 = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + + + + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + /* Allowed flush values; see deflate() and inflate() below for details */ + var Z_NO_FLUSH$2 = 0; + var Z_PARTIAL_FLUSH$1 = 1; + //var Z_SYNC_FLUSH = 2; + var Z_FULL_FLUSH$1 = 3; + var Z_FINISH$3 = 4; + var Z_BLOCK$2 = 5; + //var Z_TREES = 6; + + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + var Z_OK$3 = 0; + var Z_STREAM_END$3 = 1; + //var Z_NEED_DICT = 2; + //var Z_ERRNO = -1; + var Z_STREAM_ERROR$2 = -2; + var Z_DATA_ERROR$2 = -3; + //var Z_MEM_ERROR = -4; + var Z_BUF_ERROR$2 = -5; + //var Z_VERSION_ERROR = -6; + + + /* compression levels */ + //var Z_NO_COMPRESSION = 0; + //var Z_BEST_SPEED = 1; + //var Z_BEST_COMPRESSION = 9; + var Z_DEFAULT_COMPRESSION$2 = -1; + + + var Z_FILTERED$1 = 1; + var Z_HUFFMAN_ONLY$1 = 2; + var Z_RLE$1 = 3; + var Z_FIXED$3 = 4; + var Z_DEFAULT_STRATEGY$2 = 0; + + /* Possible values of the data_type field (though see inflate()) */ + //var Z_BINARY = 0; + //var Z_TEXT = 1; + //var Z_ASCII = 1; // = Z_TEXT + var Z_UNKNOWN$3 = 2; + + + /* The deflate compression method */ + var Z_DEFLATED$3 = 8; + + /*============================================================================*/ + + + var MAX_MEM_LEVEL$1 = 9; + /* Maximum value for memLevel in deflateInit2 */ + var MAX_WBITS$2 = 15; + /* 32K LZ77 window */ + var DEF_MEM_LEVEL$1 = 8; + + + var LENGTH_CODES$3 = 29; + /* number of length codes, not counting the special END_BLOCK code */ + var LITERALS$3 = 256; + /* number of literal bytes 0..255 */ + var L_CODES$3 = LITERALS$3 + 1 + LENGTH_CODES$3; + /* number of Literal or Length codes, including the END_BLOCK code */ + var D_CODES$3 = 30; + /* number of distance codes */ + var BL_CODES$3 = 19; + /* number of codes used to transfer the bit lengths */ + var HEAP_SIZE$3 = 2 * L_CODES$3 + 1; + /* maximum heap size */ + var MAX_BITS$3 = 15; + /* All codes must not exceed MAX_BITS bits */ + + var MIN_MATCH$3 = 3; + var MAX_MATCH$3 = 258; + var MIN_LOOKAHEAD$1 = (MAX_MATCH$3 + MIN_MATCH$3 + 1); + + var PRESET_DICT$1 = 0x20; + + var INIT_STATE$1 = 42; + var EXTRA_STATE$1 = 69; + var NAME_STATE$1 = 73; + var COMMENT_STATE$1 = 91; + var HCRC_STATE$1 = 103; + var BUSY_STATE$1 = 113; + var FINISH_STATE$1 = 666; + + var BS_NEED_MORE$1 = 1; /* block not completed, need more input or more output */ + var BS_BLOCK_DONE$1 = 2; /* block flush performed */ + var BS_FINISH_STARTED$1 = 3; /* finish started, need only more output at next deflate */ + var BS_FINISH_DONE$1 = 4; /* finish done, accept no more input or output */ + + var OS_CODE$1 = 0x03; // Unix :) . Don't detect, use this default. + + function err$1(strm, errorCode) { + strm.msg = messages$1[errorCode]; + return errorCode; + } + + function rank$1(f) { + return ((f) << 1) - ((f) > 4 ? 9 : 0); + } + + function zero$3(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + + + /* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->output buffer and copying into it. + * (See also read_buf()). + */ + function flush_pending$1(strm) { + var s = strm.state; + + //_tr_flush_bits(s); + var len = s.pending; + if (len > strm.avail_out) { + len = strm.avail_out; + } + if (len === 0) { return; } + + common$1.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); + strm.next_out += len; + s.pending_out += len; + strm.total_out += len; + strm.avail_out -= len; + s.pending -= len; + if (s.pending === 0) { + s.pending_out = 0; + } + } + + + function flush_block_only$1(s, last) { + trees$1._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); + s.block_start = s.strstart; + flush_pending$1(s.strm); + } + + + function put_byte$1(s, b) { + s.pending_buf[s.pending++] = b; + } + + + /* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ + function putShortMSB$1(s, b) { + // put_byte(s, (Byte)(b >> 8)); + // put_byte(s, (Byte)(b & 0xff)); + s.pending_buf[s.pending++] = (b >>> 8) & 0xff; + s.pending_buf[s.pending++] = b & 0xff; + } + + + /* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->input buffer and copying from it. + * (See also flush_pending()). + */ + function read_buf$1(strm, buf, start, size) { + var len = strm.avail_in; + + if (len > size) { len = size; } + if (len === 0) { return 0; } + + strm.avail_in -= len; + + // zmemcpy(buf, strm->next_in, len); + common$1.arraySet(buf, strm.input, strm.next_in, len, start); + if (strm.state.wrap === 1) { + strm.adler = adler32_1$1(strm.adler, buf, len, start); + } + + else if (strm.state.wrap === 2) { + strm.adler = crc32_1$1(strm.adler, buf, len, start); + } + + strm.next_in += len; + strm.total_in += len; + + return len; + } + + + /* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ + function longest_match$1(s, cur_match) { + var chain_length = s.max_chain_length; /* max hash chain length */ + var scan = s.strstart; /* current string */ + var match; /* matched string */ + var len; /* length of current match */ + var best_len = s.prev_length; /* best match length so far */ + var nice_match = s.nice_match; /* stop if match long enough */ + var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD$1)) ? + s.strstart - (s.w_size - MIN_LOOKAHEAD$1) : 0/*NIL*/; + + var _win = s.window; // shortcut + + var wmask = s.w_mask; + var prev = s.prev; + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + + var strend = s.strstart + MAX_MATCH$3; + var scan_end1 = _win[scan + best_len - 1]; + var scan_end = _win[scan + best_len]; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s.prev_length >= s.good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if (nice_match > s.lookahead) { nice_match = s.lookahead; } + + // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + // Assert(cur_match < s->strstart, "no future"); + match = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ + + if (_win[match + best_len] !== scan_end || + _win[match + best_len - 1] !== scan_end1 || + _win[match] !== _win[scan] || + _win[++match] !== _win[scan + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2; + match++; + // Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + /*jshint noempty:false*/ + } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + scan < strend); + + // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH$3 - (strend - scan); + scan = strend - MAX_MATCH$3; + + if (len > best_len) { + s.match_start = cur_match; + best_len = len; + if (len >= nice_match) { + break; + } + scan_end1 = _win[scan + best_len - 1]; + scan_end = _win[scan + best_len]; + } + } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); + + if (best_len <= s.lookahead) { + return best_len; + } + return s.lookahead; + } + + + /* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ + function fill_window$1(s) { + var _w_size = s.w_size; + var p, n, m, more, str; + + //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = s.window_size - s.lookahead - s.strstart; + + // JS ints have 32 bit, block below not needed + /* Deal with !@#$% 64K limit: */ + //if (sizeof(int) <= 2) { + // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + // more = wsize; + // + // } else if (more == (unsigned)(-1)) { + // /* Very unlikely, but possible on 16 bit machine if + // * strstart == 0 && lookahead == 1 (input done a byte at time) + // */ + // more--; + // } + //} + + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD$1)) { + + common$1.arraySet(s.window, s.window, _w_size, _w_size, 0); + s.match_start -= _w_size; + s.strstart -= _w_size; + /* we now have strstart >= MAX_DIST */ + s.block_start -= _w_size; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + + n = s.hash_size; + p = n; + do { + m = s.head[--p]; + s.head[p] = (m >= _w_size ? m - _w_size : 0); + } while (--n); + + n = _w_size; + p = n; + do { + m = s.prev[--p]; + s.prev[p] = (m >= _w_size ? m - _w_size : 0); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); + + more += _w_size; + } + if (s.strm.avail_in === 0) { + break; + } + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + //Assert(more >= 2, "more < 2"); + n = read_buf$1(s.strm, s.window, s.strstart + s.lookahead, more); + s.lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s.lookahead + s.insert >= MIN_MATCH$3) { + str = s.strstart - s.insert; + s.ins_h = s.window[str]; + + /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; + //#if MIN_MATCH != 3 + // Call update_hash() MIN_MATCH-3 more times + //#endif + while (s.insert) { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$3 - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = str; + str++; + s.insert--; + if (s.lookahead + s.insert < MIN_MATCH$3) { + break; + } + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s.lookahead < MIN_LOOKAHEAD$1 && s.strm.avail_in !== 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + // if (s.high_water < s.window_size) { + // var curr = s.strstart + s.lookahead; + // var init = 0; + // + // if (s.high_water < curr) { + // /* Previous high water mark below current data -- zero WIN_INIT + // * bytes or up to end of window, whichever is less. + // */ + // init = s.window_size - curr; + // if (init > WIN_INIT) + // init = WIN_INIT; + // zmemzero(s->window + curr, (unsigned)init); + // s->high_water = curr + init; + // } + // else if (s->high_water < (ulg)curr + WIN_INIT) { + // /* High water mark at or above current data, but below current data + // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + // * to end of window, whichever is less. + // */ + // init = (ulg)curr + WIN_INIT - s->high_water; + // if (init > s->window_size - s->high_water) + // init = s->window_size - s->high_water; + // zmemzero(s->window + s->high_water, (unsigned)init); + // s->high_water += init; + // } + // } + // + // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + // "not enough room for search"); + } + + /* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ + function deflate_stored$1(s, flush) { + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + var max_block_size = 0xffff; + + if (max_block_size > s.pending_buf_size - 5) { + max_block_size = s.pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s.lookahead <= 1) { + + //Assert(s->strstart < s->w_size+MAX_DIST(s) || + // s->block_start >= (long)s->w_size, "slide too late"); + // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || + // s.block_start >= s.w_size)) { + // throw new Error("slide too late"); + // } + + fill_window$1(s); + if (s.lookahead === 0 && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE$1; + } + + if (s.lookahead === 0) { + break; + } + /* flush the current block */ + } + //Assert(s->block_start >= 0L, "block gone"); + // if (s.block_start < 0) throw new Error("block gone"); + + s.strstart += s.lookahead; + s.lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + var max_start = s.block_start + max_block_size; + + if (s.strstart === 0 || s.strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s.lookahead = s.strstart - max_start; + s.strstart = max_start; + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + + + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD$1)) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + } + + s.insert = 0; + + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$1(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$1; + } + /***/ + return BS_FINISH_DONE$1; + } + + if (s.strstart > s.block_start) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + + return BS_NEED_MORE$1; + } + + /* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + function deflate_fast$1(s, flush) { + var hash_head; /* head of the hash chain */ + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD$1) { + fill_window$1(s); + if (s.lookahead < MIN_LOOKAHEAD$1 && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE$1; + } + if (s.lookahead === 0) { + break; /* flush the current block */ + } + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH$3) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$3 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD$1))) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match$1(s, hash_head); + /* longest_match() sets match_start */ + } + if (s.match_length >= MIN_MATCH$3) { + // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only + + /*** _tr_tally_dist(s, s.strstart - s.match_start, + s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees$1._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$3); + + s.lookahead -= s.match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$3) { + s.match_length--; /* string at strstart already in table */ + do { + s.strstart++; + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$3 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s.match_length !== 0); + s.strstart++; + } else + { + s.strstart += s.match_length; + s.match_length = 0; + s.ins_h = s.window[s.strstart]; + /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s.window[s.strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees$1._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + } + s.insert = ((s.strstart < (MIN_MATCH$3 - 1)) ? s.strstart : MIN_MATCH$3 - 1); + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$1(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$1; + } + /***/ + return BS_FINISH_DONE$1; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + return BS_BLOCK_DONE$1; + } + + /* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + function deflate_slow$1(s, flush) { + var hash_head; /* head of hash chain */ + var bflush; /* set if current block must be flushed */ + + var max_insert; + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD$1) { + fill_window$1(s); + if (s.lookahead < MIN_LOOKAHEAD$1 && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE$1; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH$3) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$3 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + */ + s.prev_length = s.match_length; + s.prev_match = s.match_start; + s.match_length = MIN_MATCH$3 - 1; + + if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && + s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD$1)/*MAX_DIST(s)*/) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match$1(s, hash_head); + /* longest_match() sets match_start */ + + if (s.match_length <= 5 && + (s.strategy === Z_FILTERED$1 || (s.match_length === MIN_MATCH$3 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s.match_length = MIN_MATCH$3 - 1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s.prev_length >= MIN_MATCH$3 && s.match_length <= s.prev_length) { + max_insert = s.strstart + s.lookahead - MIN_MATCH$3; + /* Do not insert strings in hash table beyond this. */ + + //check_match(s, s.strstart-1, s.prev_match, s.prev_length); + + /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, + s.prev_length - MIN_MATCH, bflush);***/ + bflush = trees$1._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$3); + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s.lookahead -= s.prev_length - 1; + s.prev_length -= 2; + do { + if (++s.strstart <= max_insert) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$3 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + } while (--s.prev_length !== 0); + s.match_available = 0; + s.match_length = MIN_MATCH$3 - 1; + s.strstart++; + + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + + } else if (s.match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees$1._tr_tally(s, 0, s.window[s.strstart - 1]); + + if (bflush) { + /*** FLUSH_BLOCK_ONLY(s, 0) ***/ + flush_block_only$1(s, false); + /***/ + } + s.strstart++; + s.lookahead--; + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s.match_available = 1; + s.strstart++; + s.lookahead--; + } + } + //Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s.match_available) { + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees$1._tr_tally(s, 0, s.window[s.strstart - 1]); + + s.match_available = 0; + } + s.insert = s.strstart < MIN_MATCH$3 - 1 ? s.strstart : MIN_MATCH$3 - 1; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$1(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$1; + } + /***/ + return BS_FINISH_DONE$1; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + + return BS_BLOCK_DONE$1; + } + + + /* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ + function deflate_rle$1(s, flush) { + var bflush; /* set if current block must be flushed */ + var prev; /* byte at distance one to match */ + var scan, strend; /* scan goes up to strend for length of run */ + + var _win = s.window; + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s.lookahead <= MAX_MATCH$3) { + fill_window$1(s); + if (s.lookahead <= MAX_MATCH$3 && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE$1; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s.match_length = 0; + if (s.lookahead >= MIN_MATCH$3 && s.strstart > 0) { + scan = s.strstart - 1; + prev = _win[scan]; + if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { + strend = s.strstart + MAX_MATCH$3; + do { + /*jshint noempty:false*/ + } while (prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + scan < strend); + s.match_length = MAX_MATCH$3 - (strend - scan); + if (s.match_length > s.lookahead) { + s.match_length = s.lookahead; + } + } + //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s.match_length >= MIN_MATCH$3) { + //check_match(s, s.strstart, s.strstart - 1, s.match_length); + + /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees$1._tr_tally(s, 1, s.match_length - MIN_MATCH$3); + + s.lookahead -= s.match_length; + s.strstart += s.match_length; + s.match_length = 0; + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees$1._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$1(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$1; + } + /***/ + return BS_FINISH_DONE$1; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + return BS_BLOCK_DONE$1; + } + + /* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ + function deflate_huff$1(s, flush) { + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s.lookahead === 0) { + fill_window$1(s); + if (s.lookahead === 0) { + if (flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE$1; + } + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s.match_length = 0; + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees$1._tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$1(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$1; + } + /***/ + return BS_FINISH_DONE$1; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$1(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$1; + } + /***/ + } + return BS_BLOCK_DONE$1; + } + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + function Config$1(good_length, max_lazy, nice_length, max_chain, func) { + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; + } + + var configuration_table$1; + + configuration_table$1 = [ + /* good lazy nice chain */ + new Config$1(0, 0, 0, 0, deflate_stored$1), /* 0 store only */ + new Config$1(4, 4, 8, 4, deflate_fast$1), /* 1 max speed, no lazy matches */ + new Config$1(4, 5, 16, 8, deflate_fast$1), /* 2 */ + new Config$1(4, 6, 32, 32, deflate_fast$1), /* 3 */ + + new Config$1(4, 4, 16, 16, deflate_slow$1), /* 4 lazy matches */ + new Config$1(8, 16, 32, 32, deflate_slow$1), /* 5 */ + new Config$1(8, 16, 128, 128, deflate_slow$1), /* 6 */ + new Config$1(8, 32, 128, 256, deflate_slow$1), /* 7 */ + new Config$1(32, 128, 258, 1024, deflate_slow$1), /* 8 */ + new Config$1(32, 258, 258, 4096, deflate_slow$1) /* 9 max compression */ + ]; + + + /* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ + function lm_init$1(s) { + s.window_size = 2 * s.w_size; + + /*** CLEAR_HASH(s); ***/ + zero$3(s.head); // Fill with NIL (= 0); + + /* Set the default configuration parameters: + */ + s.max_lazy_match = configuration_table$1[s.level].max_lazy; + s.good_match = configuration_table$1[s.level].good_length; + s.nice_match = configuration_table$1[s.level].nice_length; + s.max_chain_length = configuration_table$1[s.level].max_chain; + + s.strstart = 0; + s.block_start = 0; + s.lookahead = 0; + s.insert = 0; + s.match_length = s.prev_length = MIN_MATCH$3 - 1; + s.match_available = 0; + s.ins_h = 0; + } + + + function DeflateState$1() { + this.strm = null; /* pointer back to this zlib stream */ + this.status = 0; /* as the name implies */ + this.pending_buf = null; /* output still pending */ + this.pending_buf_size = 0; /* size of pending_buf */ + this.pending_out = 0; /* next pending byte to output to the stream */ + this.pending = 0; /* nb of bytes in the pending buffer */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.gzhead = null; /* gzip header information to write */ + this.gzindex = 0; /* where in extra, name, or comment */ + this.method = Z_DEFLATED$3; /* can only be DEFLATED */ + this.last_flush = -1; /* value of flush param for previous deflate call */ + + this.w_size = 0; /* LZ77 window size (32K by default) */ + this.w_bits = 0; /* log2(w_size) (8..16) */ + this.w_mask = 0; /* w_size - 1 */ + + this.window = null; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. + */ + + this.window_size = 0; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + this.prev = null; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + this.head = null; /* Heads of the hash chains or NIL. */ + + this.ins_h = 0; /* hash index of string to be inserted */ + this.hash_size = 0; /* number of elements in hash table */ + this.hash_bits = 0; /* log2(hash_size) */ + this.hash_mask = 0; /* hash_size-1 */ + + this.hash_shift = 0; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + this.block_start = 0; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + this.match_length = 0; /* length of best match */ + this.prev_match = 0; /* previous match */ + this.match_available = 0; /* set if previous match exists */ + this.strstart = 0; /* start of string to insert */ + this.match_start = 0; /* start of matching string */ + this.lookahead = 0; /* number of valid bytes ahead in window */ + + this.prev_length = 0; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + this.max_chain_length = 0; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + this.max_lazy_match = 0; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ + // That's alias to max_lazy_match, don't use directly + //this.max_insert_length = 0; + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + this.level = 0; /* compression level (1..9) */ + this.strategy = 0; /* favor or force Huffman coding*/ + + this.good_match = 0; + /* Use a faster search when the previous match is longer than this */ + + this.nice_match = 0; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + + /* Didn't use ct_data typedef below to suppress compiler warning */ + + // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + // Use flat array of DOUBLE size, with interleaved fata, + // because JS does not support effective + this.dyn_ltree = new common$1.Buf16(HEAP_SIZE$3 * 2); + this.dyn_dtree = new common$1.Buf16((2 * D_CODES$3 + 1) * 2); + this.bl_tree = new common$1.Buf16((2 * BL_CODES$3 + 1) * 2); + zero$3(this.dyn_ltree); + zero$3(this.dyn_dtree); + zero$3(this.bl_tree); + + this.l_desc = null; /* desc. for literal tree */ + this.d_desc = null; /* desc. for distance tree */ + this.bl_desc = null; /* desc. for bit length tree */ + + //ush bl_count[MAX_BITS+1]; + this.bl_count = new common$1.Buf16(MAX_BITS$3 + 1); + /* number of codes at each bit length for an optimal tree */ + + //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + this.heap = new common$1.Buf16(2 * L_CODES$3 + 1); /* heap used to build the Huffman trees */ + zero$3(this.heap); + + this.heap_len = 0; /* number of elements in the heap */ + this.heap_max = 0; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + this.depth = new common$1.Buf16(2 * L_CODES$3 + 1); //uch depth[2*L_CODES+1]; + zero$3(this.depth); + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + this.l_buf = 0; /* buffer index for literals or lengths */ + + this.lit_bufsize = 0; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + this.last_lit = 0; /* running index in l_buf */ + + this.d_buf = 0; + /* Buffer index for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + this.opt_len = 0; /* bit length of current block with optimal trees */ + this.static_len = 0; /* bit length of current block with static trees */ + this.matches = 0; /* number of string matches in current block */ + this.insert = 0; /* bytes at end of window left to insert */ + + + this.bi_buf = 0; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + this.bi_valid = 0; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + // Used for window memory init. We safely ignore it for JS. That makes + // sense only for pointers and memory check tools. + //this.high_water = 0; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + } + + + function deflateResetKeep$1(strm) { + var s; + + if (!strm || !strm.state) { + return err$1(strm, Z_STREAM_ERROR$2); + } + + strm.total_in = strm.total_out = 0; + strm.data_type = Z_UNKNOWN$3; + + s = strm.state; + s.pending = 0; + s.pending_out = 0; + + if (s.wrap < 0) { + s.wrap = -s.wrap; + /* was made negative by deflate(..., Z_FINISH); */ + } + s.status = (s.wrap ? INIT_STATE$1 : BUSY_STATE$1); + strm.adler = (s.wrap === 2) ? + 0 // crc32(0, Z_NULL, 0) + : + 1; // adler32(0, Z_NULL, 0) + s.last_flush = Z_NO_FLUSH$2; + trees$1._tr_init(s); + return Z_OK$3; + } + + + function deflateReset$1(strm) { + var ret = deflateResetKeep$1(strm); + if (ret === Z_OK$3) { + lm_init$1(strm.state); + } + return ret; + } + + + function deflateSetHeader$1(strm, head) { + if (!strm || !strm.state) { return Z_STREAM_ERROR$2; } + if (strm.state.wrap !== 2) { return Z_STREAM_ERROR$2; } + strm.state.gzhead = head; + return Z_OK$3; + } + + + function deflateInit2$1(strm, level, method, windowBits, memLevel, strategy) { + if (!strm) { // === Z_NULL + return Z_STREAM_ERROR$2; + } + var wrap = 1; + + if (level === Z_DEFAULT_COMPRESSION$2) { + level = 6; + } + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } + + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } + + + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL$1 || method !== Z_DEFLATED$3 || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED$3) { + return err$1(strm, Z_STREAM_ERROR$2); + } + + + if (windowBits === 8) { + windowBits = 9; + } + /* until 256-byte window bug fixed */ + + var s = new DeflateState$1(); + + strm.state = s; + s.strm = strm; + + s.wrap = wrap; + s.gzhead = null; + s.w_bits = windowBits; + s.w_size = 1 << s.w_bits; + s.w_mask = s.w_size - 1; + + s.hash_bits = memLevel + 7; + s.hash_size = 1 << s.hash_bits; + s.hash_mask = s.hash_size - 1; + s.hash_shift = ~~((s.hash_bits + MIN_MATCH$3 - 1) / MIN_MATCH$3); + + s.window = new common$1.Buf8(s.w_size * 2); + s.head = new common$1.Buf16(s.hash_size); + s.prev = new common$1.Buf16(s.w_size); + + // Don't need mem init magic for JS. + //s.high_water = 0; /* nothing written to s->window yet */ + + s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + s.pending_buf_size = s.lit_bufsize * 4; + + //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + //s->pending_buf = (uchf *) overlay; + s.pending_buf = new common$1.Buf8(s.pending_buf_size); + + // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) + //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s.d_buf = 1 * s.lit_bufsize; + + //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s.l_buf = (1 + 2) * s.lit_bufsize; + + s.level = level; + s.strategy = strategy; + s.method = method; + + return deflateReset$1(strm); + } + + function deflateInit$1(strm, level) { + return deflateInit2$1(strm, level, Z_DEFLATED$3, MAX_WBITS$2, DEF_MEM_LEVEL$1, Z_DEFAULT_STRATEGY$2); + } + + + function deflate$2(strm, flush) { + var old_flush, s; + var beg, val; // for gzip header write only + + if (!strm || !strm.state || + flush > Z_BLOCK$2 || flush < 0) { + return strm ? err$1(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2; + } + + s = strm.state; + + if (!strm.output || + (!strm.input && strm.avail_in !== 0) || + (s.status === FINISH_STATE$1 && flush !== Z_FINISH$3)) { + return err$1(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$2 : Z_STREAM_ERROR$2); + } + + s.strm = strm; /* just in case */ + old_flush = s.last_flush; + s.last_flush = flush; + + /* Write the header */ + if (s.status === INIT_STATE$1) { + + if (s.wrap === 2) { // GZIP header + strm.adler = 0; //crc32(0L, Z_NULL, 0); + put_byte$1(s, 31); + put_byte$1(s, 139); + put_byte$1(s, 8); + if (!s.gzhead) { // s->gzhead == Z_NULL + put_byte$1(s, 0); + put_byte$1(s, 0); + put_byte$1(s, 0); + put_byte$1(s, 0); + put_byte$1(s, 0); + put_byte$1(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY$1 || s.level < 2 ? + 4 : 0)); + put_byte$1(s, OS_CODE$1); + s.status = BUSY_STATE$1; + } + else { + put_byte$1(s, (s.gzhead.text ? 1 : 0) + + (s.gzhead.hcrc ? 2 : 0) + + (!s.gzhead.extra ? 0 : 4) + + (!s.gzhead.name ? 0 : 8) + + (!s.gzhead.comment ? 0 : 16) + ); + put_byte$1(s, s.gzhead.time & 0xff); + put_byte$1(s, (s.gzhead.time >> 8) & 0xff); + put_byte$1(s, (s.gzhead.time >> 16) & 0xff); + put_byte$1(s, (s.gzhead.time >> 24) & 0xff); + put_byte$1(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY$1 || s.level < 2 ? + 4 : 0)); + put_byte$1(s, s.gzhead.os & 0xff); + if (s.gzhead.extra && s.gzhead.extra.length) { + put_byte$1(s, s.gzhead.extra.length & 0xff); + put_byte$1(s, (s.gzhead.extra.length >> 8) & 0xff); + } + if (s.gzhead.hcrc) { + strm.adler = crc32_1$1(strm.adler, s.pending_buf, s.pending, 0); + } + s.gzindex = 0; + s.status = EXTRA_STATE$1; + } + } + else // DEFLATE header + { + var header = (Z_DEFLATED$3 + ((s.w_bits - 8) << 4)) << 8; + var level_flags = -1; + + if (s.strategy >= Z_HUFFMAN_ONLY$1 || s.level < 2) { + level_flags = 0; + } else if (s.level < 6) { + level_flags = 1; + } else if (s.level === 6) { + level_flags = 2; + } else { + level_flags = 3; + } + header |= (level_flags << 6); + if (s.strstart !== 0) { header |= PRESET_DICT$1; } + header += 31 - (header % 31); + + s.status = BUSY_STATE$1; + putShortMSB$1(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s.strstart !== 0) { + putShortMSB$1(s, strm.adler >>> 16); + putShortMSB$1(s, strm.adler & 0xffff); + } + strm.adler = 1; // adler32(0L, Z_NULL, 0); + } + } + + //#ifdef GZIP + if (s.status === EXTRA_STATE$1) { + if (s.gzhead.extra/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + + while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending$1(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + break; + } + } + put_byte$1(s, s.gzhead.extra[s.gzindex] & 0xff); + s.gzindex++; + } + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (s.gzindex === s.gzhead.extra.length) { + s.gzindex = 0; + s.status = NAME_STATE$1; + } + } + else { + s.status = NAME_STATE$1; + } + } + if (s.status === NAME_STATE$1) { + if (s.gzhead.name/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; + + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending$1(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.name.length) { + val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte$1(s, val); + } while (val !== 0); + + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.gzindex = 0; + s.status = COMMENT_STATE$1; + } + } + else { + s.status = COMMENT_STATE$1; + } + } + if (s.status === COMMENT_STATE$1) { + if (s.gzhead.comment/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; + + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending$1(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.comment.length) { + val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte$1(s, val); + } while (val !== 0); + + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.status = HCRC_STATE$1; + } + } + else { + s.status = HCRC_STATE$1; + } + } + if (s.status === HCRC_STATE$1) { + if (s.gzhead.hcrc) { + if (s.pending + 2 > s.pending_buf_size) { + flush_pending$1(strm); + } + if (s.pending + 2 <= s.pending_buf_size) { + put_byte$1(s, strm.adler & 0xff); + put_byte$1(s, (strm.adler >> 8) & 0xff); + strm.adler = 0; //crc32(0L, Z_NULL, 0); + s.status = BUSY_STATE$1; + } + } + else { + s.status = BUSY_STATE$1; + } + } + //#endif + + /* Flush as much pending output as possible */ + if (s.pending !== 0) { + flush_pending$1(strm); + if (strm.avail_out === 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s.last_flush = -1; + return Z_OK$3; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm.avail_in === 0 && rank$1(flush) <= rank$1(old_flush) && + flush !== Z_FINISH$3) { + return err$1(strm, Z_BUF_ERROR$2); + } + + /* User must not provide more input after the first FINISH: */ + if (s.status === FINISH_STATE$1 && strm.avail_in !== 0) { + return err$1(strm, Z_BUF_ERROR$2); + } + + /* Start a new block or continue the current one. + */ + if (strm.avail_in !== 0 || s.lookahead !== 0 || + (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE$1)) { + var bstate = (s.strategy === Z_HUFFMAN_ONLY$1) ? deflate_huff$1(s, flush) : + (s.strategy === Z_RLE$1 ? deflate_rle$1(s, flush) : + configuration_table$1[s.level].func(s, flush)); + + if (bstate === BS_FINISH_STARTED$1 || bstate === BS_FINISH_DONE$1) { + s.status = FINISH_STATE$1; + } + if (bstate === BS_NEED_MORE$1 || bstate === BS_FINISH_STARTED$1) { + if (strm.avail_out === 0) { + s.last_flush = -1; + /* avoid BUF_ERROR next call, see above */ + } + return Z_OK$3; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate === BS_BLOCK_DONE$1) { + if (flush === Z_PARTIAL_FLUSH$1) { + trees$1._tr_align(s); + } + else if (flush !== Z_BLOCK$2) { /* FULL_FLUSH or SYNC_FLUSH */ + + trees$1._tr_stored_block(s, 0, 0, false); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush === Z_FULL_FLUSH$1) { + /*** CLEAR_HASH(s); ***/ /* forget history */ + zero$3(s.head); // Fill with NIL (= 0); + + if (s.lookahead === 0) { + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + } + } + flush_pending$1(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK$3; + } + } + } + //Assert(strm->avail_out > 0, "bug2"); + //if (strm.avail_out <= 0) { throw new Error("bug2");} + + if (flush !== Z_FINISH$3) { return Z_OK$3; } + if (s.wrap <= 0) { return Z_STREAM_END$3; } + + /* Write the trailer */ + if (s.wrap === 2) { + put_byte$1(s, strm.adler & 0xff); + put_byte$1(s, (strm.adler >> 8) & 0xff); + put_byte$1(s, (strm.adler >> 16) & 0xff); + put_byte$1(s, (strm.adler >> 24) & 0xff); + put_byte$1(s, strm.total_in & 0xff); + put_byte$1(s, (strm.total_in >> 8) & 0xff); + put_byte$1(s, (strm.total_in >> 16) & 0xff); + put_byte$1(s, (strm.total_in >> 24) & 0xff); + } + else + { + putShortMSB$1(s, strm.adler >>> 16); + putShortMSB$1(s, strm.adler & 0xffff); + } + + flush_pending$1(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s.wrap > 0) { s.wrap = -s.wrap; } + /* write the trailer only once! */ + return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3; + } + + function deflateEnd$1(strm) { + var status; + + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR$2; + } + + status = strm.state.status; + if (status !== INIT_STATE$1 && + status !== EXTRA_STATE$1 && + status !== NAME_STATE$1 && + status !== COMMENT_STATE$1 && + status !== HCRC_STATE$1 && + status !== BUSY_STATE$1 && + status !== FINISH_STATE$1 + ) { + return err$1(strm, Z_STREAM_ERROR$2); + } + + strm.state = null; + + return status === BUSY_STATE$1 ? err$1(strm, Z_DATA_ERROR$2) : Z_OK$3; + } + + + /* ========================================================================= + * Initializes the compression dictionary from the given byte + * sequence without producing any compressed output. + */ + function deflateSetDictionary$1(strm, dictionary) { + var dictLength = dictionary.length; + + var s; + var str, n; + var wrap; + var avail; + var next; + var input; + var tmpDict; + + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR$2; + } + + s = strm.state; + wrap = s.wrap; + + if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE$1) || s.lookahead) { + return Z_STREAM_ERROR$2; + } + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap === 1) { + /* adler32(strm->adler, dictionary, dictLength); */ + strm.adler = adler32_1$1(strm.adler, dictionary, dictLength, 0); + } + + s.wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s.w_size) { + if (wrap === 0) { /* already empty otherwise */ + /*** CLEAR_HASH(s); ***/ + zero$3(s.head); // Fill with NIL (= 0); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + /* use the tail */ + // dictionary = dictionary.slice(dictLength - s.w_size); + tmpDict = new common$1.Buf8(s.w_size); + common$1.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + /* insert dictionary into window and hash */ + avail = strm.avail_in; + next = strm.next_in; + input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window$1(s); + while (s.lookahead >= MIN_MATCH$3) { + str = s.strstart; + n = s.lookahead - (MIN_MATCH$3 - 1); + do { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$3 - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + + s.head[s.ins_h] = str; + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH$3 - 1; + fill_window$1(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH$3 - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK$3; + } + + + var deflateInit_1$1 = deflateInit$1; + var deflateInit2_1$1 = deflateInit2$1; + var deflateReset_1$1 = deflateReset$1; + var deflateResetKeep_1$1 = deflateResetKeep$1; + var deflateSetHeader_1$1 = deflateSetHeader$1; + var deflate_2$2 = deflate$2; + var deflateEnd_1$1 = deflateEnd$1; + var deflateSetDictionary_1$1 = deflateSetDictionary$1; + var deflateInfo$1 = 'pako deflate (from Nodeca project)'; + + /* Not implemented + exports.deflateBound = deflateBound; + exports.deflateCopy = deflateCopy; + exports.deflateParams = deflateParams; + exports.deflatePending = deflatePending; + exports.deflatePrime = deflatePrime; + exports.deflateTune = deflateTune; + */ + + var deflate_1$2 = { + deflateInit: deflateInit_1$1, + deflateInit2: deflateInit2_1$1, + deflateReset: deflateReset_1$1, + deflateResetKeep: deflateResetKeep_1$1, + deflateSetHeader: deflateSetHeader_1$1, + deflate: deflate_2$2, + deflateEnd: deflateEnd_1$1, + deflateSetDictionary: deflateSetDictionary_1$1, + deflateInfo: deflateInfo$1 + }; + + // Quick check if we can use fast array to bin string conversion + // + // - apply(Array) can fail on Android 2.2 + // - apply(Uint8Array) can fail on iOS 5.1 Safari + // + var STR_APPLY_OK$1 = true; + var STR_APPLY_UIA_OK$1 = true; + + try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK$1 = false; } + try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK$1 = false; } + + + // Table with utf8 lengths (calculated by first byte of sequence) + // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, + // because max possible codepoint is 0x10ffff + var _utf8len$1 = new common$1.Buf8(256); + for (var q$1 = 0; q$1 < 256; q$1++) { + _utf8len$1[q$1] = (q$1 >= 252 ? 6 : q$1 >= 248 ? 5 : q$1 >= 240 ? 4 : q$1 >= 224 ? 3 : q$1 >= 192 ? 2 : 1); + } + _utf8len$1[254] = _utf8len$1[254] = 1; // Invalid sequence start + + + // convert string to array (typed, when possible) + var string2buf$1 = function (str) { + var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; + + // count binary size + for (m_pos = 0; m_pos < str_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; + } + + // allocate buffer + buf = new common$1.Buf8(buf_len); + + // convert + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + if (c < 0x80) { + /* one byte */ + buf[i++] = c; + } else if (c < 0x800) { + /* two bytes */ + buf[i++] = 0xC0 | (c >>> 6); + buf[i++] = 0x80 | (c & 0x3f); + } else if (c < 0x10000) { + /* three bytes */ + buf[i++] = 0xE0 | (c >>> 12); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } else { + /* four bytes */ + buf[i++] = 0xf0 | (c >>> 18); + buf[i++] = 0x80 | (c >>> 12 & 0x3f); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } + } + + return buf; + }; + + // Helper (used in 2 places) + function buf2binstring$1(buf, len) { + // On Chrome, the arguments in a function call that are allowed is `65534`. + // If the length of the buffer is smaller than that, we can use this optimization, + // otherwise we will take a slower path. + if (len < 65534) { + if ((buf.subarray && STR_APPLY_UIA_OK$1) || (!buf.subarray && STR_APPLY_OK$1)) { + return String.fromCharCode.apply(null, common$1.shrinkBuf(buf, len)); + } + } + + var result = ''; + for (var i = 0; i < len; i++) { + result += String.fromCharCode(buf[i]); + } + return result; + } + + + // Convert byte array to binary string + var buf2binstring_1$1 = function (buf) { + return buf2binstring$1(buf, buf.length); + }; + + + // Convert binary string (typed, when possible) + var binstring2buf$1 = function (str) { + var buf = new common$1.Buf8(str.length); + for (var i = 0, len = buf.length; i < len; i++) { + buf[i] = str.charCodeAt(i); + } + return buf; + }; + + + // convert array to string + var buf2string$1 = function (buf, max) { + var i, out, c, c_len; + var len = max || buf.length; + + // Reserve max possible length (2 words per char) + // NB: by unknown reasons, Array is significantly faster for + // String.fromCharCode.apply than Uint16Array. + var utf16buf = new Array(len * 2); + + for (out = 0, i = 0; i < len;) { + c = buf[i++]; + // quick process ascii + if (c < 0x80) { utf16buf[out++] = c; continue; } + + c_len = _utf8len$1[c]; + // skip 5 & 6 byte codes + if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } + + // apply mask on first byte + c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; + // join the rest + while (c_len > 1 && i < len) { + c = (c << 6) | (buf[i++] & 0x3f); + c_len--; + } + + // terminated by end of string? + if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } + + if (c < 0x10000) { + utf16buf[out++] = c; + } else { + c -= 0x10000; + utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); + utf16buf[out++] = 0xdc00 | (c & 0x3ff); + } + } + + return buf2binstring$1(utf16buf, out); + }; + + + // Calculate max possible position in utf8 buffer, + // that will not break sequence. If that's not possible + // - (very small limits) return max size as is. + // + // buf[] - utf8 bytes array + // max - length limit (mandatory); + var utf8border$1 = function (buf, max) { + var pos; + + max = max || buf.length; + if (max > buf.length) { max = buf.length; } + + // go back from last position, until start of sequence found + pos = max - 1; + while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } + + // Very small and broken sequence, + // return max, because we should return something anyway. + if (pos < 0) { return max; } + + // If we came to start of buffer - that means buffer is too small, + // return max too. + if (pos === 0) { return max; } + + return (pos + _utf8len$1[buf[pos]] > max) ? pos : max; + }; + + var strings$1 = { + string2buf: string2buf$1, + buf2binstring: buf2binstring_1$1, + binstring2buf: binstring2buf$1, + buf2string: buf2string$1, + utf8border: utf8border$1 + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function ZStream$1() { + /* next input byte */ + this.input = null; // JS specific, because we have no pointers + this.next_in = 0; + /* number of bytes available at input */ + this.avail_in = 0; + /* total number of input bytes read so far */ + this.total_in = 0; + /* next output byte should be put there */ + this.output = null; // JS specific, because we have no pointers + this.next_out = 0; + /* remaining free space at output */ + this.avail_out = 0; + /* total number of bytes output so far */ + this.total_out = 0; + /* last error message, NULL if no error */ + this.msg = ''/*Z_NULL*/; + /* not visible by applications */ + this.state = null; + /* best guess about the data type: binary or text */ + this.data_type = 2/*Z_UNKNOWN*/; + /* adler32 value of the uncompressed data */ + this.adler = 0; + } + + var zstream$1 = ZStream$1; + + var toString$2 = Object.prototype.toString; + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + var Z_NO_FLUSH$3 = 0; + var Z_FINISH$4 = 4; + + var Z_OK$4 = 0; + var Z_STREAM_END$4 = 1; + var Z_SYNC_FLUSH$1 = 2; + + var Z_DEFAULT_COMPRESSION$3 = -1; + + var Z_DEFAULT_STRATEGY$3 = 0; + + var Z_DEFLATED$4 = 8; + + /* ===========================================================================*/ + + + /** + * class Deflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[deflate]], + * [[deflateRaw]] and [[gzip]]. + **/ + + /* internal + * Deflate.chunks -> Array + * + * Chunks of output data, if [[Deflate#onData]] not overridden. + **/ + + /** + * Deflate.result -> Uint8Array|Array + * + * Compressed result, generated by default [[Deflate#onData]] + * and [[Deflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Deflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ + + /** + * Deflate.err -> Number + * + * Error code after deflate finished. 0 (Z_OK) on success. + * You will not need it in real life, because deflate errors + * are possible only on wrong options or bad `onData` / `onEnd` + * custom handlers. + **/ + + /** + * Deflate.msg -> String + * + * Error message, if [[Deflate.err]] != 0 + **/ + + + /** + * new Deflate(options) + * - options (Object): zlib deflate options. + * + * Creates new deflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `level` + * - `windowBits` + * - `memLevel` + * - `strategy` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw deflate + * - `gzip` (Boolean) - create gzip wrapper + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * - `header` (Object) - custom header for gzip + * - `text` (Boolean) - true if compressed data believed to be text + * - `time` (Number) - modification time, unix timestamp + * - `os` (Number) - operation system code + * - `extra` (Array) - array of bytes with extra data (max 65536) + * - `name` (String) - file name (binary string) + * - `comment` (String) - comment (binary string) + * - `hcrc` (Boolean) - true if header crc should be added + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var deflate = new pako.Deflate({ level: 3}); + * + * deflate.push(chunk1, false); + * deflate.push(chunk2, true); // true -> last chunk + * + * if (deflate.err) { throw new Error(deflate.err); } + * + * console.log(deflate.result); + * ``` + **/ + function Deflate$1(options) { + if (!(this instanceof Deflate$1)) return new Deflate$1(options); + + this.options = common$1.assign({ + level: Z_DEFAULT_COMPRESSION$3, + method: Z_DEFLATED$4, + chunkSize: 16384, + windowBits: 15, + memLevel: 8, + strategy: Z_DEFAULT_STRATEGY$3, + to: '' + }, options || {}); + + var opt = this.options; + + if (opt.raw && (opt.windowBits > 0)) { + opt.windowBits = -opt.windowBits; + } + + else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { + opt.windowBits += 16; + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream$1(); + this.strm.avail_out = 0; + + var status = deflate_1$2.deflateInit2( + this.strm, + opt.level, + opt.method, + opt.windowBits, + opt.memLevel, + opt.strategy + ); + + if (status !== Z_OK$4) { + throw new Error(messages$1[status]); + } + + if (opt.header) { + deflate_1$2.deflateSetHeader(this.strm, opt.header); + } + + if (opt.dictionary) { + var dict; + // Convert data if needed + if (typeof opt.dictionary === 'string') { + // If we need to compress text, change encoding to utf8. + dict = strings$1.string2buf(opt.dictionary); + } else if (toString$2.call(opt.dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(opt.dictionary); + } else { + dict = opt.dictionary; + } + + status = deflate_1$2.deflateSetDictionary(this.strm, dict); + + if (status !== Z_OK$4) { + throw new Error(messages$1[status]); + } + + this._dict_set = true; + } + } + + /** + * Deflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be + * converted to utf8 byte sequence. + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with + * new compressed chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the compression context. + * + * On fail call [[Deflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * array format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ + Deflate$1.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var status, _mode; + + if (this.ended) { return false; } + + _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH$4 : Z_NO_FLUSH$3); + + // Convert data if needed + if (typeof data === 'string') { + // If we need to compress text, change encoding to utf8. + strm.input = strings$1.string2buf(data); + } else if (toString$2.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + do { + if (strm.avail_out === 0) { + strm.output = new common$1.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + status = deflate_1$2.deflate(strm, _mode); /* no bad return value */ + + if (status !== Z_STREAM_END$4 && status !== Z_OK$4) { + this.onEnd(status); + this.ended = true; + return false; + } + if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH$4 || _mode === Z_SYNC_FLUSH$1))) { + if (this.options.to === 'string') { + this.onData(strings$1.buf2binstring(common$1.shrinkBuf(strm.output, strm.next_out))); + } else { + this.onData(common$1.shrinkBuf(strm.output, strm.next_out)); + } + } + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END$4); + + // Finalize on the last chunk. + if (_mode === Z_FINISH$4) { + status = deflate_1$2.deflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === Z_OK$4; + } + + // callback interim results if Z_SYNC_FLUSH. + if (_mode === Z_SYNC_FLUSH$1) { + this.onEnd(Z_OK$4); + strm.avail_out = 0; + return true; + } + + return true; + }; + + + /** + * Deflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): output data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ + Deflate$1.prototype.onData = function (chunk) { + this.chunks.push(chunk); + }; + + + /** + * Deflate#onEnd(status) -> Void + * - status (Number): deflate status. 0 (Z_OK) on success, + * other if not. + * + * Called once after you tell deflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ + Deflate$1.prototype.onEnd = function (status) { + // On success - join + if (status === Z_OK$4) { + if (this.options.to === 'string') { + this.result = this.chunks.join(''); + } else { + this.result = common$1.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; + }; + + + /** + * deflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * Compress `data` with deflate algorithm and `options`. + * + * Supported options are: + * + * - level + * - windowBits + * - memLevel + * - strategy + * - dictionary + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , data = Uint8Array([1,2,3,4,5,6,7,8,9]); + * + * console.log(pako.deflate(data)); + * ``` + **/ + function deflate$3(input, options) { + var deflator = new Deflate$1(options); + + deflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (deflator.err) { throw deflator.msg || messages$1[deflator.err]; } + + return deflator.result; + } + + + /** + * deflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ + function deflateRaw$1(input, options) { + options = options || {}; + options.raw = true; + return deflate$3(input, options); + } + + + /** + * gzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but create gzip wrapper instead of + * deflate one. + **/ + function gzip$1(input, options) { + options = options || {}; + options.gzip = true; + return deflate$3(input, options); + } + + + var Deflate_1$1 = Deflate$1; + var deflate_2$3 = deflate$3; + var deflateRaw_1$1 = deflateRaw$1; + var gzip_1$1 = gzip$1; + + var deflate_1$3 = { + Deflate: Deflate_1$1, + deflate: deflate_2$3, + deflateRaw: deflateRaw_1$1, + gzip: gzip_1$1 + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + // See state defs from inflate.js + var BAD$2 = 30; /* got a data error -- remain here until reset */ + var TYPE$2 = 12; /* i: waiting for type bits, including last-flag bit */ + + /* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state.mode === LEN + strm.avail_in >= 6 + strm.avail_out >= 258 + start >= strm.avail_out + state.bits < 8 + + On return, state.mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm.avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm.avail_out >= 258 for each loop to avoid checking for + output space. + */ + var inffast$1 = function inflate_fast(strm, start) { + var state; + var _in; /* local strm.input */ + var last; /* have enough input while in < last */ + var _out; /* local strm.output */ + var beg; /* inflate()'s initial strm.output */ + var end; /* while out < end, enough space available */ + //#ifdef INFLATE_STRICT + var dmax; /* maximum distance from zlib header */ + //#endif + var wsize; /* window size or zero if not using window */ + var whave; /* valid bytes in the window */ + var wnext; /* window write index */ + // Use `s_window` instead `window`, avoid conflict with instrumentation tools + var s_window; /* allocated sliding window, if wsize != 0 */ + var hold; /* local strm.hold */ + var bits; /* local strm.bits */ + var lcode; /* local strm.lencode */ + var dcode; /* local strm.distcode */ + var lmask; /* mask for first level of length codes */ + var dmask; /* mask for first level of distance codes */ + var here; /* retrieved table entry */ + var op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + var len; /* match length, unused bytes */ + var dist; /* match distance */ + var from; /* where to copy match from */ + var from_source; + + + var input, output; // JS specific, because we have no pointers + + /* copy state to local variables */ + state = strm.state; + //here = state.here; + _in = strm.next_in; + input = strm.input; + last = _in + (strm.avail_in - 5); + _out = strm.next_out; + output = strm.output; + beg = _out - (start - strm.avail_out); + end = _out + (strm.avail_out - 257); + //#ifdef INFLATE_STRICT + dmax = state.dmax; + //#endif + wsize = state.wsize; + whave = state.whave; + wnext = state.wnext; + s_window = state.window; + hold = state.hold; + bits = state.bits; + lcode = state.lencode; + dcode = state.distcode; + lmask = (1 << state.lenbits) - 1; + dmask = (1 << state.distbits) - 1; + + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + top: + do { + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + + here = lcode[hold & lmask]; + + dolen: + for (;;) { // Goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + if (op === 0) { /* literal */ + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + output[_out++] = here & 0xffff/*here.val*/; + } + else if (op & 16) { /* length base */ + len = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + len += hold & ((1 << op) - 1); + hold >>>= op; + bits -= op; + } + //Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = dcode[hold & dmask]; + + dodist: + for (;;) { // goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + + if (op & 16) { /* distance base */ + dist = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + } + dist += hold & ((1 << op) - 1); + //#ifdef INFLATE_STRICT + if (dist > dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$2; + break top; + } + //#endif + hold >>>= op; + bits -= op; + //Tracevv((stderr, "inflate: distance %u\n", dist)); + op = _out - beg; /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$2; + break top; + } + + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + // if (len <= op - whave) { + // do { + // output[_out++] = 0; + // } while (--len); + // continue top; + // } + // len -= op - whave; + // do { + // output[_out++] = 0; + // } while (--op > whave); + // if (op === 0) { + // from = _out - dist; + // do { + // output[_out++] = output[from++]; + // } while (--len); + // continue top; + // } + //#endif + } + from = 0; // window index + from_source = s_window; + if (wnext === 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = 0; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + while (len > 2) { + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + len -= 3; + } + if (len) { + output[_out++] = from_source[from++]; + if (len > 1) { + output[_out++] = from_source[from++]; + } + } + } + else { + from = _out - dist; /* copy direct from output */ + do { /* minimum length is three */ + output[_out++] = output[from++]; + output[_out++] = output[from++]; + output[_out++] = output[from++]; + len -= 3; + } while (len > 2); + if (len) { + output[_out++] = output[from++]; + if (len > 1) { + output[_out++] = output[from++]; + } + } + } + } + else if ((op & 64) === 0) { /* 2nd level distance code */ + here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dodist; + } + else { + strm.msg = 'invalid distance code'; + state.mode = BAD$2; + break top; + } + + break; // need to emulate goto via "continue" + } + } + else if ((op & 64) === 0) { /* 2nd level length code */ + here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dolen; + } + else if (op & 32) { /* end-of-block */ + //Tracevv((stderr, "inflate: end of block\n")); + state.mode = TYPE$2; + break top; + } + else { + strm.msg = 'invalid literal/length code'; + state.mode = BAD$2; + break top; + } + + break; // need to emulate goto via "continue" + } + } while (_in < last && _out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + _in -= len; + bits -= len << 3; + hold &= (1 << bits) - 1; + + /* update state and return */ + strm.next_in = _in; + strm.next_out = _out; + strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); + strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); + state.hold = hold; + state.bits = bits; + return; + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + var MAXBITS$1 = 15; + var ENOUGH_LENS$2 = 852; + var ENOUGH_DISTS$2 = 592; + //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + + var CODES$2 = 0; + var LENS$2 = 1; + var DISTS$2 = 2; + + var lbase$1 = [ /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 + ]; + + var lext$1 = [ /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 + ]; + + var dbase$1 = [ /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0 + ]; + + var dext$1 = [ /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64 + ]; + + var inftrees$1 = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) + { + var bits = opts.bits; + //here = opts.here; /* table entry for duplication */ + + var len = 0; /* a code's length in bits */ + var sym = 0; /* index of code symbols */ + var min = 0, max = 0; /* minimum and maximum code lengths */ + var root = 0; /* number of index bits for root table */ + var curr = 0; /* number of index bits for current table */ + var drop = 0; /* code bits to drop for sub-table */ + var left = 0; /* number of prefix codes available */ + var used = 0; /* code entries in table used */ + var huff = 0; /* Huffman code */ + var incr; /* for incrementing code, index */ + var fill; /* index for replicating entries */ + var low; /* low bits for current root entry */ + var mask; /* mask for low root bits */ + var next; /* next available space in table */ + var base = null; /* base value table to use */ + var base_index = 0; + // var shoextra; /* extra bits table to use */ + var end; /* use base and extra for symbol > end */ + var count = new common$1.Buf16(MAXBITS$1 + 1); //[MAXBITS+1]; /* number of codes of each length */ + var offs = new common$1.Buf16(MAXBITS$1 + 1); //[MAXBITS+1]; /* offsets in table for each length */ + var extra = null; + var extra_index = 0; + + var here_bits, here_op, here_val; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS$1; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + + /* bound code lengths, force root to be within code lengths */ + root = bits; + for (max = MAXBITS$1; max >= 1; max--) { + if (count[max] !== 0) { break; } + } + if (root > max) { + root = max; + } + if (max === 0) { /* no symbols to code at all */ + //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ + //table.bits[opts.table_index] = 1; //here.bits = (var char)1; + //table.val[opts.table_index++] = 0; //here.val = (var short)0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + + //table.op[opts.table_index] = 64; + //table.bits[opts.table_index] = 1; + //table.val[opts.table_index++] = 0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + opts.bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { break; } + } + if (root < min) { + root = min; + } + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS$1; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } /* over-subscribed */ + } + if (left > 0 && (type === CODES$2 || max !== 1)) { + return -1; /* incomplete set */ + } + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS$1; len++) { + offs[len + 1] = offs[len] + count[len]; + } + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + // poor man optimization - use if-else instead of switch, + // to avoid deopts in old v8 + if (type === CODES$2) { + base = extra = work; /* dummy value--not used */ + end = 19; + + } else if (type === LENS$2) { + base = lbase$1; + base_index -= 257; + extra = lext$1; + extra_index -= 257; + end = 256; + + } else { /* DISTS */ + base = dbase$1; + extra = dext$1; + end = -1; + } + + /* initialize opts for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = table_index; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = -1; /* trigger new sub-table when len > root */ + used = 1 << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type === LENS$2 && used > ENOUGH_LENS$2) || + (type === DISTS$2 && used > ENOUGH_DISTS$2)) { + return 1; + } + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here_bits = len - drop; + if (work[sym] < end) { + here_op = 0; + here_val = work[sym]; + } + else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base[base_index + work[sym]]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1 << (len - drop); + fill = 1 << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; + } while (fill !== 0); + + /* backwards increment the len-bit code huff */ + incr = 1 << (len - 1); + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) !== low) { + /* if first time, transition to sub-tables */ + if (drop === 0) { + drop = root; + } + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { break; } + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1 << curr; + if ((type === LENS$2 && used > ENOUGH_LENS$2) || + (type === DISTS$2 && used > ENOUGH_DISTS$2)) { + return 1; + } + + /* point entry in root table to sub-table */ + low = huff & mask; + /*table.op[low] = curr; + table.bits[low] = root; + table.val[low] = next - opts.table_index;*/ + table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff !== 0) { + //table.op[next + huff] = 64; /* invalid code marker */ + //table.bits[next + huff] = len - drop; + //table.val[next + huff] = 0; + table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + } + + /* set return parameters */ + //opts.table_index += used; + opts.bits = root; + return 0; + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + + + + + var CODES$3 = 0; + var LENS$3 = 1; + var DISTS$3 = 2; + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + /* Allowed flush values; see deflate() and inflate() below for details */ + //var Z_NO_FLUSH = 0; + //var Z_PARTIAL_FLUSH = 1; + //var Z_SYNC_FLUSH = 2; + //var Z_FULL_FLUSH = 3; + var Z_FINISH$5 = 4; + var Z_BLOCK$3 = 5; + var Z_TREES$1 = 6; + + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + var Z_OK$5 = 0; + var Z_STREAM_END$5 = 1; + var Z_NEED_DICT$1 = 2; + //var Z_ERRNO = -1; + var Z_STREAM_ERROR$3 = -2; + var Z_DATA_ERROR$3 = -3; + var Z_MEM_ERROR$1 = -4; + var Z_BUF_ERROR$3 = -5; + //var Z_VERSION_ERROR = -6; + + /* The deflate compression method */ + var Z_DEFLATED$5 = 8; + + + /* STATES ====================================================================*/ + /* ===========================================================================*/ + + + var HEAD$1 = 1; /* i: waiting for magic header */ + var FLAGS$1 = 2; /* i: waiting for method and flags (gzip) */ + var TIME$1 = 3; /* i: waiting for modification time (gzip) */ + var OS$1 = 4; /* i: waiting for extra flags and operating system (gzip) */ + var EXLEN$1 = 5; /* i: waiting for extra length (gzip) */ + var EXTRA$1 = 6; /* i: waiting for extra bytes (gzip) */ + var NAME$1 = 7; /* i: waiting for end of file name (gzip) */ + var COMMENT$1 = 8; /* i: waiting for end of comment (gzip) */ + var HCRC$1 = 9; /* i: waiting for header crc (gzip) */ + var DICTID$1 = 10; /* i: waiting for dictionary check value */ + var DICT$1 = 11; /* waiting for inflateSetDictionary() call */ + var TYPE$3 = 12; /* i: waiting for type bits, including last-flag bit */ + var TYPEDO$1 = 13; /* i: same, but skip check to exit inflate on new block */ + var STORED$1 = 14; /* i: waiting for stored size (length and complement) */ + var COPY_$1 = 15; /* i/o: same as COPY below, but only first time in */ + var COPY$1 = 16; /* i/o: waiting for input or output to copy stored block */ + var TABLE$1 = 17; /* i: waiting for dynamic block table lengths */ + var LENLENS$1 = 18; /* i: waiting for code length code lengths */ + var CODELENS$1 = 19; /* i: waiting for length/lit and distance code lengths */ + var LEN_$1 = 20; /* i: same as LEN below, but only first time in */ + var LEN$1 = 21; /* i: waiting for length/lit/eob code */ + var LENEXT$1 = 22; /* i: waiting for length extra bits */ + var DIST$1 = 23; /* i: waiting for distance code */ + var DISTEXT$1 = 24; /* i: waiting for distance extra bits */ + var MATCH$1 = 25; /* o: waiting for output space to copy string */ + var LIT$1 = 26; /* o: waiting for output space to write literal */ + var CHECK$1 = 27; /* i: waiting for 32-bit check value */ + var LENGTH$1 = 28; /* i: waiting for 32-bit length (gzip) */ + var DONE$1 = 29; /* finished check, done -- remain here until reset */ + var BAD$3 = 30; /* got a data error -- remain here until reset */ + var MEM$1 = 31; /* got an inflate() memory error -- remain here until reset */ + var SYNC$1 = 32; /* looking for synchronization bytes to restart inflate() */ + + /* ===========================================================================*/ + + + + var ENOUGH_LENS$3 = 852; + var ENOUGH_DISTS$3 = 592; + //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + + var MAX_WBITS$3 = 15; + /* 32K LZ77 window */ + var DEF_WBITS$1 = MAX_WBITS$3; + + + function zswap32$1(q) { + return (((q >>> 24) & 0xff) + + ((q >>> 8) & 0xff00) + + ((q & 0xff00) << 8) + + ((q & 0xff) << 24)); + } + + + function InflateState$1() { + this.mode = 0; /* current inflate mode */ + this.last = false; /* true if processing last block */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.havedict = false; /* true if dictionary provided */ + this.flags = 0; /* gzip header method and flags (0 if zlib) */ + this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ + this.check = 0; /* protected copy of check value */ + this.total = 0; /* protected copy of output count */ + // TODO: may be {} + this.head = null; /* where to save gzip header information */ + + /* sliding window */ + this.wbits = 0; /* log base 2 of requested window size */ + this.wsize = 0; /* window size or zero if not using window */ + this.whave = 0; /* valid bytes in the window */ + this.wnext = 0; /* window write index */ + this.window = null; /* allocated sliding window, if needed */ + + /* bit accumulator */ + this.hold = 0; /* input bit accumulator */ + this.bits = 0; /* number of bits in "in" */ + + /* for string and stored block copying */ + this.length = 0; /* literal or length of data to copy */ + this.offset = 0; /* distance back to copy string from */ + + /* for table and code decoding */ + this.extra = 0; /* extra bits needed */ + + /* fixed and dynamic code tables */ + this.lencode = null; /* starting table for length/literal codes */ + this.distcode = null; /* starting table for distance codes */ + this.lenbits = 0; /* index bits for lencode */ + this.distbits = 0; /* index bits for distcode */ + + /* dynamic table building */ + this.ncode = 0; /* number of code length code lengths */ + this.nlen = 0; /* number of length code lengths */ + this.ndist = 0; /* number of distance code lengths */ + this.have = 0; /* number of code lengths in lens[] */ + this.next = null; /* next available space in codes[] */ + + this.lens = new common$1.Buf16(320); /* temporary storage for code lengths */ + this.work = new common$1.Buf16(288); /* work area for code table building */ + + /* + because we don't have pointers in js, we use lencode and distcode directly + as buffers so we don't need codes + */ + //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ + this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ + this.distdyn = null; /* dynamic table for distance codes (JS specific) */ + this.sane = 0; /* if false, allow invalid distance too far */ + this.back = 0; /* bits back of last unprocessed length/lit */ + this.was = 0; /* initial length of match */ + } + + function inflateResetKeep$1(strm) { + var state; + + if (!strm || !strm.state) { return Z_STREAM_ERROR$3; } + state = strm.state; + strm.total_in = strm.total_out = state.total = 0; + strm.msg = ''; /*Z_NULL*/ + if (state.wrap) { /* to support ill-conceived Java test suite */ + strm.adler = state.wrap & 1; + } + state.mode = HEAD$1; + state.last = 0; + state.havedict = 0; + state.dmax = 32768; + state.head = null/*Z_NULL*/; + state.hold = 0; + state.bits = 0; + //state.lencode = state.distcode = state.next = state.codes; + state.lencode = state.lendyn = new common$1.Buf32(ENOUGH_LENS$3); + state.distcode = state.distdyn = new common$1.Buf32(ENOUGH_DISTS$3); + + state.sane = 1; + state.back = -1; + //Tracev((stderr, "inflate: reset\n")); + return Z_OK$5; + } + + function inflateReset$1(strm) { + var state; + + if (!strm || !strm.state) { return Z_STREAM_ERROR$3; } + state = strm.state; + state.wsize = 0; + state.whave = 0; + state.wnext = 0; + return inflateResetKeep$1(strm); + + } + + function inflateReset2$1(strm, windowBits) { + var wrap; + var state; + + /* get the state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR$3; } + state = strm.state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; + if (windowBits < 48) { + windowBits &= 15; + } + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) { + return Z_STREAM_ERROR$3; + } + if (state.window !== null && state.wbits !== windowBits) { + state.window = null; + } + + /* update state and reset the rest of it */ + state.wrap = wrap; + state.wbits = windowBits; + return inflateReset$1(strm); + } + + function inflateInit2$1(strm, windowBits) { + var ret; + var state; + + if (!strm) { return Z_STREAM_ERROR$3; } + //strm.msg = Z_NULL; /* in case we return an error */ + + state = new InflateState$1(); + + //if (state === Z_NULL) return Z_MEM_ERROR; + //Tracev((stderr, "inflate: allocated\n")); + strm.state = state; + state.window = null/*Z_NULL*/; + ret = inflateReset2$1(strm, windowBits); + if (ret !== Z_OK$5) { + strm.state = null/*Z_NULL*/; + } + return ret; + } + + function inflateInit$1(strm) { + return inflateInit2$1(strm, DEF_WBITS$1); + } + + + /* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ + var virgin$1 = true; + + var lenfix$1, distfix$1; // We have no pointers in JS, so keep tables separate + + function fixedtables$1(state) { + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin$1) { + var sym; + + lenfix$1 = new common$1.Buf32(512); + distfix$1 = new common$1.Buf32(32); + + /* literal/length table */ + sym = 0; + while (sym < 144) { state.lens[sym++] = 8; } + while (sym < 256) { state.lens[sym++] = 9; } + while (sym < 280) { state.lens[sym++] = 7; } + while (sym < 288) { state.lens[sym++] = 8; } + + inftrees$1(LENS$3, state.lens, 0, 288, lenfix$1, 0, state.work, { bits: 9 }); + + /* distance table */ + sym = 0; + while (sym < 32) { state.lens[sym++] = 5; } + + inftrees$1(DISTS$3, state.lens, 0, 32, distfix$1, 0, state.work, { bits: 5 }); + + /* do this just once */ + virgin$1 = false; + } + + state.lencode = lenfix$1; + state.lenbits = 9; + state.distcode = distfix$1; + state.distbits = 5; + } + + + /* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ + function updatewindow$1(strm, src, end, copy) { + var dist; + var state = strm.state; + + /* if it hasn't been done already, allocate space for the window */ + if (state.window === null) { + state.wsize = 1 << state.wbits; + state.wnext = 0; + state.whave = 0; + + state.window = new common$1.Buf8(state.wsize); + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state.wsize) { + common$1.arraySet(state.window, src, end - state.wsize, state.wsize, 0); + state.wnext = 0; + state.whave = state.wsize; + } + else { + dist = state.wsize - state.wnext; + if (dist > copy) { + dist = copy; + } + //zmemcpy(state->window + state->wnext, end - copy, dist); + common$1.arraySet(state.window, src, end - copy, dist, state.wnext); + copy -= dist; + if (copy) { + //zmemcpy(state->window, end - copy, copy); + common$1.arraySet(state.window, src, end - copy, copy, 0); + state.wnext = copy; + state.whave = state.wsize; + } + else { + state.wnext += dist; + if (state.wnext === state.wsize) { state.wnext = 0; } + if (state.whave < state.wsize) { state.whave += dist; } + } + } + return 0; + } + + function inflate$2(strm, flush) { + var state; + var input, output; // input/output buffers + var next; /* next input INDEX */ + var put; /* next output INDEX */ + var have, left; /* available input and output */ + var hold; /* bit buffer */ + var bits; /* bits in bit buffer */ + var _in, _out; /* save starting available input and output */ + var copy; /* number of stored or match bytes to copy */ + var from; /* where to copy match bytes from */ + var from_source; + var here = 0; /* current decoding table entry */ + var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) + //var last; /* parent table entry */ + var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) + var len; /* length to copy for repeats, bits to drop */ + var ret; /* return code */ + var hbuf = new common$1.Buf8(4); /* buffer for gzip header crc calculation */ + var opts; + + var n; // temporary var for NEED_BITS + + var order = /* permutation of code lengths */ + [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; + + + if (!strm || !strm.state || !strm.output || + (!strm.input && strm.avail_in !== 0)) { + return Z_STREAM_ERROR$3; + } + + state = strm.state; + if (state.mode === TYPE$3) { state.mode = TYPEDO$1; } /* skip check */ + + + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + _in = have; + _out = left; + ret = Z_OK$5; + + inf_leave: // goto emulation + for (;;) { + switch (state.mode) { + case HEAD$1: + if (state.wrap === 0) { + state.mode = TYPEDO$1; + break; + } + //=== NEEDBITS(16); + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ + state.check = 0/*crc32(0L, Z_NULL, 0)*/; + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$1(state.check, hbuf, 2, 0); + //===// + + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = FLAGS$1; + break; + } + state.flags = 0; /* expect zlib header */ + if (state.head) { + state.head.done = false; + } + if (!(state.wrap & 1) || /* check if zlib header allowed */ + (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { + strm.msg = 'incorrect header check'; + state.mode = BAD$3; + break; + } + if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$5) { + strm.msg = 'unknown compression method'; + state.mode = BAD$3; + break; + } + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + len = (hold & 0x0f)/*BITS(4)*/ + 8; + if (state.wbits === 0) { + state.wbits = len; + } + else if (len > state.wbits) { + strm.msg = 'invalid window size'; + state.mode = BAD$3; + break; + } + state.dmax = 1 << len; + //Tracev((stderr, "inflate: zlib header ok\n")); + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = hold & 0x200 ? DICTID$1 : TYPE$3; + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + break; + case FLAGS$1: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.flags = hold; + if ((state.flags & 0xff) !== Z_DEFLATED$5) { + strm.msg = 'unknown compression method'; + state.mode = BAD$3; + break; + } + if (state.flags & 0xe000) { + strm.msg = 'unknown header flags set'; + state.mode = BAD$3; + break; + } + if (state.head) { + state.head.text = ((hold >> 8) & 1); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = TIME$1; + /* falls through */ + case TIME$1: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.time = hold; + } + if (state.flags & 0x0200) { + //=== CRC4(state.check, hold) + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + hbuf[2] = (hold >>> 16) & 0xff; + hbuf[3] = (hold >>> 24) & 0xff; + state.check = crc32_1$1(state.check, hbuf, 4, 0); + //=== + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = OS$1; + /* falls through */ + case OS$1: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.xflags = (hold & 0xff); + state.head.os = (hold >> 8); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = EXLEN$1; + /* falls through */ + case EXLEN$1: + if (state.flags & 0x0400) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length = hold; + if (state.head) { + state.head.extra_len = hold; + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + else if (state.head) { + state.head.extra = null/*Z_NULL*/; + } + state.mode = EXTRA$1; + /* falls through */ + case EXTRA$1: + if (state.flags & 0x0400) { + copy = state.length; + if (copy > have) { copy = have; } + if (copy) { + if (state.head) { + len = state.head.extra_len - state.length; + if (!state.head.extra) { + // Use untyped array for more convenient processing later + state.head.extra = new Array(state.head.extra_len); + } + common$1.arraySet( + state.head.extra, + input, + next, + // extra field is limited to 65536 bytes + // - no need for additional size check + copy, + /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ + len + ); + //zmemcpy(state.head.extra + len, next, + // len + copy > state.head.extra_max ? + // state.head.extra_max - len : copy); + } + if (state.flags & 0x0200) { + state.check = crc32_1$1(state.check, input, copy, next); + } + have -= copy; + next += copy; + state.length -= copy; + } + if (state.length) { break inf_leave; } + } + state.length = 0; + state.mode = NAME$1; + /* falls through */ + case NAME$1: + if (state.flags & 0x0800) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + // TODO: 2 or 1 bytes? + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.name_max*/)) { + state.head.name += String.fromCharCode(len); + } + } while (len && copy < have); + + if (state.flags & 0x0200) { + state.check = crc32_1$1(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.name = null; + } + state.length = 0; + state.mode = COMMENT$1; + /* falls through */ + case COMMENT$1: + if (state.flags & 0x1000) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.comm_max*/)) { + state.head.comment += String.fromCharCode(len); + } + } while (len && copy < have); + if (state.flags & 0x0200) { + state.check = crc32_1$1(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.comment = null; + } + state.mode = HCRC$1; + /* falls through */ + case HCRC$1: + if (state.flags & 0x0200) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.check & 0xffff)) { + strm.msg = 'header crc mismatch'; + state.mode = BAD$3; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + if (state.head) { + state.head.hcrc = ((state.flags >> 9) & 1); + state.head.done = true; + } + strm.adler = state.check = 0; + state.mode = TYPE$3; + break; + case DICTID$1: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + strm.adler = state.check = zswap32$1(hold); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = DICT$1; + /* falls through */ + case DICT$1: + if (state.havedict === 0) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + return Z_NEED_DICT$1; + } + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = TYPE$3; + /* falls through */ + case TYPE$3: + if (flush === Z_BLOCK$3 || flush === Z_TREES$1) { break inf_leave; } + /* falls through */ + case TYPEDO$1: + if (state.last) { + //--- BYTEBITS() ---// + hold >>>= bits & 7; + bits -= bits & 7; + //---// + state.mode = CHECK$1; + break; + } + //=== NEEDBITS(3); */ + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.last = (hold & 0x01)/*BITS(1)*/; + //--- DROPBITS(1) ---// + hold >>>= 1; + bits -= 1; + //---// + + switch ((hold & 0x03)/*BITS(2)*/) { + case 0: /* stored block */ + //Tracev((stderr, "inflate: stored block%s\n", + // state.last ? " (last)" : "")); + state.mode = STORED$1; + break; + case 1: /* fixed block */ + fixedtables$1(state); + //Tracev((stderr, "inflate: fixed codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = LEN_$1; /* decode codes */ + if (flush === Z_TREES$1) { + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break inf_leave; + } + break; + case 2: /* dynamic block */ + //Tracev((stderr, "inflate: dynamic codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = TABLE$1; + break; + case 3: + strm.msg = 'invalid block type'; + state.mode = BAD$3; + } + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break; + case STORED$1: + //--- BYTEBITS() ---// /* go to byte boundary */ + hold >>>= bits & 7; + bits -= bits & 7; + //---// + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { + strm.msg = 'invalid stored block lengths'; + state.mode = BAD$3; + break; + } + state.length = hold & 0xffff; + //Tracev((stderr, "inflate: stored length %u\n", + // state.length)); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = COPY_$1; + if (flush === Z_TREES$1) { break inf_leave; } + /* falls through */ + case COPY_$1: + state.mode = COPY$1; + /* falls through */ + case COPY$1: + copy = state.length; + if (copy) { + if (copy > have) { copy = have; } + if (copy > left) { copy = left; } + if (copy === 0) { break inf_leave; } + //--- zmemcpy(put, next, copy); --- + common$1.arraySet(output, input, next, copy, put); + //---// + have -= copy; + next += copy; + left -= copy; + put += copy; + state.length -= copy; + break; + } + //Tracev((stderr, "inflate: stored end\n")); + state.mode = TYPE$3; + break; + case TABLE$1: + //=== NEEDBITS(14); */ + while (bits < 14) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + //#ifndef PKZIP_BUG_WORKAROUND + if (state.nlen > 286 || state.ndist > 30) { + strm.msg = 'too many length or distance symbols'; + state.mode = BAD$3; + break; + } + //#endif + //Tracev((stderr, "inflate: table sizes ok\n")); + state.have = 0; + state.mode = LENLENS$1; + /* falls through */ + case LENLENS$1: + while (state.have < state.ncode) { + //=== NEEDBITS(3); + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + while (state.have < 19) { + state.lens[order[state.have++]] = 0; + } + // We have separate tables & no pointers. 2 commented lines below not needed. + //state.next = state.codes; + //state.lencode = state.next; + // Switch to use dynamic table + state.lencode = state.lendyn; + state.lenbits = 7; + + opts = { bits: state.lenbits }; + ret = inftrees$1(CODES$3, state.lens, 0, 19, state.lencode, 0, state.work, opts); + state.lenbits = opts.bits; + + if (ret) { + strm.msg = 'invalid code lengths set'; + state.mode = BAD$3; + break; + } + //Tracev((stderr, "inflate: code lengths ok\n")); + state.have = 0; + state.mode = CODELENS$1; + /* falls through */ + case CODELENS$1: + while (state.have < state.nlen + state.ndist) { + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_val < 16) { + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.lens[state.have++] = here_val; + } + else { + if (here_val === 16) { + //=== NEEDBITS(here.bits + 2); + n = here_bits + 2; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + if (state.have === 0) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD$3; + break; + } + len = state.lens[state.have - 1]; + copy = 3 + (hold & 0x03);//BITS(2); + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + } + else if (here_val === 17) { + //=== NEEDBITS(here.bits + 3); + n = here_bits + 3; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 3 + (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + else { + //=== NEEDBITS(here.bits + 7); + n = here_bits + 7; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 11 + (hold & 0x7f);//BITS(7); + //--- DROPBITS(7) ---// + hold >>>= 7; + bits -= 7; + //---// + } + if (state.have + copy > state.nlen + state.ndist) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD$3; + break; + } + while (copy--) { + state.lens[state.have++] = len; + } + } + } + + /* handle error breaks in while */ + if (state.mode === BAD$3) { break; } + + /* check for end-of-block code (better have one) */ + if (state.lens[256] === 0) { + strm.msg = 'invalid code -- missing end-of-block'; + state.mode = BAD$3; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state.lenbits = 9; + + opts = { bits: state.lenbits }; + ret = inftrees$1(LENS$3, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.lenbits = opts.bits; + // state.lencode = state.next; + + if (ret) { + strm.msg = 'invalid literal/lengths set'; + state.mode = BAD$3; + break; + } + + state.distbits = 6; + //state.distcode.copy(state.codes); + // Switch to use dynamic table + state.distcode = state.distdyn; + opts = { bits: state.distbits }; + ret = inftrees$1(DISTS$3, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.distbits = opts.bits; + // state.distcode = state.next; + + if (ret) { + strm.msg = 'invalid distances set'; + state.mode = BAD$3; + break; + } + //Tracev((stderr, 'inflate: codes ok\n')); + state.mode = LEN_$1; + if (flush === Z_TREES$1) { break inf_leave; } + /* falls through */ + case LEN_$1: + state.mode = LEN$1; + /* falls through */ + case LEN$1: + if (have >= 6 && left >= 258) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + inffast$1(strm, _out); + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + if (state.mode === TYPE$3) { + state.back = -1; + } + break; + } + state.back = 0; + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if (here_bits <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_op && (here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.lencode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + state.length = here_val; + if (here_op === 0) { + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + state.mode = LIT$1; + break; + } + if (here_op & 32) { + //Tracevv((stderr, "inflate: end of block\n")); + state.back = -1; + state.mode = TYPE$3; + break; + } + if (here_op & 64) { + strm.msg = 'invalid literal/length code'; + state.mode = BAD$3; + break; + } + state.extra = here_op & 15; + state.mode = LENEXT$1; + /* falls through */ + case LENEXT$1: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //Tracevv((stderr, "inflate: length %u\n", state.length)); + state.was = state.length; + state.mode = DIST$1; + /* falls through */ + case DIST$1: + for (;;) { + here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if ((here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.distcode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + if (here_op & 64) { + strm.msg = 'invalid distance code'; + state.mode = BAD$3; + break; + } + state.offset = here_val; + state.extra = (here_op) & 15; + state.mode = DISTEXT$1; + /* falls through */ + case DISTEXT$1: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //#ifdef INFLATE_STRICT + if (state.offset > state.dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$3; + break; + } + //#endif + //Tracevv((stderr, "inflate: distance %u\n", state.offset)); + state.mode = MATCH$1; + /* falls through */ + case MATCH$1: + if (left === 0) { break inf_leave; } + copy = _out - left; + if (state.offset > copy) { /* copy from window */ + copy = state.offset - copy; + if (copy > state.whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$3; + break; + } + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + // Trace((stderr, "inflate.c too far\n")); + // copy -= state.whave; + // if (copy > state.length) { copy = state.length; } + // if (copy > left) { copy = left; } + // left -= copy; + // state.length -= copy; + // do { + // output[put++] = 0; + // } while (--copy); + // if (state.length === 0) { state.mode = LEN; } + // break; + //#endif + } + if (copy > state.wnext) { + copy -= state.wnext; + from = state.wsize - copy; + } + else { + from = state.wnext - copy; + } + if (copy > state.length) { copy = state.length; } + from_source = state.window; + } + else { /* copy from output */ + from_source = output; + from = put - state.offset; + copy = state.length; + } + if (copy > left) { copy = left; } + left -= copy; + state.length -= copy; + do { + output[put++] = from_source[from++]; + } while (--copy); + if (state.length === 0) { state.mode = LEN$1; } + break; + case LIT$1: + if (left === 0) { break inf_leave; } + output[put++] = state.length; + left--; + state.mode = LEN$1; + break; + case CHECK$1: + if (state.wrap) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + // Use '|' instead of '+' to make sure that result is signed + hold |= input[next++] << bits; + bits += 8; + } + //===// + _out -= left; + strm.total_out += _out; + state.total += _out; + if (_out) { + strm.adler = state.check = + /*UPDATE(state.check, put - _out, _out);*/ + (state.flags ? crc32_1$1(state.check, output, _out, put - _out) : adler32_1$1(state.check, output, _out, put - _out)); + + } + _out = left; + // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too + if ((state.flags ? hold : zswap32$1(hold)) !== state.check) { + strm.msg = 'incorrect data check'; + state.mode = BAD$3; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: check matches trailer\n")); + } + state.mode = LENGTH$1; + /* falls through */ + case LENGTH$1: + if (state.wrap && state.flags) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.total & 0xffffffff)) { + strm.msg = 'incorrect length check'; + state.mode = BAD$3; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: length matches trailer\n")); + } + state.mode = DONE$1; + /* falls through */ + case DONE$1: + ret = Z_STREAM_END$5; + break inf_leave; + case BAD$3: + ret = Z_DATA_ERROR$3; + break inf_leave; + case MEM$1: + return Z_MEM_ERROR$1; + case SYNC$1: + /* falls through */ + default: + return Z_STREAM_ERROR$3; + } + } + + // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + + if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$3 && + (state.mode < CHECK$1 || flush !== Z_FINISH$5))) { + if (updatewindow$1(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if (state.wrap && _out) { + strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ + (state.flags ? crc32_1$1(state.check, output, _out, strm.next_out - _out) : adler32_1$1(state.check, output, _out, strm.next_out - _out)); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + + (state.mode === TYPE$3 ? 128 : 0) + + (state.mode === LEN_$1 || state.mode === COPY_$1 ? 256 : 0); + if (((_in === 0 && _out === 0) || flush === Z_FINISH$5) && ret === Z_OK$5) { + ret = Z_BUF_ERROR$3; + } + return ret; + } + + function inflateEnd$1(strm) { + + if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { + return Z_STREAM_ERROR$3; + } + + var state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK$5; + } + + function inflateGetHeader$1(strm, head) { + var state; + + /* check state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR$3; } + state = strm.state; + if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$3; } + + /* save header structure */ + state.head = head; + head.done = false; + return Z_OK$5; + } + + function inflateSetDictionary$1(strm, dictionary) { + var dictLength = dictionary.length; + + var state; + var dictid; + var ret; + + /* check state */ + if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$3; } + state = strm.state; + + if (state.wrap !== 0 && state.mode !== DICT$1) { + return Z_STREAM_ERROR$3; + } + + /* check for correct dictionary identifier */ + if (state.mode === DICT$1) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32_1$1(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR$3; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow$1(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM$1; + return Z_MEM_ERROR$1; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK$5; + } + + var inflateReset_1$1 = inflateReset$1; + var inflateReset2_1$1 = inflateReset2$1; + var inflateResetKeep_1$1 = inflateResetKeep$1; + var inflateInit_1$1 = inflateInit$1; + var inflateInit2_1$1 = inflateInit2$1; + var inflate_2$2 = inflate$2; + var inflateEnd_1$1 = inflateEnd$1; + var inflateGetHeader_1$1 = inflateGetHeader$1; + var inflateSetDictionary_1$1 = inflateSetDictionary$1; + var inflateInfo$1 = 'pako inflate (from Nodeca project)'; + + /* Not implemented + exports.inflateCopy = inflateCopy; + exports.inflateGetDictionary = inflateGetDictionary; + exports.inflateMark = inflateMark; + exports.inflatePrime = inflatePrime; + exports.inflateSync = inflateSync; + exports.inflateSyncPoint = inflateSyncPoint; + exports.inflateUndermine = inflateUndermine; + */ + + var inflate_1$2 = { + inflateReset: inflateReset_1$1, + inflateReset2: inflateReset2_1$1, + inflateResetKeep: inflateResetKeep_1$1, + inflateInit: inflateInit_1$1, + inflateInit2: inflateInit2_1$1, + inflate: inflate_2$2, + inflateEnd: inflateEnd_1$1, + inflateGetHeader: inflateGetHeader_1$1, + inflateSetDictionary: inflateSetDictionary_1$1, + inflateInfo: inflateInfo$1 + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + var constants$1 = { + + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_TREES: 6, + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + //Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + //Z_VERSION_ERROR: -6, + + /* compression levels */ + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + + + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + + /* Possible values of the data_type field (though see inflate()) */ + Z_BINARY: 0, + Z_TEXT: 1, + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function GZheader$1() { + /* true if compressed data believed to be text */ + this.text = 0; + /* modification time */ + this.time = 0; + /* extra flags (not used when writing a gzip file) */ + this.xflags = 0; + /* operating system */ + this.os = 0; + /* pointer to extra field or Z_NULL if none */ + this.extra = null; + /* extra field length (valid if extra != Z_NULL) */ + this.extra_len = 0; // Actually, we don't need it in JS, + // but leave for few code modifications + + // + // Setup limits is not necessary because in js we should not preallocate memory + // for inflate use constant limit in 65536 bytes + // + + /* space at extra (only when reading header) */ + // this.extra_max = 0; + /* pointer to zero-terminated file name or Z_NULL */ + this.name = ''; + /* space at name (only when reading header) */ + // this.name_max = 0; + /* pointer to zero-terminated comment or Z_NULL */ + this.comment = ''; + /* space at comment (only when reading header) */ + // this.comm_max = 0; + /* true if there was or will be a header crc */ + this.hcrc = 0; + /* true when done reading gzip header (not used when writing a gzip file) */ + this.done = false; + } + + var gzheader$1 = GZheader$1; + + var toString$3 = Object.prototype.toString; + + /** + * class Inflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[inflate]] + * and [[inflateRaw]]. + **/ + + /* internal + * inflate.chunks -> Array + * + * Chunks of output data, if [[Inflate#onData]] not overridden. + **/ + + /** + * Inflate.result -> Uint8Array|Array|String + * + * Uncompressed result, generated by default [[Inflate#onData]] + * and [[Inflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Inflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ + + /** + * Inflate.err -> Number + * + * Error code after inflate finished. 0 (Z_OK) on success. + * Should be checked if broken data possible. + **/ + + /** + * Inflate.msg -> String + * + * Error message, if [[Inflate.err]] != 0 + **/ + + + /** + * new Inflate(options) + * - options (Object): zlib inflate options. + * + * Creates new inflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `windowBits` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw inflate + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * By default, when no options set, autodetect deflate/gzip data format via + * wrapper header. + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var inflate = new pako.Inflate({ level: 3}); + * + * inflate.push(chunk1, false); + * inflate.push(chunk2, true); // true -> last chunk + * + * if (inflate.err) { throw new Error(inflate.err); } + * + * console.log(inflate.result); + * ``` + **/ + function Inflate$1(options) { + if (!(this instanceof Inflate$1)) return new Inflate$1(options); + + this.options = common$1.assign({ + chunkSize: 16384, + windowBits: 0, + to: '' + }, options || {}); + + var opt = this.options; + + // Force window size for `raw` data, if not set directly, + // because we have no header for autodetect. + if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { + opt.windowBits = -opt.windowBits; + if (opt.windowBits === 0) { opt.windowBits = -15; } + } + + // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate + if ((opt.windowBits >= 0) && (opt.windowBits < 16) && + !(options && options.windowBits)) { + opt.windowBits += 32; + } + + // Gzip header has no info about windows size, we can do autodetect only + // for deflate. So, if window size not set, force it to max when gzip possible + if ((opt.windowBits > 15) && (opt.windowBits < 48)) { + // bit 3 (16) -> gzipped data + // bit 4 (32) -> autodetect gzip/deflate + if ((opt.windowBits & 15) === 0) { + opt.windowBits |= 15; + } + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream$1(); + this.strm.avail_out = 0; + + var status = inflate_1$2.inflateInit2( + this.strm, + opt.windowBits + ); + + if (status !== constants$1.Z_OK) { + throw new Error(messages$1[status]); + } + + this.header = new gzheader$1(); + + inflate_1$2.inflateGetHeader(this.strm, this.header); + + // Setup dictionary + if (opt.dictionary) { + // Convert data if needed + if (typeof opt.dictionary === 'string') { + opt.dictionary = strings$1.string2buf(opt.dictionary); + } else if (toString$3.call(opt.dictionary) === '[object ArrayBuffer]') { + opt.dictionary = new Uint8Array(opt.dictionary); + } + if (opt.raw) { //In raw mode we need to set the dictionary early + status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary); + if (status !== constants$1.Z_OK) { + throw new Error(messages$1[status]); + } + } + } + } + + /** + * Inflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with + * new output chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the decompression context. + * + * On fail call [[Inflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ + Inflate$1.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var dictionary = this.options.dictionary; + var status, _mode; + var next_out_utf8, tail, utf8str; + + // Flag to properly process Z_BUF_ERROR on testing inflate call + // when we check that all output data was flushed. + var allowBufError = false; + + if (this.ended) { return false; } + _mode = (mode === ~~mode) ? mode : ((mode === true) ? constants$1.Z_FINISH : constants$1.Z_NO_FLUSH); + + // Convert data if needed + if (typeof data === 'string') { + // Only binary strings can be decompressed on practice + strm.input = strings$1.binstring2buf(data); + } else if (toString$3.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + do { + if (strm.avail_out === 0) { + strm.output = new common$1.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + + status = inflate_1$2.inflate(strm, constants$1.Z_NO_FLUSH); /* no bad return value */ + + if (status === constants$1.Z_NEED_DICT && dictionary) { + status = inflate_1$2.inflateSetDictionary(this.strm, dictionary); + } + + if (status === constants$1.Z_BUF_ERROR && allowBufError === true) { + status = constants$1.Z_OK; + allowBufError = false; + } + + if (status !== constants$1.Z_STREAM_END && status !== constants$1.Z_OK) { + this.onEnd(status); + this.ended = true; + return false; + } + + if (strm.next_out) { + if (strm.avail_out === 0 || status === constants$1.Z_STREAM_END || (strm.avail_in === 0 && (_mode === constants$1.Z_FINISH || _mode === constants$1.Z_SYNC_FLUSH))) { + + if (this.options.to === 'string') { + + next_out_utf8 = strings$1.utf8border(strm.output, strm.next_out); + + tail = strm.next_out - next_out_utf8; + utf8str = strings$1.buf2string(strm.output, next_out_utf8); + + // move tail + strm.next_out = tail; + strm.avail_out = chunkSize - tail; + if (tail) { common$1.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } + + this.onData(utf8str); + + } else { + this.onData(common$1.shrinkBuf(strm.output, strm.next_out)); + } + } + } + + // When no more input data, we should check that internal inflate buffers + // are flushed. The only way to do it when avail_out = 0 - run one more + // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. + // Here we set flag to process this error properly. + // + // NOTE. Deflate does not return error in this case and does not needs such + // logic. + if (strm.avail_in === 0 && strm.avail_out === 0) { + allowBufError = true; + } + + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== constants$1.Z_STREAM_END); + + if (status === constants$1.Z_STREAM_END) { + _mode = constants$1.Z_FINISH; + } + + // Finalize on the last chunk. + if (_mode === constants$1.Z_FINISH) { + status = inflate_1$2.inflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === constants$1.Z_OK; + } + + // callback interim results if Z_SYNC_FLUSH. + if (_mode === constants$1.Z_SYNC_FLUSH) { + this.onEnd(constants$1.Z_OK); + strm.avail_out = 0; + return true; + } + + return true; + }; + + + /** + * Inflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): output data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ + Inflate$1.prototype.onData = function (chunk) { + this.chunks.push(chunk); + }; + + + /** + * Inflate#onEnd(status) -> Void + * - status (Number): inflate status. 0 (Z_OK) on success, + * other if not. + * + * Called either after you tell inflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ + Inflate$1.prototype.onEnd = function (status) { + // On success - join + if (status === constants$1.Z_OK) { + if (this.options.to === 'string') { + // Glue & convert here, until we teach pako to send + // utf8 aligned strings to onData + this.result = this.chunks.join(''); + } else { + this.result = common$1.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; + }; + + + /** + * inflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Decompress `data` with inflate/ungzip and `options`. Autodetect + * format via wrapper header by default. That's why we don't provide + * separate `ungzip` method. + * + * Supported options are: + * + * - windowBits + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) + * , output; + * + * try { + * output = pako.inflate(input); + * } catch (err) + * console.log(err); + * } + * ``` + **/ + function inflate$3(input, options) { + var inflator = new Inflate$1(options); + + inflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (inflator.err) { throw inflator.msg || messages$1[inflator.err]; } + + return inflator.result; + } + + + /** + * inflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * The same as [[inflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ + function inflateRaw$1(input, options) { + options = options || {}; + options.raw = true; + return inflate$3(input, options); + } + + + /** + * ungzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Just shortcut to [[inflate]], because it autodetects format + * by header.content. Done for convenience. + **/ + + + var Inflate_1$1 = Inflate$1; + var inflate_2$3 = inflate$3; + var inflateRaw_1$1 = inflateRaw$1; + var ungzip$1 = inflate$3; + + var inflate_1$3 = { + Inflate: Inflate_1$1, + inflate: inflate_2$3, + inflateRaw: inflateRaw_1$1, + ungzip: ungzip$1 + }; + + var assign$1 = common$1.assign; + + + + + + var pako$1 = {}; + + assign$1(pako$1, deflate_1$3, inflate_1$3, constants$1); + + var pako_1$1 = pako$1; + + var PDFHeader = /** @class */ (function () { + function PDFHeader(major, minor) { + this.major = String(major); + this.minor = String(minor); + } + PDFHeader.prototype.toString = function () { + var bc = charFromCode(129); + return "%PDF-" + this.major + "." + this.minor + "\n%" + bc + bc + bc + bc; + }; + PDFHeader.prototype.sizeInBytes = function () { + return 12 + this.major.length + this.minor.length; + }; + PDFHeader.prototype.copyBytesInto = function (buffer, offset) { + var initialOffset = offset; + buffer[offset++] = CharCodes$1.Percent; + buffer[offset++] = CharCodes$1.P; + buffer[offset++] = CharCodes$1.D; + buffer[offset++] = CharCodes$1.F; + buffer[offset++] = CharCodes$1.Dash; + offset += copyStringIntoBuffer(this.major, buffer, offset); + buffer[offset++] = CharCodes$1.Period; + offset += copyStringIntoBuffer(this.minor, buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.Percent; + buffer[offset++] = 129; + buffer[offset++] = 129; + buffer[offset++] = 129; + buffer[offset++] = 129; + return offset - initialOffset; + }; + PDFHeader.forVersion = function (major, minor) { + return new PDFHeader(major, minor); + }; + return PDFHeader; + }()); + + var PDFObject = /** @class */ (function () { + function PDFObject() { + } + PDFObject.prototype.clone = function (_context) { + throw new MethodNotImplementedError(this.constructor.name, 'clone'); + }; + PDFObject.prototype.toString = function () { + throw new MethodNotImplementedError(this.constructor.name, 'toString'); + }; + PDFObject.prototype.sizeInBytes = function () { + throw new MethodNotImplementedError(this.constructor.name, 'sizeInBytes'); + }; + PDFObject.prototype.copyBytesInto = function (_buffer, _offset) { + throw new MethodNotImplementedError(this.constructor.name, 'copyBytesInto'); + }; + return PDFObject; + }()); + + var PDFNumber = /** @class */ (function (_super) { + __extends(PDFNumber, _super); + function PDFNumber(value) { + var _this = _super.call(this) || this; + _this.numberValue = value; + _this.stringValue = numberToString(value); + return _this; + } + PDFNumber.prototype.asNumber = function () { + return this.numberValue; + }; + /** @deprecated in favor of [[PDFNumber.asNumber]] */ + PDFNumber.prototype.value = function () { + return this.numberValue; + }; + PDFNumber.prototype.clone = function () { + return PDFNumber.of(this.numberValue); + }; + PDFNumber.prototype.toString = function () { + return this.stringValue; + }; + PDFNumber.prototype.sizeInBytes = function () { + return this.stringValue.length; + }; + PDFNumber.prototype.copyBytesInto = function (buffer, offset) { + offset += copyStringIntoBuffer(this.stringValue, buffer, offset); + return this.stringValue.length; + }; + PDFNumber.of = function (value) { return new PDFNumber(value); }; + return PDFNumber; + }(PDFObject)); + + var PDFArray = /** @class */ (function (_super) { + __extends(PDFArray, _super); + function PDFArray(context) { + var _this = _super.call(this) || this; + _this.array = []; + _this.context = context; + return _this; + } + PDFArray.prototype.size = function () { + return this.array.length; + }; + PDFArray.prototype.push = function (object) { + this.array.push(object); + }; + PDFArray.prototype.insert = function (index, object) { + this.array.splice(index, 0, object); + }; + PDFArray.prototype.indexOf = function (object) { + var index = this.array.indexOf(object); + return index === -1 ? undefined : index; + }; + PDFArray.prototype.remove = function (index) { + this.array.splice(index, 1); + }; + PDFArray.prototype.set = function (idx, object) { + this.array[idx] = object; + }; + PDFArray.prototype.get = function (index) { + return this.array[index]; + }; + PDFArray.prototype.lookupMaybe = function (index) { + var _a; + var types = []; + for (var _i = 1; _i < arguments.length; _i++) { + types[_i - 1] = arguments[_i]; + } + return (_a = this.context).lookupMaybe.apply(_a, __spreadArrays([this.get(index)], types)); + }; + PDFArray.prototype.lookup = function (index) { + var _a; + var types = []; + for (var _i = 1; _i < arguments.length; _i++) { + types[_i - 1] = arguments[_i]; + } + return (_a = this.context).lookup.apply(_a, __spreadArrays([this.get(index)], types)); + }; + PDFArray.prototype.asRectangle = function () { + if (this.size() !== 4) + throw new PDFArrayIsNotRectangleError(this.size()); + var lowerLeftX = this.lookup(0, PDFNumber).asNumber(); + var lowerLeftY = this.lookup(1, PDFNumber).asNumber(); + var upperRightX = this.lookup(2, PDFNumber).asNumber(); + var upperRightY = this.lookup(3, PDFNumber).asNumber(); + var x = lowerLeftX; + var y = lowerLeftY; + var width = upperRightX - lowerLeftX; + var height = upperRightY - lowerLeftY; + return { x: x, y: y, width: width, height: height }; + }; + PDFArray.prototype.asArray = function () { + return this.array.slice(); + }; + PDFArray.prototype.clone = function (context) { + var clone = PDFArray.withContext(context || this.context); + for (var idx = 0, len = this.size(); idx < len; idx++) { + clone.push(this.array[idx]); + } + return clone; + }; + PDFArray.prototype.toString = function () { + var arrayString = '[ '; + for (var idx = 0, len = this.size(); idx < len; idx++) { + arrayString += this.get(idx).toString(); + arrayString += ' '; + } + arrayString += ']'; + return arrayString; + }; + PDFArray.prototype.sizeInBytes = function () { + var size = 3; + for (var idx = 0, len = this.size(); idx < len; idx++) { + size += this.get(idx).sizeInBytes() + 1; + } + return size; + }; + PDFArray.prototype.copyBytesInto = function (buffer, offset) { + var initialOffset = offset; + buffer[offset++] = CharCodes$1.LeftSquareBracket; + buffer[offset++] = CharCodes$1.Space; + for (var idx = 0, len = this.size(); idx < len; idx++) { + offset += this.get(idx).copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Space; + } + buffer[offset++] = CharCodes$1.RightSquareBracket; + return offset - initialOffset; + }; + PDFArray.prototype.scalePDFNumbers = function (x, y) { + for (var idx = 0, len = this.size(); idx < len; idx++) { + var el = this.lookup(idx); + if (el instanceof PDFNumber) { + var factor = idx % 2 === 0 ? x : y; + this.set(idx, PDFNumber.of(el.asNumber() * factor)); + } + } + }; + PDFArray.withContext = function (context) { return new PDFArray(context); }; + return PDFArray; + }(PDFObject)); + + var ENFORCER = {}; + var PDFBool = /** @class */ (function (_super) { + __extends(PDFBool, _super); + function PDFBool(enforcer, value) { + var _this = this; + if (enforcer !== ENFORCER) + throw new PrivateConstructorError('PDFBool'); + _this = _super.call(this) || this; + _this.value = value; + return _this; + } + PDFBool.prototype.asBoolean = function () { + return this.value; + }; + PDFBool.prototype.clone = function () { + return this; + }; + PDFBool.prototype.toString = function () { + return String(this.value); + }; + PDFBool.prototype.sizeInBytes = function () { + return this.value ? 4 : 5; + }; + PDFBool.prototype.copyBytesInto = function (buffer, offset) { + if (this.value) { + buffer[offset++] = CharCodes$1.t; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.u; + buffer[offset++] = CharCodes$1.e; + return 4; + } + else { + buffer[offset++] = CharCodes$1.f; + buffer[offset++] = CharCodes$1.a; + buffer[offset++] = CharCodes$1.l; + buffer[offset++] = CharCodes$1.s; + buffer[offset++] = CharCodes$1.e; + return 5; + } + }; + PDFBool.True = new PDFBool(ENFORCER, true); + PDFBool.False = new PDFBool(ENFORCER, false); + return PDFBool; + }(PDFObject)); + + var IsDelimiter = new Uint8Array(256); + IsDelimiter[CharCodes$1.LeftParen] = 1; + IsDelimiter[CharCodes$1.RightParen] = 1; + IsDelimiter[CharCodes$1.LessThan] = 1; + IsDelimiter[CharCodes$1.GreaterThan] = 1; + IsDelimiter[CharCodes$1.LeftSquareBracket] = 1; + IsDelimiter[CharCodes$1.RightSquareBracket] = 1; + IsDelimiter[CharCodes$1.LeftCurly] = 1; + IsDelimiter[CharCodes$1.RightCurly] = 1; + IsDelimiter[CharCodes$1.ForwardSlash] = 1; + IsDelimiter[CharCodes$1.Percent] = 1; + + var IsWhitespace = new Uint8Array(256); + IsWhitespace[CharCodes$1.Null] = 1; + IsWhitespace[CharCodes$1.Tab] = 1; + IsWhitespace[CharCodes$1.Newline] = 1; + IsWhitespace[CharCodes$1.FormFeed] = 1; + IsWhitespace[CharCodes$1.CarriageReturn] = 1; + IsWhitespace[CharCodes$1.Space] = 1; + + var IsIrregular = new Uint8Array(256); + for (var idx$1 = 0, len = 256; idx$1 < len; idx$1++) { + IsIrregular[idx$1] = IsWhitespace[idx$1] || IsDelimiter[idx$1] ? 1 : 0; + } + IsIrregular[CharCodes$1.Hash] = 1; + + var decodeName = function (name) { + return name.replace(/#([\dABCDEF]{2})/g, function (_, hex) { return charFromHexCode(hex); }); + }; + var isRegularChar = function (charCode) { + return charCode >= CharCodes$1.ExclamationPoint && + charCode <= CharCodes$1.Tilde && + !IsIrregular[charCode]; + }; + var ENFORCER$1 = {}; + var pool = new Map(); + var PDFName = /** @class */ (function (_super) { + __extends(PDFName, _super); + function PDFName(enforcer, name) { + var _this = this; + if (enforcer !== ENFORCER$1) + throw new PrivateConstructorError('PDFName'); + _this = _super.call(this) || this; + var encodedName = '/'; + for (var idx = 0, len = name.length; idx < len; idx++) { + var character = name[idx]; + var code = toCharCode(character); + encodedName += isRegularChar(code) ? character : "#" + toHexString(code); + } + _this.encodedName = encodedName; + return _this; + } + PDFName.prototype.asBytes = function () { + var bytes = []; + var hex = ''; + var escaped = false; + var pushByte = function (byte) { + if (byte !== undefined) + bytes.push(byte); + escaped = false; + }; + for (var idx = 1, len = this.encodedName.length; idx < len; idx++) { + var char = this.encodedName[idx]; + var byte = toCharCode(char); + var nextChar = this.encodedName[idx + 1]; + if (!escaped) { + if (byte === CharCodes$1.Hash) + escaped = true; + else + pushByte(byte); + } + else { + if ((byte >= CharCodes$1.Zero && byte <= CharCodes$1.Nine) || + (byte >= CharCodes$1.a && byte <= CharCodes$1.f) || + (byte >= CharCodes$1.A && byte <= CharCodes$1.F)) { + hex += char; + if (hex.length === 2 || + !((nextChar >= '0' && nextChar <= '9') || + (nextChar >= 'a' && nextChar <= 'f') || + (nextChar >= 'A' && nextChar <= 'F'))) { + pushByte(parseInt(hex, 16)); + hex = ''; + } + } + else { + pushByte(byte); + } + } + } + return new Uint8Array(bytes); + }; + // TODO: This should probably use `utf8Decode()` + // TODO: Polyfill Array.from? + PDFName.prototype.decodeText = function () { + var bytes = this.asBytes(); + return String.fromCharCode.apply(String, Array.from(bytes)); + }; + PDFName.prototype.asString = function () { + return this.encodedName; + }; + /** @deprecated in favor of [[PDFName.asString]] */ + PDFName.prototype.value = function () { + return this.encodedName; + }; + PDFName.prototype.clone = function () { + return this; + }; + PDFName.prototype.toString = function () { + return this.encodedName; + }; + PDFName.prototype.sizeInBytes = function () { + return this.encodedName.length; + }; + PDFName.prototype.copyBytesInto = function (buffer, offset) { + offset += copyStringIntoBuffer(this.encodedName, buffer, offset); + return this.encodedName.length; + }; + PDFName.of = function (name) { + var decodedValue = decodeName(name); + var instance = pool.get(decodedValue); + if (!instance) { + instance = new PDFName(ENFORCER$1, decodedValue); + pool.set(decodedValue, instance); + } + return instance; + }; + /* tslint:disable member-ordering */ + PDFName.Length = PDFName.of('Length'); + PDFName.FlateDecode = PDFName.of('FlateDecode'); + PDFName.Resources = PDFName.of('Resources'); + PDFName.Font = PDFName.of('Font'); + PDFName.XObject = PDFName.of('XObject'); + PDFName.ExtGState = PDFName.of('ExtGState'); + PDFName.Contents = PDFName.of('Contents'); + PDFName.Type = PDFName.of('Type'); + PDFName.Parent = PDFName.of('Parent'); + PDFName.MediaBox = PDFName.of('MediaBox'); + PDFName.Page = PDFName.of('Page'); + PDFName.Annots = PDFName.of('Annots'); + PDFName.TrimBox = PDFName.of('TrimBox'); + PDFName.ArtBox = PDFName.of('ArtBox'); + PDFName.BleedBox = PDFName.of('BleedBox'); + PDFName.CropBox = PDFName.of('CropBox'); + PDFName.Rotate = PDFName.of('Rotate'); + PDFName.Title = PDFName.of('Title'); + PDFName.Author = PDFName.of('Author'); + PDFName.Subject = PDFName.of('Subject'); + PDFName.Creator = PDFName.of('Creator'); + PDFName.Keywords = PDFName.of('Keywords'); + PDFName.Producer = PDFName.of('Producer'); + PDFName.CreationDate = PDFName.of('CreationDate'); + PDFName.ModDate = PDFName.of('ModDate'); + return PDFName; + }(PDFObject)); + + var PDFNull = /** @class */ (function (_super) { + __extends(PDFNull, _super); + function PDFNull() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFNull.prototype.asNull = function () { + return null; + }; + PDFNull.prototype.clone = function () { + return this; + }; + PDFNull.prototype.toString = function () { + return 'null'; + }; + PDFNull.prototype.sizeInBytes = function () { + return 4; + }; + PDFNull.prototype.copyBytesInto = function (buffer, offset) { + buffer[offset++] = CharCodes$1.n; + buffer[offset++] = CharCodes$1.u; + buffer[offset++] = CharCodes$1.l; + buffer[offset++] = CharCodes$1.l; + return 4; + }; + return PDFNull; + }(PDFObject)); + var PDFNull$1 = new PDFNull(); + + var PDFDict = /** @class */ (function (_super) { + __extends(PDFDict, _super); + function PDFDict(map, context) { + var _this = _super.call(this) || this; + _this.dict = map; + _this.context = context; + return _this; + } + PDFDict.prototype.keys = function () { + return Array.from(this.dict.keys()); + }; + PDFDict.prototype.values = function () { + return Array.from(this.dict.values()); + }; + PDFDict.prototype.entries = function () { + return Array.from(this.dict.entries()); + }; + PDFDict.prototype.set = function (key, value) { + this.dict.set(key, value); + }; + PDFDict.prototype.get = function (key, + // TODO: `preservePDFNull` is for backwards compatibility. Should be + // removed in next breaking API change. + preservePDFNull) { + if (preservePDFNull === void 0) { preservePDFNull = false; } + var value = this.dict.get(key); + if (value === PDFNull$1 && !preservePDFNull) + return undefined; + return value; + }; + PDFDict.prototype.has = function (key) { + var value = this.dict.get(key); + return value !== undefined && value !== PDFNull$1; + }; + PDFDict.prototype.lookupMaybe = function (key) { + var _a; + var types = []; + for (var _i = 1; _i < arguments.length; _i++) { + types[_i - 1] = arguments[_i]; + } + // TODO: `preservePDFNull` is for backwards compatibility. Should be + // removed in next breaking API change. + var preservePDFNull = types.includes(PDFNull$1); + var value = (_a = this.context).lookupMaybe.apply(_a, __spreadArrays([this.get(key, preservePDFNull)], types)); + if (value === PDFNull$1 && !preservePDFNull) + return undefined; + return value; + }; + PDFDict.prototype.lookup = function (key) { + var _a; + var types = []; + for (var _i = 1; _i < arguments.length; _i++) { + types[_i - 1] = arguments[_i]; + } + // TODO: `preservePDFNull` is for backwards compatibility. Should be + // removed in next breaking API change. + var preservePDFNull = types.includes(PDFNull$1); + var value = (_a = this.context).lookup.apply(_a, __spreadArrays([this.get(key, preservePDFNull)], types)); + if (value === PDFNull$1 && !preservePDFNull) + return undefined; + return value; + }; + PDFDict.prototype.delete = function (key) { + return this.dict.delete(key); + }; + PDFDict.prototype.asMap = function () { + return new Map(this.dict); + }; + /** Generate a random key that doesn't exist in current key set */ + PDFDict.prototype.uniqueKey = function (tag) { + if (tag === void 0) { tag = ''; } + var existingKeys = this.keys(); + var key = PDFName.of(this.context.addRandomSuffix(tag, 10)); + while (existingKeys.includes(key)) { + key = PDFName.of(this.context.addRandomSuffix(tag, 10)); + } + return key; + }; + PDFDict.prototype.clone = function (context) { + var clone = PDFDict.withContext(context || this.context); + var entries = this.entries(); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], key = _a[0], value = _a[1]; + clone.set(key, value); + } + return clone; + }; + PDFDict.prototype.toString = function () { + var dictString = '<<\n'; + var entries = this.entries(); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], key = _a[0], value = _a[1]; + dictString += key.toString() + ' ' + value.toString() + '\n'; + } + dictString += '>>'; + return dictString; + }; + PDFDict.prototype.sizeInBytes = function () { + var size = 5; + var entries = this.entries(); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], key = _a[0], value = _a[1]; + size += key.sizeInBytes() + value.sizeInBytes() + 2; + } + return size; + }; + PDFDict.prototype.copyBytesInto = function (buffer, offset) { + var initialOffset = offset; + buffer[offset++] = CharCodes$1.LessThan; + buffer[offset++] = CharCodes$1.LessThan; + buffer[offset++] = CharCodes$1.Newline; + var entries = this.entries(); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], key = _a[0], value = _a[1]; + offset += key.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Space; + offset += value.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + } + buffer[offset++] = CharCodes$1.GreaterThan; + buffer[offset++] = CharCodes$1.GreaterThan; + return offset - initialOffset; + }; + PDFDict.withContext = function (context) { return new PDFDict(new Map(), context); }; + PDFDict.fromMapWithContext = function (map, context) { + return new PDFDict(map, context); + }; + return PDFDict; + }(PDFObject)); + + var PDFStream = /** @class */ (function (_super) { + __extends(PDFStream, _super); + function PDFStream(dict) { + var _this = _super.call(this) || this; + _this.dict = dict; + return _this; + } + PDFStream.prototype.clone = function (_context) { + throw new MethodNotImplementedError(this.constructor.name, 'clone'); + }; + PDFStream.prototype.getContentsString = function () { + throw new MethodNotImplementedError(this.constructor.name, 'getContentsString'); + }; + PDFStream.prototype.getContents = function () { + throw new MethodNotImplementedError(this.constructor.name, 'getContents'); + }; + PDFStream.prototype.getContentsSize = function () { + throw new MethodNotImplementedError(this.constructor.name, 'getContentsSize'); + }; + PDFStream.prototype.updateDict = function () { + var contentsSize = this.getContentsSize(); + this.dict.set(PDFName.Length, PDFNumber.of(contentsSize)); + }; + PDFStream.prototype.sizeInBytes = function () { + this.updateDict(); + return this.dict.sizeInBytes() + this.getContentsSize() + 18; + }; + PDFStream.prototype.toString = function () { + this.updateDict(); + var streamString = this.dict.toString(); + streamString += '\nstream\n'; + streamString += this.getContentsString(); + streamString += '\nendstream'; + return streamString; + }; + PDFStream.prototype.copyBytesInto = function (buffer, offset) { + this.updateDict(); + var initialOffset = offset; + offset += this.dict.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.s; + buffer[offset++] = CharCodes$1.t; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.e; + buffer[offset++] = CharCodes$1.a; + buffer[offset++] = CharCodes$1.m; + buffer[offset++] = CharCodes$1.Newline; + var contents = this.getContents(); + for (var idx = 0, len = contents.length; idx < len; idx++) { + buffer[offset++] = contents[idx]; + } + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.e; + buffer[offset++] = CharCodes$1.n; + buffer[offset++] = CharCodes$1.d; + buffer[offset++] = CharCodes$1.s; + buffer[offset++] = CharCodes$1.t; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.e; + buffer[offset++] = CharCodes$1.a; + buffer[offset++] = CharCodes$1.m; + return offset - initialOffset; + }; + return PDFStream; + }(PDFObject)); + + var PDFRawStream = /** @class */ (function (_super) { + __extends(PDFRawStream, _super); + function PDFRawStream(dict, contents) { + var _this = _super.call(this, dict) || this; + _this.contents = contents; + return _this; + } + PDFRawStream.prototype.asUint8Array = function () { + return this.contents.slice(); + }; + PDFRawStream.prototype.clone = function (context) { + return PDFRawStream.of(this.dict.clone(context), this.contents.slice()); + }; + PDFRawStream.prototype.getContentsString = function () { + return arrayAsString(this.contents); + }; + PDFRawStream.prototype.getContents = function () { + return this.contents; + }; + PDFRawStream.prototype.getContentsSize = function () { + return this.contents.length; + }; + PDFRawStream.of = function (dict, contents) { + return new PDFRawStream(dict, contents); + }; + return PDFRawStream; + }(PDFStream)); + + var ENFORCER$2 = {}; + var pool$1 = new Map(); + var PDFRef = /** @class */ (function (_super) { + __extends(PDFRef, _super); + function PDFRef(enforcer, objectNumber, generationNumber) { + var _this = this; + if (enforcer !== ENFORCER$2) + throw new PrivateConstructorError('PDFRef'); + _this = _super.call(this) || this; + _this.objectNumber = objectNumber; + _this.generationNumber = generationNumber; + _this.tag = objectNumber + " " + generationNumber + " R"; + return _this; + } + PDFRef.prototype.clone = function () { + return this; + }; + PDFRef.prototype.toString = function () { + return this.tag; + }; + PDFRef.prototype.sizeInBytes = function () { + return this.tag.length; + }; + PDFRef.prototype.copyBytesInto = function (buffer, offset) { + offset += copyStringIntoBuffer(this.tag, buffer, offset); + return this.tag.length; + }; + PDFRef.of = function (objectNumber, generationNumber) { + if (generationNumber === void 0) { generationNumber = 0; } + var tag = objectNumber + " " + generationNumber + " R"; + var instance = pool$1.get(tag); + if (!instance) { + instance = new PDFRef(ENFORCER$2, objectNumber, generationNumber); + pool$1.set(tag, instance); + } + return instance; + }; + return PDFRef; + }(PDFObject)); + + var PDFOperator = /** @class */ (function () { + function PDFOperator(name, args) { + this.name = name; + this.args = args || []; + } + PDFOperator.prototype.clone = function (context) { + var args = new Array(this.args.length); + for (var idx = 0, len = args.length; idx < len; idx++) { + var arg = this.args[idx]; + args[idx] = arg instanceof PDFObject ? arg.clone(context) : arg; + } + return PDFOperator.of(this.name, args); + }; + PDFOperator.prototype.toString = function () { + var value = ''; + for (var idx = 0, len = this.args.length; idx < len; idx++) { + value += String(this.args[idx]) + ' '; + } + value += this.name; + return value; + }; + PDFOperator.prototype.sizeInBytes = function () { + var size = 0; + for (var idx = 0, len = this.args.length; idx < len; idx++) { + var arg = this.args[idx]; + size += (arg instanceof PDFObject ? arg.sizeInBytes() : arg.length) + 1; + } + size += this.name.length; + return size; + }; + PDFOperator.prototype.copyBytesInto = function (buffer, offset) { + var initialOffset = offset; + for (var idx = 0, len = this.args.length; idx < len; idx++) { + var arg = this.args[idx]; + if (arg instanceof PDFObject) { + offset += arg.copyBytesInto(buffer, offset); + } + else { + offset += copyStringIntoBuffer(arg, buffer, offset); + } + buffer[offset++] = CharCodes$1.Space; + } + offset += copyStringIntoBuffer(this.name, buffer, offset); + return offset - initialOffset; + }; + PDFOperator.of = function (name, args) { + return new PDFOperator(name, args); + }; + return PDFOperator; + }()); + + var PDFOperatorNames; + (function (PDFOperatorNames) { + // Non Stroking Color Operators + PDFOperatorNames["NonStrokingColor"] = "sc"; + PDFOperatorNames["NonStrokingColorN"] = "scn"; + PDFOperatorNames["NonStrokingColorRgb"] = "rg"; + PDFOperatorNames["NonStrokingColorGray"] = "g"; + PDFOperatorNames["NonStrokingColorCmyk"] = "k"; + PDFOperatorNames["NonStrokingColorspace"] = "cs"; + // Stroking Color Operators + PDFOperatorNames["StrokingColor"] = "SC"; + PDFOperatorNames["StrokingColorN"] = "SCN"; + PDFOperatorNames["StrokingColorRgb"] = "RG"; + PDFOperatorNames["StrokingColorGray"] = "G"; + PDFOperatorNames["StrokingColorCmyk"] = "K"; + PDFOperatorNames["StrokingColorspace"] = "CS"; + // Marked Content Operators + PDFOperatorNames["BeginMarkedContentSequence"] = "BDC"; + PDFOperatorNames["BeginMarkedContent"] = "BMC"; + PDFOperatorNames["EndMarkedContent"] = "EMC"; + PDFOperatorNames["MarkedContentPointWithProps"] = "DP"; + PDFOperatorNames["MarkedContentPoint"] = "MP"; + PDFOperatorNames["DrawObject"] = "Do"; + // Graphics State Operators + PDFOperatorNames["ConcatTransformationMatrix"] = "cm"; + PDFOperatorNames["PopGraphicsState"] = "Q"; + PDFOperatorNames["PushGraphicsState"] = "q"; + PDFOperatorNames["SetFlatness"] = "i"; + PDFOperatorNames["SetGraphicsStateParams"] = "gs"; + PDFOperatorNames["SetLineCapStyle"] = "J"; + PDFOperatorNames["SetLineDashPattern"] = "d"; + PDFOperatorNames["SetLineJoinStyle"] = "j"; + PDFOperatorNames["SetLineMiterLimit"] = "M"; + PDFOperatorNames["SetLineWidth"] = "w"; + PDFOperatorNames["SetTextMatrix"] = "Tm"; + PDFOperatorNames["SetRenderingIntent"] = "ri"; + // Graphics Operators + PDFOperatorNames["AppendRectangle"] = "re"; + PDFOperatorNames["BeginInlineImage"] = "BI"; + PDFOperatorNames["BeginInlineImageData"] = "ID"; + PDFOperatorNames["EndInlineImage"] = "EI"; + PDFOperatorNames["ClipEvenOdd"] = "W*"; + PDFOperatorNames["ClipNonZero"] = "W"; + PDFOperatorNames["CloseAndStroke"] = "s"; + PDFOperatorNames["CloseFillEvenOddAndStroke"] = "b*"; + PDFOperatorNames["CloseFillNonZeroAndStroke"] = "b"; + PDFOperatorNames["ClosePath"] = "h"; + PDFOperatorNames["AppendBezierCurve"] = "c"; + PDFOperatorNames["CurveToReplicateFinalPoint"] = "y"; + PDFOperatorNames["CurveToReplicateInitialPoint"] = "v"; + PDFOperatorNames["EndPath"] = "n"; + PDFOperatorNames["FillEvenOddAndStroke"] = "B*"; + PDFOperatorNames["FillEvenOdd"] = "f*"; + PDFOperatorNames["FillNonZeroAndStroke"] = "B"; + PDFOperatorNames["FillNonZero"] = "f"; + PDFOperatorNames["LegacyFillNonZero"] = "F"; + PDFOperatorNames["LineTo"] = "l"; + PDFOperatorNames["MoveTo"] = "m"; + PDFOperatorNames["ShadingFill"] = "sh"; + PDFOperatorNames["StrokePath"] = "S"; + // Text Operators + PDFOperatorNames["BeginText"] = "BT"; + PDFOperatorNames["EndText"] = "ET"; + PDFOperatorNames["MoveText"] = "Td"; + PDFOperatorNames["MoveTextSetLeading"] = "TD"; + PDFOperatorNames["NextLine"] = "T*"; + PDFOperatorNames["SetCharacterSpacing"] = "Tc"; + PDFOperatorNames["SetFontAndSize"] = "Tf"; + PDFOperatorNames["SetTextHorizontalScaling"] = "Tz"; + PDFOperatorNames["SetTextLineHeight"] = "TL"; + PDFOperatorNames["SetTextRenderingMode"] = "Tr"; + PDFOperatorNames["SetTextRise"] = "Ts"; + PDFOperatorNames["SetWordSpacing"] = "Tw"; + PDFOperatorNames["ShowText"] = "Tj"; + PDFOperatorNames["ShowTextAdjusted"] = "TJ"; + PDFOperatorNames["ShowTextLine"] = "'"; + PDFOperatorNames["ShowTextLineAndSpace"] = "\""; + // Type3 Font Operators + PDFOperatorNames["Type3D0"] = "d0"; + PDFOperatorNames["Type3D1"] = "d1"; + // Compatibility Section Operators + PDFOperatorNames["BeginCompatibilitySection"] = "BX"; + PDFOperatorNames["EndCompatibilitySection"] = "EX"; + })(PDFOperatorNames || (PDFOperatorNames = {})); + var Ops = PDFOperatorNames; + + var PDFFlateStream = /** @class */ (function (_super) { + __extends(PDFFlateStream, _super); + function PDFFlateStream(dict, encode) { + var _this = _super.call(this, dict) || this; + _this.computeContents = function () { + var unencodedContents = _this.getUnencodedContents(); + return _this.encode ? pako_1$1.deflate(unencodedContents) : unencodedContents; + }; + _this.encode = encode; + if (encode) + dict.set(PDFName.of('Filter'), PDFName.of('FlateDecode')); + _this.contentsCache = Cache.populatedBy(_this.computeContents); + return _this; + } + PDFFlateStream.prototype.getContents = function () { + return this.contentsCache.access(); + }; + PDFFlateStream.prototype.getContentsSize = function () { + return this.contentsCache.access().length; + }; + PDFFlateStream.prototype.getUnencodedContents = function () { + throw new MethodNotImplementedError(this.constructor.name, 'getUnencodedContents'); + }; + return PDFFlateStream; + }(PDFStream)); + + var PDFContentStream = /** @class */ (function (_super) { + __extends(PDFContentStream, _super); + function PDFContentStream(dict, operators, encode) { + if (encode === void 0) { encode = true; } + var _this = _super.call(this, dict, encode) || this; + _this.operators = operators; + return _this; + } + PDFContentStream.prototype.push = function () { + var _a; + var operators = []; + for (var _i = 0; _i < arguments.length; _i++) { + operators[_i] = arguments[_i]; + } + (_a = this.operators).push.apply(_a, operators); + }; + PDFContentStream.prototype.clone = function (context) { + var operators = new Array(this.operators.length); + for (var idx = 0, len = this.operators.length; idx < len; idx++) { + operators[idx] = this.operators[idx].clone(context); + } + var _a = this, dict = _a.dict, encode = _a.encode; + return PDFContentStream.of(dict.clone(context), operators, encode); + }; + PDFContentStream.prototype.getContentsString = function () { + var value = ''; + for (var idx = 0, len = this.operators.length; idx < len; idx++) { + value += this.operators[idx] + "\n"; + } + return value; + }; + PDFContentStream.prototype.getUnencodedContents = function () { + var buffer = new Uint8Array(this.getUnencodedContentsSize()); + var offset = 0; + for (var idx = 0, len = this.operators.length; idx < len; idx++) { + offset += this.operators[idx].copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + } + return buffer; + }; + PDFContentStream.prototype.getUnencodedContentsSize = function () { + var size = 0; + for (var idx = 0, len = this.operators.length; idx < len; idx++) { + size += this.operators[idx].sizeInBytes() + 1; + } + return size; + }; + PDFContentStream.of = function (dict, operators, encode) { + if (encode === void 0) { encode = true; } + return new PDFContentStream(dict, operators, encode); + }; + return PDFContentStream; + }(PDFFlateStream)); + + /** + * Generates a pseudo random number. Although it is not cryptographically secure + * and uniformly distributed, it is not a concern for the intended use-case, + * which is to generate distinct numbers. + * + * Credit: https://stackoverflow.com/a/19303725/10254049 + */ + var SimpleRNG = /** @class */ (function () { + function SimpleRNG(seed) { + this.seed = seed; + } + SimpleRNG.prototype.nextInt = function () { + var x = Math.sin(this.seed++) * 10000; + return x - Math.floor(x); + }; + SimpleRNG.withSeed = function (seed) { return new SimpleRNG(seed); }; + return SimpleRNG; + }()); + + var byAscendingObjectNumber = function (_a, _b) { + var a = _a[0]; + var b = _b[0]; + return a.objectNumber - b.objectNumber; + }; + var PDFContext = /** @class */ (function () { + function PDFContext() { + this.largestObjectNumber = 0; + this.header = PDFHeader.forVersion(1, 7); + this.trailerInfo = {}; + this.indirectObjects = new Map(); + this.rng = SimpleRNG.withSeed(1); + } + PDFContext.prototype.assign = function (ref, object) { + this.indirectObjects.set(ref, object); + if (ref.objectNumber > this.largestObjectNumber) { + this.largestObjectNumber = ref.objectNumber; + } + }; + PDFContext.prototype.nextRef = function () { + this.largestObjectNumber += 1; + return PDFRef.of(this.largestObjectNumber); + }; + PDFContext.prototype.register = function (object) { + var ref = this.nextRef(); + this.assign(ref, object); + return ref; + }; + PDFContext.prototype.delete = function (ref) { + return this.indirectObjects.delete(ref); + }; + PDFContext.prototype.lookupMaybe = function (ref) { + var types = []; + for (var _i = 1; _i < arguments.length; _i++) { + types[_i - 1] = arguments[_i]; + } + // TODO: `preservePDFNull` is for backwards compatibility. Should be + // removed in next breaking API change. + var preservePDFNull = types.includes(PDFNull$1); + var result = ref instanceof PDFRef ? this.indirectObjects.get(ref) : ref; + if (!result || (result === PDFNull$1 && !preservePDFNull)) + return undefined; + for (var idx = 0, len = types.length; idx < len; idx++) { + var type = types[idx]; + if (type === PDFNull$1) { + if (result === PDFNull$1) + return result; + } + else { + if (result instanceof type) + return result; + } + } + throw new UnexpectedObjectTypeError(types, result); + }; + PDFContext.prototype.lookup = function (ref) { + var types = []; + for (var _i = 1; _i < arguments.length; _i++) { + types[_i - 1] = arguments[_i]; + } + var result = ref instanceof PDFRef ? this.indirectObjects.get(ref) : ref; + if (types.length === 0) + return result; + for (var idx = 0, len = types.length; idx < len; idx++) { + var type = types[idx]; + if (type === PDFNull$1) { + if (result === PDFNull$1) + return result; + } + else { + if (result instanceof type) + return result; + } + } + throw new UnexpectedObjectTypeError(types, result); + }; + PDFContext.prototype.getObjectRef = function (pdfObject) { + var entries = Array.from(this.indirectObjects.entries()); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], ref = _a[0], object = _a[1]; + if (object === pdfObject) { + return ref; + } + } + return undefined; + }; + PDFContext.prototype.enumerateIndirectObjects = function () { + return Array.from(this.indirectObjects.entries()).sort(byAscendingObjectNumber); + }; + PDFContext.prototype.obj = function (literal) { + if (literal instanceof PDFObject) { + return literal; + } + else if (literal === null || literal === undefined) { + return PDFNull$1; + } + else if (typeof literal === 'string') { + return PDFName.of(literal); + } + else if (typeof literal === 'number') { + return PDFNumber.of(literal); + } + else if (typeof literal === 'boolean') { + return literal ? PDFBool.True : PDFBool.False; + } + else if (Array.isArray(literal)) { + var array = PDFArray.withContext(this); + for (var idx = 0, len = literal.length; idx < len; idx++) { + array.push(this.obj(literal[idx])); + } + return array; + } + else { + var dict = PDFDict.withContext(this); + var keys = Object.keys(literal); + for (var idx = 0, len = keys.length; idx < len; idx++) { + var key = keys[idx]; + var value = literal[key]; + if (value !== undefined) + dict.set(PDFName.of(key), this.obj(value)); + } + return dict; + } + }; + PDFContext.prototype.stream = function (contents, dict) { + if (dict === void 0) { dict = {}; } + return PDFRawStream.of(this.obj(dict), typedArrayFor(contents)); + }; + PDFContext.prototype.flateStream = function (contents, dict) { + if (dict === void 0) { dict = {}; } + return this.stream(pako_1$1.deflate(typedArrayFor(contents)), __assign(__assign({}, dict), { Filter: 'FlateDecode' })); + }; + PDFContext.prototype.contentStream = function (operators, dict) { + if (dict === void 0) { dict = {}; } + return PDFContentStream.of(this.obj(dict), operators); + }; + PDFContext.prototype.formXObject = function (operators, dict) { + if (dict === void 0) { dict = {}; } + return this.contentStream(operators, __assign(__assign({ BBox: this.obj([0, 0, 0, 0]), Matrix: this.obj([1, 0, 0, 1, 0, 0]) }, dict), { Type: 'XObject', Subtype: 'Form' })); + }; + /* + * Reference to PDFContentStream that contains a single PDFOperator: `q`. + * Used by [[PDFPageLeaf]] instances to ensure that when content streams are + * added to a modified PDF, they start in the default, unchanged graphics + * state. + */ + PDFContext.prototype.getPushGraphicsStateContentStream = function () { + if (this.pushGraphicsStateContentStreamRef) { + return this.pushGraphicsStateContentStreamRef; + } + var dict = this.obj({}); + var op = PDFOperator.of(Ops.PushGraphicsState); + var stream = PDFContentStream.of(dict, [op]); + this.pushGraphicsStateContentStreamRef = this.register(stream); + return this.pushGraphicsStateContentStreamRef; + }; + /* + * Reference to PDFContentStream that contains a single PDFOperator: `Q`. + * Used by [[PDFPageLeaf]] instances to ensure that when content streams are + * added to a modified PDF, they start in the default, unchanged graphics + * state. + */ + PDFContext.prototype.getPopGraphicsStateContentStream = function () { + if (this.popGraphicsStateContentStreamRef) { + return this.popGraphicsStateContentStreamRef; + } + var dict = this.obj({}); + var op = PDFOperator.of(Ops.PopGraphicsState); + var stream = PDFContentStream.of(dict, [op]); + this.popGraphicsStateContentStreamRef = this.register(stream); + return this.popGraphicsStateContentStreamRef; + }; + PDFContext.prototype.addRandomSuffix = function (prefix, suffixLength) { + if (suffixLength === void 0) { suffixLength = 4; } + return prefix + "-" + Math.floor(this.rng.nextInt() * Math.pow(10, suffixLength)); + }; + PDFContext.create = function () { return new PDFContext(); }; + return PDFContext; + }()); + + var PDFPageLeaf = /** @class */ (function (_super) { + __extends(PDFPageLeaf, _super); + function PDFPageLeaf(map, context, autoNormalizeCTM) { + if (autoNormalizeCTM === void 0) { autoNormalizeCTM = true; } + var _this = _super.call(this, map, context) || this; + _this.normalized = false; + _this.autoNormalizeCTM = autoNormalizeCTM; + return _this; + } + PDFPageLeaf.prototype.clone = function (context) { + var clone = PDFPageLeaf.fromMapWithContext(new Map(), context || this.context, this.autoNormalizeCTM); + var entries = this.entries(); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], key = _a[0], value = _a[1]; + clone.set(key, value); + } + return clone; + }; + PDFPageLeaf.prototype.Parent = function () { + return this.lookupMaybe(PDFName.Parent, PDFDict); + }; + PDFPageLeaf.prototype.Contents = function () { + return this.lookup(PDFName.of('Contents')); + }; + PDFPageLeaf.prototype.Annots = function () { + return this.lookupMaybe(PDFName.Annots, PDFArray); + }; + PDFPageLeaf.prototype.BleedBox = function () { + return this.lookupMaybe(PDFName.BleedBox, PDFArray); + }; + PDFPageLeaf.prototype.TrimBox = function () { + return this.lookupMaybe(PDFName.TrimBox, PDFArray); + }; + PDFPageLeaf.prototype.ArtBox = function () { + return this.lookupMaybe(PDFName.ArtBox, PDFArray); + }; + PDFPageLeaf.prototype.Resources = function () { + var dictOrRef = this.getInheritableAttribute(PDFName.Resources); + return this.context.lookupMaybe(dictOrRef, PDFDict); + }; + PDFPageLeaf.prototype.MediaBox = function () { + var arrayOrRef = this.getInheritableAttribute(PDFName.MediaBox); + return this.context.lookup(arrayOrRef, PDFArray); + }; + PDFPageLeaf.prototype.CropBox = function () { + var arrayOrRef = this.getInheritableAttribute(PDFName.CropBox); + return this.context.lookupMaybe(arrayOrRef, PDFArray); + }; + PDFPageLeaf.prototype.Rotate = function () { + var numberOrRef = this.getInheritableAttribute(PDFName.Rotate); + return this.context.lookupMaybe(numberOrRef, PDFNumber); + }; + PDFPageLeaf.prototype.getInheritableAttribute = function (name) { + var attribute; + this.ascend(function (node) { + if (!attribute) + attribute = node.get(name); + }); + return attribute; + }; + PDFPageLeaf.prototype.setParent = function (parentRef) { + this.set(PDFName.Parent, parentRef); + }; + PDFPageLeaf.prototype.addContentStream = function (contentStreamRef) { + var Contents = this.normalizedEntries().Contents || this.context.obj([]); + this.set(PDFName.Contents, Contents); + Contents.push(contentStreamRef); + }; + PDFPageLeaf.prototype.wrapContentStreams = function (startStream, endStream) { + var Contents = this.Contents(); + if (Contents instanceof PDFArray) { + Contents.insert(0, startStream); + Contents.push(endStream); + return true; + } + return false; + }; + PDFPageLeaf.prototype.addAnnot = function (annotRef) { + var Annots = this.normalizedEntries().Annots; + Annots.push(annotRef); + }; + PDFPageLeaf.prototype.removeAnnot = function (annotRef) { + var Annots = this.normalizedEntries().Annots; + var index = Annots.indexOf(annotRef); + if (index !== undefined) { + Annots.remove(index); + } + }; + PDFPageLeaf.prototype.setFontDictionary = function (name, fontDictRef) { + var Font = this.normalizedEntries().Font; + Font.set(name, fontDictRef); + }; + PDFPageLeaf.prototype.newFontDictionaryKey = function (tag) { + var Font = this.normalizedEntries().Font; + return Font.uniqueKey(tag); + }; + PDFPageLeaf.prototype.newFontDictionary = function (tag, fontDictRef) { + var key = this.newFontDictionaryKey(tag); + this.setFontDictionary(key, fontDictRef); + return key; + }; + PDFPageLeaf.prototype.setXObject = function (name, xObjectRef) { + var XObject = this.normalizedEntries().XObject; + XObject.set(name, xObjectRef); + }; + PDFPageLeaf.prototype.newXObjectKey = function (tag) { + var XObject = this.normalizedEntries().XObject; + return XObject.uniqueKey(tag); + }; + PDFPageLeaf.prototype.newXObject = function (tag, xObjectRef) { + var key = this.newXObjectKey(tag); + this.setXObject(key, xObjectRef); + return key; + }; + PDFPageLeaf.prototype.setExtGState = function (name, extGStateRef) { + var ExtGState = this.normalizedEntries().ExtGState; + ExtGState.set(name, extGStateRef); + }; + PDFPageLeaf.prototype.newExtGStateKey = function (tag) { + var ExtGState = this.normalizedEntries().ExtGState; + return ExtGState.uniqueKey(tag); + }; + PDFPageLeaf.prototype.newExtGState = function (tag, extGStateRef) { + var key = this.newExtGStateKey(tag); + this.setExtGState(key, extGStateRef); + return key; + }; + PDFPageLeaf.prototype.ascend = function (visitor) { + visitor(this); + var Parent = this.Parent(); + if (Parent) + Parent.ascend(visitor); + }; + PDFPageLeaf.prototype.normalize = function () { + if (this.normalized) + return; + var context = this.context; + var contentsRef = this.get(PDFName.Contents); + var contents = this.context.lookup(contentsRef); + if (contents instanceof PDFStream) { + this.set(PDFName.Contents, context.obj([contentsRef])); + } + if (this.autoNormalizeCTM) { + this.wrapContentStreams(this.context.getPushGraphicsStateContentStream(), this.context.getPopGraphicsStateContentStream()); + } + // TODO: Clone `Resources` if it is inherited + var dictOrRef = this.getInheritableAttribute(PDFName.Resources); + var Resources = context.lookupMaybe(dictOrRef, PDFDict) || context.obj({}); + this.set(PDFName.Resources, Resources); + // TODO: Clone `Font` if it is inherited + var Font = Resources.lookupMaybe(PDFName.Font, PDFDict) || context.obj({}); + Resources.set(PDFName.Font, Font); + // TODO: Clone `XObject` if it is inherited + var XObject = Resources.lookupMaybe(PDFName.XObject, PDFDict) || context.obj({}); + Resources.set(PDFName.XObject, XObject); + // TODO: Clone `ExtGState` if it is inherited + var ExtGState = Resources.lookupMaybe(PDFName.ExtGState, PDFDict) || context.obj({}); + Resources.set(PDFName.ExtGState, ExtGState); + var Annots = this.Annots() || context.obj([]); + this.set(PDFName.Annots, Annots); + this.normalized = true; + }; + PDFPageLeaf.prototype.normalizedEntries = function () { + this.normalize(); + var Annots = this.Annots(); + var Resources = this.Resources(); + var Contents = this.Contents(); + return { + Annots: Annots, + Resources: Resources, + Contents: Contents, + Font: Resources.lookup(PDFName.Font, PDFDict), + XObject: Resources.lookup(PDFName.XObject, PDFDict), + ExtGState: Resources.lookup(PDFName.ExtGState, PDFDict), + }; + }; + PDFPageLeaf.InheritableEntries = [ + 'Resources', + 'MediaBox', + 'CropBox', + 'Rotate', + ]; + PDFPageLeaf.withContextAndParent = function (context, parent) { + var dict = new Map(); + dict.set(PDFName.Type, PDFName.Page); + dict.set(PDFName.Parent, parent); + dict.set(PDFName.Resources, context.obj({})); + dict.set(PDFName.MediaBox, context.obj([0, 0, 612, 792])); + return new PDFPageLeaf(dict, context, false); + }; + PDFPageLeaf.fromMapWithContext = function (map, context, autoNormalizeCTM) { + if (autoNormalizeCTM === void 0) { autoNormalizeCTM = true; } + return new PDFPageLeaf(map, context, autoNormalizeCTM); + }; + return PDFPageLeaf; + }(PDFDict)); + + /** + * PDFObjectCopier copies PDFObjects from a src context to a dest context. + * The primary use case for this is to copy pages between PDFs. + * + * _Copying_ an object with a PDFObjectCopier is different from _cloning_ an + * object with its [[PDFObject.clone]] method: + * + * ``` + * const src: PDFContext = ... + * const dest: PDFContext = ... + * const originalObject: PDFObject = ... + * const copiedObject = PDFObjectCopier.for(src, dest).copy(originalObject); + * const clonedObject = originalObject.clone(); + * ``` + * + * Copying an object is equivalent to cloning it and then copying over any other + * objects that it references. Note that only dictionaries, arrays, and streams + * (or structures build from them) can contain indirect references to other + * objects. Copying a PDFObject that is not a dictionary, array, or stream is + * supported, but is equivalent to cloning it. + */ + var PDFObjectCopier = /** @class */ (function () { + function PDFObjectCopier(src, dest) { + var _this = this; + this.traversedObjects = new Map(); + // prettier-ignore + this.copy = function (object) { return (object instanceof PDFPageLeaf ? _this.copyPDFPage(object) + : object instanceof PDFDict ? _this.copyPDFDict(object) + : object instanceof PDFArray ? _this.copyPDFArray(object) + : object instanceof PDFStream ? _this.copyPDFStream(object) + : object instanceof PDFRef ? _this.copyPDFIndirectObject(object) + : object.clone()); }; + this.copyPDFPage = function (originalPage) { + var clonedPage = originalPage.clone(); + // Move any entries that the originalPage is inheriting from its parent + // tree nodes directly into originalPage so they are preserved during + // the copy. + var InheritableEntries = PDFPageLeaf.InheritableEntries; + for (var idx = 0, len = InheritableEntries.length; idx < len; idx++) { + var key = PDFName.of(InheritableEntries[idx]); + var value = clonedPage.getInheritableAttribute(key); + if (!clonedPage.get(key) && value) + clonedPage.set(key, value); + } + // Remove the parent reference to prevent the whole donor document's page + // tree from being copied when we only need a single page. + clonedPage.delete(PDFName.of('Parent')); + return _this.copyPDFDict(clonedPage); + }; + this.copyPDFDict = function (originalDict) { + if (_this.traversedObjects.has(originalDict)) { + return _this.traversedObjects.get(originalDict); + } + var clonedDict = originalDict.clone(_this.dest); + _this.traversedObjects.set(originalDict, clonedDict); + var entries = originalDict.entries(); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], key = _a[0], value = _a[1]; + clonedDict.set(key, _this.copy(value)); + } + return clonedDict; + }; + this.copyPDFArray = function (originalArray) { + if (_this.traversedObjects.has(originalArray)) { + return _this.traversedObjects.get(originalArray); + } + var clonedArray = originalArray.clone(_this.dest); + _this.traversedObjects.set(originalArray, clonedArray); + for (var idx = 0, len = originalArray.size(); idx < len; idx++) { + var value = originalArray.get(idx); + clonedArray.set(idx, _this.copy(value)); + } + return clonedArray; + }; + this.copyPDFStream = function (originalStream) { + if (_this.traversedObjects.has(originalStream)) { + return _this.traversedObjects.get(originalStream); + } + var clonedStream = originalStream.clone(_this.dest); + _this.traversedObjects.set(originalStream, clonedStream); + var entries = originalStream.dict.entries(); + for (var idx = 0, len = entries.length; idx < len; idx++) { + var _a = entries[idx], key = _a[0], value = _a[1]; + clonedStream.dict.set(key, _this.copy(value)); + } + return clonedStream; + }; + this.copyPDFIndirectObject = function (ref) { + var alreadyMapped = _this.traversedObjects.has(ref); + if (!alreadyMapped) { + var newRef = _this.dest.nextRef(); + _this.traversedObjects.set(ref, newRef); + var dereferencedValue = _this.src.lookup(ref); + if (dereferencedValue) { + var cloned = _this.copy(dereferencedValue); + _this.dest.assign(newRef, cloned); + } + } + return _this.traversedObjects.get(ref); + }; + this.src = src; + this.dest = dest; + } + PDFObjectCopier.for = function (src, dest) { + return new PDFObjectCopier(src, dest); + }; + return PDFObjectCopier; + }()); + + /** + * Entries should be added using the [[addEntry]] and [[addDeletedEntry]] + * methods **in order of ascending object number**. + */ + var PDFCrossRefSection = /** @class */ (function () { + function PDFCrossRefSection(firstEntry) { + this.subsections = firstEntry ? [[firstEntry]] : []; + this.chunkIdx = 0; + this.chunkLength = firstEntry ? 1 : 0; + } + PDFCrossRefSection.prototype.addEntry = function (ref, offset) { + this.append({ ref: ref, offset: offset, deleted: false }); + }; + PDFCrossRefSection.prototype.addDeletedEntry = function (ref, nextFreeObjectNumber) { + this.append({ ref: ref, offset: nextFreeObjectNumber, deleted: true }); + }; + PDFCrossRefSection.prototype.toString = function () { + var section = "xref\n"; + for (var rangeIdx = 0, rangeLen = this.subsections.length; rangeIdx < rangeLen; rangeIdx++) { + var range = this.subsections[rangeIdx]; + section += range[0].ref.objectNumber + " " + range.length + "\n"; + for (var entryIdx = 0, entryLen = range.length; entryIdx < entryLen; entryIdx++) { + var entry = range[entryIdx]; + section += padStart(String(entry.offset), 10, '0'); + section += ' '; + section += padStart(String(entry.ref.generationNumber), 5, '0'); + section += ' '; + section += entry.deleted ? 'f' : 'n'; + section += ' \n'; + } + } + return section; + }; + PDFCrossRefSection.prototype.sizeInBytes = function () { + var size = 5; + for (var idx = 0, len = this.subsections.length; idx < len; idx++) { + var subsection = this.subsections[idx]; + var subsectionLength = subsection.length; + var firstEntry = subsection[0]; + size += 2; + size += String(firstEntry.ref.objectNumber).length; + size += String(subsectionLength).length; + size += 20 * subsectionLength; + } + return size; + }; + PDFCrossRefSection.prototype.copyBytesInto = function (buffer, offset) { + var initialOffset = offset; + buffer[offset++] = CharCodes$1.x; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.e; + buffer[offset++] = CharCodes$1.f; + buffer[offset++] = CharCodes$1.Newline; + offset += this.copySubsectionsIntoBuffer(this.subsections, buffer, offset); + return offset - initialOffset; + }; + PDFCrossRefSection.prototype.copySubsectionsIntoBuffer = function (subsections, buffer, offset) { + var initialOffset = offset; + var length = subsections.length; + for (var idx = 0; idx < length; idx++) { + var subsection = this.subsections[idx]; + var firstObjectNumber = String(subsection[0].ref.objectNumber); + offset += copyStringIntoBuffer(firstObjectNumber, buffer, offset); + buffer[offset++] = CharCodes$1.Space; + var rangeLength = String(subsection.length); + offset += copyStringIntoBuffer(rangeLength, buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + offset += this.copyEntriesIntoBuffer(subsection, buffer, offset); + } + return offset - initialOffset; + }; + PDFCrossRefSection.prototype.copyEntriesIntoBuffer = function (entries, buffer, offset) { + var length = entries.length; + for (var idx = 0; idx < length; idx++) { + var entry = entries[idx]; + var entryOffset = padStart(String(entry.offset), 10, '0'); + offset += copyStringIntoBuffer(entryOffset, buffer, offset); + buffer[offset++] = CharCodes$1.Space; + var entryGen = padStart(String(entry.ref.generationNumber), 5, '0'); + offset += copyStringIntoBuffer(entryGen, buffer, offset); + buffer[offset++] = CharCodes$1.Space; + buffer[offset++] = entry.deleted ? CharCodes$1.f : CharCodes$1.n; + buffer[offset++] = CharCodes$1.Space; + buffer[offset++] = CharCodes$1.Newline; + } + return 20 * length; + }; + PDFCrossRefSection.prototype.append = function (currEntry) { + if (this.chunkLength === 0) { + this.subsections.push([currEntry]); + this.chunkIdx = 0; + this.chunkLength = 1; + return; + } + var chunk = this.subsections[this.chunkIdx]; + var prevEntry = chunk[this.chunkLength - 1]; + if (currEntry.ref.objectNumber - prevEntry.ref.objectNumber > 1) { + this.subsections.push([currEntry]); + this.chunkIdx += 1; + this.chunkLength = 1; + } + else { + chunk.push(currEntry); + this.chunkLength += 1; + } + }; + PDFCrossRefSection.create = function () { + return new PDFCrossRefSection({ + ref: PDFRef.of(0, 65535), + offset: 0, + deleted: true, + }); + }; + PDFCrossRefSection.createEmpty = function () { return new PDFCrossRefSection(); }; + return PDFCrossRefSection; + }()); + + var PDFTrailer = /** @class */ (function () { + function PDFTrailer(lastXRefOffset) { + this.lastXRefOffset = String(lastXRefOffset); + } + PDFTrailer.prototype.toString = function () { + return "startxref\n" + this.lastXRefOffset + "\n%%EOF"; + }; + PDFTrailer.prototype.sizeInBytes = function () { + return 16 + this.lastXRefOffset.length; + }; + PDFTrailer.prototype.copyBytesInto = function (buffer, offset) { + var initialOffset = offset; + buffer[offset++] = CharCodes$1.s; + buffer[offset++] = CharCodes$1.t; + buffer[offset++] = CharCodes$1.a; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.t; + buffer[offset++] = CharCodes$1.x; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.e; + buffer[offset++] = CharCodes$1.f; + buffer[offset++] = CharCodes$1.Newline; + offset += copyStringIntoBuffer(this.lastXRefOffset, buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.Percent; + buffer[offset++] = CharCodes$1.Percent; + buffer[offset++] = CharCodes$1.E; + buffer[offset++] = CharCodes$1.O; + buffer[offset++] = CharCodes$1.F; + return offset - initialOffset; + }; + PDFTrailer.forLastCrossRefSectionOffset = function (offset) { + return new PDFTrailer(offset); + }; + return PDFTrailer; + }()); + + var PDFTrailerDict = /** @class */ (function () { + function PDFTrailerDict(dict) { + this.dict = dict; + } + PDFTrailerDict.prototype.toString = function () { + return "trailer\n" + this.dict.toString(); + }; + PDFTrailerDict.prototype.sizeInBytes = function () { + return 8 + this.dict.sizeInBytes(); + }; + PDFTrailerDict.prototype.copyBytesInto = function (buffer, offset) { + var initialOffset = offset; + buffer[offset++] = CharCodes$1.t; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.a; + buffer[offset++] = CharCodes$1.i; + buffer[offset++] = CharCodes$1.l; + buffer[offset++] = CharCodes$1.e; + buffer[offset++] = CharCodes$1.r; + buffer[offset++] = CharCodes$1.Newline; + offset += this.dict.copyBytesInto(buffer, offset); + return offset - initialOffset; + }; + PDFTrailerDict.of = function (dict) { return new PDFTrailerDict(dict); }; + return PDFTrailerDict; + }()); + + var PDFObjectStream = /** @class */ (function (_super) { + __extends(PDFObjectStream, _super); + function PDFObjectStream(context, objects, encode) { + if (encode === void 0) { encode = true; } + var _this = _super.call(this, context.obj({}), encode) || this; + _this.objects = objects; + _this.offsets = _this.computeObjectOffsets(); + _this.offsetsString = _this.computeOffsetsString(); + _this.dict.set(PDFName.of('Type'), PDFName.of('ObjStm')); + _this.dict.set(PDFName.of('N'), PDFNumber.of(_this.objects.length)); + _this.dict.set(PDFName.of('First'), PDFNumber.of(_this.offsetsString.length)); + return _this; + } + PDFObjectStream.prototype.getObjectsCount = function () { + return this.objects.length; + }; + PDFObjectStream.prototype.clone = function (context) { + return PDFObjectStream.withContextAndObjects(context || this.dict.context, this.objects.slice(), this.encode); + }; + PDFObjectStream.prototype.getContentsString = function () { + var value = this.offsetsString; + for (var idx = 0, len = this.objects.length; idx < len; idx++) { + var _a = this.objects[idx], object = _a[1]; + value += object + "\n"; + } + return value; + }; + PDFObjectStream.prototype.getUnencodedContents = function () { + var buffer = new Uint8Array(this.getUnencodedContentsSize()); + var offset = copyStringIntoBuffer(this.offsetsString, buffer, 0); + for (var idx = 0, len = this.objects.length; idx < len; idx++) { + var _a = this.objects[idx], object = _a[1]; + offset += object.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + } + return buffer; + }; + PDFObjectStream.prototype.getUnencodedContentsSize = function () { + return (this.offsetsString.length + + last(this.offsets)[1] + + last(this.objects)[1].sizeInBytes() + + 1); + }; + PDFObjectStream.prototype.computeOffsetsString = function () { + var offsetsString = ''; + for (var idx = 0, len = this.offsets.length; idx < len; idx++) { + var _a = this.offsets[idx], objectNumber = _a[0], offset = _a[1]; + offsetsString += objectNumber + " " + offset + " "; + } + return offsetsString; + }; + PDFObjectStream.prototype.computeObjectOffsets = function () { + var offset = 0; + var offsets = new Array(this.objects.length); + for (var idx = 0, len = this.objects.length; idx < len; idx++) { + var _a = this.objects[idx], ref = _a[0], object = _a[1]; + offsets[idx] = [ref.objectNumber, offset]; + offset += object.sizeInBytes() + 1; // '\n' + } + return offsets; + }; + PDFObjectStream.withContextAndObjects = function (context, objects, encode) { + if (encode === void 0) { encode = true; } + return new PDFObjectStream(context, objects, encode); + }; + return PDFObjectStream; + }(PDFFlateStream)); + + var PDFWriter = /** @class */ (function () { + function PDFWriter(context, objectsPerTick) { + var _this = this; + this.parsedObjects = 0; + this.shouldWaitForTick = function (n) { + _this.parsedObjects += n; + return _this.parsedObjects % _this.objectsPerTick === 0; + }; + this.context = context; + this.objectsPerTick = objectsPerTick; + } + PDFWriter.prototype.serializeToBuffer = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, size, header, indirectObjects, xref, trailerDict, trailer, offset, buffer, idx, len, _b, ref, object, objectNumber, generationNumber, n; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: return [4 /*yield*/, this.computeBufferSize()]; + case 1: + _a = _c.sent(), size = _a.size, header = _a.header, indirectObjects = _a.indirectObjects, xref = _a.xref, trailerDict = _a.trailerDict, trailer = _a.trailer; + offset = 0; + buffer = new Uint8Array(size); + offset += header.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.Newline; + idx = 0, len = indirectObjects.length; + _c.label = 2; + case 2: + if (!(idx < len)) return [3 /*break*/, 5]; + _b = indirectObjects[idx], ref = _b[0], object = _b[1]; + objectNumber = String(ref.objectNumber); + offset += copyStringIntoBuffer(objectNumber, buffer, offset); + buffer[offset++] = CharCodes$1.Space; + generationNumber = String(ref.generationNumber); + offset += copyStringIntoBuffer(generationNumber, buffer, offset); + buffer[offset++] = CharCodes$1.Space; + buffer[offset++] = CharCodes$1.o; + buffer[offset++] = CharCodes$1.b; + buffer[offset++] = CharCodes$1.j; + buffer[offset++] = CharCodes$1.Newline; + offset += object.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.e; + buffer[offset++] = CharCodes$1.n; + buffer[offset++] = CharCodes$1.d; + buffer[offset++] = CharCodes$1.o; + buffer[offset++] = CharCodes$1.b; + buffer[offset++] = CharCodes$1.j; + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.Newline; + n = object instanceof PDFObjectStream ? object.getObjectsCount() : 1; + if (!this.shouldWaitForTick(n)) return [3 /*break*/, 4]; + return [4 /*yield*/, waitForTick()]; + case 3: + _c.sent(); + _c.label = 4; + case 4: + idx++; + return [3 /*break*/, 2]; + case 5: + if (xref) { + offset += xref.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + } + if (trailerDict) { + offset += trailerDict.copyBytesInto(buffer, offset); + buffer[offset++] = CharCodes$1.Newline; + buffer[offset++] = CharCodes$1.Newline; + } + offset += trailer.copyBytesInto(buffer, offset); + return [2 /*return*/, buffer]; + } + }); + }); + }; + PDFWriter.prototype.computeIndirectObjectSize = function (_a) { + var ref = _a[0], object = _a[1]; + var refSize = ref.sizeInBytes() + 3; // 'R' -> 'obj\n' + var objectSize = object.sizeInBytes() + 9; // '\nendobj\n\n' + return refSize + objectSize; + }; + PDFWriter.prototype.createTrailerDict = function () { + return this.context.obj({ + Size: this.context.largestObjectNumber + 1, + Root: this.context.trailerInfo.Root, + Encrypt: this.context.trailerInfo.Encrypt, + Info: this.context.trailerInfo.Info, + ID: this.context.trailerInfo.ID, + }); + }; + PDFWriter.prototype.computeBufferSize = function () { + return __awaiter(this, void 0, void 0, function () { + var header, size, xref, indirectObjects, idx, len, indirectObject, ref, xrefOffset, trailerDict, trailer; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + header = PDFHeader.forVersion(1, 7); + size = header.sizeInBytes() + 2; + xref = PDFCrossRefSection.create(); + indirectObjects = this.context.enumerateIndirectObjects(); + idx = 0, len = indirectObjects.length; + _a.label = 1; + case 1: + if (!(idx < len)) return [3 /*break*/, 4]; + indirectObject = indirectObjects[idx]; + ref = indirectObject[0]; + xref.addEntry(ref, size); + size += this.computeIndirectObjectSize(indirectObject); + if (!this.shouldWaitForTick(1)) return [3 /*break*/, 3]; + return [4 /*yield*/, waitForTick()]; + case 2: + _a.sent(); + _a.label = 3; + case 3: + idx++; + return [3 /*break*/, 1]; + case 4: + xrefOffset = size; + size += xref.sizeInBytes() + 1; // '\n' + trailerDict = PDFTrailerDict.of(this.createTrailerDict()); + size += trailerDict.sizeInBytes() + 2; // '\n\n' + trailer = PDFTrailer.forLastCrossRefSectionOffset(xrefOffset); + size += trailer.sizeInBytes(); + return [2 /*return*/, { size: size, header: header, indirectObjects: indirectObjects, xref: xref, trailerDict: trailerDict, trailer: trailer }]; + } + }); + }); + }; + PDFWriter.forContext = function (context, objectsPerTick) { + return new PDFWriter(context, objectsPerTick); + }; + return PDFWriter; + }()); + + var PDFInvalidObject = /** @class */ (function (_super) { + __extends(PDFInvalidObject, _super); + function PDFInvalidObject(data) { + var _this = _super.call(this) || this; + _this.data = data; + return _this; + } + PDFInvalidObject.prototype.clone = function () { + return PDFInvalidObject.of(this.data.slice()); + }; + PDFInvalidObject.prototype.toString = function () { + return "PDFInvalidObject(" + this.data.length + " bytes)"; + }; + PDFInvalidObject.prototype.sizeInBytes = function () { + return this.data.length; + }; + PDFInvalidObject.prototype.copyBytesInto = function (buffer, offset) { + var length = this.data.length; + for (var idx = 0; idx < length; idx++) { + buffer[offset++] = this.data[idx]; + } + return length; + }; + PDFInvalidObject.of = function (data) { return new PDFInvalidObject(data); }; + return PDFInvalidObject; + }(PDFObject)); + + var EntryType; + (function (EntryType) { + EntryType[EntryType["Deleted"] = 0] = "Deleted"; + EntryType[EntryType["Uncompressed"] = 1] = "Uncompressed"; + EntryType[EntryType["Compressed"] = 2] = "Compressed"; + })(EntryType || (EntryType = {})); + /** + * Entries should be added using the [[addDeletedEntry]], + * [[addUncompressedEntry]], and [[addCompressedEntry]] methods + * **in order of ascending object number**. + */ + var PDFCrossRefStream = /** @class */ (function (_super) { + __extends(PDFCrossRefStream, _super); + function PDFCrossRefStream(dict, entries, encode) { + if (encode === void 0) { encode = true; } + var _this = _super.call(this, dict, encode) || this; + // Returns an array of integer pairs for each subsection of the cross ref + // section, where each integer pair represents: + // firstObjectNumber(OfSection), length(OfSection) + _this.computeIndex = function () { + var subsections = []; + var subsectionLength = 0; + for (var idx = 0, len = _this.entries.length; idx < len; idx++) { + var currEntry = _this.entries[idx]; + var prevEntry = _this.entries[idx - 1]; + if (idx === 0) { + subsections.push(currEntry.ref.objectNumber); + } + else if (currEntry.ref.objectNumber - prevEntry.ref.objectNumber > 1) { + subsections.push(subsectionLength); + subsections.push(currEntry.ref.objectNumber); + subsectionLength = 0; + } + subsectionLength += 1; + } + subsections.push(subsectionLength); + return subsections; + }; + _this.computeEntryTuples = function () { + var entryTuples = new Array(_this.entries.length); + for (var idx = 0, len = _this.entries.length; idx < len; idx++) { + var entry = _this.entries[idx]; + if (entry.type === EntryType.Deleted) { + var type = entry.type, nextFreeObjectNumber = entry.nextFreeObjectNumber, ref = entry.ref; + entryTuples[idx] = [type, nextFreeObjectNumber, ref.generationNumber]; + } + if (entry.type === EntryType.Uncompressed) { + var type = entry.type, offset = entry.offset, ref = entry.ref; + entryTuples[idx] = [type, offset, ref.generationNumber]; + } + if (entry.type === EntryType.Compressed) { + var type = entry.type, objectStreamRef = entry.objectStreamRef, index = entry.index; + entryTuples[idx] = [type, objectStreamRef.objectNumber, index]; + } + } + return entryTuples; + }; + _this.computeMaxEntryByteWidths = function () { + var entryTuples = _this.entryTuplesCache.access(); + var widths = [0, 0, 0]; + for (var idx = 0, len = entryTuples.length; idx < len; idx++) { + var _a = entryTuples[idx], first = _a[0], second = _a[1], third = _a[2]; + var firstSize = sizeInBytes(first); + var secondSize = sizeInBytes(second); + var thirdSize = sizeInBytes(third); + if (firstSize > widths[0]) + widths[0] = firstSize; + if (secondSize > widths[1]) + widths[1] = secondSize; + if (thirdSize > widths[2]) + widths[2] = thirdSize; + } + return widths; + }; + _this.entries = entries || []; + _this.entryTuplesCache = Cache.populatedBy(_this.computeEntryTuples); + _this.maxByteWidthsCache = Cache.populatedBy(_this.computeMaxEntryByteWidths); + _this.indexCache = Cache.populatedBy(_this.computeIndex); + dict.set(PDFName.of('Type'), PDFName.of('XRef')); + return _this; + } + PDFCrossRefStream.prototype.addDeletedEntry = function (ref, nextFreeObjectNumber) { + var type = EntryType.Deleted; + this.entries.push({ type: type, ref: ref, nextFreeObjectNumber: nextFreeObjectNumber }); + this.entryTuplesCache.invalidate(); + this.maxByteWidthsCache.invalidate(); + this.indexCache.invalidate(); + this.contentsCache.invalidate(); + }; + PDFCrossRefStream.prototype.addUncompressedEntry = function (ref, offset) { + var type = EntryType.Uncompressed; + this.entries.push({ type: type, ref: ref, offset: offset }); + this.entryTuplesCache.invalidate(); + this.maxByteWidthsCache.invalidate(); + this.indexCache.invalidate(); + this.contentsCache.invalidate(); + }; + PDFCrossRefStream.prototype.addCompressedEntry = function (ref, objectStreamRef, index) { + var type = EntryType.Compressed; + this.entries.push({ type: type, ref: ref, objectStreamRef: objectStreamRef, index: index }); + this.entryTuplesCache.invalidate(); + this.maxByteWidthsCache.invalidate(); + this.indexCache.invalidate(); + this.contentsCache.invalidate(); + }; + PDFCrossRefStream.prototype.clone = function (context) { + var _a = this, dict = _a.dict, entries = _a.entries, encode = _a.encode; + return PDFCrossRefStream.of(dict.clone(context), entries.slice(), encode); + }; + PDFCrossRefStream.prototype.getContentsString = function () { + var entryTuples = this.entryTuplesCache.access(); + var byteWidths = this.maxByteWidthsCache.access(); + var value = ''; + for (var entryIdx = 0, entriesLen = entryTuples.length; entryIdx < entriesLen; entryIdx++) { + var _a = entryTuples[entryIdx], first = _a[0], second = _a[1], third = _a[2]; + var firstBytes = reverseArray(bytesFor(first)); + var secondBytes = reverseArray(bytesFor(second)); + var thirdBytes = reverseArray(bytesFor(third)); + for (var idx = byteWidths[0] - 1; idx >= 0; idx--) { + value += (firstBytes[idx] || 0).toString(2); + } + for (var idx = byteWidths[1] - 1; idx >= 0; idx--) { + value += (secondBytes[idx] || 0).toString(2); + } + for (var idx = byteWidths[2] - 1; idx >= 0; idx--) { + value += (thirdBytes[idx] || 0).toString(2); + } + } + return value; + }; + PDFCrossRefStream.prototype.getUnencodedContents = function () { + var entryTuples = this.entryTuplesCache.access(); + var byteWidths = this.maxByteWidthsCache.access(); + var buffer = new Uint8Array(this.getUnencodedContentsSize()); + var offset = 0; + for (var entryIdx = 0, entriesLen = entryTuples.length; entryIdx < entriesLen; entryIdx++) { + var _a = entryTuples[entryIdx], first = _a[0], second = _a[1], third = _a[2]; + var firstBytes = reverseArray(bytesFor(first)); + var secondBytes = reverseArray(bytesFor(second)); + var thirdBytes = reverseArray(bytesFor(third)); + for (var idx = byteWidths[0] - 1; idx >= 0; idx--) { + buffer[offset++] = firstBytes[idx] || 0; + } + for (var idx = byteWidths[1] - 1; idx >= 0; idx--) { + buffer[offset++] = secondBytes[idx] || 0; + } + for (var idx = byteWidths[2] - 1; idx >= 0; idx--) { + buffer[offset++] = thirdBytes[idx] || 0; + } + } + return buffer; + }; + PDFCrossRefStream.prototype.getUnencodedContentsSize = function () { + var byteWidths = this.maxByteWidthsCache.access(); + var entryWidth = sum(byteWidths); + return entryWidth * this.entries.length; + }; + PDFCrossRefStream.prototype.updateDict = function () { + _super.prototype.updateDict.call(this); + var byteWidths = this.maxByteWidthsCache.access(); + var index = this.indexCache.access(); + var context = this.dict.context; + this.dict.set(PDFName.of('W'), context.obj(byteWidths)); + this.dict.set(PDFName.of('Index'), context.obj(index)); + }; + PDFCrossRefStream.create = function (dict, encode) { + if (encode === void 0) { encode = true; } + var stream = new PDFCrossRefStream(dict, [], encode); + stream.addDeletedEntry(PDFRef.of(0, 65535), 0); + return stream; + }; + PDFCrossRefStream.of = function (dict, entries, encode) { + if (encode === void 0) { encode = true; } + return new PDFCrossRefStream(dict, entries, encode); + }; + return PDFCrossRefStream; + }(PDFFlateStream)); + + var PDFStreamWriter = /** @class */ (function (_super) { + __extends(PDFStreamWriter, _super); + function PDFStreamWriter(context, objectsPerTick, encodeStreams, objectsPerStream) { + var _this = _super.call(this, context, objectsPerTick) || this; + _this.encodeStreams = encodeStreams; + _this.objectsPerStream = objectsPerStream; + return _this; + } + PDFStreamWriter.prototype.computeBufferSize = function () { + return __awaiter(this, void 0, void 0, function () { + var objectNumber, header, size, xrefStream, uncompressedObjects, compressedObjects, objectStreamRefs, indirectObjects, idx, len, indirectObject, ref, object, shouldNotCompress, chunk, objectStreamRef, idx, len, chunk, ref, objectStream, xrefStreamRef, xrefOffset, trailer; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + objectNumber = this.context.largestObjectNumber + 1; + header = PDFHeader.forVersion(1, 7); + size = header.sizeInBytes() + 2; + xrefStream = PDFCrossRefStream.create(this.createTrailerDict(), this.encodeStreams); + uncompressedObjects = []; + compressedObjects = []; + objectStreamRefs = []; + indirectObjects = this.context.enumerateIndirectObjects(); + idx = 0, len = indirectObjects.length; + _a.label = 1; + case 1: + if (!(idx < len)) return [3 /*break*/, 6]; + indirectObject = indirectObjects[idx]; + ref = indirectObject[0], object = indirectObject[1]; + shouldNotCompress = ref === this.context.trailerInfo.Encrypt || + object instanceof PDFStream || + object instanceof PDFInvalidObject || + ref.generationNumber !== 0; + if (!shouldNotCompress) return [3 /*break*/, 4]; + uncompressedObjects.push(indirectObject); + xrefStream.addUncompressedEntry(ref, size); + size += this.computeIndirectObjectSize(indirectObject); + if (!this.shouldWaitForTick(1)) return [3 /*break*/, 3]; + return [4 /*yield*/, waitForTick()]; + case 2: + _a.sent(); + _a.label = 3; + case 3: return [3 /*break*/, 5]; + case 4: + chunk = last(compressedObjects); + objectStreamRef = last(objectStreamRefs); + if (!chunk || chunk.length % this.objectsPerStream === 0) { + chunk = []; + compressedObjects.push(chunk); + objectStreamRef = PDFRef.of(objectNumber++); + objectStreamRefs.push(objectStreamRef); + } + xrefStream.addCompressedEntry(ref, objectStreamRef, chunk.length); + chunk.push(indirectObject); + _a.label = 5; + case 5: + idx++; + return [3 /*break*/, 1]; + case 6: + idx = 0, len = compressedObjects.length; + _a.label = 7; + case 7: + if (!(idx < len)) return [3 /*break*/, 10]; + chunk = compressedObjects[idx]; + ref = objectStreamRefs[idx]; + objectStream = PDFObjectStream.withContextAndObjects(this.context, chunk, this.encodeStreams); + xrefStream.addUncompressedEntry(ref, size); + size += this.computeIndirectObjectSize([ref, objectStream]); + uncompressedObjects.push([ref, objectStream]); + if (!this.shouldWaitForTick(chunk.length)) return [3 /*break*/, 9]; + return [4 /*yield*/, waitForTick()]; + case 8: + _a.sent(); + _a.label = 9; + case 9: + idx++; + return [3 /*break*/, 7]; + case 10: + xrefStreamRef = PDFRef.of(objectNumber++); + xrefStream.dict.set(PDFName.of('Size'), PDFNumber.of(objectNumber)); + xrefStream.addUncompressedEntry(xrefStreamRef, size); + xrefOffset = size; + size += this.computeIndirectObjectSize([xrefStreamRef, xrefStream]); + uncompressedObjects.push([xrefStreamRef, xrefStream]); + trailer = PDFTrailer.forLastCrossRefSectionOffset(xrefOffset); + size += trailer.sizeInBytes(); + return [2 /*return*/, { size: size, header: header, indirectObjects: uncompressedObjects, trailer: trailer }]; + } + }); + }); + }; + PDFStreamWriter.forContext = function (context, objectsPerTick, encodeStreams, objectsPerStream) { + if (encodeStreams === void 0) { encodeStreams = true; } + if (objectsPerStream === void 0) { objectsPerStream = 50; } + return new PDFStreamWriter(context, objectsPerTick, encodeStreams, objectsPerStream); + }; + return PDFStreamWriter; + }(PDFWriter)); + + var PDFHexString = /** @class */ (function (_super) { + __extends(PDFHexString, _super); + function PDFHexString(value) { + var _this = _super.call(this) || this; + _this.value = value; + return _this; + } + PDFHexString.prototype.asBytes = function () { + // Append a zero if the number of digits is odd. See PDF spec 7.3.4.3 + var hex = this.value + (this.value.length % 2 === 1 ? '0' : ''); + var hexLength = hex.length; + var bytes = new Uint8Array(hex.length / 2); + var hexOffset = 0; + var bytesOffset = 0; + // Interpret each pair of hex digits as a single byte + while (hexOffset < hexLength) { + var byte = parseInt(hex.substring(hexOffset, hexOffset + 2), 16); + bytes[bytesOffset] = byte; + hexOffset += 2; + bytesOffset += 1; + } + return bytes; + }; + PDFHexString.prototype.decodeText = function () { + var bytes = this.asBytes(); + if (hasUtf16BOM(bytes)) + return utf16Decode(bytes); + return pdfDocEncodingDecode(bytes); + }; + PDFHexString.prototype.decodeDate = function () { + var text = this.decodeText(); + var date = parseDate(text); + if (!date) + throw new InvalidPDFDateStringError(text); + return date; + }; + PDFHexString.prototype.asString = function () { + return this.value; + }; + PDFHexString.prototype.clone = function () { + return PDFHexString.of(this.value); + }; + PDFHexString.prototype.toString = function () { + return "<" + this.value + ">"; + }; + PDFHexString.prototype.sizeInBytes = function () { + return this.value.length + 2; + }; + PDFHexString.prototype.copyBytesInto = function (buffer, offset) { + buffer[offset++] = CharCodes$1.LessThan; + offset += copyStringIntoBuffer(this.value, buffer, offset); + buffer[offset++] = CharCodes$1.GreaterThan; + return this.value.length + 2; + }; + PDFHexString.of = function (value) { return new PDFHexString(value); }; + PDFHexString.fromText = function (value) { + var encoded = utf16Encode(value); + var hex = ''; + for (var idx = 0, len = encoded.length; idx < len; idx++) { + hex += toHexStringOfMinLength(encoded[idx], 4); + } + return new PDFHexString(hex); + }; + return PDFHexString; + }(PDFObject)); + + /** + * A note of thanks to the developers of https://github.com/foliojs/pdfkit, as + * this class borrows from: + * https://github.com/foliojs/pdfkit/blob/f91bdd61c164a72ea06be1a43dc0a412afc3925f/lib/font/afm.coffee + */ + var StandardFontEmbedder = /** @class */ (function () { + function StandardFontEmbedder(fontName, customName) { + // prettier-ignore + this.encoding = (fontName === FontNames.ZapfDingbats ? Encodings.ZapfDingbats + : fontName === FontNames.Symbol ? Encodings.Symbol + : Encodings.WinAnsi); + this.font = Font.load(fontName); + this.fontName = this.font.FontName; + this.customName = customName; + } + /** + * Encode the JavaScript string into this font. (JavaScript encodes strings in + * Unicode, but standard fonts use either WinAnsi, ZapfDingbats, or Symbol + * encodings) + */ + StandardFontEmbedder.prototype.encodeText = function (text) { + var glyphs = this.encodeTextAsGlyphs(text); + var hexCodes = new Array(glyphs.length); + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + hexCodes[idx] = toHexString(glyphs[idx].code); + } + return PDFHexString.of(hexCodes.join('')); + }; + StandardFontEmbedder.prototype.widthOfTextAtSize = function (text, size) { + var glyphs = this.encodeTextAsGlyphs(text); + var totalWidth = 0; + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + var left = glyphs[idx].name; + var right = (glyphs[idx + 1] || {}).name; + var kernAmount = this.font.getXAxisKerningForPair(left, right) || 0; + totalWidth += this.widthOfGlyph(left) + kernAmount; + } + var scale = size / 1000; + return totalWidth * scale; + }; + StandardFontEmbedder.prototype.heightOfFontAtSize = function (size, options) { + if (options === void 0) { options = {}; } + var _a = options.descender, descender = _a === void 0 ? true : _a; + var _b = this.font, Ascender = _b.Ascender, Descender = _b.Descender, FontBBox = _b.FontBBox; + var yTop = Ascender || FontBBox[3]; + var yBottom = Descender || FontBBox[1]; + var height = yTop - yBottom; + if (!descender) + height += Descender || 0; + return (height / 1000) * size; + }; + StandardFontEmbedder.prototype.sizeOfFontAtHeight = function (height) { + var _a = this.font, Ascender = _a.Ascender, Descender = _a.Descender, FontBBox = _a.FontBBox; + var yTop = Ascender || FontBBox[3]; + var yBottom = Descender || FontBBox[1]; + return (1000 * height) / (yTop - yBottom); + }; + StandardFontEmbedder.prototype.embedIntoContext = function (context, ref) { + var fontDict = context.obj({ + Type: 'Font', + Subtype: 'Type1', + BaseFont: this.customName || this.fontName, + Encoding: this.encoding === Encodings.WinAnsi ? 'WinAnsiEncoding' : undefined, + }); + if (ref) { + context.assign(ref, fontDict); + return ref; + } + else { + return context.register(fontDict); + } + }; + StandardFontEmbedder.prototype.widthOfGlyph = function (glyphName) { + // Default to 250 if font doesn't specify a width + return this.font.getWidthOfGlyph(glyphName) || 250; + }; + StandardFontEmbedder.prototype.encodeTextAsGlyphs = function (text) { + var codePoints = Array.from(text); + var glyphs = new Array(codePoints.length); + for (var idx = 0, len = codePoints.length; idx < len; idx++) { + var codePoint = toCodePoint(codePoints[idx]); + glyphs[idx] = this.encoding.encodeUnicodeCodePoint(codePoint); + } + return glyphs; + }; + StandardFontEmbedder.for = function (fontName, customName) { + return new StandardFontEmbedder(fontName, customName); + }; + return StandardFontEmbedder; + }()); + + /** `glyphs` should be an array of unique glyphs */ + var createCmap = function (glyphs, glyphId) { + var bfChars = new Array(glyphs.length); + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + var glyph = glyphs[idx]; + var id = cmapHexFormat(cmapHexString(glyphId(glyph))); + var unicode = cmapHexFormat.apply(void 0, glyph.codePoints.map(cmapCodePointFormat)); + bfChars[idx] = [id, unicode]; + } + return fillCmapTemplate(bfChars); + }; + /* =============================== Templates ================================ */ + var fillCmapTemplate = function (bfChars) { return "/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo <<\n /Registry (Adobe)\n /Ordering (UCS)\n /Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000>\nendcodespacerange\n" + bfChars.length + " beginbfchar\n" + bfChars.map(function (_a) { + var glyphId = _a[0], codePoint = _a[1]; + return glyphId + " " + codePoint; + }).join('\n') + "\nendbfchar\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend"; }; + /* =============================== Utilities ================================ */ + var cmapHexFormat = function () { + var values = []; + for (var _i = 0; _i < arguments.length; _i++) { + values[_i] = arguments[_i]; + } + return "<" + values.join('') + ">"; + }; + var cmapHexString = function (value) { return toHexStringOfMinLength(value, 4); }; + var cmapCodePointFormat = function (codePoint) { + if (isWithinBMP(codePoint)) + return cmapHexString(codePoint); + if (hasSurrogates(codePoint)) { + var hs = highSurrogate(codePoint); + var ls = lowSurrogate(codePoint); + return "" + cmapHexString(hs) + cmapHexString(ls); + } + var hex = toHexString(codePoint); + var msg = "0x" + hex + " is not a valid UTF-8 or UTF-16 codepoint."; + throw new Error(msg); + }; + + // prettier-ignore + var makeFontFlags = function (options) { + var flags = 0; + var flipBit = function (bit) { flags |= (1 << (bit - 1)); }; + if (options.fixedPitch) + flipBit(1); + if (options.serif) + flipBit(2); + if (options.symbolic) + flipBit(3); + if (options.script) + flipBit(4); + if (options.nonsymbolic) + flipBit(6); + if (options.italic) + flipBit(7); + if (options.allCap) + flipBit(17); + if (options.smallCap) + flipBit(18); + if (options.forceBold) + flipBit(19); + return flags; + }; + // From: https://github.com/foliojs/pdfkit/blob/83f5f7243172a017adcf6a7faa5547c55982c57b/lib/font/embedded.js#L123-L129 + var deriveFontFlags = function (font) { + var familyClass = font['OS/2'] ? font['OS/2'].sFamilyClass : 0; + var flags = makeFontFlags({ + fixedPitch: font.post.isFixedPitch, + serif: 1 <= familyClass && familyClass <= 7, + symbolic: true, + script: familyClass === 10, + italic: font.head.macStyle.italic, + }); + return flags; + }; + + var PDFString = /** @class */ (function (_super) { + __extends(PDFString, _super); + function PDFString(value) { + var _this = _super.call(this) || this; + _this.value = value; + return _this; + } + PDFString.prototype.asBytes = function () { + var bytes = []; + var octal = ''; + var escaped = false; + var pushByte = function (byte) { + if (byte !== undefined) + bytes.push(byte); + escaped = false; + }; + for (var idx = 0, len = this.value.length; idx < len; idx++) { + var char = this.value[idx]; + var byte = toCharCode(char); + var nextChar = this.value[idx + 1]; + if (!escaped) { + if (byte === CharCodes$1.BackSlash) + escaped = true; + else + pushByte(byte); + } + else { + if (byte === CharCodes$1.Newline) + pushByte(); + else if (byte === CharCodes$1.CarriageReturn) + pushByte(); + else if (byte === CharCodes$1.n) + pushByte(CharCodes$1.Newline); + else if (byte === CharCodes$1.r) + pushByte(CharCodes$1.CarriageReturn); + else if (byte === CharCodes$1.t) + pushByte(CharCodes$1.Tab); + else if (byte === CharCodes$1.b) + pushByte(CharCodes$1.Backspace); + else if (byte === CharCodes$1.f) + pushByte(CharCodes$1.FormFeed); + else if (byte === CharCodes$1.LeftParen) + pushByte(CharCodes$1.LeftParen); + else if (byte === CharCodes$1.RightParen) + pushByte(CharCodes$1.RightParen); + else if (byte === CharCodes$1.Backspace) + pushByte(CharCodes$1.BackSlash); + else if (byte >= CharCodes$1.Zero && byte <= CharCodes$1.Seven) { + octal += char; + if (octal.length === 3 || !(nextChar >= '0' && nextChar <= '7')) { + pushByte(parseInt(octal, 8)); + octal = ''; + } + } + else { + pushByte(byte); + } + } + } + return new Uint8Array(bytes); + }; + PDFString.prototype.decodeText = function () { + var bytes = this.asBytes(); + if (hasUtf16BOM(bytes)) + return utf16Decode(bytes); + return pdfDocEncodingDecode(bytes); + }; + PDFString.prototype.decodeDate = function () { + var text = this.decodeText(); + var date = parseDate(text); + if (!date) + throw new InvalidPDFDateStringError(text); + return date; + }; + PDFString.prototype.asString = function () { + return this.value; + }; + PDFString.prototype.clone = function () { + return PDFString.of(this.value); + }; + PDFString.prototype.toString = function () { + return "(" + this.value + ")"; + }; + PDFString.prototype.sizeInBytes = function () { + return this.value.length + 2; + }; + PDFString.prototype.copyBytesInto = function (buffer, offset) { + buffer[offset++] = CharCodes$1.LeftParen; + offset += copyStringIntoBuffer(this.value, buffer, offset); + buffer[offset++] = CharCodes$1.RightParen; + return this.value.length + 2; + }; + // The PDF spec allows newlines and parens to appear directly within a literal + // string. These character _may_ be escaped. But they do not _have_ to be. So + // for simplicity, we will not bother escaping them. + PDFString.of = function (value) { return new PDFString(value); }; + PDFString.fromDate = function (date) { + var year = padStart(String(date.getUTCFullYear()), 4, '0'); + var month = padStart(String(date.getUTCMonth() + 1), 2, '0'); + var day = padStart(String(date.getUTCDate()), 2, '0'); + var hours = padStart(String(date.getUTCHours()), 2, '0'); + var mins = padStart(String(date.getUTCMinutes()), 2, '0'); + var secs = padStart(String(date.getUTCSeconds()), 2, '0'); + return new PDFString("D:" + year + month + day + hours + mins + secs + "Z"); + }; + return PDFString; + }(PDFObject)); + + /** + * A note of thanks to the developers of https://github.com/foliojs/pdfkit, as + * this class borrows from: + * https://github.com/devongovett/pdfkit/blob/e71edab0dd4657b5a767804ba86c94c58d01fbca/lib/image/jpeg.coffee + */ + var CustomFontEmbedder = /** @class */ (function () { + function CustomFontEmbedder(font, fontData, customName, fontFeatures) { + var _this = this; + this.allGlyphsInFontSortedById = function () { + var glyphs = new Array(_this.font.characterSet.length); + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + var codePoint = _this.font.characterSet[idx]; + glyphs[idx] = _this.font.glyphForCodePoint(codePoint); + } + return sortedUniq(glyphs.sort(byAscendingId), function (g) { return g.id; }); + }; + this.font = font; + this.scale = 1000 / this.font.unitsPerEm; + this.fontData = fontData; + this.fontName = this.font.postscriptName || 'Font'; + this.customName = customName; + this.fontFeatures = fontFeatures; + this.baseFontName = ''; + this.glyphCache = Cache.populatedBy(this.allGlyphsInFontSortedById); + } + CustomFontEmbedder.for = function (fontkit, fontData, customName, fontFeatures) { + return __awaiter(this, void 0, void 0, function () { + var font; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, fontkit.create(fontData)]; + case 1: + font = _a.sent(); + return [2 /*return*/, new CustomFontEmbedder(font, fontData, customName, fontFeatures)]; + } + }); + }); + }; + /** + * Encode the JavaScript string into this font. (JavaScript encodes strings in + * Unicode, but embedded fonts use their own custom encodings) + */ + CustomFontEmbedder.prototype.encodeText = function (text) { + var glyphs = this.font.layout(text, this.fontFeatures).glyphs; + var hexCodes = new Array(glyphs.length); + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + hexCodes[idx] = toHexStringOfMinLength(glyphs[idx].id, 4); + } + return PDFHexString.of(hexCodes.join('')); + }; + // The advanceWidth takes into account kerning automatically, so we don't + // have to do that manually like we do for the standard fonts. + CustomFontEmbedder.prototype.widthOfTextAtSize = function (text, size) { + var glyphs = this.font.layout(text, this.fontFeatures).glyphs; + var totalWidth = 0; + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + totalWidth += glyphs[idx].advanceWidth * this.scale; + } + var scale = size / 1000; + return totalWidth * scale; + }; + CustomFontEmbedder.prototype.heightOfFontAtSize = function (size, options) { + if (options === void 0) { options = {}; } + var _a = options.descender, descender = _a === void 0 ? true : _a; + var _b = this.font, ascent = _b.ascent, descent = _b.descent, bbox = _b.bbox; + var yTop = (ascent || bbox.maxY) * this.scale; + var yBottom = (descent || bbox.minY) * this.scale; + var height = yTop - yBottom; + if (!descender) + height -= Math.abs(descent) || 0; + return (height / 1000) * size; + }; + CustomFontEmbedder.prototype.sizeOfFontAtHeight = function (height) { + var _a = this.font, ascent = _a.ascent, descent = _a.descent, bbox = _a.bbox; + var yTop = (ascent || bbox.maxY) * this.scale; + var yBottom = (descent || bbox.minY) * this.scale; + return (1000 * height) / (yTop - yBottom); + }; + CustomFontEmbedder.prototype.embedIntoContext = function (context, ref) { + this.baseFontName = + this.customName || context.addRandomSuffix(this.fontName); + return this.embedFontDict(context, ref); + }; + CustomFontEmbedder.prototype.embedFontDict = function (context, ref) { + return __awaiter(this, void 0, void 0, function () { + var cidFontDictRef, unicodeCMapRef, fontDict; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.embedCIDFontDict(context)]; + case 1: + cidFontDictRef = _a.sent(); + unicodeCMapRef = this.embedUnicodeCmap(context); + fontDict = context.obj({ + Type: 'Font', + Subtype: 'Type0', + BaseFont: this.baseFontName, + Encoding: 'Identity-H', + DescendantFonts: [cidFontDictRef], + ToUnicode: unicodeCMapRef, + }); + if (ref) { + context.assign(ref, fontDict); + return [2 /*return*/, ref]; + } + else { + return [2 /*return*/, context.register(fontDict)]; + } + } + }); + }); + }; + CustomFontEmbedder.prototype.isCFF = function () { + return this.font.cff; + }; + CustomFontEmbedder.prototype.embedCIDFontDict = function (context) { + return __awaiter(this, void 0, void 0, function () { + var fontDescriptorRef, cidFontDict; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.embedFontDescriptor(context)]; + case 1: + fontDescriptorRef = _a.sent(); + cidFontDict = context.obj({ + Type: 'Font', + Subtype: this.isCFF() ? 'CIDFontType0' : 'CIDFontType2', + CIDToGIDMap: 'Identity', + BaseFont: this.baseFontName, + CIDSystemInfo: { + Registry: PDFString.of('Adobe'), + Ordering: PDFString.of('Identity'), + Supplement: 0, + }, + FontDescriptor: fontDescriptorRef, + W: this.computeWidths(), + }); + return [2 /*return*/, context.register(cidFontDict)]; + } + }); + }); + }; + CustomFontEmbedder.prototype.embedFontDescriptor = function (context) { + return __awaiter(this, void 0, void 0, function () { + var fontStreamRef, scale, _a, italicAngle, ascent, descent, capHeight, xHeight, _b, minX, minY, maxX, maxY, fontDescriptor; + var _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: return [4 /*yield*/, this.embedFontStream(context)]; + case 1: + fontStreamRef = _d.sent(); + scale = this.scale; + _a = this.font, italicAngle = _a.italicAngle, ascent = _a.ascent, descent = _a.descent, capHeight = _a.capHeight, xHeight = _a.xHeight; + _b = this.font.bbox, minX = _b.minX, minY = _b.minY, maxX = _b.maxX, maxY = _b.maxY; + fontDescriptor = context.obj((_c = { + Type: 'FontDescriptor', + FontName: this.baseFontName, + Flags: deriveFontFlags(this.font), + FontBBox: [minX * scale, minY * scale, maxX * scale, maxY * scale], + ItalicAngle: italicAngle, + Ascent: ascent * scale, + Descent: descent * scale, + CapHeight: (capHeight || ascent) * scale, + XHeight: (xHeight || 0) * scale, + // Not sure how to compute/find this, nor is anybody else really: + // https://stackoverflow.com/questions/35485179/stemv-value-of-the-truetype-font + StemV: 0 + }, + _c[this.isCFF() ? 'FontFile3' : 'FontFile2'] = fontStreamRef, + _c)); + return [2 /*return*/, context.register(fontDescriptor)]; + } + }); + }); + }; + CustomFontEmbedder.prototype.serializeFont = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.fontData]; + }); + }); + }; + CustomFontEmbedder.prototype.embedFontStream = function (context) { + return __awaiter(this, void 0, void 0, function () { + var fontStream, _a, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _b = (_a = context).flateStream; + return [4 /*yield*/, this.serializeFont()]; + case 1: + fontStream = _b.apply(_a, [_c.sent(), { + Subtype: this.isCFF() ? 'CIDFontType0C' : undefined, + }]); + return [2 /*return*/, context.register(fontStream)]; + } + }); + }); + }; + CustomFontEmbedder.prototype.embedUnicodeCmap = function (context) { + var cmap = createCmap(this.glyphCache.access(), this.glyphId.bind(this)); + var cmapStream = context.flateStream(cmap); + return context.register(cmapStream); + }; + CustomFontEmbedder.prototype.glyphId = function (glyph) { + return glyph ? glyph.id : -1; + }; + CustomFontEmbedder.prototype.computeWidths = function () { + var glyphs = this.glyphCache.access(); + var widths = []; + var currSection = []; + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + var currGlyph = glyphs[idx]; + var prevGlyph = glyphs[idx - 1]; + var currGlyphId = this.glyphId(currGlyph); + var prevGlyphId = this.glyphId(prevGlyph); + if (idx === 0) { + widths.push(currGlyphId); + } + else if (currGlyphId - prevGlyphId !== 1) { + widths.push(currSection); + widths.push(currGlyphId); + currSection = []; + } + currSection.push(currGlyph.advanceWidth * this.scale); + } + widths.push(currSection); + return widths; + }; + return CustomFontEmbedder; + }()); + + /** + * A note of thanks to the developers of https://github.com/foliojs/pdfkit, as + * this class borrows from: + * https://github.com/devongovett/pdfkit/blob/e71edab0dd4657b5a767804ba86c94c58d01fbca/lib/image/jpeg.coffee + */ + var CustomFontSubsetEmbedder = /** @class */ (function (_super) { + __extends(CustomFontSubsetEmbedder, _super); + function CustomFontSubsetEmbedder(font, fontData, customFontName, fontFeatures) { + var _this = _super.call(this, font, fontData, customFontName, fontFeatures) || this; + _this.subset = _this.font.createSubset(); + _this.glyphs = []; + _this.glyphCache = Cache.populatedBy(function () { return _this.glyphs; }); + _this.glyphIdMap = new Map(); + return _this; + } + CustomFontSubsetEmbedder.for = function (fontkit, fontData, customFontName, fontFeatures) { + return __awaiter(this, void 0, void 0, function () { + var font; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, fontkit.create(fontData)]; + case 1: + font = _a.sent(); + return [2 /*return*/, new CustomFontSubsetEmbedder(font, fontData, customFontName, fontFeatures)]; + } + }); + }); + }; + CustomFontSubsetEmbedder.prototype.encodeText = function (text) { + var glyphs = this.font.layout(text, this.fontFeatures).glyphs; + var hexCodes = new Array(glyphs.length); + for (var idx = 0, len = glyphs.length; idx < len; idx++) { + var glyph = glyphs[idx]; + var subsetGlyphId = this.subset.includeGlyph(glyph); + this.glyphs[subsetGlyphId - 1] = glyph; + this.glyphIdMap.set(glyph.id, subsetGlyphId); + hexCodes[idx] = toHexStringOfMinLength(subsetGlyphId, 4); + } + this.glyphCache.invalidate(); + return PDFHexString.of(hexCodes.join('')); + }; + CustomFontSubsetEmbedder.prototype.isCFF = function () { + return this.subset.cff; + }; + CustomFontSubsetEmbedder.prototype.glyphId = function (glyph) { + return glyph ? this.glyphIdMap.get(glyph.id) : -1; + }; + CustomFontSubsetEmbedder.prototype.serializeFont = function () { + var _this = this; + return new Promise(function (resolve, reject) { + var parts = []; + _this.subset + .encodeStream() + .on('data', function (bytes) { return parts.push(bytes); }) + .on('end', function () { return resolve(mergeUint8Arrays(parts)); }) + .on('error', function (err) { return reject(err); }); + }); + }; + return CustomFontSubsetEmbedder; + }(CustomFontEmbedder)); + + (function (AFRelationship) { + AFRelationship["Source"] = "Source"; + AFRelationship["Data"] = "Data"; + AFRelationship["Alternative"] = "Alternative"; + AFRelationship["Supplement"] = "Supplement"; + AFRelationship["EncryptedPayload"] = "EncryptedPayload"; + AFRelationship["FormData"] = "EncryptedPayload"; + AFRelationship["Schema"] = "Schema"; + AFRelationship["Unspecified"] = "Unspecified"; + })(exports.AFRelationship || (exports.AFRelationship = {})); + var FileEmbedder = /** @class */ (function () { + function FileEmbedder(fileData, fileName, options) { + if (options === void 0) { options = {}; } + this.fileData = fileData; + this.fileName = fileName; + this.options = options; + } + FileEmbedder.for = function (bytes, fileName, options) { + if (options === void 0) { options = {}; } + return new FileEmbedder(bytes, fileName, options); + }; + FileEmbedder.prototype.embedIntoContext = function (context, ref) { + return __awaiter(this, void 0, void 0, function () { + var _a, mimeType, description, creationDate, modificationDate, afRelationship, embeddedFileStream, embeddedFileStreamRef, fileSpecDict; + return __generator(this, function (_b) { + _a = this.options, mimeType = _a.mimeType, description = _a.description, creationDate = _a.creationDate, modificationDate = _a.modificationDate, afRelationship = _a.afRelationship; + embeddedFileStream = context.flateStream(this.fileData, { + Type: 'EmbeddedFile', + Subtype: mimeType !== null && mimeType !== void 0 ? mimeType : undefined, + Params: { + Size: this.fileData.length, + CreationDate: creationDate + ? PDFString.fromDate(creationDate) + : undefined, + ModDate: modificationDate + ? PDFString.fromDate(modificationDate) + : undefined, + }, + }); + embeddedFileStreamRef = context.register(embeddedFileStream); + fileSpecDict = context.obj({ + Type: 'Filespec', + F: PDFString.of(this.fileName), + UF: PDFHexString.fromText(this.fileName), + EF: { F: embeddedFileStreamRef }, + Desc: description ? PDFHexString.fromText(description) : undefined, + AFRelationship: afRelationship !== null && afRelationship !== void 0 ? afRelationship : undefined, + }); + if (ref) { + context.assign(ref, fileSpecDict); + return [2 /*return*/, ref]; + } + else { + return [2 /*return*/, context.register(fileSpecDict)]; + } + }); + }); + }; + return FileEmbedder; + }()); + + // prettier-ignore + var MARKERS = [ + 0xffc0, 0xffc1, 0xffc2, + 0xffc3, 0xffc5, 0xffc6, + 0xffc7, 0xffc8, 0xffc9, + 0xffca, 0xffcb, 0xffcc, + 0xffcd, 0xffce, 0xffcf, + ]; + var ColorSpace; + (function (ColorSpace) { + ColorSpace["DeviceGray"] = "DeviceGray"; + ColorSpace["DeviceRGB"] = "DeviceRGB"; + ColorSpace["DeviceCMYK"] = "DeviceCMYK"; + })(ColorSpace || (ColorSpace = {})); + var ChannelToColorSpace = { + 1: ColorSpace.DeviceGray, + 3: ColorSpace.DeviceRGB, + 4: ColorSpace.DeviceCMYK, + }; + /** + * A note of thanks to the developers of https://github.com/foliojs/pdfkit, as + * this class borrows from: + * https://github.com/foliojs/pdfkit/blob/a6af76467ce06bd6a2af4aa7271ccac9ff152a7d/lib/image/jpeg.js + */ + var JpegEmbedder = /** @class */ (function () { + function JpegEmbedder(imageData, bitsPerComponent, width, height, colorSpace) { + this.imageData = imageData; + this.bitsPerComponent = bitsPerComponent; + this.width = width; + this.height = height; + this.colorSpace = colorSpace; + } + JpegEmbedder.for = function (imageData) { + return __awaiter(this, void 0, void 0, function () { + var dataView, soi, pos, marker, bitsPerComponent, height, width, channelByte, channelName, colorSpace; + return __generator(this, function (_a) { + dataView = new DataView(imageData.buffer); + soi = dataView.getUint16(0); + if (soi !== 0xffd8) + throw new Error('SOI not found in JPEG'); + pos = 2; + while (pos < dataView.byteLength) { + marker = dataView.getUint16(pos); + pos += 2; + if (MARKERS.includes(marker)) + break; + pos += dataView.getUint16(pos); + } + if (!MARKERS.includes(marker)) + throw new Error('Invalid JPEG'); + pos += 2; + bitsPerComponent = dataView.getUint8(pos++); + height = dataView.getUint16(pos); + pos += 2; + width = dataView.getUint16(pos); + pos += 2; + channelByte = dataView.getUint8(pos++); + channelName = ChannelToColorSpace[channelByte]; + if (!channelName) + throw new Error('Unknown JPEG channel.'); + colorSpace = channelName; + return [2 /*return*/, new JpegEmbedder(imageData, bitsPerComponent, width, height, colorSpace)]; + }); + }); + }; + JpegEmbedder.prototype.embedIntoContext = function (context, ref) { + return __awaiter(this, void 0, void 0, function () { + var xObject; + return __generator(this, function (_a) { + xObject = context.stream(this.imageData, { + Type: 'XObject', + Subtype: 'Image', + BitsPerComponent: this.bitsPerComponent, + Width: this.width, + Height: this.height, + ColorSpace: this.colorSpace, + Filter: 'DCTDecode', + // CMYK JPEG streams in PDF are typically stored complemented, + // with 1 as 'off' and 0 as 'on' (PDF 32000-1:2008, 8.6.4.4). + // + // Standalone CMYK JPEG (usually exported by Photoshop) are + // stored inverse, with 0 as 'off' and 1 as 'on', like RGB. + // + // Applying a swap here as a hedge that most bytes passing + // through this method will benefit from it. + Decode: this.colorSpace === ColorSpace.DeviceCMYK + ? [1, 0, 1, 0, 1, 0, 1, 0] + : undefined, + }); + if (ref) { + context.assign(ref, xObject); + return [2 /*return*/, ref]; + } + else { + return [2 /*return*/, context.register(xObject)]; + } + }); + }); + }; + return JpegEmbedder; + }()); + + var common$2 = createCommonjsModule(function (module, exports) { + + + var TYPED_OK = (typeof Uint8Array !== 'undefined') && + (typeof Uint16Array !== 'undefined') && + (typeof Int32Array !== 'undefined'); + + function _has(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + } + + exports.assign = function (obj /*from1, from2, from3, ...*/) { + var sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + var source = sources.shift(); + if (!source) { continue; } + + if (typeof source !== 'object') { + throw new TypeError(source + 'must be non-object'); + } + + for (var p in source) { + if (_has(source, p)) { + obj[p] = source[p]; + } + } + } + + return obj; + }; + + + // reduce buffer size, avoiding mem copy + exports.shrinkBuf = function (buf, size) { + if (buf.length === size) { return buf; } + if (buf.subarray) { return buf.subarray(0, size); } + buf.length = size; + return buf; + }; + + + var fnTyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + if (src.subarray && dest.subarray) { + dest.set(src.subarray(src_offs, src_offs + len), dest_offs); + return; + } + // Fallback to ordinary array + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + var i, l, len, pos, chunk, result; + + // calculate data length + len = 0; + for (i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + + // join chunks + result = new Uint8Array(len); + pos = 0; + for (i = 0, l = chunks.length; i < l; i++) { + chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } + + return result; + } + }; + + var fnUntyped = { + arraySet: function (dest, src, src_offs, len, dest_offs) { + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + return [].concat.apply([], chunks); + } + }; + + + // Enable/Disable typed arrays use, for testing + // + exports.setTyped = function (on) { + if (on) { + exports.Buf8 = Uint8Array; + exports.Buf16 = Uint16Array; + exports.Buf32 = Int32Array; + exports.assign(exports, fnTyped); + } else { + exports.Buf8 = Array; + exports.Buf16 = Array; + exports.Buf32 = Array; + exports.assign(exports, fnUntyped); + } + }; + + exports.setTyped(TYPED_OK); + }); + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + /* eslint-disable space-unary-ops */ + + + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + //var Z_FILTERED = 1; + //var Z_HUFFMAN_ONLY = 2; + //var Z_RLE = 3; + var Z_FIXED$4 = 4; + //var Z_DEFAULT_STRATEGY = 0; + + /* Possible values of the data_type field (though see inflate()) */ + var Z_BINARY$2 = 0; + var Z_TEXT$2 = 1; + //var Z_ASCII = 1; // = Z_TEXT + var Z_UNKNOWN$4 = 2; + + /*============================================================================*/ + + + function zero$4(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + + // From zutil.h + + var STORED_BLOCK$2 = 0; + var STATIC_TREES$2 = 1; + var DYN_TREES$2 = 2; + /* The three kinds of block type */ + + var MIN_MATCH$4 = 3; + var MAX_MATCH$4 = 258; + /* The minimum and maximum match lengths */ + + // From deflate.h + /* =========================================================================== + * Internal compression state. + */ + + var LENGTH_CODES$4 = 29; + /* number of length codes, not counting the special END_BLOCK code */ + + var LITERALS$4 = 256; + /* number of literal bytes 0..255 */ + + var L_CODES$4 = LITERALS$4 + 1 + LENGTH_CODES$4; + /* number of Literal or Length codes, including the END_BLOCK code */ + + var D_CODES$4 = 30; + /* number of distance codes */ + + var BL_CODES$4 = 19; + /* number of codes used to transfer the bit lengths */ + + var HEAP_SIZE$4 = 2 * L_CODES$4 + 1; + /* maximum heap size */ + + var MAX_BITS$4 = 15; + /* All codes must not exceed MAX_BITS bits */ + + var Buf_size$2 = 16; + /* size of bit buffer in bi_buf */ + + + /* =========================================================================== + * Constants + */ + + var MAX_BL_BITS$2 = 7; + /* Bit length codes must not exceed MAX_BL_BITS bits */ + + var END_BLOCK$2 = 256; + /* end of block literal code */ + + var REP_3_6$2 = 16; + /* repeat previous bit length 3-6 times (2 bits of repeat count) */ + + var REPZ_3_10$2 = 17; + /* repeat a zero length 3-10 times (3 bits of repeat count) */ + + var REPZ_11_138$2 = 18; + /* repeat a zero length 11-138 times (7 bits of repeat count) */ + + /* eslint-disable comma-spacing,array-bracket-spacing */ + var extra_lbits$2 = /* extra bits for each length code */ + [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + + var extra_dbits$2 = /* extra bits for each distance code */ + [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + + var extra_blbits$2 = /* extra bits for each bit length code */ + [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + + var bl_order$2 = + [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; + /* eslint-enable comma-spacing,array-bracket-spacing */ + + /* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + + /* =========================================================================== + * Local data. These are initialized only once. + */ + + // We pre-fill arrays with 0 to avoid uninitialized gaps + + var DIST_CODE_LEN$2 = 512; /* see definition of array dist_code below */ + + // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 + var static_ltree$2 = new Array((L_CODES$4 + 2) * 2); + zero$4(static_ltree$2); + /* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + + var static_dtree$2 = new Array(D_CODES$4 * 2); + zero$4(static_dtree$2); + /* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + + var _dist_code$2 = new Array(DIST_CODE_LEN$2); + zero$4(_dist_code$2); + /* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + + var _length_code$2 = new Array(MAX_MATCH$4 - MIN_MATCH$4 + 1); + zero$4(_length_code$2); + /* length code for each normalized match length (0 == MIN_MATCH) */ + + var base_length$2 = new Array(LENGTH_CODES$4); + zero$4(base_length$2); + /* First normalized length for each code (0 = MIN_MATCH) */ + + var base_dist$2 = new Array(D_CODES$4); + zero$4(base_dist$2); + /* First normalized distance for each code (0 = distance of 1) */ + + + function StaticTreeDesc$2(static_tree, extra_bits, extra_base, elems, max_length) { + + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ + + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; + } + + + var static_l_desc$2; + var static_d_desc$2; + var static_bl_desc$2; + + + function TreeDesc$2(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ + } + + + + function d_code$2(dist) { + return dist < 256 ? _dist_code$2[dist] : _dist_code$2[256 + (dist >>> 7)]; + } + + + /* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ + function put_short$2(s, w) { + // put_byte(s, (uch)((w) & 0xff)); + // put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; + } + + + /* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + function send_bits$2(s, value, length) { + if (s.bi_valid > (Buf_size$2 - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short$2(s, s.bi_buf); + s.bi_buf = value >> (Buf_size$2 - s.bi_valid); + s.bi_valid += length - Buf_size$2; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; + } + } + + + function send_code$2(s, c, tree) { + send_bits$2(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); + } + + + /* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + function bi_reverse$2(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; + } + + + /* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ + function bi_flush$2(s) { + if (s.bi_valid === 16) { + put_short$2(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; + + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } + } + + + /* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + function gen_bitlen$2(s, desc) + // deflate_state *s; + // tree_desc *desc; /* the tree descriptor */ + { + var tree = desc.dyn_tree; + var max_code = desc.max_code; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var extra = desc.stat_desc.extra_bits; + var base = desc.stat_desc.extra_base; + var max_length = desc.stat_desc.max_length; + var h; /* heap index */ + var n, m; /* iterate over the tree elements */ + var bits; /* bit length */ + var xbits; /* extra bits */ + var f; /* frequency */ + var overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS$4; bits++) { + s.bl_count[bits] = 0; + } + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + + for (h = s.heap_max + 1; h < HEAP_SIZE$4; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) { continue; } /* not a leaf node */ + + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } + + // Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } + } + + + /* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + function gen_codes$2(tree, max_code, bl_count) + // ct_data *tree; /* the tree to decorate */ + // int max_code; /* largest code with non zero frequency */ + // ushf *bl_count; /* number of codes at each bit length */ + { + var next_code = new Array(MAX_BITS$4 + 1); /* next code value for each bit length */ + var code = 0; /* running code value */ + var bits; /* bit index */ + var n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS$4; bits++) { + next_code[bits] = code = (code + bl_count[bits - 1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES$4 - 1; code++) { + base_length$2[code] = length; + for (n = 0; n < (1 << extra_lbits$2[code]); n++) { + _length_code$2[length++] = code; + } + } + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code$2[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist$2[code] = dist; + for (n = 0; n < (1 << extra_dbits$2[code]); n++) { + _dist_code$2[dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES$4; code++) { + base_dist$2[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits$2[code] - 7)); n++) { + _dist_code$2[256 + dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS$4; bits++) { + bl_count[bits] = 0; + } + + n = 0; + while (n <= 143) { + static_ltree$2[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree$2[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree$2[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree$2[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes$2(static_ltree$2, L_CODES$4 + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES$4; n++) { + static_dtree$2[n * 2 + 1]/*.Len*/ = 5; + static_dtree$2[n * 2]/*.Code*/ = bi_reverse$2(n, 5); + } + + // Now data ready and we can init static trees + static_l_desc$2 = new StaticTreeDesc$2(static_ltree$2, extra_lbits$2, LITERALS$4 + 1, L_CODES$4, MAX_BITS$4); + static_d_desc$2 = new StaticTreeDesc$2(static_dtree$2, extra_dbits$2, 0, D_CODES$4, MAX_BITS$4); + static_bl_desc$2 = new StaticTreeDesc$2(new Array(0), extra_blbits$2, 0, BL_CODES$4, MAX_BL_BITS$2); + + //static_init_done = true; + } + + + /* =========================================================================== + * Initialize a new block. + */ + function init_block$2(s) { + var n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES$4; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES$4; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES$4; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + + s.dyn_ltree[END_BLOCK$2 * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.last_lit = s.matches = 0; + } + + + /* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ + function bi_windup$2(s) + { + if (s.bi_valid > 8) { + put_short$2(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; + } + s.bi_buf = 0; + s.bi_valid = 0; + } + + /* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ + function copy_block$2(s, buf, len, header) + //DeflateState *s; + //charf *buf; /* the input data */ + //unsigned len; /* its length */ + //int header; /* true if block header must be written */ + { + bi_windup$2(s); /* align on byte boundary */ + + if (header) { + put_short$2(s, len); + put_short$2(s, ~len); + } + // while (len--) { + // put_byte(s, *buf++); + // } + common$2.arraySet(s.pending_buf, s.window, buf, len, s.pending); + s.pending += len; + } + + /* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + function smaller$2(tree, n, m, depth) { + var _n2 = n * 2; + var _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); + } + + /* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + function pqdownheap$2(s, tree, k) + // deflate_state *s; + // ct_data *tree; /* the tree to restore */ + // int k; /* node to move down */ + { + var v = s.heap[k]; + var j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller$2(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller$2(tree, v, s.heap[j], s.depth)) { break; } + + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; + } + + + // inlined manually + // var SMALLEST = 1; + + /* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ + function compress_block$2(s, ltree, dtree) + // deflate_state *s; + // const ct_data *ltree; /* literal tree */ + // const ct_data *dtree; /* distance tree */ + { + var dist; /* distance of matched string */ + var lc; /* match length or unmatched char (if dist == 0) */ + var lx = 0; /* running index in l_buf */ + var code; /* the code to send */ + var extra; /* number of extra bits to send */ + + if (s.last_lit !== 0) { + do { + dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); + lc = s.pending_buf[s.l_buf + lx]; + lx++; + + if (dist === 0) { + send_code$2(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code$2[lc]; + send_code$2(s, code + LITERALS$4 + 1, ltree); /* send the length code */ + extra = extra_lbits$2[code]; + if (extra !== 0) { + lc -= base_length$2[code]; + send_bits$2(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code$2(dist); + //Assert (code < D_CODES, "bad d_code"); + + send_code$2(s, code, dtree); /* send the distance code */ + extra = extra_dbits$2[code]; + if (extra !== 0) { + dist -= base_dist$2[code]; + send_bits$2(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + // "pendingBuf overflow"); + + } while (lx < s.last_lit); + } + + send_code$2(s, END_BLOCK$2, ltree); + } + + + /* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ + function build_tree$2(s, desc) + // deflate_state *s; + // tree_desc *desc; /* the tree descriptor */ + { + var tree = desc.dyn_tree; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var elems = desc.stat_desc.elems; + var n, m; /* iterate over heap elements */ + var max_code = -1; /* largest code with non zero frequency */ + var node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE$4; + + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; + + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; + } + /* node is 0 or 1 so it does not have extra bits */ + } + desc.max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap$2(s, tree, n); } + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap$2(s, tree, 1/*SMALLEST*/); + /***/ + + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ + + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; + + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap$2(s, tree, 1/*SMALLEST*/); + + } while (s.heap_len >= 2); + + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen$2(s, desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes$2(tree, max_code, s.bl_count); + } + + + /* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ + function scan_tree$2(s, tree, max_code) + // deflate_state *s; + // ct_data *tree; /* the tree to be scanned */ + // int max_code; /* and its largest code of non zero frequency */ + { + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ + + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; + + } else if (curlen !== 0) { + + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6$2 * 2]/*.Freq*/++; + + } else if (count <= 10) { + s.bl_tree[REPZ_3_10$2 * 2]/*.Freq*/++; + + } else { + s.bl_tree[REPZ_11_138$2 * 2]/*.Freq*/++; + } + + count = 0; + prevlen = curlen; + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } + } + + + /* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + function send_tree$2(s, tree, max_code) + // deflate_state *s; + // ct_data *tree; /* the tree to be scanned */ + // int max_code; /* and its largest code of non zero frequency */ + { + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ + + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + do { send_code$2(s, curlen, s.bl_tree); } while (--count !== 0); + + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code$2(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code$2(s, REP_3_6$2, s.bl_tree); + send_bits$2(s, count - 3, 2); + + } else if (count <= 10) { + send_code$2(s, REPZ_3_10$2, s.bl_tree); + send_bits$2(s, count - 3, 3); + + } else { + send_code$2(s, REPZ_11_138$2, s.bl_tree); + send_bits$2(s, count - 11, 7); + } + + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } + } + + + /* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + function build_bl_tree$2(s) { + var max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree$2(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree$2(s, s.dyn_dtree, s.d_desc.max_code); + + /* Build the bit length tree: */ + build_tree$2(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES$4 - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order$2[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); + + return max_blindex; + } + + + /* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + function send_all_trees$2(s, lcodes, dcodes, blcodes) + // deflate_state *s; + // int lcodes, dcodes, blcodes; /* number of codes for each tree */ + { + var rank; /* index in bl_order */ + + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits$2(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits$2(s, dcodes - 1, 5); + send_bits$2(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits$2(s, s.bl_tree[bl_order$2[rank] * 2 + 1]/*.Len*/, 3); + } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree$2(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree$2(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); + } + + + /* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ + function detect_data_type$2(s) { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + var black_mask = 0xf3ffc07f; + var n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>>= 1) { + if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY$2; + } + } + + /* Check for textual ("white-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT$2; + } + for (n = 32; n < LITERALS$4; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT$2; + } + } + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY$2; + } + + + var static_init_done$2 = false; + + /* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ + function _tr_init$2(s) + { + + if (!static_init_done$2) { + tr_static_init$2(); + static_init_done$2 = true; + } + + s.l_desc = new TreeDesc$2(s.dyn_ltree, static_l_desc$2); + s.d_desc = new TreeDesc$2(s.dyn_dtree, static_d_desc$2); + s.bl_desc = new TreeDesc$2(s.bl_tree, static_bl_desc$2); + + s.bi_buf = 0; + s.bi_valid = 0; + + /* Initialize the first block of the first file: */ + init_block$2(s); + } + + + /* =========================================================================== + * Send a stored block + */ + function _tr_stored_block$2(s, buf, stored_len, last) + //DeflateState *s; + //charf *buf; /* input block */ + //ulg stored_len; /* length of input block */ + //int last; /* one if this is the last block for a file */ + { + send_bits$2(s, (STORED_BLOCK$2 << 1) + (last ? 1 : 0), 3); /* send block type */ + copy_block$2(s, buf, stored_len, true); /* with header */ + } + + + /* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ + function _tr_align$2(s) { + send_bits$2(s, STATIC_TREES$2 << 1, 3); + send_code$2(s, END_BLOCK$2, static_ltree$2); + bi_flush$2(s); + } + + + /* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + function _tr_flush_block$2(s, buf, stored_len, last) + //DeflateState *s; + //charf *buf; /* input block, or NULL if too old */ + //ulg stored_len; /* length of input block */ + //int last; /* one if this is the last block for a file */ + { + var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + var max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { + + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN$4) { + s.strm.data_type = detect_data_type$2(s); + } + + /* Construct the literal and distance trees */ + build_tree$2(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + + build_tree$2(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree$2(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; + + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->last_lit)); + + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block$2(s, buf, stored_len, last); + + } else if (s.strategy === Z_FIXED$4 || static_lenb === opt_lenb) { + + send_bits$2(s, (STATIC_TREES$2 << 1) + (last ? 1 : 0), 3); + compress_block$2(s, static_ltree$2, static_dtree$2); + + } else { + send_bits$2(s, (DYN_TREES$2 << 1) + (last ? 1 : 0), 3); + send_all_trees$2(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block$2(s, s.dyn_ltree, s.dyn_dtree); + } + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block$2(s); + + if (last) { + bi_windup$2(s); + } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); + } + + /* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + function _tr_tally$2(s, dist, lc) + // deflate_state *s; + // unsigned dist; /* distance of matched string */ + // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ + { + //var out_length, in_length, dcode; + + s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; + s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; + + s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; + s.last_lit++; + + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s.dyn_ltree[(_length_code$2[lc] + LITERALS$4 + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code$2(dist) * 2]/*.Freq*/++; + } + + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + + //#ifdef TRUNCATE_BLOCK + // /* Try to guess if it is profitable to stop the current block here */ + // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { + // /* Compute an upper bound for the compressed length */ + // out_length = s.last_lit*8; + // in_length = s.strstart - s.block_start; + // + // for (dcode = 0; dcode < D_CODES; dcode++) { + // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); + // } + // out_length >>>= 3; + // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + // // s->last_lit, in_length, out_length, + // // 100L - out_length*100L/in_length)); + // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { + // return true; + // } + // } + //#endif + + return (s.last_lit === s.lit_bufsize - 1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + } + + var _tr_init_1$2 = _tr_init$2; + var _tr_stored_block_1$2 = _tr_stored_block$2; + var _tr_flush_block_1$2 = _tr_flush_block$2; + var _tr_tally_1$2 = _tr_tally$2; + var _tr_align_1$2 = _tr_align$2; + + var trees$2 = { + _tr_init: _tr_init_1$2, + _tr_stored_block: _tr_stored_block_1$2, + _tr_flush_block: _tr_flush_block_1$2, + _tr_tally: _tr_tally_1$2, + _tr_align: _tr_align_1$2 + }; + + // Note: adler32 takes 12% for level 0 and 2% for level 6. + // It isn't worth it to make additional optimizations as in original. + // Small size is preferable. + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function adler32$2(adler, buf, len, pos) { + var s1 = (adler & 0xffff) |0, + s2 = ((adler >>> 16) & 0xffff) |0, + n = 0; + + while (len !== 0) { + // Set limit ~ twice less than 5552, to keep + // s2 in 31-bits, because we force signed ints. + // in other case %= will fail. + n = len > 2000 ? 2000 : len; + len -= n; + + do { + s1 = (s1 + buf[pos++]) |0; + s2 = (s2 + s1) |0; + } while (--n); + + s1 %= 65521; + s2 %= 65521; + } + + return (s1 | (s2 << 16)) |0; + } + + + var adler32_1$2 = adler32$2; + + // Note: we can't get significant speed boost here. + // So write code to minimize size - no pregenerated tables + // and array tools dependencies. + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + // Use ordinary array, since untyped makes no boost here + function makeTable$2() { + var c, table = []; + + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); + } + table[n] = c; + } + + return table; + } + + // Create table on load. Just 255 signed longs. Not a problem. + var crcTable$2 = makeTable$2(); + + + function crc32$2(crc, buf, len, pos) { + var t = crcTable$2, + end = pos + len; + + crc ^= -1; + + for (var i = pos; i < end; i++) { + crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + } + + return (crc ^ (-1)); // >>> 0; + } + + + var crc32_1$2 = crc32$2; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + var messages$2 = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + + + + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + /* Allowed flush values; see deflate() and inflate() below for details */ + var Z_NO_FLUSH$4 = 0; + var Z_PARTIAL_FLUSH$2 = 1; + //var Z_SYNC_FLUSH = 2; + var Z_FULL_FLUSH$2 = 3; + var Z_FINISH$6 = 4; + var Z_BLOCK$4 = 5; + //var Z_TREES = 6; + + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + var Z_OK$6 = 0; + var Z_STREAM_END$6 = 1; + //var Z_NEED_DICT = 2; + //var Z_ERRNO = -1; + var Z_STREAM_ERROR$4 = -2; + var Z_DATA_ERROR$4 = -3; + //var Z_MEM_ERROR = -4; + var Z_BUF_ERROR$4 = -5; + //var Z_VERSION_ERROR = -6; + + + /* compression levels */ + //var Z_NO_COMPRESSION = 0; + //var Z_BEST_SPEED = 1; + //var Z_BEST_COMPRESSION = 9; + var Z_DEFAULT_COMPRESSION$4 = -1; + + + var Z_FILTERED$2 = 1; + var Z_HUFFMAN_ONLY$2 = 2; + var Z_RLE$2 = 3; + var Z_FIXED$5 = 4; + var Z_DEFAULT_STRATEGY$4 = 0; + + /* Possible values of the data_type field (though see inflate()) */ + //var Z_BINARY = 0; + //var Z_TEXT = 1; + //var Z_ASCII = 1; // = Z_TEXT + var Z_UNKNOWN$5 = 2; + + + /* The deflate compression method */ + var Z_DEFLATED$6 = 8; + + /*============================================================================*/ + + + var MAX_MEM_LEVEL$2 = 9; + /* Maximum value for memLevel in deflateInit2 */ + var MAX_WBITS$4 = 15; + /* 32K LZ77 window */ + var DEF_MEM_LEVEL$2 = 8; + + + var LENGTH_CODES$5 = 29; + /* number of length codes, not counting the special END_BLOCK code */ + var LITERALS$5 = 256; + /* number of literal bytes 0..255 */ + var L_CODES$5 = LITERALS$5 + 1 + LENGTH_CODES$5; + /* number of Literal or Length codes, including the END_BLOCK code */ + var D_CODES$5 = 30; + /* number of distance codes */ + var BL_CODES$5 = 19; + /* number of codes used to transfer the bit lengths */ + var HEAP_SIZE$5 = 2 * L_CODES$5 + 1; + /* maximum heap size */ + var MAX_BITS$5 = 15; + /* All codes must not exceed MAX_BITS bits */ + + var MIN_MATCH$5 = 3; + var MAX_MATCH$5 = 258; + var MIN_LOOKAHEAD$2 = (MAX_MATCH$5 + MIN_MATCH$5 + 1); + + var PRESET_DICT$2 = 0x20; + + var INIT_STATE$2 = 42; + var EXTRA_STATE$2 = 69; + var NAME_STATE$2 = 73; + var COMMENT_STATE$2 = 91; + var HCRC_STATE$2 = 103; + var BUSY_STATE$2 = 113; + var FINISH_STATE$2 = 666; + + var BS_NEED_MORE$2 = 1; /* block not completed, need more input or more output */ + var BS_BLOCK_DONE$2 = 2; /* block flush performed */ + var BS_FINISH_STARTED$2 = 3; /* finish started, need only more output at next deflate */ + var BS_FINISH_DONE$2 = 4; /* finish done, accept no more input or output */ + + var OS_CODE$2 = 0x03; // Unix :) . Don't detect, use this default. + + function err$2(strm, errorCode) { + strm.msg = messages$2[errorCode]; + return errorCode; + } + + function rank$2(f) { + return ((f) << 1) - ((f) > 4 ? 9 : 0); + } + + function zero$5(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + + + /* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->output buffer and copying into it. + * (See also read_buf()). + */ + function flush_pending$2(strm) { + var s = strm.state; + + //_tr_flush_bits(s); + var len = s.pending; + if (len > strm.avail_out) { + len = strm.avail_out; + } + if (len === 0) { return; } + + common$2.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); + strm.next_out += len; + s.pending_out += len; + strm.total_out += len; + strm.avail_out -= len; + s.pending -= len; + if (s.pending === 0) { + s.pending_out = 0; + } + } + + + function flush_block_only$2(s, last) { + trees$2._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); + s.block_start = s.strstart; + flush_pending$2(s.strm); + } + + + function put_byte$2(s, b) { + s.pending_buf[s.pending++] = b; + } + + + /* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ + function putShortMSB$2(s, b) { + // put_byte(s, (Byte)(b >> 8)); + // put_byte(s, (Byte)(b & 0xff)); + s.pending_buf[s.pending++] = (b >>> 8) & 0xff; + s.pending_buf[s.pending++] = b & 0xff; + } + + + /* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->input buffer and copying from it. + * (See also flush_pending()). + */ + function read_buf$2(strm, buf, start, size) { + var len = strm.avail_in; + + if (len > size) { len = size; } + if (len === 0) { return 0; } + + strm.avail_in -= len; + + // zmemcpy(buf, strm->next_in, len); + common$2.arraySet(buf, strm.input, strm.next_in, len, start); + if (strm.state.wrap === 1) { + strm.adler = adler32_1$2(strm.adler, buf, len, start); + } + + else if (strm.state.wrap === 2) { + strm.adler = crc32_1$2(strm.adler, buf, len, start); + } + + strm.next_in += len; + strm.total_in += len; + + return len; + } + + + /* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ + function longest_match$2(s, cur_match) { + var chain_length = s.max_chain_length; /* max hash chain length */ + var scan = s.strstart; /* current string */ + var match; /* matched string */ + var len; /* length of current match */ + var best_len = s.prev_length; /* best match length so far */ + var nice_match = s.nice_match; /* stop if match long enough */ + var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD$2)) ? + s.strstart - (s.w_size - MIN_LOOKAHEAD$2) : 0/*NIL*/; + + var _win = s.window; // shortcut + + var wmask = s.w_mask; + var prev = s.prev; + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + + var strend = s.strstart + MAX_MATCH$5; + var scan_end1 = _win[scan + best_len - 1]; + var scan_end = _win[scan + best_len]; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s.prev_length >= s.good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if (nice_match > s.lookahead) { nice_match = s.lookahead; } + + // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + // Assert(cur_match < s->strstart, "no future"); + match = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ + + if (_win[match + best_len] !== scan_end || + _win[match + best_len - 1] !== scan_end1 || + _win[match] !== _win[scan] || + _win[++match] !== _win[scan + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2; + match++; + // Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + /*jshint noempty:false*/ + } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + scan < strend); + + // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH$5 - (strend - scan); + scan = strend - MAX_MATCH$5; + + if (len > best_len) { + s.match_start = cur_match; + best_len = len; + if (len >= nice_match) { + break; + } + scan_end1 = _win[scan + best_len - 1]; + scan_end = _win[scan + best_len]; + } + } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); + + if (best_len <= s.lookahead) { + return best_len; + } + return s.lookahead; + } + + + /* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ + function fill_window$2(s) { + var _w_size = s.w_size; + var p, n, m, more, str; + + //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = s.window_size - s.lookahead - s.strstart; + + // JS ints have 32 bit, block below not needed + /* Deal with !@#$% 64K limit: */ + //if (sizeof(int) <= 2) { + // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + // more = wsize; + // + // } else if (more == (unsigned)(-1)) { + // /* Very unlikely, but possible on 16 bit machine if + // * strstart == 0 && lookahead == 1 (input done a byte at time) + // */ + // more--; + // } + //} + + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD$2)) { + + common$2.arraySet(s.window, s.window, _w_size, _w_size, 0); + s.match_start -= _w_size; + s.strstart -= _w_size; + /* we now have strstart >= MAX_DIST */ + s.block_start -= _w_size; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + + n = s.hash_size; + p = n; + do { + m = s.head[--p]; + s.head[p] = (m >= _w_size ? m - _w_size : 0); + } while (--n); + + n = _w_size; + p = n; + do { + m = s.prev[--p]; + s.prev[p] = (m >= _w_size ? m - _w_size : 0); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); + + more += _w_size; + } + if (s.strm.avail_in === 0) { + break; + } + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + //Assert(more >= 2, "more < 2"); + n = read_buf$2(s.strm, s.window, s.strstart + s.lookahead, more); + s.lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s.lookahead + s.insert >= MIN_MATCH$5) { + str = s.strstart - s.insert; + s.ins_h = s.window[str]; + + /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; + //#if MIN_MATCH != 3 + // Call update_hash() MIN_MATCH-3 more times + //#endif + while (s.insert) { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$5 - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = str; + str++; + s.insert--; + if (s.lookahead + s.insert < MIN_MATCH$5) { + break; + } + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s.lookahead < MIN_LOOKAHEAD$2 && s.strm.avail_in !== 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + // if (s.high_water < s.window_size) { + // var curr = s.strstart + s.lookahead; + // var init = 0; + // + // if (s.high_water < curr) { + // /* Previous high water mark below current data -- zero WIN_INIT + // * bytes or up to end of window, whichever is less. + // */ + // init = s.window_size - curr; + // if (init > WIN_INIT) + // init = WIN_INIT; + // zmemzero(s->window + curr, (unsigned)init); + // s->high_water = curr + init; + // } + // else if (s->high_water < (ulg)curr + WIN_INIT) { + // /* High water mark at or above current data, but below current data + // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + // * to end of window, whichever is less. + // */ + // init = (ulg)curr + WIN_INIT - s->high_water; + // if (init > s->window_size - s->high_water) + // init = s->window_size - s->high_water; + // zmemzero(s->window + s->high_water, (unsigned)init); + // s->high_water += init; + // } + // } + // + // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + // "not enough room for search"); + } + + /* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ + function deflate_stored$2(s, flush) { + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + var max_block_size = 0xffff; + + if (max_block_size > s.pending_buf_size - 5) { + max_block_size = s.pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s.lookahead <= 1) { + + //Assert(s->strstart < s->w_size+MAX_DIST(s) || + // s->block_start >= (long)s->w_size, "slide too late"); + // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || + // s.block_start >= s.w_size)) { + // throw new Error("slide too late"); + // } + + fill_window$2(s); + if (s.lookahead === 0 && flush === Z_NO_FLUSH$4) { + return BS_NEED_MORE$2; + } + + if (s.lookahead === 0) { + break; + } + /* flush the current block */ + } + //Assert(s->block_start >= 0L, "block gone"); + // if (s.block_start < 0) throw new Error("block gone"); + + s.strstart += s.lookahead; + s.lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + var max_start = s.block_start + max_block_size; + + if (s.strstart === 0 || s.strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s.lookahead = s.strstart - max_start; + s.strstart = max_start; + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + + + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD$2)) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + } + + s.insert = 0; + + if (flush === Z_FINISH$6) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$2(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$2; + } + /***/ + return BS_FINISH_DONE$2; + } + + if (s.strstart > s.block_start) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + + return BS_NEED_MORE$2; + } + + /* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + function deflate_fast$2(s, flush) { + var hash_head; /* head of the hash chain */ + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD$2) { + fill_window$2(s); + if (s.lookahead < MIN_LOOKAHEAD$2 && flush === Z_NO_FLUSH$4) { + return BS_NEED_MORE$2; + } + if (s.lookahead === 0) { + break; /* flush the current block */ + } + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH$5) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$5 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD$2))) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match$2(s, hash_head); + /* longest_match() sets match_start */ + } + if (s.match_length >= MIN_MATCH$5) { + // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only + + /*** _tr_tally_dist(s, s.strstart - s.match_start, + s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees$2._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH$5); + + s.lookahead -= s.match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH$5) { + s.match_length--; /* string at strstart already in table */ + do { + s.strstart++; + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$5 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s.match_length !== 0); + s.strstart++; + } else + { + s.strstart += s.match_length; + s.match_length = 0; + s.ins_h = s.window[s.strstart]; + /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s.window[s.strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees$2._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + } + s.insert = ((s.strstart < (MIN_MATCH$5 - 1)) ? s.strstart : MIN_MATCH$5 - 1); + if (flush === Z_FINISH$6) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$2(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$2; + } + /***/ + return BS_FINISH_DONE$2; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + return BS_BLOCK_DONE$2; + } + + /* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + function deflate_slow$2(s, flush) { + var hash_head; /* head of hash chain */ + var bflush; /* set if current block must be flushed */ + + var max_insert; + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD$2) { + fill_window$2(s); + if (s.lookahead < MIN_LOOKAHEAD$2 && flush === Z_NO_FLUSH$4) { + return BS_NEED_MORE$2; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH$5) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$5 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + */ + s.prev_length = s.match_length; + s.prev_match = s.match_start; + s.match_length = MIN_MATCH$5 - 1; + + if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && + s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD$2)/*MAX_DIST(s)*/) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match$2(s, hash_head); + /* longest_match() sets match_start */ + + if (s.match_length <= 5 && + (s.strategy === Z_FILTERED$2 || (s.match_length === MIN_MATCH$5 && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s.match_length = MIN_MATCH$5 - 1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s.prev_length >= MIN_MATCH$5 && s.match_length <= s.prev_length) { + max_insert = s.strstart + s.lookahead - MIN_MATCH$5; + /* Do not insert strings in hash table beyond this. */ + + //check_match(s, s.strstart-1, s.prev_match, s.prev_length); + + /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, + s.prev_length - MIN_MATCH, bflush);***/ + bflush = trees$2._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH$5); + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s.lookahead -= s.prev_length - 1; + s.prev_length -= 2; + do { + if (++s.strstart <= max_insert) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH$5 - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + } while (--s.prev_length !== 0); + s.match_available = 0; + s.match_length = MIN_MATCH$5 - 1; + s.strstart++; + + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + + } else if (s.match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees$2._tr_tally(s, 0, s.window[s.strstart - 1]); + + if (bflush) { + /*** FLUSH_BLOCK_ONLY(s, 0) ***/ + flush_block_only$2(s, false); + /***/ + } + s.strstart++; + s.lookahead--; + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s.match_available = 1; + s.strstart++; + s.lookahead--; + } + } + //Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s.match_available) { + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = trees$2._tr_tally(s, 0, s.window[s.strstart - 1]); + + s.match_available = 0; + } + s.insert = s.strstart < MIN_MATCH$5 - 1 ? s.strstart : MIN_MATCH$5 - 1; + if (flush === Z_FINISH$6) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$2(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$2; + } + /***/ + return BS_FINISH_DONE$2; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + + return BS_BLOCK_DONE$2; + } + + + /* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ + function deflate_rle$2(s, flush) { + var bflush; /* set if current block must be flushed */ + var prev; /* byte at distance one to match */ + var scan, strend; /* scan goes up to strend for length of run */ + + var _win = s.window; + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s.lookahead <= MAX_MATCH$5) { + fill_window$2(s); + if (s.lookahead <= MAX_MATCH$5 && flush === Z_NO_FLUSH$4) { + return BS_NEED_MORE$2; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s.match_length = 0; + if (s.lookahead >= MIN_MATCH$5 && s.strstart > 0) { + scan = s.strstart - 1; + prev = _win[scan]; + if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { + strend = s.strstart + MAX_MATCH$5; + do { + /*jshint noempty:false*/ + } while (prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + scan < strend); + s.match_length = MAX_MATCH$5 - (strend - scan); + if (s.match_length > s.lookahead) { + s.match_length = s.lookahead; + } + } + //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s.match_length >= MIN_MATCH$5) { + //check_match(s, s.strstart, s.strstart - 1, s.match_length); + + /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ + bflush = trees$2._tr_tally(s, 1, s.match_length - MIN_MATCH$5); + + s.lookahead -= s.match_length; + s.strstart += s.match_length; + s.match_length = 0; + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees$2._tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$6) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$2(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$2; + } + /***/ + return BS_FINISH_DONE$2; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + return BS_BLOCK_DONE$2; + } + + /* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ + function deflate_huff$2(s, flush) { + var bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s.lookahead === 0) { + fill_window$2(s); + if (s.lookahead === 0) { + if (flush === Z_NO_FLUSH$4) { + return BS_NEED_MORE$2; + } + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s.match_length = 0; + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = trees$2._tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$6) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only$2(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED$2; + } + /***/ + return BS_FINISH_DONE$2; + } + if (s.last_lit) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only$2(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE$2; + } + /***/ + } + return BS_BLOCK_DONE$2; + } + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + function Config$2(good_length, max_lazy, nice_length, max_chain, func) { + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; + } + + var configuration_table$2; + + configuration_table$2 = [ + /* good lazy nice chain */ + new Config$2(0, 0, 0, 0, deflate_stored$2), /* 0 store only */ + new Config$2(4, 4, 8, 4, deflate_fast$2), /* 1 max speed, no lazy matches */ + new Config$2(4, 5, 16, 8, deflate_fast$2), /* 2 */ + new Config$2(4, 6, 32, 32, deflate_fast$2), /* 3 */ + + new Config$2(4, 4, 16, 16, deflate_slow$2), /* 4 lazy matches */ + new Config$2(8, 16, 32, 32, deflate_slow$2), /* 5 */ + new Config$2(8, 16, 128, 128, deflate_slow$2), /* 6 */ + new Config$2(8, 32, 128, 256, deflate_slow$2), /* 7 */ + new Config$2(32, 128, 258, 1024, deflate_slow$2), /* 8 */ + new Config$2(32, 258, 258, 4096, deflate_slow$2) /* 9 max compression */ + ]; + + + /* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ + function lm_init$2(s) { + s.window_size = 2 * s.w_size; + + /*** CLEAR_HASH(s); ***/ + zero$5(s.head); // Fill with NIL (= 0); + + /* Set the default configuration parameters: + */ + s.max_lazy_match = configuration_table$2[s.level].max_lazy; + s.good_match = configuration_table$2[s.level].good_length; + s.nice_match = configuration_table$2[s.level].nice_length; + s.max_chain_length = configuration_table$2[s.level].max_chain; + + s.strstart = 0; + s.block_start = 0; + s.lookahead = 0; + s.insert = 0; + s.match_length = s.prev_length = MIN_MATCH$5 - 1; + s.match_available = 0; + s.ins_h = 0; + } + + + function DeflateState$2() { + this.strm = null; /* pointer back to this zlib stream */ + this.status = 0; /* as the name implies */ + this.pending_buf = null; /* output still pending */ + this.pending_buf_size = 0; /* size of pending_buf */ + this.pending_out = 0; /* next pending byte to output to the stream */ + this.pending = 0; /* nb of bytes in the pending buffer */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.gzhead = null; /* gzip header information to write */ + this.gzindex = 0; /* where in extra, name, or comment */ + this.method = Z_DEFLATED$6; /* can only be DEFLATED */ + this.last_flush = -1; /* value of flush param for previous deflate call */ + + this.w_size = 0; /* LZ77 window size (32K by default) */ + this.w_bits = 0; /* log2(w_size) (8..16) */ + this.w_mask = 0; /* w_size - 1 */ + + this.window = null; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. + */ + + this.window_size = 0; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + this.prev = null; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + this.head = null; /* Heads of the hash chains or NIL. */ + + this.ins_h = 0; /* hash index of string to be inserted */ + this.hash_size = 0; /* number of elements in hash table */ + this.hash_bits = 0; /* log2(hash_size) */ + this.hash_mask = 0; /* hash_size-1 */ + + this.hash_shift = 0; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + this.block_start = 0; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + this.match_length = 0; /* length of best match */ + this.prev_match = 0; /* previous match */ + this.match_available = 0; /* set if previous match exists */ + this.strstart = 0; /* start of string to insert */ + this.match_start = 0; /* start of matching string */ + this.lookahead = 0; /* number of valid bytes ahead in window */ + + this.prev_length = 0; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + this.max_chain_length = 0; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + this.max_lazy_match = 0; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ + // That's alias to max_lazy_match, don't use directly + //this.max_insert_length = 0; + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + this.level = 0; /* compression level (1..9) */ + this.strategy = 0; /* favor or force Huffman coding*/ + + this.good_match = 0; + /* Use a faster search when the previous match is longer than this */ + + this.nice_match = 0; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + + /* Didn't use ct_data typedef below to suppress compiler warning */ + + // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + // Use flat array of DOUBLE size, with interleaved fata, + // because JS does not support effective + this.dyn_ltree = new common$2.Buf16(HEAP_SIZE$5 * 2); + this.dyn_dtree = new common$2.Buf16((2 * D_CODES$5 + 1) * 2); + this.bl_tree = new common$2.Buf16((2 * BL_CODES$5 + 1) * 2); + zero$5(this.dyn_ltree); + zero$5(this.dyn_dtree); + zero$5(this.bl_tree); + + this.l_desc = null; /* desc. for literal tree */ + this.d_desc = null; /* desc. for distance tree */ + this.bl_desc = null; /* desc. for bit length tree */ + + //ush bl_count[MAX_BITS+1]; + this.bl_count = new common$2.Buf16(MAX_BITS$5 + 1); + /* number of codes at each bit length for an optimal tree */ + + //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + this.heap = new common$2.Buf16(2 * L_CODES$5 + 1); /* heap used to build the Huffman trees */ + zero$5(this.heap); + + this.heap_len = 0; /* number of elements in the heap */ + this.heap_max = 0; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + this.depth = new common$2.Buf16(2 * L_CODES$5 + 1); //uch depth[2*L_CODES+1]; + zero$5(this.depth); + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + this.l_buf = 0; /* buffer index for literals or lengths */ + + this.lit_bufsize = 0; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + this.last_lit = 0; /* running index in l_buf */ + + this.d_buf = 0; + /* Buffer index for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + this.opt_len = 0; /* bit length of current block with optimal trees */ + this.static_len = 0; /* bit length of current block with static trees */ + this.matches = 0; /* number of string matches in current block */ + this.insert = 0; /* bytes at end of window left to insert */ + + + this.bi_buf = 0; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + this.bi_valid = 0; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + // Used for window memory init. We safely ignore it for JS. That makes + // sense only for pointers and memory check tools. + //this.high_water = 0; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + } + + + function deflateResetKeep$2(strm) { + var s; + + if (!strm || !strm.state) { + return err$2(strm, Z_STREAM_ERROR$4); + } + + strm.total_in = strm.total_out = 0; + strm.data_type = Z_UNKNOWN$5; + + s = strm.state; + s.pending = 0; + s.pending_out = 0; + + if (s.wrap < 0) { + s.wrap = -s.wrap; + /* was made negative by deflate(..., Z_FINISH); */ + } + s.status = (s.wrap ? INIT_STATE$2 : BUSY_STATE$2); + strm.adler = (s.wrap === 2) ? + 0 // crc32(0, Z_NULL, 0) + : + 1; // adler32(0, Z_NULL, 0) + s.last_flush = Z_NO_FLUSH$4; + trees$2._tr_init(s); + return Z_OK$6; + } + + + function deflateReset$2(strm) { + var ret = deflateResetKeep$2(strm); + if (ret === Z_OK$6) { + lm_init$2(strm.state); + } + return ret; + } + + + function deflateSetHeader$2(strm, head) { + if (!strm || !strm.state) { return Z_STREAM_ERROR$4; } + if (strm.state.wrap !== 2) { return Z_STREAM_ERROR$4; } + strm.state.gzhead = head; + return Z_OK$6; + } + + + function deflateInit2$2(strm, level, method, windowBits, memLevel, strategy) { + if (!strm) { // === Z_NULL + return Z_STREAM_ERROR$4; + } + var wrap = 1; + + if (level === Z_DEFAULT_COMPRESSION$4) { + level = 6; + } + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } + + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } + + + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL$2 || method !== Z_DEFLATED$6 || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED$5) { + return err$2(strm, Z_STREAM_ERROR$4); + } + + + if (windowBits === 8) { + windowBits = 9; + } + /* until 256-byte window bug fixed */ + + var s = new DeflateState$2(); + + strm.state = s; + s.strm = strm; + + s.wrap = wrap; + s.gzhead = null; + s.w_bits = windowBits; + s.w_size = 1 << s.w_bits; + s.w_mask = s.w_size - 1; + + s.hash_bits = memLevel + 7; + s.hash_size = 1 << s.hash_bits; + s.hash_mask = s.hash_size - 1; + s.hash_shift = ~~((s.hash_bits + MIN_MATCH$5 - 1) / MIN_MATCH$5); + + s.window = new common$2.Buf8(s.w_size * 2); + s.head = new common$2.Buf16(s.hash_size); + s.prev = new common$2.Buf16(s.w_size); + + // Don't need mem init magic for JS. + //s.high_water = 0; /* nothing written to s->window yet */ + + s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + s.pending_buf_size = s.lit_bufsize * 4; + + //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + //s->pending_buf = (uchf *) overlay; + s.pending_buf = new common$2.Buf8(s.pending_buf_size); + + // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) + //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s.d_buf = 1 * s.lit_bufsize; + + //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s.l_buf = (1 + 2) * s.lit_bufsize; + + s.level = level; + s.strategy = strategy; + s.method = method; + + return deflateReset$2(strm); + } + + function deflateInit$2(strm, level) { + return deflateInit2$2(strm, level, Z_DEFLATED$6, MAX_WBITS$4, DEF_MEM_LEVEL$2, Z_DEFAULT_STRATEGY$4); + } + + + function deflate$4(strm, flush) { + var old_flush, s; + var beg, val; // for gzip header write only + + if (!strm || !strm.state || + flush > Z_BLOCK$4 || flush < 0) { + return strm ? err$2(strm, Z_STREAM_ERROR$4) : Z_STREAM_ERROR$4; + } + + s = strm.state; + + if (!strm.output || + (!strm.input && strm.avail_in !== 0) || + (s.status === FINISH_STATE$2 && flush !== Z_FINISH$6)) { + return err$2(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$4 : Z_STREAM_ERROR$4); + } + + s.strm = strm; /* just in case */ + old_flush = s.last_flush; + s.last_flush = flush; + + /* Write the header */ + if (s.status === INIT_STATE$2) { + + if (s.wrap === 2) { // GZIP header + strm.adler = 0; //crc32(0L, Z_NULL, 0); + put_byte$2(s, 31); + put_byte$2(s, 139); + put_byte$2(s, 8); + if (!s.gzhead) { // s->gzhead == Z_NULL + put_byte$2(s, 0); + put_byte$2(s, 0); + put_byte$2(s, 0); + put_byte$2(s, 0); + put_byte$2(s, 0); + put_byte$2(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY$2 || s.level < 2 ? + 4 : 0)); + put_byte$2(s, OS_CODE$2); + s.status = BUSY_STATE$2; + } + else { + put_byte$2(s, (s.gzhead.text ? 1 : 0) + + (s.gzhead.hcrc ? 2 : 0) + + (!s.gzhead.extra ? 0 : 4) + + (!s.gzhead.name ? 0 : 8) + + (!s.gzhead.comment ? 0 : 16) + ); + put_byte$2(s, s.gzhead.time & 0xff); + put_byte$2(s, (s.gzhead.time >> 8) & 0xff); + put_byte$2(s, (s.gzhead.time >> 16) & 0xff); + put_byte$2(s, (s.gzhead.time >> 24) & 0xff); + put_byte$2(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY$2 || s.level < 2 ? + 4 : 0)); + put_byte$2(s, s.gzhead.os & 0xff); + if (s.gzhead.extra && s.gzhead.extra.length) { + put_byte$2(s, s.gzhead.extra.length & 0xff); + put_byte$2(s, (s.gzhead.extra.length >> 8) & 0xff); + } + if (s.gzhead.hcrc) { + strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending, 0); + } + s.gzindex = 0; + s.status = EXTRA_STATE$2; + } + } + else // DEFLATE header + { + var header = (Z_DEFLATED$6 + ((s.w_bits - 8) << 4)) << 8; + var level_flags = -1; + + if (s.strategy >= Z_HUFFMAN_ONLY$2 || s.level < 2) { + level_flags = 0; + } else if (s.level < 6) { + level_flags = 1; + } else if (s.level === 6) { + level_flags = 2; + } else { + level_flags = 3; + } + header |= (level_flags << 6); + if (s.strstart !== 0) { header |= PRESET_DICT$2; } + header += 31 - (header % 31); + + s.status = BUSY_STATE$2; + putShortMSB$2(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s.strstart !== 0) { + putShortMSB$2(s, strm.adler >>> 16); + putShortMSB$2(s, strm.adler & 0xffff); + } + strm.adler = 1; // adler32(0L, Z_NULL, 0); + } + } + + //#ifdef GZIP + if (s.status === EXTRA_STATE$2) { + if (s.gzhead.extra/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + + while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending$2(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + break; + } + } + put_byte$2(s, s.gzhead.extra[s.gzindex] & 0xff); + s.gzindex++; + } + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (s.gzindex === s.gzhead.extra.length) { + s.gzindex = 0; + s.status = NAME_STATE$2; + } + } + else { + s.status = NAME_STATE$2; + } + } + if (s.status === NAME_STATE$2) { + if (s.gzhead.name/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; + + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending$2(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.name.length) { + val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte$2(s, val); + } while (val !== 0); + + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.gzindex = 0; + s.status = COMMENT_STATE$2; + } + } + else { + s.status = COMMENT_STATE$2; + } + } + if (s.status === COMMENT_STATE$2) { + if (s.gzhead.comment/* != Z_NULL*/) { + beg = s.pending; /* start of bytes to update crc */ + //int val; + + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending$2(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.comment.length) { + val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte$2(s, val); + } while (val !== 0); + + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1$2(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.status = HCRC_STATE$2; + } + } + else { + s.status = HCRC_STATE$2; + } + } + if (s.status === HCRC_STATE$2) { + if (s.gzhead.hcrc) { + if (s.pending + 2 > s.pending_buf_size) { + flush_pending$2(strm); + } + if (s.pending + 2 <= s.pending_buf_size) { + put_byte$2(s, strm.adler & 0xff); + put_byte$2(s, (strm.adler >> 8) & 0xff); + strm.adler = 0; //crc32(0L, Z_NULL, 0); + s.status = BUSY_STATE$2; + } + } + else { + s.status = BUSY_STATE$2; + } + } + //#endif + + /* Flush as much pending output as possible */ + if (s.pending !== 0) { + flush_pending$2(strm); + if (strm.avail_out === 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s.last_flush = -1; + return Z_OK$6; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm.avail_in === 0 && rank$2(flush) <= rank$2(old_flush) && + flush !== Z_FINISH$6) { + return err$2(strm, Z_BUF_ERROR$4); + } + + /* User must not provide more input after the first FINISH: */ + if (s.status === FINISH_STATE$2 && strm.avail_in !== 0) { + return err$2(strm, Z_BUF_ERROR$4); + } + + /* Start a new block or continue the current one. + */ + if (strm.avail_in !== 0 || s.lookahead !== 0 || + (flush !== Z_NO_FLUSH$4 && s.status !== FINISH_STATE$2)) { + var bstate = (s.strategy === Z_HUFFMAN_ONLY$2) ? deflate_huff$2(s, flush) : + (s.strategy === Z_RLE$2 ? deflate_rle$2(s, flush) : + configuration_table$2[s.level].func(s, flush)); + + if (bstate === BS_FINISH_STARTED$2 || bstate === BS_FINISH_DONE$2) { + s.status = FINISH_STATE$2; + } + if (bstate === BS_NEED_MORE$2 || bstate === BS_FINISH_STARTED$2) { + if (strm.avail_out === 0) { + s.last_flush = -1; + /* avoid BUF_ERROR next call, see above */ + } + return Z_OK$6; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate === BS_BLOCK_DONE$2) { + if (flush === Z_PARTIAL_FLUSH$2) { + trees$2._tr_align(s); + } + else if (flush !== Z_BLOCK$4) { /* FULL_FLUSH or SYNC_FLUSH */ + + trees$2._tr_stored_block(s, 0, 0, false); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush === Z_FULL_FLUSH$2) { + /*** CLEAR_HASH(s); ***/ /* forget history */ + zero$5(s.head); // Fill with NIL (= 0); + + if (s.lookahead === 0) { + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + } + } + flush_pending$2(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK$6; + } + } + } + //Assert(strm->avail_out > 0, "bug2"); + //if (strm.avail_out <= 0) { throw new Error("bug2");} + + if (flush !== Z_FINISH$6) { return Z_OK$6; } + if (s.wrap <= 0) { return Z_STREAM_END$6; } + + /* Write the trailer */ + if (s.wrap === 2) { + put_byte$2(s, strm.adler & 0xff); + put_byte$2(s, (strm.adler >> 8) & 0xff); + put_byte$2(s, (strm.adler >> 16) & 0xff); + put_byte$2(s, (strm.adler >> 24) & 0xff); + put_byte$2(s, strm.total_in & 0xff); + put_byte$2(s, (strm.total_in >> 8) & 0xff); + put_byte$2(s, (strm.total_in >> 16) & 0xff); + put_byte$2(s, (strm.total_in >> 24) & 0xff); + } + else + { + putShortMSB$2(s, strm.adler >>> 16); + putShortMSB$2(s, strm.adler & 0xffff); + } + + flush_pending$2(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s.wrap > 0) { s.wrap = -s.wrap; } + /* write the trailer only once! */ + return s.pending !== 0 ? Z_OK$6 : Z_STREAM_END$6; + } + + function deflateEnd$2(strm) { + var status; + + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR$4; + } + + status = strm.state.status; + if (status !== INIT_STATE$2 && + status !== EXTRA_STATE$2 && + status !== NAME_STATE$2 && + status !== COMMENT_STATE$2 && + status !== HCRC_STATE$2 && + status !== BUSY_STATE$2 && + status !== FINISH_STATE$2 + ) { + return err$2(strm, Z_STREAM_ERROR$4); + } + + strm.state = null; + + return status === BUSY_STATE$2 ? err$2(strm, Z_DATA_ERROR$4) : Z_OK$6; + } + + + /* ========================================================================= + * Initializes the compression dictionary from the given byte + * sequence without producing any compressed output. + */ + function deflateSetDictionary$2(strm, dictionary) { + var dictLength = dictionary.length; + + var s; + var str, n; + var wrap; + var avail; + var next; + var input; + var tmpDict; + + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR$4; + } + + s = strm.state; + wrap = s.wrap; + + if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE$2) || s.lookahead) { + return Z_STREAM_ERROR$4; + } + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap === 1) { + /* adler32(strm->adler, dictionary, dictLength); */ + strm.adler = adler32_1$2(strm.adler, dictionary, dictLength, 0); + } + + s.wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s.w_size) { + if (wrap === 0) { /* already empty otherwise */ + /*** CLEAR_HASH(s); ***/ + zero$5(s.head); // Fill with NIL (= 0); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + /* use the tail */ + // dictionary = dictionary.slice(dictLength - s.w_size); + tmpDict = new common$2.Buf8(s.w_size); + common$2.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + /* insert dictionary into window and hash */ + avail = strm.avail_in; + next = strm.next_in; + input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window$2(s); + while (s.lookahead >= MIN_MATCH$5) { + str = s.strstart; + n = s.lookahead - (MIN_MATCH$5 - 1); + do { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH$5 - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + + s.head[s.ins_h] = str; + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH$5 - 1; + fill_window$2(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH$5 - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK$6; + } + + + var deflateInit_1$2 = deflateInit$2; + var deflateInit2_1$2 = deflateInit2$2; + var deflateReset_1$2 = deflateReset$2; + var deflateResetKeep_1$2 = deflateResetKeep$2; + var deflateSetHeader_1$2 = deflateSetHeader$2; + var deflate_2$4 = deflate$4; + var deflateEnd_1$2 = deflateEnd$2; + var deflateSetDictionary_1$2 = deflateSetDictionary$2; + var deflateInfo$2 = 'pako deflate (from Nodeca project)'; + + /* Not implemented + exports.deflateBound = deflateBound; + exports.deflateCopy = deflateCopy; + exports.deflateParams = deflateParams; + exports.deflatePending = deflatePending; + exports.deflatePrime = deflatePrime; + exports.deflateTune = deflateTune; + */ + + var deflate_1$4 = { + deflateInit: deflateInit_1$2, + deflateInit2: deflateInit2_1$2, + deflateReset: deflateReset_1$2, + deflateResetKeep: deflateResetKeep_1$2, + deflateSetHeader: deflateSetHeader_1$2, + deflate: deflate_2$4, + deflateEnd: deflateEnd_1$2, + deflateSetDictionary: deflateSetDictionary_1$2, + deflateInfo: deflateInfo$2 + }; + + // Quick check if we can use fast array to bin string conversion + // + // - apply(Array) can fail on Android 2.2 + // - apply(Uint8Array) can fail on iOS 5.1 Safari + // + var STR_APPLY_OK$2 = true; + var STR_APPLY_UIA_OK$2 = true; + + try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK$2 = false; } + try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK$2 = false; } + + + // Table with utf8 lengths (calculated by first byte of sequence) + // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, + // because max possible codepoint is 0x10ffff + var _utf8len$2 = new common$2.Buf8(256); + for (var q$2 = 0; q$2 < 256; q$2++) { + _utf8len$2[q$2] = (q$2 >= 252 ? 6 : q$2 >= 248 ? 5 : q$2 >= 240 ? 4 : q$2 >= 224 ? 3 : q$2 >= 192 ? 2 : 1); + } + _utf8len$2[254] = _utf8len$2[254] = 1; // Invalid sequence start + + + // convert string to array (typed, when possible) + var string2buf$2 = function (str) { + var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; + + // count binary size + for (m_pos = 0; m_pos < str_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; + } + + // allocate buffer + buf = new common$2.Buf8(buf_len); + + // convert + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + if (c < 0x80) { + /* one byte */ + buf[i++] = c; + } else if (c < 0x800) { + /* two bytes */ + buf[i++] = 0xC0 | (c >>> 6); + buf[i++] = 0x80 | (c & 0x3f); + } else if (c < 0x10000) { + /* three bytes */ + buf[i++] = 0xE0 | (c >>> 12); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } else { + /* four bytes */ + buf[i++] = 0xf0 | (c >>> 18); + buf[i++] = 0x80 | (c >>> 12 & 0x3f); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } + } + + return buf; + }; + + // Helper (used in 2 places) + function buf2binstring$2(buf, len) { + // On Chrome, the arguments in a function call that are allowed is `65534`. + // If the length of the buffer is smaller than that, we can use this optimization, + // otherwise we will take a slower path. + if (len < 65534) { + if ((buf.subarray && STR_APPLY_UIA_OK$2) || (!buf.subarray && STR_APPLY_OK$2)) { + return String.fromCharCode.apply(null, common$2.shrinkBuf(buf, len)); + } + } + + var result = ''; + for (var i = 0; i < len; i++) { + result += String.fromCharCode(buf[i]); + } + return result; + } + + + // Convert byte array to binary string + var buf2binstring_1$2 = function (buf) { + return buf2binstring$2(buf, buf.length); + }; + + + // Convert binary string (typed, when possible) + var binstring2buf$2 = function (str) { + var buf = new common$2.Buf8(str.length); + for (var i = 0, len = buf.length; i < len; i++) { + buf[i] = str.charCodeAt(i); + } + return buf; + }; + + + // convert array to string + var buf2string$2 = function (buf, max) { + var i, out, c, c_len; + var len = max || buf.length; + + // Reserve max possible length (2 words per char) + // NB: by unknown reasons, Array is significantly faster for + // String.fromCharCode.apply than Uint16Array. + var utf16buf = new Array(len * 2); + + for (out = 0, i = 0; i < len;) { + c = buf[i++]; + // quick process ascii + if (c < 0x80) { utf16buf[out++] = c; continue; } + + c_len = _utf8len$2[c]; + // skip 5 & 6 byte codes + if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } + + // apply mask on first byte + c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; + // join the rest + while (c_len > 1 && i < len) { + c = (c << 6) | (buf[i++] & 0x3f); + c_len--; + } + + // terminated by end of string? + if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } + + if (c < 0x10000) { + utf16buf[out++] = c; + } else { + c -= 0x10000; + utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); + utf16buf[out++] = 0xdc00 | (c & 0x3ff); + } + } + + return buf2binstring$2(utf16buf, out); + }; + + + // Calculate max possible position in utf8 buffer, + // that will not break sequence. If that's not possible + // - (very small limits) return max size as is. + // + // buf[] - utf8 bytes array + // max - length limit (mandatory); + var utf8border$2 = function (buf, max) { + var pos; + + max = max || buf.length; + if (max > buf.length) { max = buf.length; } + + // go back from last position, until start of sequence found + pos = max - 1; + while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } + + // Very small and broken sequence, + // return max, because we should return something anyway. + if (pos < 0) { return max; } + + // If we came to start of buffer - that means buffer is too small, + // return max too. + if (pos === 0) { return max; } + + return (pos + _utf8len$2[buf[pos]] > max) ? pos : max; + }; + + var strings$2 = { + string2buf: string2buf$2, + buf2binstring: buf2binstring_1$2, + binstring2buf: binstring2buf$2, + buf2string: buf2string$2, + utf8border: utf8border$2 + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function ZStream$2() { + /* next input byte */ + this.input = null; // JS specific, because we have no pointers + this.next_in = 0; + /* number of bytes available at input */ + this.avail_in = 0; + /* total number of input bytes read so far */ + this.total_in = 0; + /* next output byte should be put there */ + this.output = null; // JS specific, because we have no pointers + this.next_out = 0; + /* remaining free space at output */ + this.avail_out = 0; + /* total number of bytes output so far */ + this.total_out = 0; + /* last error message, NULL if no error */ + this.msg = ''/*Z_NULL*/; + /* not visible by applications */ + this.state = null; + /* best guess about the data type: binary or text */ + this.data_type = 2/*Z_UNKNOWN*/; + /* adler32 value of the uncompressed data */ + this.adler = 0; + } + + var zstream$2 = ZStream$2; + + var toString$4 = Object.prototype.toString; + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + var Z_NO_FLUSH$5 = 0; + var Z_FINISH$7 = 4; + + var Z_OK$7 = 0; + var Z_STREAM_END$7 = 1; + var Z_SYNC_FLUSH$2 = 2; + + var Z_DEFAULT_COMPRESSION$5 = -1; + + var Z_DEFAULT_STRATEGY$5 = 0; + + var Z_DEFLATED$7 = 8; + + /* ===========================================================================*/ + + + /** + * class Deflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[deflate]], + * [[deflateRaw]] and [[gzip]]. + **/ + + /* internal + * Deflate.chunks -> Array + * + * Chunks of output data, if [[Deflate#onData]] not overridden. + **/ + + /** + * Deflate.result -> Uint8Array|Array + * + * Compressed result, generated by default [[Deflate#onData]] + * and [[Deflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Deflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ + + /** + * Deflate.err -> Number + * + * Error code after deflate finished. 0 (Z_OK) on success. + * You will not need it in real life, because deflate errors + * are possible only on wrong options or bad `onData` / `onEnd` + * custom handlers. + **/ + + /** + * Deflate.msg -> String + * + * Error message, if [[Deflate.err]] != 0 + **/ + + + /** + * new Deflate(options) + * - options (Object): zlib deflate options. + * + * Creates new deflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `level` + * - `windowBits` + * - `memLevel` + * - `strategy` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw deflate + * - `gzip` (Boolean) - create gzip wrapper + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * - `header` (Object) - custom header for gzip + * - `text` (Boolean) - true if compressed data believed to be text + * - `time` (Number) - modification time, unix timestamp + * - `os` (Number) - operation system code + * - `extra` (Array) - array of bytes with extra data (max 65536) + * - `name` (String) - file name (binary string) + * - `comment` (String) - comment (binary string) + * - `hcrc` (Boolean) - true if header crc should be added + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var deflate = new pako.Deflate({ level: 3}); + * + * deflate.push(chunk1, false); + * deflate.push(chunk2, true); // true -> last chunk + * + * if (deflate.err) { throw new Error(deflate.err); } + * + * console.log(deflate.result); + * ``` + **/ + function Deflate$2(options) { + if (!(this instanceof Deflate$2)) return new Deflate$2(options); + + this.options = common$2.assign({ + level: Z_DEFAULT_COMPRESSION$5, + method: Z_DEFLATED$7, + chunkSize: 16384, + windowBits: 15, + memLevel: 8, + strategy: Z_DEFAULT_STRATEGY$5, + to: '' + }, options || {}); + + var opt = this.options; + + if (opt.raw && (opt.windowBits > 0)) { + opt.windowBits = -opt.windowBits; + } + + else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { + opt.windowBits += 16; + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream$2(); + this.strm.avail_out = 0; + + var status = deflate_1$4.deflateInit2( + this.strm, + opt.level, + opt.method, + opt.windowBits, + opt.memLevel, + opt.strategy + ); + + if (status !== Z_OK$7) { + throw new Error(messages$2[status]); + } + + if (opt.header) { + deflate_1$4.deflateSetHeader(this.strm, opt.header); + } + + if (opt.dictionary) { + var dict; + // Convert data if needed + if (typeof opt.dictionary === 'string') { + // If we need to compress text, change encoding to utf8. + dict = strings$2.string2buf(opt.dictionary); + } else if (toString$4.call(opt.dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(opt.dictionary); + } else { + dict = opt.dictionary; + } + + status = deflate_1$4.deflateSetDictionary(this.strm, dict); + + if (status !== Z_OK$7) { + throw new Error(messages$2[status]); + } + + this._dict_set = true; + } + } + + /** + * Deflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be + * converted to utf8 byte sequence. + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with + * new compressed chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the compression context. + * + * On fail call [[Deflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * array format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ + Deflate$2.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var status, _mode; + + if (this.ended) { return false; } + + _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH$7 : Z_NO_FLUSH$5); + + // Convert data if needed + if (typeof data === 'string') { + // If we need to compress text, change encoding to utf8. + strm.input = strings$2.string2buf(data); + } else if (toString$4.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + do { + if (strm.avail_out === 0) { + strm.output = new common$2.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + status = deflate_1$4.deflate(strm, _mode); /* no bad return value */ + + if (status !== Z_STREAM_END$7 && status !== Z_OK$7) { + this.onEnd(status); + this.ended = true; + return false; + } + if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH$7 || _mode === Z_SYNC_FLUSH$2))) { + if (this.options.to === 'string') { + this.onData(strings$2.buf2binstring(common$2.shrinkBuf(strm.output, strm.next_out))); + } else { + this.onData(common$2.shrinkBuf(strm.output, strm.next_out)); + } + } + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END$7); + + // Finalize on the last chunk. + if (_mode === Z_FINISH$7) { + status = deflate_1$4.deflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === Z_OK$7; + } + + // callback interim results if Z_SYNC_FLUSH. + if (_mode === Z_SYNC_FLUSH$2) { + this.onEnd(Z_OK$7); + strm.avail_out = 0; + return true; + } + + return true; + }; + + + /** + * Deflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): output data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ + Deflate$2.prototype.onData = function (chunk) { + this.chunks.push(chunk); + }; + + + /** + * Deflate#onEnd(status) -> Void + * - status (Number): deflate status. 0 (Z_OK) on success, + * other if not. + * + * Called once after you tell deflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ + Deflate$2.prototype.onEnd = function (status) { + // On success - join + if (status === Z_OK$7) { + if (this.options.to === 'string') { + this.result = this.chunks.join(''); + } else { + this.result = common$2.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; + }; + + + /** + * deflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * Compress `data` with deflate algorithm and `options`. + * + * Supported options are: + * + * - level + * - windowBits + * - memLevel + * - strategy + * - dictionary + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be "binary string" + * (each char code [0..255]) + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , data = Uint8Array([1,2,3,4,5,6,7,8,9]); + * + * console.log(pako.deflate(data)); + * ``` + **/ + function deflate$5(input, options) { + var deflator = new Deflate$2(options); + + deflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (deflator.err) { throw deflator.msg || messages$2[deflator.err]; } + + return deflator.result; + } + + + /** + * deflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ + function deflateRaw$2(input, options) { + options = options || {}; + options.raw = true; + return deflate$5(input, options); + } + + + /** + * gzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but create gzip wrapper instead of + * deflate one. + **/ + function gzip$2(input, options) { + options = options || {}; + options.gzip = true; + return deflate$5(input, options); + } + + + var Deflate_1$2 = Deflate$2; + var deflate_2$5 = deflate$5; + var deflateRaw_1$2 = deflateRaw$2; + var gzip_1$2 = gzip$2; + + var deflate_1$5 = { + Deflate: Deflate_1$2, + deflate: deflate_2$5, + deflateRaw: deflateRaw_1$2, + gzip: gzip_1$2 + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + // See state defs from inflate.js + var BAD$4 = 30; /* got a data error -- remain here until reset */ + var TYPE$4 = 12; /* i: waiting for type bits, including last-flag bit */ + + /* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state.mode === LEN + strm.avail_in >= 6 + strm.avail_out >= 258 + start >= strm.avail_out + state.bits < 8 + + On return, state.mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm.avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm.avail_out >= 258 for each loop to avoid checking for + output space. + */ + var inffast$2 = function inflate_fast(strm, start) { + var state; + var _in; /* local strm.input */ + var last; /* have enough input while in < last */ + var _out; /* local strm.output */ + var beg; /* inflate()'s initial strm.output */ + var end; /* while out < end, enough space available */ + //#ifdef INFLATE_STRICT + var dmax; /* maximum distance from zlib header */ + //#endif + var wsize; /* window size or zero if not using window */ + var whave; /* valid bytes in the window */ + var wnext; /* window write index */ + // Use `s_window` instead `window`, avoid conflict with instrumentation tools + var s_window; /* allocated sliding window, if wsize != 0 */ + var hold; /* local strm.hold */ + var bits; /* local strm.bits */ + var lcode; /* local strm.lencode */ + var dcode; /* local strm.distcode */ + var lmask; /* mask for first level of length codes */ + var dmask; /* mask for first level of distance codes */ + var here; /* retrieved table entry */ + var op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + var len; /* match length, unused bytes */ + var dist; /* match distance */ + var from; /* where to copy match from */ + var from_source; + + + var input, output; // JS specific, because we have no pointers + + /* copy state to local variables */ + state = strm.state; + //here = state.here; + _in = strm.next_in; + input = strm.input; + last = _in + (strm.avail_in - 5); + _out = strm.next_out; + output = strm.output; + beg = _out - (start - strm.avail_out); + end = _out + (strm.avail_out - 257); + //#ifdef INFLATE_STRICT + dmax = state.dmax; + //#endif + wsize = state.wsize; + whave = state.whave; + wnext = state.wnext; + s_window = state.window; + hold = state.hold; + bits = state.bits; + lcode = state.lencode; + dcode = state.distcode; + lmask = (1 << state.lenbits) - 1; + dmask = (1 << state.distbits) - 1; + + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + top: + do { + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + + here = lcode[hold & lmask]; + + dolen: + for (;;) { // Goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + if (op === 0) { /* literal */ + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + output[_out++] = here & 0xffff/*here.val*/; + } + else if (op & 16) { /* length base */ + len = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + len += hold & ((1 << op) - 1); + hold >>>= op; + bits -= op; + } + //Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = dcode[hold & dmask]; + + dodist: + for (;;) { // goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + + if (op & 16) { /* distance base */ + dist = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + } + dist += hold & ((1 << op) - 1); + //#ifdef INFLATE_STRICT + if (dist > dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$4; + break top; + } + //#endif + hold >>>= op; + bits -= op; + //Tracevv((stderr, "inflate: distance %u\n", dist)); + op = _out - beg; /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$4; + break top; + } + + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + // if (len <= op - whave) { + // do { + // output[_out++] = 0; + // } while (--len); + // continue top; + // } + // len -= op - whave; + // do { + // output[_out++] = 0; + // } while (--op > whave); + // if (op === 0) { + // from = _out - dist; + // do { + // output[_out++] = output[from++]; + // } while (--len); + // continue top; + // } + //#endif + } + from = 0; // window index + from_source = s_window; + if (wnext === 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = 0; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + while (len > 2) { + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + len -= 3; + } + if (len) { + output[_out++] = from_source[from++]; + if (len > 1) { + output[_out++] = from_source[from++]; + } + } + } + else { + from = _out - dist; /* copy direct from output */ + do { /* minimum length is three */ + output[_out++] = output[from++]; + output[_out++] = output[from++]; + output[_out++] = output[from++]; + len -= 3; + } while (len > 2); + if (len) { + output[_out++] = output[from++]; + if (len > 1) { + output[_out++] = output[from++]; + } + } + } + } + else if ((op & 64) === 0) { /* 2nd level distance code */ + here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dodist; + } + else { + strm.msg = 'invalid distance code'; + state.mode = BAD$4; + break top; + } + + break; // need to emulate goto via "continue" + } + } + else if ((op & 64) === 0) { /* 2nd level length code */ + here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dolen; + } + else if (op & 32) { /* end-of-block */ + //Tracevv((stderr, "inflate: end of block\n")); + state.mode = TYPE$4; + break top; + } + else { + strm.msg = 'invalid literal/length code'; + state.mode = BAD$4; + break top; + } + + break; // need to emulate goto via "continue" + } + } while (_in < last && _out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + _in -= len; + bits -= len << 3; + hold &= (1 << bits) - 1; + + /* update state and return */ + strm.next_in = _in; + strm.next_out = _out; + strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); + strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); + state.hold = hold; + state.bits = bits; + return; + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + var MAXBITS$2 = 15; + var ENOUGH_LENS$4 = 852; + var ENOUGH_DISTS$4 = 592; + //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + + var CODES$4 = 0; + var LENS$4 = 1; + var DISTS$4 = 2; + + var lbase$2 = [ /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 + ]; + + var lext$2 = [ /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 + ]; + + var dbase$2 = [ /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0 + ]; + + var dext$2 = [ /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64 + ]; + + var inftrees$2 = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) + { + var bits = opts.bits; + //here = opts.here; /* table entry for duplication */ + + var len = 0; /* a code's length in bits */ + var sym = 0; /* index of code symbols */ + var min = 0, max = 0; /* minimum and maximum code lengths */ + var root = 0; /* number of index bits for root table */ + var curr = 0; /* number of index bits for current table */ + var drop = 0; /* code bits to drop for sub-table */ + var left = 0; /* number of prefix codes available */ + var used = 0; /* code entries in table used */ + var huff = 0; /* Huffman code */ + var incr; /* for incrementing code, index */ + var fill; /* index for replicating entries */ + var low; /* low bits for current root entry */ + var mask; /* mask for low root bits */ + var next; /* next available space in table */ + var base = null; /* base value table to use */ + var base_index = 0; + // var shoextra; /* extra bits table to use */ + var end; /* use base and extra for symbol > end */ + var count = new common$2.Buf16(MAXBITS$2 + 1); //[MAXBITS+1]; /* number of codes of each length */ + var offs = new common$2.Buf16(MAXBITS$2 + 1); //[MAXBITS+1]; /* offsets in table for each length */ + var extra = null; + var extra_index = 0; + + var here_bits, here_op, here_val; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS$2; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + + /* bound code lengths, force root to be within code lengths */ + root = bits; + for (max = MAXBITS$2; max >= 1; max--) { + if (count[max] !== 0) { break; } + } + if (root > max) { + root = max; + } + if (max === 0) { /* no symbols to code at all */ + //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ + //table.bits[opts.table_index] = 1; //here.bits = (var char)1; + //table.val[opts.table_index++] = 0; //here.val = (var short)0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + + //table.op[opts.table_index] = 64; + //table.bits[opts.table_index] = 1; + //table.val[opts.table_index++] = 0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + opts.bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { break; } + } + if (root < min) { + root = min; + } + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS$2; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } /* over-subscribed */ + } + if (left > 0 && (type === CODES$4 || max !== 1)) { + return -1; /* incomplete set */ + } + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS$2; len++) { + offs[len + 1] = offs[len] + count[len]; + } + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + // poor man optimization - use if-else instead of switch, + // to avoid deopts in old v8 + if (type === CODES$4) { + base = extra = work; /* dummy value--not used */ + end = 19; + + } else if (type === LENS$4) { + base = lbase$2; + base_index -= 257; + extra = lext$2; + extra_index -= 257; + end = 256; + + } else { /* DISTS */ + base = dbase$2; + extra = dext$2; + end = -1; + } + + /* initialize opts for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = table_index; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = -1; /* trigger new sub-table when len > root */ + used = 1 << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type === LENS$4 && used > ENOUGH_LENS$4) || + (type === DISTS$4 && used > ENOUGH_DISTS$4)) { + return 1; + } + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here_bits = len - drop; + if (work[sym] < end) { + here_op = 0; + here_val = work[sym]; + } + else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base[base_index + work[sym]]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1 << (len - drop); + fill = 1 << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; + } while (fill !== 0); + + /* backwards increment the len-bit code huff */ + incr = 1 << (len - 1); + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) !== low) { + /* if first time, transition to sub-tables */ + if (drop === 0) { + drop = root; + } + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { break; } + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1 << curr; + if ((type === LENS$4 && used > ENOUGH_LENS$4) || + (type === DISTS$4 && used > ENOUGH_DISTS$4)) { + return 1; + } + + /* point entry in root table to sub-table */ + low = huff & mask; + /*table.op[low] = curr; + table.bits[low] = root; + table.val[low] = next - opts.table_index;*/ + table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff !== 0) { + //table.op[next + huff] = 64; /* invalid code marker */ + //table.bits[next + huff] = len - drop; + //table.val[next + huff] = 0; + table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + } + + /* set return parameters */ + //opts.table_index += used; + opts.bits = root; + return 0; + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + + + + + + + var CODES$5 = 0; + var LENS$5 = 1; + var DISTS$5 = 2; + + /* Public constants ==========================================================*/ + /* ===========================================================================*/ + + + /* Allowed flush values; see deflate() and inflate() below for details */ + //var Z_NO_FLUSH = 0; + //var Z_PARTIAL_FLUSH = 1; + //var Z_SYNC_FLUSH = 2; + //var Z_FULL_FLUSH = 3; + var Z_FINISH$8 = 4; + var Z_BLOCK$5 = 5; + var Z_TREES$2 = 6; + + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + var Z_OK$8 = 0; + var Z_STREAM_END$8 = 1; + var Z_NEED_DICT$2 = 2; + //var Z_ERRNO = -1; + var Z_STREAM_ERROR$5 = -2; + var Z_DATA_ERROR$5 = -3; + var Z_MEM_ERROR$2 = -4; + var Z_BUF_ERROR$5 = -5; + //var Z_VERSION_ERROR = -6; + + /* The deflate compression method */ + var Z_DEFLATED$8 = 8; + + + /* STATES ====================================================================*/ + /* ===========================================================================*/ + + + var HEAD$2 = 1; /* i: waiting for magic header */ + var FLAGS$2 = 2; /* i: waiting for method and flags (gzip) */ + var TIME$2 = 3; /* i: waiting for modification time (gzip) */ + var OS$2 = 4; /* i: waiting for extra flags and operating system (gzip) */ + var EXLEN$2 = 5; /* i: waiting for extra length (gzip) */ + var EXTRA$2 = 6; /* i: waiting for extra bytes (gzip) */ + var NAME$2 = 7; /* i: waiting for end of file name (gzip) */ + var COMMENT$2 = 8; /* i: waiting for end of comment (gzip) */ + var HCRC$2 = 9; /* i: waiting for header crc (gzip) */ + var DICTID$2 = 10; /* i: waiting for dictionary check value */ + var DICT$2 = 11; /* waiting for inflateSetDictionary() call */ + var TYPE$5 = 12; /* i: waiting for type bits, including last-flag bit */ + var TYPEDO$2 = 13; /* i: same, but skip check to exit inflate on new block */ + var STORED$2 = 14; /* i: waiting for stored size (length and complement) */ + var COPY_$2 = 15; /* i/o: same as COPY below, but only first time in */ + var COPY$2 = 16; /* i/o: waiting for input or output to copy stored block */ + var TABLE$2 = 17; /* i: waiting for dynamic block table lengths */ + var LENLENS$2 = 18; /* i: waiting for code length code lengths */ + var CODELENS$2 = 19; /* i: waiting for length/lit and distance code lengths */ + var LEN_$2 = 20; /* i: same as LEN below, but only first time in */ + var LEN$2 = 21; /* i: waiting for length/lit/eob code */ + var LENEXT$2 = 22; /* i: waiting for length extra bits */ + var DIST$2 = 23; /* i: waiting for distance code */ + var DISTEXT$2 = 24; /* i: waiting for distance extra bits */ + var MATCH$2 = 25; /* o: waiting for output space to copy string */ + var LIT$2 = 26; /* o: waiting for output space to write literal */ + var CHECK$2 = 27; /* i: waiting for 32-bit check value */ + var LENGTH$2 = 28; /* i: waiting for 32-bit length (gzip) */ + var DONE$2 = 29; /* finished check, done -- remain here until reset */ + var BAD$5 = 30; /* got a data error -- remain here until reset */ + var MEM$2 = 31; /* got an inflate() memory error -- remain here until reset */ + var SYNC$2 = 32; /* looking for synchronization bytes to restart inflate() */ + + /* ===========================================================================*/ + + + + var ENOUGH_LENS$5 = 852; + var ENOUGH_DISTS$5 = 592; + //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + + var MAX_WBITS$5 = 15; + /* 32K LZ77 window */ + var DEF_WBITS$2 = MAX_WBITS$5; + + + function zswap32$2(q) { + return (((q >>> 24) & 0xff) + + ((q >>> 8) & 0xff00) + + ((q & 0xff00) << 8) + + ((q & 0xff) << 24)); + } + + + function InflateState$2() { + this.mode = 0; /* current inflate mode */ + this.last = false; /* true if processing last block */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.havedict = false; /* true if dictionary provided */ + this.flags = 0; /* gzip header method and flags (0 if zlib) */ + this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ + this.check = 0; /* protected copy of check value */ + this.total = 0; /* protected copy of output count */ + // TODO: may be {} + this.head = null; /* where to save gzip header information */ + + /* sliding window */ + this.wbits = 0; /* log base 2 of requested window size */ + this.wsize = 0; /* window size or zero if not using window */ + this.whave = 0; /* valid bytes in the window */ + this.wnext = 0; /* window write index */ + this.window = null; /* allocated sliding window, if needed */ + + /* bit accumulator */ + this.hold = 0; /* input bit accumulator */ + this.bits = 0; /* number of bits in "in" */ + + /* for string and stored block copying */ + this.length = 0; /* literal or length of data to copy */ + this.offset = 0; /* distance back to copy string from */ + + /* for table and code decoding */ + this.extra = 0; /* extra bits needed */ + + /* fixed and dynamic code tables */ + this.lencode = null; /* starting table for length/literal codes */ + this.distcode = null; /* starting table for distance codes */ + this.lenbits = 0; /* index bits for lencode */ + this.distbits = 0; /* index bits for distcode */ + + /* dynamic table building */ + this.ncode = 0; /* number of code length code lengths */ + this.nlen = 0; /* number of length code lengths */ + this.ndist = 0; /* number of distance code lengths */ + this.have = 0; /* number of code lengths in lens[] */ + this.next = null; /* next available space in codes[] */ + + this.lens = new common$2.Buf16(320); /* temporary storage for code lengths */ + this.work = new common$2.Buf16(288); /* work area for code table building */ + + /* + because we don't have pointers in js, we use lencode and distcode directly + as buffers so we don't need codes + */ + //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ + this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ + this.distdyn = null; /* dynamic table for distance codes (JS specific) */ + this.sane = 0; /* if false, allow invalid distance too far */ + this.back = 0; /* bits back of last unprocessed length/lit */ + this.was = 0; /* initial length of match */ + } + + function inflateResetKeep$2(strm) { + var state; + + if (!strm || !strm.state) { return Z_STREAM_ERROR$5; } + state = strm.state; + strm.total_in = strm.total_out = state.total = 0; + strm.msg = ''; /*Z_NULL*/ + if (state.wrap) { /* to support ill-conceived Java test suite */ + strm.adler = state.wrap & 1; + } + state.mode = HEAD$2; + state.last = 0; + state.havedict = 0; + state.dmax = 32768; + state.head = null/*Z_NULL*/; + state.hold = 0; + state.bits = 0; + //state.lencode = state.distcode = state.next = state.codes; + state.lencode = state.lendyn = new common$2.Buf32(ENOUGH_LENS$5); + state.distcode = state.distdyn = new common$2.Buf32(ENOUGH_DISTS$5); + + state.sane = 1; + state.back = -1; + //Tracev((stderr, "inflate: reset\n")); + return Z_OK$8; + } + + function inflateReset$2(strm) { + var state; + + if (!strm || !strm.state) { return Z_STREAM_ERROR$5; } + state = strm.state; + state.wsize = 0; + state.whave = 0; + state.wnext = 0; + return inflateResetKeep$2(strm); + + } + + function inflateReset2$2(strm, windowBits) { + var wrap; + var state; + + /* get the state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR$5; } + state = strm.state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; + if (windowBits < 48) { + windowBits &= 15; + } + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) { + return Z_STREAM_ERROR$5; + } + if (state.window !== null && state.wbits !== windowBits) { + state.window = null; + } + + /* update state and reset the rest of it */ + state.wrap = wrap; + state.wbits = windowBits; + return inflateReset$2(strm); + } + + function inflateInit2$2(strm, windowBits) { + var ret; + var state; + + if (!strm) { return Z_STREAM_ERROR$5; } + //strm.msg = Z_NULL; /* in case we return an error */ + + state = new InflateState$2(); + + //if (state === Z_NULL) return Z_MEM_ERROR; + //Tracev((stderr, "inflate: allocated\n")); + strm.state = state; + state.window = null/*Z_NULL*/; + ret = inflateReset2$2(strm, windowBits); + if (ret !== Z_OK$8) { + strm.state = null/*Z_NULL*/; + } + return ret; + } + + function inflateInit$2(strm) { + return inflateInit2$2(strm, DEF_WBITS$2); + } + + + /* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ + var virgin$2 = true; + + var lenfix$2, distfix$2; // We have no pointers in JS, so keep tables separate + + function fixedtables$2(state) { + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin$2) { + var sym; + + lenfix$2 = new common$2.Buf32(512); + distfix$2 = new common$2.Buf32(32); + + /* literal/length table */ + sym = 0; + while (sym < 144) { state.lens[sym++] = 8; } + while (sym < 256) { state.lens[sym++] = 9; } + while (sym < 280) { state.lens[sym++] = 7; } + while (sym < 288) { state.lens[sym++] = 8; } + + inftrees$2(LENS$5, state.lens, 0, 288, lenfix$2, 0, state.work, { bits: 9 }); + + /* distance table */ + sym = 0; + while (sym < 32) { state.lens[sym++] = 5; } + + inftrees$2(DISTS$5, state.lens, 0, 32, distfix$2, 0, state.work, { bits: 5 }); + + /* do this just once */ + virgin$2 = false; + } + + state.lencode = lenfix$2; + state.lenbits = 9; + state.distcode = distfix$2; + state.distbits = 5; + } + + + /* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ + function updatewindow$2(strm, src, end, copy) { + var dist; + var state = strm.state; + + /* if it hasn't been done already, allocate space for the window */ + if (state.window === null) { + state.wsize = 1 << state.wbits; + state.wnext = 0; + state.whave = 0; + + state.window = new common$2.Buf8(state.wsize); + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state.wsize) { + common$2.arraySet(state.window, src, end - state.wsize, state.wsize, 0); + state.wnext = 0; + state.whave = state.wsize; + } + else { + dist = state.wsize - state.wnext; + if (dist > copy) { + dist = copy; + } + //zmemcpy(state->window + state->wnext, end - copy, dist); + common$2.arraySet(state.window, src, end - copy, dist, state.wnext); + copy -= dist; + if (copy) { + //zmemcpy(state->window, end - copy, copy); + common$2.arraySet(state.window, src, end - copy, copy, 0); + state.wnext = copy; + state.whave = state.wsize; + } + else { + state.wnext += dist; + if (state.wnext === state.wsize) { state.wnext = 0; } + if (state.whave < state.wsize) { state.whave += dist; } + } + } + return 0; + } + + function inflate$4(strm, flush) { + var state; + var input, output; // input/output buffers + var next; /* next input INDEX */ + var put; /* next output INDEX */ + var have, left; /* available input and output */ + var hold; /* bit buffer */ + var bits; /* bits in bit buffer */ + var _in, _out; /* save starting available input and output */ + var copy; /* number of stored or match bytes to copy */ + var from; /* where to copy match bytes from */ + var from_source; + var here = 0; /* current decoding table entry */ + var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) + //var last; /* parent table entry */ + var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) + var len; /* length to copy for repeats, bits to drop */ + var ret; /* return code */ + var hbuf = new common$2.Buf8(4); /* buffer for gzip header crc calculation */ + var opts; + + var n; // temporary var for NEED_BITS + + var order = /* permutation of code lengths */ + [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; + + + if (!strm || !strm.state || !strm.output || + (!strm.input && strm.avail_in !== 0)) { + return Z_STREAM_ERROR$5; + } + + state = strm.state; + if (state.mode === TYPE$5) { state.mode = TYPEDO$2; } /* skip check */ + + + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + _in = have; + _out = left; + ret = Z_OK$8; + + inf_leave: // goto emulation + for (;;) { + switch (state.mode) { + case HEAD$2: + if (state.wrap === 0) { + state.mode = TYPEDO$2; + break; + } + //=== NEEDBITS(16); + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ + state.check = 0/*crc32(0L, Z_NULL, 0)*/; + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$2(state.check, hbuf, 2, 0); + //===// + + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = FLAGS$2; + break; + } + state.flags = 0; /* expect zlib header */ + if (state.head) { + state.head.done = false; + } + if (!(state.wrap & 1) || /* check if zlib header allowed */ + (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { + strm.msg = 'incorrect header check'; + state.mode = BAD$5; + break; + } + if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED$8) { + strm.msg = 'unknown compression method'; + state.mode = BAD$5; + break; + } + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + len = (hold & 0x0f)/*BITS(4)*/ + 8; + if (state.wbits === 0) { + state.wbits = len; + } + else if (len > state.wbits) { + strm.msg = 'invalid window size'; + state.mode = BAD$5; + break; + } + state.dmax = 1 << len; + //Tracev((stderr, "inflate: zlib header ok\n")); + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = hold & 0x200 ? DICTID$2 : TYPE$5; + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + break; + case FLAGS$2: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.flags = hold; + if ((state.flags & 0xff) !== Z_DEFLATED$8) { + strm.msg = 'unknown compression method'; + state.mode = BAD$5; + break; + } + if (state.flags & 0xe000) { + strm.msg = 'unknown header flags set'; + state.mode = BAD$5; + break; + } + if (state.head) { + state.head.text = ((hold >> 8) & 1); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$2(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = TIME$2; + /* falls through */ + case TIME$2: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.time = hold; + } + if (state.flags & 0x0200) { + //=== CRC4(state.check, hold) + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + hbuf[2] = (hold >>> 16) & 0xff; + hbuf[3] = (hold >>> 24) & 0xff; + state.check = crc32_1$2(state.check, hbuf, 4, 0); + //=== + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = OS$2; + /* falls through */ + case OS$2: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.xflags = (hold & 0xff); + state.head.os = (hold >> 8); + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$2(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = EXLEN$2; + /* falls through */ + case EXLEN$2: + if (state.flags & 0x0400) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length = hold; + if (state.head) { + state.head.extra_len = hold; + } + if (state.flags & 0x0200) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1$2(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + else if (state.head) { + state.head.extra = null/*Z_NULL*/; + } + state.mode = EXTRA$2; + /* falls through */ + case EXTRA$2: + if (state.flags & 0x0400) { + copy = state.length; + if (copy > have) { copy = have; } + if (copy) { + if (state.head) { + len = state.head.extra_len - state.length; + if (!state.head.extra) { + // Use untyped array for more convenient processing later + state.head.extra = new Array(state.head.extra_len); + } + common$2.arraySet( + state.head.extra, + input, + next, + // extra field is limited to 65536 bytes + // - no need for additional size check + copy, + /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ + len + ); + //zmemcpy(state.head.extra + len, next, + // len + copy > state.head.extra_max ? + // state.head.extra_max - len : copy); + } + if (state.flags & 0x0200) { + state.check = crc32_1$2(state.check, input, copy, next); + } + have -= copy; + next += copy; + state.length -= copy; + } + if (state.length) { break inf_leave; } + } + state.length = 0; + state.mode = NAME$2; + /* falls through */ + case NAME$2: + if (state.flags & 0x0800) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + // TODO: 2 or 1 bytes? + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.name_max*/)) { + state.head.name += String.fromCharCode(len); + } + } while (len && copy < have); + + if (state.flags & 0x0200) { + state.check = crc32_1$2(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.name = null; + } + state.length = 0; + state.mode = COMMENT$2; + /* falls through */ + case COMMENT$2: + if (state.flags & 0x1000) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.comm_max*/)) { + state.head.comment += String.fromCharCode(len); + } + } while (len && copy < have); + if (state.flags & 0x0200) { + state.check = crc32_1$2(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.comment = null; + } + state.mode = HCRC$2; + /* falls through */ + case HCRC$2: + if (state.flags & 0x0200) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.check & 0xffff)) { + strm.msg = 'header crc mismatch'; + state.mode = BAD$5; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + if (state.head) { + state.head.hcrc = ((state.flags >> 9) & 1); + state.head.done = true; + } + strm.adler = state.check = 0; + state.mode = TYPE$5; + break; + case DICTID$2: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + strm.adler = state.check = zswap32$2(hold); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = DICT$2; + /* falls through */ + case DICT$2: + if (state.havedict === 0) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + return Z_NEED_DICT$2; + } + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = TYPE$5; + /* falls through */ + case TYPE$5: + if (flush === Z_BLOCK$5 || flush === Z_TREES$2) { break inf_leave; } + /* falls through */ + case TYPEDO$2: + if (state.last) { + //--- BYTEBITS() ---// + hold >>>= bits & 7; + bits -= bits & 7; + //---// + state.mode = CHECK$2; + break; + } + //=== NEEDBITS(3); */ + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.last = (hold & 0x01)/*BITS(1)*/; + //--- DROPBITS(1) ---// + hold >>>= 1; + bits -= 1; + //---// + + switch ((hold & 0x03)/*BITS(2)*/) { + case 0: /* stored block */ + //Tracev((stderr, "inflate: stored block%s\n", + // state.last ? " (last)" : "")); + state.mode = STORED$2; + break; + case 1: /* fixed block */ + fixedtables$2(state); + //Tracev((stderr, "inflate: fixed codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = LEN_$2; /* decode codes */ + if (flush === Z_TREES$2) { + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break inf_leave; + } + break; + case 2: /* dynamic block */ + //Tracev((stderr, "inflate: dynamic codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = TABLE$2; + break; + case 3: + strm.msg = 'invalid block type'; + state.mode = BAD$5; + } + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break; + case STORED$2: + //--- BYTEBITS() ---// /* go to byte boundary */ + hold >>>= bits & 7; + bits -= bits & 7; + //---// + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { + strm.msg = 'invalid stored block lengths'; + state.mode = BAD$5; + break; + } + state.length = hold & 0xffff; + //Tracev((stderr, "inflate: stored length %u\n", + // state.length)); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = COPY_$2; + if (flush === Z_TREES$2) { break inf_leave; } + /* falls through */ + case COPY_$2: + state.mode = COPY$2; + /* falls through */ + case COPY$2: + copy = state.length; + if (copy) { + if (copy > have) { copy = have; } + if (copy > left) { copy = left; } + if (copy === 0) { break inf_leave; } + //--- zmemcpy(put, next, copy); --- + common$2.arraySet(output, input, next, copy, put); + //---// + have -= copy; + next += copy; + left -= copy; + put += copy; + state.length -= copy; + break; + } + //Tracev((stderr, "inflate: stored end\n")); + state.mode = TYPE$5; + break; + case TABLE$2: + //=== NEEDBITS(14); */ + while (bits < 14) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + //#ifndef PKZIP_BUG_WORKAROUND + if (state.nlen > 286 || state.ndist > 30) { + strm.msg = 'too many length or distance symbols'; + state.mode = BAD$5; + break; + } + //#endif + //Tracev((stderr, "inflate: table sizes ok\n")); + state.have = 0; + state.mode = LENLENS$2; + /* falls through */ + case LENLENS$2: + while (state.have < state.ncode) { + //=== NEEDBITS(3); + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + while (state.have < 19) { + state.lens[order[state.have++]] = 0; + } + // We have separate tables & no pointers. 2 commented lines below not needed. + //state.next = state.codes; + //state.lencode = state.next; + // Switch to use dynamic table + state.lencode = state.lendyn; + state.lenbits = 7; + + opts = { bits: state.lenbits }; + ret = inftrees$2(CODES$5, state.lens, 0, 19, state.lencode, 0, state.work, opts); + state.lenbits = opts.bits; + + if (ret) { + strm.msg = 'invalid code lengths set'; + state.mode = BAD$5; + break; + } + //Tracev((stderr, "inflate: code lengths ok\n")); + state.have = 0; + state.mode = CODELENS$2; + /* falls through */ + case CODELENS$2: + while (state.have < state.nlen + state.ndist) { + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_val < 16) { + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.lens[state.have++] = here_val; + } + else { + if (here_val === 16) { + //=== NEEDBITS(here.bits + 2); + n = here_bits + 2; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + if (state.have === 0) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD$5; + break; + } + len = state.lens[state.have - 1]; + copy = 3 + (hold & 0x03);//BITS(2); + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + } + else if (here_val === 17) { + //=== NEEDBITS(here.bits + 3); + n = here_bits + 3; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 3 + (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + else { + //=== NEEDBITS(here.bits + 7); + n = here_bits + 7; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 11 + (hold & 0x7f);//BITS(7); + //--- DROPBITS(7) ---// + hold >>>= 7; + bits -= 7; + //---// + } + if (state.have + copy > state.nlen + state.ndist) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD$5; + break; + } + while (copy--) { + state.lens[state.have++] = len; + } + } + } + + /* handle error breaks in while */ + if (state.mode === BAD$5) { break; } + + /* check for end-of-block code (better have one) */ + if (state.lens[256] === 0) { + strm.msg = 'invalid code -- missing end-of-block'; + state.mode = BAD$5; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state.lenbits = 9; + + opts = { bits: state.lenbits }; + ret = inftrees$2(LENS$5, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.lenbits = opts.bits; + // state.lencode = state.next; + + if (ret) { + strm.msg = 'invalid literal/lengths set'; + state.mode = BAD$5; + break; + } + + state.distbits = 6; + //state.distcode.copy(state.codes); + // Switch to use dynamic table + state.distcode = state.distdyn; + opts = { bits: state.distbits }; + ret = inftrees$2(DISTS$5, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.distbits = opts.bits; + // state.distcode = state.next; + + if (ret) { + strm.msg = 'invalid distances set'; + state.mode = BAD$5; + break; + } + //Tracev((stderr, 'inflate: codes ok\n')); + state.mode = LEN_$2; + if (flush === Z_TREES$2) { break inf_leave; } + /* falls through */ + case LEN_$2: + state.mode = LEN$2; + /* falls through */ + case LEN$2: + if (have >= 6 && left >= 258) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + inffast$2(strm, _out); + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + if (state.mode === TYPE$5) { + state.back = -1; + } + break; + } + state.back = 0; + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if (here_bits <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_op && (here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.lencode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + state.length = here_val; + if (here_op === 0) { + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + state.mode = LIT$2; + break; + } + if (here_op & 32) { + //Tracevv((stderr, "inflate: end of block\n")); + state.back = -1; + state.mode = TYPE$5; + break; + } + if (here_op & 64) { + strm.msg = 'invalid literal/length code'; + state.mode = BAD$5; + break; + } + state.extra = here_op & 15; + state.mode = LENEXT$2; + /* falls through */ + case LENEXT$2: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //Tracevv((stderr, "inflate: length %u\n", state.length)); + state.was = state.length; + state.mode = DIST$2; + /* falls through */ + case DIST$2: + for (;;) { + here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if ((here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.distcode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + if (here_op & 64) { + strm.msg = 'invalid distance code'; + state.mode = BAD$5; + break; + } + state.offset = here_val; + state.extra = (here_op) & 15; + state.mode = DISTEXT$2; + /* falls through */ + case DISTEXT$2: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //#ifdef INFLATE_STRICT + if (state.offset > state.dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$5; + break; + } + //#endif + //Tracevv((stderr, "inflate: distance %u\n", state.offset)); + state.mode = MATCH$2; + /* falls through */ + case MATCH$2: + if (left === 0) { break inf_leave; } + copy = _out - left; + if (state.offset > copy) { /* copy from window */ + copy = state.offset - copy; + if (copy > state.whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$5; + break; + } + // (!) This block is disabled in zlib defaults, + // don't enable it for binary compatibility + //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + // Trace((stderr, "inflate.c too far\n")); + // copy -= state.whave; + // if (copy > state.length) { copy = state.length; } + // if (copy > left) { copy = left; } + // left -= copy; + // state.length -= copy; + // do { + // output[put++] = 0; + // } while (--copy); + // if (state.length === 0) { state.mode = LEN; } + // break; + //#endif + } + if (copy > state.wnext) { + copy -= state.wnext; + from = state.wsize - copy; + } + else { + from = state.wnext - copy; + } + if (copy > state.length) { copy = state.length; } + from_source = state.window; + } + else { /* copy from output */ + from_source = output; + from = put - state.offset; + copy = state.length; + } + if (copy > left) { copy = left; } + left -= copy; + state.length -= copy; + do { + output[put++] = from_source[from++]; + } while (--copy); + if (state.length === 0) { state.mode = LEN$2; } + break; + case LIT$2: + if (left === 0) { break inf_leave; } + output[put++] = state.length; + left--; + state.mode = LEN$2; + break; + case CHECK$2: + if (state.wrap) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + // Use '|' instead of '+' to make sure that result is signed + hold |= input[next++] << bits; + bits += 8; + } + //===// + _out -= left; + strm.total_out += _out; + state.total += _out; + if (_out) { + strm.adler = state.check = + /*UPDATE(state.check, put - _out, _out);*/ + (state.flags ? crc32_1$2(state.check, output, _out, put - _out) : adler32_1$2(state.check, output, _out, put - _out)); + + } + _out = left; + // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too + if ((state.flags ? hold : zswap32$2(hold)) !== state.check) { + strm.msg = 'incorrect data check'; + state.mode = BAD$5; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: check matches trailer\n")); + } + state.mode = LENGTH$2; + /* falls through */ + case LENGTH$2: + if (state.wrap && state.flags) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (hold !== (state.total & 0xffffffff)) { + strm.msg = 'incorrect length check'; + state.mode = BAD$5; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: length matches trailer\n")); + } + state.mode = DONE$2; + /* falls through */ + case DONE$2: + ret = Z_STREAM_END$8; + break inf_leave; + case BAD$5: + ret = Z_DATA_ERROR$5; + break inf_leave; + case MEM$2: + return Z_MEM_ERROR$2; + case SYNC$2: + /* falls through */ + default: + return Z_STREAM_ERROR$5; + } + } + + // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + + if (state.wsize || (_out !== strm.avail_out && state.mode < BAD$5 && + (state.mode < CHECK$2 || flush !== Z_FINISH$8))) { + if (updatewindow$2(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if (state.wrap && _out) { + strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ + (state.flags ? crc32_1$2(state.check, output, _out, strm.next_out - _out) : adler32_1$2(state.check, output, _out, strm.next_out - _out)); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + + (state.mode === TYPE$5 ? 128 : 0) + + (state.mode === LEN_$2 || state.mode === COPY_$2 ? 256 : 0); + if (((_in === 0 && _out === 0) || flush === Z_FINISH$8) && ret === Z_OK$8) { + ret = Z_BUF_ERROR$5; + } + return ret; + } + + function inflateEnd$2(strm) { + + if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { + return Z_STREAM_ERROR$5; + } + + var state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK$8; + } + + function inflateGetHeader$2(strm, head) { + var state; + + /* check state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR$5; } + state = strm.state; + if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$5; } + + /* save header structure */ + state.head = head; + head.done = false; + return Z_OK$8; + } + + function inflateSetDictionary$2(strm, dictionary) { + var dictLength = dictionary.length; + + var state; + var dictid; + var ret; + + /* check state */ + if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$5; } + state = strm.state; + + if (state.wrap !== 0 && state.mode !== DICT$2) { + return Z_STREAM_ERROR$5; + } + + /* check for correct dictionary identifier */ + if (state.mode === DICT$2) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32_1$2(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR$5; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow$2(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM$2; + return Z_MEM_ERROR$2; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK$8; + } + + var inflateReset_1$2 = inflateReset$2; + var inflateReset2_1$2 = inflateReset2$2; + var inflateResetKeep_1$2 = inflateResetKeep$2; + var inflateInit_1$2 = inflateInit$2; + var inflateInit2_1$2 = inflateInit2$2; + var inflate_2$4 = inflate$4; + var inflateEnd_1$2 = inflateEnd$2; + var inflateGetHeader_1$2 = inflateGetHeader$2; + var inflateSetDictionary_1$2 = inflateSetDictionary$2; + var inflateInfo$2 = 'pako inflate (from Nodeca project)'; + + /* Not implemented + exports.inflateCopy = inflateCopy; + exports.inflateGetDictionary = inflateGetDictionary; + exports.inflateMark = inflateMark; + exports.inflatePrime = inflatePrime; + exports.inflateSync = inflateSync; + exports.inflateSyncPoint = inflateSyncPoint; + exports.inflateUndermine = inflateUndermine; + */ + + var inflate_1$4 = { + inflateReset: inflateReset_1$2, + inflateReset2: inflateReset2_1$2, + inflateResetKeep: inflateResetKeep_1$2, + inflateInit: inflateInit_1$2, + inflateInit2: inflateInit2_1$2, + inflate: inflate_2$4, + inflateEnd: inflateEnd_1$2, + inflateGetHeader: inflateGetHeader_1$2, + inflateSetDictionary: inflateSetDictionary_1$2, + inflateInfo: inflateInfo$2 + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + var constants$2 = { + + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_TREES: 6, + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + //Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + //Z_VERSION_ERROR: -6, + + /* compression levels */ + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + + + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + + /* Possible values of the data_type field (though see inflate()) */ + Z_BINARY: 0, + Z_TEXT: 1, + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type + }; + + // (C) 1995-2013 Jean-loup Gailly and Mark Adler + // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin + // + // This software is provided 'as-is', without any express or implied + // warranty. In no event will the authors be held liable for any damages + // arising from the use of this software. + // + // Permission is granted to anyone to use this software for any purpose, + // including commercial applications, and to alter it and redistribute it + // freely, subject to the following restrictions: + // + // 1. The origin of this software must not be misrepresented; you must not + // claim that you wrote the original software. If you use this software + // in a product, an acknowledgment in the product documentation would be + // appreciated but is not required. + // 2. Altered source versions must be plainly marked as such, and must not be + // misrepresented as being the original software. + // 3. This notice may not be removed or altered from any source distribution. + + function GZheader$2() { + /* true if compressed data believed to be text */ + this.text = 0; + /* modification time */ + this.time = 0; + /* extra flags (not used when writing a gzip file) */ + this.xflags = 0; + /* operating system */ + this.os = 0; + /* pointer to extra field or Z_NULL if none */ + this.extra = null; + /* extra field length (valid if extra != Z_NULL) */ + this.extra_len = 0; // Actually, we don't need it in JS, + // but leave for few code modifications + + // + // Setup limits is not necessary because in js we should not preallocate memory + // for inflate use constant limit in 65536 bytes + // + + /* space at extra (only when reading header) */ + // this.extra_max = 0; + /* pointer to zero-terminated file name or Z_NULL */ + this.name = ''; + /* space at name (only when reading header) */ + // this.name_max = 0; + /* pointer to zero-terminated comment or Z_NULL */ + this.comment = ''; + /* space at comment (only when reading header) */ + // this.comm_max = 0; + /* true if there was or will be a header crc */ + this.hcrc = 0; + /* true when done reading gzip header (not used when writing a gzip file) */ + this.done = false; + } + + var gzheader$2 = GZheader$2; + + var toString$5 = Object.prototype.toString; + + /** + * class Inflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[inflate]] + * and [[inflateRaw]]. + **/ + + /* internal + * inflate.chunks -> Array + * + * Chunks of output data, if [[Inflate#onData]] not overridden. + **/ + + /** + * Inflate.result -> Uint8Array|Array|String + * + * Uncompressed result, generated by default [[Inflate#onData]] + * and [[Inflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Inflate#push]] with + * `Z_SYNC_FLUSH` param). + **/ + + /** + * Inflate.err -> Number + * + * Error code after inflate finished. 0 (Z_OK) on success. + * Should be checked if broken data possible. + **/ + + /** + * Inflate.msg -> String + * + * Error message, if [[Inflate.err]] != 0 + **/ + + + /** + * new Inflate(options) + * - options (Object): zlib inflate options. + * + * Creates new inflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `windowBits` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw inflate + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * By default, when no options set, autodetect deflate/gzip data format via + * wrapper header. + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * var inflate = new pako.Inflate({ level: 3}); + * + * inflate.push(chunk1, false); + * inflate.push(chunk2, true); // true -> last chunk + * + * if (inflate.err) { throw new Error(inflate.err); } + * + * console.log(inflate.result); + * ``` + **/ + function Inflate$2(options) { + if (!(this instanceof Inflate$2)) return new Inflate$2(options); + + this.options = common$2.assign({ + chunkSize: 16384, + windowBits: 0, + to: '' + }, options || {}); + + var opt = this.options; + + // Force window size for `raw` data, if not set directly, + // because we have no header for autodetect. + if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { + opt.windowBits = -opt.windowBits; + if (opt.windowBits === 0) { opt.windowBits = -15; } + } + + // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate + if ((opt.windowBits >= 0) && (opt.windowBits < 16) && + !(options && options.windowBits)) { + opt.windowBits += 32; + } + + // Gzip header has no info about windows size, we can do autodetect only + // for deflate. So, if window size not set, force it to max when gzip possible + if ((opt.windowBits > 15) && (opt.windowBits < 48)) { + // bit 3 (16) -> gzipped data + // bit 4 (32) -> autodetect gzip/deflate + if ((opt.windowBits & 15) === 0) { + opt.windowBits |= 15; + } + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream$2(); + this.strm.avail_out = 0; + + var status = inflate_1$4.inflateInit2( + this.strm, + opt.windowBits + ); + + if (status !== constants$2.Z_OK) { + throw new Error(messages$2[status]); + } + + this.header = new gzheader$2(); + + inflate_1$4.inflateGetHeader(this.strm, this.header); + + // Setup dictionary + if (opt.dictionary) { + // Convert data if needed + if (typeof opt.dictionary === 'string') { + opt.dictionary = strings$2.string2buf(opt.dictionary); + } else if (toString$5.call(opt.dictionary) === '[object ArrayBuffer]') { + opt.dictionary = new Uint8Array(opt.dictionary); + } + if (opt.raw) { //In raw mode we need to set the dictionary early + status = inflate_1$4.inflateSetDictionary(this.strm, opt.dictionary); + if (status !== constants$2.Z_OK) { + throw new Error(messages$2[status]); + } + } + } + } + + /** + * Inflate#push(data[, mode]) -> Boolean + * - data (Uint8Array|Array|ArrayBuffer|String): input data + * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with + * new output chunks. Returns `true` on success. The last data block must have + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the decompression context. + * + * On fail call [[Inflate#onEnd]] with error code and return false. + * + * We strongly recommend to use `Uint8Array` on input for best speed (output + * format is detected automatically). Also, don't skip last param and always + * use the same type in your code (boolean or number). That will improve JS speed. + * + * For regular `Array`-s make sure all elements are [0..255]. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ + Inflate$2.prototype.push = function (data, mode) { + var strm = this.strm; + var chunkSize = this.options.chunkSize; + var dictionary = this.options.dictionary; + var status, _mode; + var next_out_utf8, tail, utf8str; + + // Flag to properly process Z_BUF_ERROR on testing inflate call + // when we check that all output data was flushed. + var allowBufError = false; + + if (this.ended) { return false; } + _mode = (mode === ~~mode) ? mode : ((mode === true) ? constants$2.Z_FINISH : constants$2.Z_NO_FLUSH); + + // Convert data if needed + if (typeof data === 'string') { + // Only binary strings can be decompressed on practice + strm.input = strings$2.binstring2buf(data); + } else if (toString$5.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + do { + if (strm.avail_out === 0) { + strm.output = new common$2.Buf8(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + + status = inflate_1$4.inflate(strm, constants$2.Z_NO_FLUSH); /* no bad return value */ + + if (status === constants$2.Z_NEED_DICT && dictionary) { + status = inflate_1$4.inflateSetDictionary(this.strm, dictionary); + } + + if (status === constants$2.Z_BUF_ERROR && allowBufError === true) { + status = constants$2.Z_OK; + allowBufError = false; + } + + if (status !== constants$2.Z_STREAM_END && status !== constants$2.Z_OK) { + this.onEnd(status); + this.ended = true; + return false; + } + + if (strm.next_out) { + if (strm.avail_out === 0 || status === constants$2.Z_STREAM_END || (strm.avail_in === 0 && (_mode === constants$2.Z_FINISH || _mode === constants$2.Z_SYNC_FLUSH))) { + + if (this.options.to === 'string') { + + next_out_utf8 = strings$2.utf8border(strm.output, strm.next_out); + + tail = strm.next_out - next_out_utf8; + utf8str = strings$2.buf2string(strm.output, next_out_utf8); + + // move tail + strm.next_out = tail; + strm.avail_out = chunkSize - tail; + if (tail) { common$2.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } + + this.onData(utf8str); + + } else { + this.onData(common$2.shrinkBuf(strm.output, strm.next_out)); + } + } + } + + // When no more input data, we should check that internal inflate buffers + // are flushed. The only way to do it when avail_out = 0 - run one more + // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. + // Here we set flag to process this error properly. + // + // NOTE. Deflate does not return error in this case and does not needs such + // logic. + if (strm.avail_in === 0 && strm.avail_out === 0) { + allowBufError = true; + } + + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== constants$2.Z_STREAM_END); + + if (status === constants$2.Z_STREAM_END) { + _mode = constants$2.Z_FINISH; + } + + // Finalize on the last chunk. + if (_mode === constants$2.Z_FINISH) { + status = inflate_1$4.inflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === constants$2.Z_OK; + } + + // callback interim results if Z_SYNC_FLUSH. + if (_mode === constants$2.Z_SYNC_FLUSH) { + this.onEnd(constants$2.Z_OK); + strm.avail_out = 0; + return true; + } + + return true; + }; + + + /** + * Inflate#onData(chunk) -> Void + * - chunk (Uint8Array|Array|String): output data. Type of array depends + * on js engine support. When string output requested, each chunk + * will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ + Inflate$2.prototype.onData = function (chunk) { + this.chunks.push(chunk); + }; + + + /** + * Inflate#onEnd(status) -> Void + * - status (Number): inflate status. 0 (Z_OK) on success, + * other if not. + * + * Called either after you tell inflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ + Inflate$2.prototype.onEnd = function (status) { + // On success - join + if (status === constants$2.Z_OK) { + if (this.options.to === 'string') { + // Glue & convert here, until we teach pako to send + // utf8 aligned strings to onData + this.result = this.chunks.join(''); + } else { + this.result = common$2.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; + }; + + + /** + * inflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Decompress `data` with inflate/ungzip and `options`. Autodetect + * format via wrapper header by default. That's why we don't provide + * separate `ungzip` method. + * + * Supported options are: + * + * - windowBits + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * + * ##### Example: + * + * ```javascript + * var pako = require('pako') + * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) + * , output; + * + * try { + * output = pako.inflate(input); + * } catch (err) + * console.log(err); + * } + * ``` + **/ + function inflate$5(input, options) { + var inflator = new Inflate$2(options); + + inflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (inflator.err) { throw inflator.msg || messages$2[inflator.err]; } + + return inflator.result; + } + + + /** + * inflateRaw(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * The same as [[inflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ + function inflateRaw$2(input, options) { + options = options || {}; + options.raw = true; + return inflate$5(input, options); + } + + + /** + * ungzip(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * Just shortcut to [[inflate]], because it autodetects format + * by header.content. Done for convenience. + **/ + + + var Inflate_1$2 = Inflate$2; + var inflate_2$5 = inflate$5; + var inflateRaw_1$2 = inflateRaw$2; + var ungzip$2 = inflate$5; + + var inflate_1$5 = { + Inflate: Inflate_1$2, + inflate: inflate_2$5, + inflateRaw: inflateRaw_1$2, + ungzip: ungzip$2 + }; + + var assign$2 = common$2.assign; + + + + + + var pako$2 = {}; + + assign$2(pako$2, deflate_1$5, inflate_1$5, constants$2); + + var pako_1$2 = pako$2; + + var UPNG = {}; + + + + UPNG.toRGBA8 = function(out) + { + var w = out.width, h = out.height; + if(out.tabs.acTL==null) return [UPNG.toRGBA8.decodeImage(out.data, w, h, out).buffer]; + + var frms = []; + if(out.frames[0].data==null) out.frames[0].data = out.data; + + var len = w*h*4, img = new Uint8Array(len), empty = new Uint8Array(len), prev=new Uint8Array(len); + for(var i=0; i>3)]>>(7-((i&7)<<0)))& 1), cj=3*j; bf[qi]=p[cj]; bf[qi+1]=p[cj+1]; bf[qi+2]=p[cj+2]; bf[qi+3]=(j>2)]>>(6-((i&3)<<1)))& 3), cj=3*j; bf[qi]=p[cj]; bf[qi+1]=p[cj+1]; bf[qi+2]=p[cj+2]; bf[qi+3]=(j>1)]>>(4-((i&1)<<2)))&15), cj=3*j; bf[qi]=p[cj]; bf[qi+1]=p[cj+1]; bf[qi+2]=p[cj+2]; bf[qi+3]=(j>>3)]>>>(7 -((x&7) )))& 1), al=(gr==tr*255)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; } + else if(depth== 2) for(var x=0; x>>2)]>>>(6 -((x&3)<<1)))& 3), al=(gr==tr* 85)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; } + else if(depth== 4) for(var x=0; x>>1)]>>>(4 -((x&1)<<2)))&15), al=(gr==tr* 17)?0:255; bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr; } + else if(depth== 8) for(var x=0; x>>2<<3);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7); + var D=(d>>>3)+4,q=N[D-4]|N[D-3]<<8;if(Z)W=H.H.W(W,w+q);W.set(new R(N.buffer,N.byteOffset+D,q),w);d=D+q<<3; + w+=q;continue}if(Z)W=H.H.W(W,w+(1<<17));if(m==1){v=b.J;C=b.h;X=(1<<9)-1;u=(1<<5)-1;}if(m==2){J=A(N,d,5)+257; + h=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0;}for(var c=0; + cj)j=K;}d+=3*Q;M(b.Q,j);I(b.Q,j,b.u);v=b.w;C=b.d; + d=l(b.u,(1<>>4;if(p>>>8==0){W[w++]=p;}else if(p==256){break}else {var z=w+p-254; + if(p>264){var _=b.q[p-257];z=w+(_>>>3)+A(N,d,_&7);d+=_&7;}var $=C[e(N,d)&u];d+=$&15;var s=$>>>4,Y=b.c[s],a=(Y>>>4)+n(N,d,Y&15); + d+=Y&15;while(w>>4; + if(b<=15){A[I]=b;I++;}else {var Z=0,m=0;if(b==16){m=3+l(V,n,2);n+=2;Z=A[I-1];}else if(b==17){m=3+l(V,n,3); + n+=3;}else if(b==18){m=11+l(V,n,7);n+=7;}var J=I+m;while(I>>1; + while(An)n=M;A++;}while(A>1,I=N[l+1],e=M<<4|I,b=W-I,Z=N[l]<>>15-W;R[J]=e;Z++;}}};H.H.l=function(N,W){var R=H.H.m.r,V=15-W;for(var n=0;n>>V;}};H.H.M=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8;}; + H.H.I=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8;N[V+2]|=R>>>16;};H.H.e=function(N,W,R){return (N[W>>>3]|N[(W>>>3)+1]<<8)>>>(W&7)&(1<>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)&(1<>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)}; + H.H.i=function(N,W){return (N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16|N[(W>>>3)+3]<<24)>>>(W&7)};H.H.m=function(){var N=Uint16Array,W=Uint32Array; + return {K:new N(16),j:new N(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new N(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new W(32),J:new N(512),_:[],h:new N(32),$:[],w:new N(32768),C:[],v:[],d:new N(32768),D:[],u:new N(512),Q:[],r:new N(1<<15),s:new W(286),Y:new W(30),a:new W(19),t:new W(15e3),k:new N(1<<16),g:new N(1<<15)}}(); + (function(){var N=H.H.m,W=1<<15;for(var R=0;R>>1|(V&1431655765)<<1; + V=(V&3435973836)>>>2|(V&858993459)<<2;V=(V&4042322160)>>>4|(V&252645135)<<4;V=(V&4278255360)>>>8|(V&16711935)<<8; + N.r[R]=(V>>>16|V<<16)>>>17;}function n(A,l,M){while(l--!=0)A.push(0,M);}for(var R=0;R<32;R++){N.q[R]=N.S[R]<<3|N.T[R]; + N.c[R]=N.p[R]<<4|N.z[R];}n(N._,144,8);n(N._,255-143,9);n(N._,279-255,7);n(N._,287-279,8);H.H.n(N._,9); + H.H.A(N._,9,N.J);H.H.l(N._,9);n(N.$,32,5);H.H.n(N.$,5);H.H.A(N.$,5,N.h);H.H.l(N.$,5);n(N.Q,19,0);n(N.C,286,0); + n(N.D,30,0);n(N.v,320,0);}());return H.H.N}(); + + + UPNG.decode._readInterlace = function(data, out) + { + var w = out.width, h = out.height; + var bpp = UPNG.decode._getBPP(out), cbpp = bpp>>3, bpl = Math.ceil(w*bpp/8); + var img = new Uint8Array( h * bpl ); + var di = 0; + + var starting_row = [ 0, 0, 4, 0, 2, 0, 1 ]; + var starting_col = [ 0, 4, 0, 2, 0, 1, 0 ]; + var row_increment = [ 8, 8, 8, 4, 4, 2, 2 ]; + var col_increment = [ 8, 8, 4, 4, 2, 2, 1 ]; + + var pass=0; + while(pass<7) + { + var ri = row_increment[pass], ci = col_increment[pass]; + var sw = 0, sh = 0; + var cr = starting_row[pass]; while(cr>3]; val = (val>>(7-(cdi&7)))&1; + img[row*bpl + (col>>3)] |= (val << (7-((col&7)<<0))); + } + if(bpp==2) { + var val = data[cdi>>3]; val = (val>>(6-(cdi&7)))&3; + img[row*bpl + (col>>2)] |= (val << (6-((col&3)<<1))); + } + if(bpp==4) { + var val = data[cdi>>3]; val = (val>>(4-(cdi&7)))&15; + img[row*bpl + (col>>1)] |= (val << (4-((col&1)<<2))); + } + if(bpp>=8) { + var ii = row*bpl+col*cbpp; + for(var j=0; j>3)+j]; + } + cdi+=bpp; col+=ci; + } + y++; row += ri; + } + if(sw*sh!=0) di += sh * (1 + bpll); + pass = pass + 1; + } + return img; + }; + + UPNG.decode._getBPP = function(out) { + var noc = [1,null,3,1,2,null,4][out.ctype]; + return noc * out.depth; + }; + + UPNG.decode._filterZero = function(data, out, off, w, h) + { + var bpp = UPNG.decode._getBPP(out), bpl = Math.ceil(w*bpp/8), paeth = UPNG.decode._paeth; + bpp = Math.ceil(bpp/8); + + var i=0, di=1, type=data[off], x=0; + + if(type>1) data[off]=[0,0,1][type-2]; + if(type==3) for(x=bpp; x>>1) )&255; + + for(var y=0; y>>1)); + for(; x>>1) ); } + else { for(; x>8)&255; buff[p+1] = n&255; }, + readUint : function(buff,p) { return (buff[p]*(256*256*256)) + ((buff[p+1]<<16) | (buff[p+2]<< 8) | buff[p+3]); }, + writeUint : function(buff,p,n){ buff[p]=(n>>24)&255; buff[p+1]=(n>>16)&255; buff[p+2]=(n>>8)&255; buff[p+3]=n&255; }, + readASCII : function(buff,p,l){ var s = ""; for(var i=0; i=0 && yoff>=0) { si = (y*sw+x)<<2; ti = (( yoff+y)*tw+xoff+x)<<2; } + else { si = ((-yoff+y)*sw-xoff+x)<<2; ti = (y*tw+x)<<2; } + + if (mode==0) { tb[ti] = sb[si]; tb[ti+1] = sb[si+1]; tb[ti+2] = sb[si+2]; tb[ti+3] = sb[si+3]; } + else if(mode==1) { + var fa = sb[si+3]*(1/255), fr=sb[si]*fa, fg=sb[si+1]*fa, fb=sb[si+2]*fa; + var ba = tb[ti+3]*(1/255), br=tb[ti]*ba, bg=tb[ti+1]*ba, bb=tb[ti+2]*ba; + + var ifa=1-fa, oa = fa+ba*ifa, ioa = (oa==0?0:1/oa); + tb[ti+3] = 255*oa; + tb[ti+0] = (fr+br*ifa)*ioa; + tb[ti+1] = (fg+bg*ifa)*ioa; + tb[ti+2] = (fb+bb*ifa)*ioa; + } + else if(mode==2){ // copy only differences, otherwise zero + var fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2]; + var ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2]; + if(fa==ba && fr==br && fg==bg && fb==bb) { tb[ti]=0; tb[ti+1]=0; tb[ti+2]=0; tb[ti+3]=0; } + else { tb[ti]=fr; tb[ti+1]=fg; tb[ti+2]=fb; tb[ti+3]=fa; } + } + else if(mode==3){ // check if can be blended + var fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2]; + var ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2]; + if(fa==ba && fr==br && fg==bg && fb==bb) continue; + //if(fa!=255 && ba!=0) return false; + if(fa<220 && ba>20) return false; + } + } + return true; + }; + + + + + UPNG.encode = function(bufs, w, h, ps, dels, tabs, forbidPlte) + { + if(ps==null) ps=0; + if(forbidPlte==null) forbidPlte = false; + + var nimg = UPNG.encode.compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte]); + UPNG.encode.compressPNG(nimg, -1); + + return UPNG.encode._main(nimg, w, h, dels, tabs); + }; + + UPNG.encodeLL = function(bufs, w, h, cc, ac, depth, dels, tabs) { + var nimg = { ctype: 0 + (cc==1 ? 0 : 2) + (ac==0 ? 0 : 4), depth: depth, frames: [] }; + var bipp = (cc+ac)*depth, bipl = bipp * w; + for(var i=0; i1, pltAlpha = false; + + var leng = 8 + (16+5+4) /*+ (9+4)*/ + (anim ? 20 : 0); + if(tabs["sRGB"]!=null) leng += 8+1+4; + if(tabs["pHYs"]!=null) leng += 8+9+4; + if(nimg.ctype==3) { + var dl = nimg.plte.length; + for(var i=0; i>>24)!=255) pltAlpha = true; + leng += (8 + dl*3 + 4) + (pltAlpha ? (8 + dl*1 + 4) : 0); + } + for(var j=0; j>>8)&255, b=(c>>>16)&255; + data[offset+ti+0]=r; data[offset+ti+1]=g; data[offset+ti+2]=b; + } + offset+=dl*3; + wUi(data,offset,crc(data,offset-dl*3-4,dl*3+4)); offset+=4; // crc + + if(pltAlpha) { + wUi(data,offset, dl); offset+=4; + wAs(data,offset,"tRNS"); offset+=4; + for(var i=0; i>>24)&255; + offset+=dl; + wUi(data,offset,crc(data,offset-dl-4,dl+4)); offset+=4; // crc + } + } + + var fi = 0; + for(var j=0; j>2, bln>>2)); + for(var j=0; jnw && c==img32[i-nw]) ind[i]=ind[i-nw]; + else { + var cmc = cmap[c]; + if(cmc==null) { cmap[c]=cmc=plte.length; plte.push(c); if(plte.length>=300) break; } + ind[i]=cmc; + } + } + } + //console.log("make palette", Date.now()-time); time = Date.now(); + } + + var cc=plte.length; //console.log("colors:",cc); + if(cc<=256 && forbidPlte==false) { + if(cc<= 2) depth=1; else if(cc<= 4) depth=2; else if(cc<=16) depth=4; else depth=8; + depth = Math.max(depth, minBits); + } + + for(var j=0; j>1)] |= (inj[ii+x]<<(4-(x&1)*4)); + else if(depth==2) for(var x=0; x>2)] |= (inj[ii+x]<<(6-(x&3)*2)); + else if(depth==1) for(var x=0; x>3)] |= (inj[ii+x]<<(7-(x&7)*1)); + } + cimg=nimg; ctype=3; bpp=1; + } + else if(gotAlpha==false && frms.length==1) { // some next "reduced" frames may contain alpha for blending + var nimg = new Uint8Array(nw*nh*3), area=nw*nh; + for(var i=0; i palette indices", Date.now()-time); time = Date.now(); + + return {ctype:ctype, depth:depth, plte:plte, frames:frms }; + }; + UPNG.encode.framize = function(bufs,w,h,alwaysBlend,evenCrd,forbidPrev) { + /* DISPOSE + - 0 : no change + - 1 : clear to transparent + - 2 : retstore to content before rendering (previous frame disposed) + BLEND + - 0 : replace + - 1 : blend + */ + var frms = []; + for(var j=0; jmax) max=x; + if(ymay) may=y; + } + } + if(max==-1) mix=miy=max=may=0; + if(evenCrd) { if((mix&1)==1)mix--; if((miy&1)==1)miy--; } + var sarea = (max-mix+1)*(may-miy+1); + if(sareamax) max=cx; + if(cymay) may=cy; + } + } + if(max==-1) mix=miy=max=may=0; + if(evenCrd) { if((mix&1)==1)mix--; if((miy&1)==1)miy--; } + r = {x:mix, y:miy, width:max-mix+1, height:may-miy+1}; + + var fr = frms[i]; fr.rect = r; fr.blend = 1; fr.img = new Uint8Array(r.width*r.height*4); + if(frms[i-1].dispose==0) { + UPNG._copyTile(pimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0); + UPNG.encode._prepareDiff(cimg,w,h,fr.img,r); + //UPNG._copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 2); + } + else + UPNG._copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0); + }; + UPNG.encode._prepareDiff = function(cimg, w,h, nimg, rec) { + UPNG._copyTile(cimg,w,h, nimg,rec.width,rec.height, -rec.x,-rec.y, 2); + /* + var n32 = new Uint32Array(nimg.buffer); + var og = new Uint8Array(rec.width*rec.height*4), o32 = new Uint32Array(og.buffer); + UPNG._copyTile(cimg,w,h, og,rec.width,rec.height, -rec.x,-rec.y, 0); + for(var i=4; i>>2]==o32[(i>>>2)-1]) { + n32[i>>>2]=o32[i>>>2]; + //var j = i, c=p32[(i>>>2)-1]; + //while(p32[j>>>2]==c) { n32[j>>>2]=c; j+=4; } + } + } + for(var i=nimg.length-8; i>0; i-=4) { + if(nimg[i+7]!=0 && nimg[i+3]==0 && o32[i>>>2]==o32[(i>>>2)+1]) { + n32[i>>>2]=o32[i>>>2]; + //var j = i, c=p32[(i>>>2)-1]; + //while(p32[j>>>2]==c) { n32[j>>>2]=c; j+=4; } + } + }*/ + }; + + UPNG.encode._filterZero = function(img,h,bpp,bpl,data, filter, levelZero) + { + var fls = [], ftry=[0,1,2,3,4]; + if (filter!=-1) ftry=[filter]; + else if(h*bpl>500000 || bpp==1) ftry=[0]; + var opts; if(levelZero) opts={level:0}; + + var CMPR = (levelZero && UZIP!=null) ? UZIP : pako_1$2; + + for(var i=0; i>1) +256)&255; + if(type==4) for(var x=bpp; x>1))&255; + for(var x=bpp; x>1))&255; } + if(type==4) { for(var x= 0; x>> 1); + else c = c >>> 1; + } + tab[n] = c; } + return tab; })(), + update : function(c, buf, off, len) { + for (var i=0; i>> 8); + return c; + }, + crc : function(b,o,l) { return UPNG.crc.update(0xffffffff,b,o,l) ^ 0xffffffff; } + }; + + + UPNG.quantize = function(abuf, ps) + { + var oimg = new Uint8Array(abuf), nimg = oimg.slice(0), nimg32 = new Uint32Array(nimg.buffer); + + var KD = UPNG.quantize.getKDtree(nimg, ps); + var root = KD[0], leafs = KD[1]; + + var planeDst = UPNG.quantize.planeDst; + var sb = oimg, tb = nimg32, len=sb.length; + + var inds = new Uint8Array(oimg.length>>2); + for(var i=0; i>2] = nd.ind; + tb[i>>2] = nd.est.rgba; + } + return { abuf:nimg.buffer, inds:inds, plte:leafs }; + }; + + UPNG.quantize.getKDtree = function(nimg, ps, err) { + if(err==null) err = 0.0001; + var nimg32 = new Uint32Array(nimg.buffer); + + var root = {i0:0, i1:nimg.length, bst:null, est:null, tdst:0, left:null, right:null }; // basic statistic, extra statistic + root.bst = UPNG.quantize.stats( nimg,root.i0, root.i1 ); root.est = UPNG.quantize.estats( root.bst ); + var leafs = [root]; + + while(leafs.length maxL) { maxL=leafs[i].est.L; mi=i; } + if(maxL=s0 || node.i1<=s0); + //console.log(maxL, leafs.length, mi); + if(s0wrong) { node.est.L=0; continue; } + + + var ln = {i0:node.i0, i1:s0, bst:null, est:null, tdst:0, left:null, right:null }; ln.bst = UPNG.quantize.stats( nimg, ln.i0, ln.i1 ); + ln.est = UPNG.quantize.estats( ln.bst ); + var rn = {i0:s0, i1:node.i1, bst:null, est:null, tdst:0, left:null, right:null }; rn.bst = {R:[], m:[], N:node.bst.N-ln.bst.N}; + for(var i=0; i<16; i++) rn.bst.R[i] = node.bst.R[i]-ln.bst.R[i]; + for(var i=0; i< 4; i++) rn.bst.m[i] = node.bst.m[i]-ln.bst.m[i]; + rn.est = UPNG.quantize.estats( rn.bst ); + + node.left = ln; node.right = rn; + leafs[mi]=ln; leafs.push(rn); + } + leafs.sort(function(a,b) { return b.bst.N-a.bst.N; }); + for(var i=0; i0) { node0=nd.right; node1=nd.left; } + + var ln = UPNG.quantize.getNearest(node0, r,g,b,a); + if(ln.tdst<=planeDst*planeDst) return ln; + var rn = UPNG.quantize.getNearest(node1, r,g,b,a); + return rn.tdst eMq) i1-=4; + if(i0>=i1) break; + + var t = nimg32[i0>>2]; nimg32[i0>>2] = nimg32[i1>>2]; nimg32[i1>>2]=t; + + i0+=4; i1-=4; + } + while(vecDot(nimg, i0, e)>eMq) i0-=4; + return i0+4; + }; + UPNG.quantize.vecDot = function(nimg, i, e) + { + return nimg[i]*e[0] + nimg[i+1]*e[1] + nimg[i+2]*e[2] + nimg[i+3]*e[3]; + }; + UPNG.quantize.stats = function(nimg, i0, i1){ + var R = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]; + var m = [0,0,0,0]; + var N = (i1-i0)>>2; + for(var i=i0; i>>0) }; + }; + UPNG.M4 = { + multVec : function(m,v) { + return [ + m[ 0]*v[0] + m[ 1]*v[1] + m[ 2]*v[2] + m[ 3]*v[3], + m[ 4]*v[0] + m[ 5]*v[1] + m[ 6]*v[2] + m[ 7]*v[3], + m[ 8]*v[0] + m[ 9]*v[1] + m[10]*v[2] + m[11]*v[3], + m[12]*v[0] + m[13]*v[1] + m[14]*v[2] + m[15]*v[3] + ]; + }, + dot : function(x,y) { return x[0]*y[0]+x[1]*y[1]+x[2]*y[2]+x[3]*y[3]; }, + sml : function(a,y) { return [a*y[0],a*y[1],a*y[2],a*y[3]]; } + }; + + UPNG.encode.concatRGBA = function(bufs) { + var tlen = 0; + for(var i=0; i 1) + throw new Error("Animated PNGs are not supported"); + var frame = new Uint8Array(frames[0]); + var _a = splitAlphaChannel(frame), rgbChannel = _a.rgbChannel, alphaChannel = _a.alphaChannel; + this.rgbChannel = rgbChannel; + var hasAlphaValues = alphaChannel.some(function (a) { return a < 255; }); + if (hasAlphaValues) + this.alphaChannel = alphaChannel; + this.type = getImageType(upng.ctype); + this.width = upng.width; + this.height = upng.height; + this.bitsPerComponent = 8; + } + PNG.load = function (pngData) { return new PNG(pngData); }; + return PNG; + }()); + + /** + * A note of thanks to the developers of https://github.com/foliojs/pdfkit, as + * this class borrows from: + * https://github.com/devongovett/pdfkit/blob/e71edab0dd4657b5a767804ba86c94c58d01fbca/lib/image/png.coffee + */ + var PngEmbedder = /** @class */ (function () { + function PngEmbedder(png) { + this.image = png; + this.bitsPerComponent = png.bitsPerComponent; + this.width = png.width; + this.height = png.height; + this.colorSpace = 'DeviceRGB'; + } + PngEmbedder.for = function (imageData) { + return __awaiter(this, void 0, void 0, function () { + var png; + return __generator(this, function (_a) { + png = PNG.load(imageData); + return [2 /*return*/, new PngEmbedder(png)]; + }); + }); + }; + PngEmbedder.prototype.embedIntoContext = function (context, ref) { + return __awaiter(this, void 0, void 0, function () { + var SMask, xObject; + return __generator(this, function (_a) { + SMask = this.embedAlphaChannel(context); + xObject = context.flateStream(this.image.rgbChannel, { + Type: 'XObject', + Subtype: 'Image', + BitsPerComponent: this.image.bitsPerComponent, + Width: this.image.width, + Height: this.image.height, + ColorSpace: this.colorSpace, + SMask: SMask, + }); + if (ref) { + context.assign(ref, xObject); + return [2 /*return*/, ref]; + } + else { + return [2 /*return*/, context.register(xObject)]; + } + }); + }); + }; + PngEmbedder.prototype.embedAlphaChannel = function (context) { + if (!this.image.alphaChannel) + return undefined; + var xObject = context.flateStream(this.image.alphaChannel, { + Type: 'XObject', + Subtype: 'Image', + Height: this.image.height, + Width: this.image.width, + BitsPerComponent: this.image.bitsPerComponent, + ColorSpace: 'DeviceGray', + Decode: [0, 1], + }); + return context.register(xObject); + }; + return PngEmbedder; + }()); + + /* + * Copyright 2012 Mozilla Foundation + * + * The Stream class contained in this file is a TypeScript port of the + * JavaScript Stream class in Mozilla's pdf.js project, made available + * under the Apache 2.0 open source license. + */ + var Stream = /** @class */ (function () { + function Stream(buffer, start, length) { + this.bytes = buffer; + this.start = start || 0; + this.pos = this.start; + this.end = !!start && !!length ? start + length : this.bytes.length; + } + Object.defineProperty(Stream.prototype, "length", { + get: function () { + return this.end - this.start; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Stream.prototype, "isEmpty", { + get: function () { + return this.length === 0; + }, + enumerable: false, + configurable: true + }); + Stream.prototype.getByte = function () { + if (this.pos >= this.end) { + return -1; + } + return this.bytes[this.pos++]; + }; + Stream.prototype.getUint16 = function () { + var b0 = this.getByte(); + var b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + }; + Stream.prototype.getInt32 = function () { + var b0 = this.getByte(); + var b1 = this.getByte(); + var b2 = this.getByte(); + var b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + }; + // Returns subarray of original buffer, should only be read. + Stream.prototype.getBytes = function (length, forceClamped) { + if (forceClamped === void 0) { forceClamped = false; } + var bytes = this.bytes; + var pos = this.pos; + var strEnd = this.end; + if (!length) { + var subarray = bytes.subarray(pos, strEnd); + // `this.bytes` is always a `Uint8Array` here. + return forceClamped ? new Uint8ClampedArray(subarray) : subarray; + } + else { + var end = pos + length; + if (end > strEnd) { + end = strEnd; + } + this.pos = end; + var subarray = bytes.subarray(pos, end); + // `this.bytes` is always a `Uint8Array` here. + return forceClamped ? new Uint8ClampedArray(subarray) : subarray; + } + }; + Stream.prototype.peekByte = function () { + var peekedByte = this.getByte(); + this.pos--; + return peekedByte; + }; + Stream.prototype.peekBytes = function (length, forceClamped) { + if (forceClamped === void 0) { forceClamped = false; } + var bytes = this.getBytes(length, forceClamped); + this.pos -= bytes.length; + return bytes; + }; + Stream.prototype.skip = function (n) { + if (!n) { + n = 1; + } + this.pos += n; + }; + Stream.prototype.reset = function () { + this.pos = this.start; + }; + Stream.prototype.moveStart = function () { + this.start = this.pos; + }; + Stream.prototype.makeSubStream = function (start, length) { + return new Stream(this.bytes, start, length); + }; + Stream.prototype.decode = function () { + return this.bytes; + }; + return Stream; + }()); + + /* + * Copyright 2012 Mozilla Foundation + * + * The DecodeStream class contained in this file is a TypeScript port of the + * JavaScript DecodeStream class in Mozilla's pdf.js project, made available + * under the Apache 2.0 open source license. + */ + // Lots of DecodeStreams are created whose buffers are never used. For these + // we share a single empty buffer. This is (a) space-efficient and (b) avoids + // having special cases that would be required if we used |null| for an empty + // buffer. + var emptyBuffer = new Uint8Array(0); + /** + * Super class for the decoding streams + */ + var DecodeStream = /** @class */ (function () { + function DecodeStream(maybeMinBufferLength) { + this.pos = 0; + this.bufferLength = 0; + this.eof = false; + this.buffer = emptyBuffer; + this.minBufferLength = 512; + if (maybeMinBufferLength) { + // Compute the first power of two that is as big as maybeMinBufferLength. + while (this.minBufferLength < maybeMinBufferLength) { + this.minBufferLength *= 2; + } + } + } + Object.defineProperty(DecodeStream.prototype, "isEmpty", { + get: function () { + while (!this.eof && this.bufferLength === 0) { + this.readBlock(); + } + return this.bufferLength === 0; + }, + enumerable: false, + configurable: true + }); + DecodeStream.prototype.getByte = function () { + var pos = this.pos; + while (this.bufferLength <= pos) { + if (this.eof) { + return -1; + } + this.readBlock(); + } + return this.buffer[this.pos++]; + }; + DecodeStream.prototype.getUint16 = function () { + var b0 = this.getByte(); + var b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + }; + DecodeStream.prototype.getInt32 = function () { + var b0 = this.getByte(); + var b1 = this.getByte(); + var b2 = this.getByte(); + var b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + }; + DecodeStream.prototype.getBytes = function (length, forceClamped) { + if (forceClamped === void 0) { forceClamped = false; } + var end; + var pos = this.pos; + if (length) { + this.ensureBuffer(pos + length); + end = pos + length; + while (!this.eof && this.bufferLength < end) { + this.readBlock(); + } + var bufEnd = this.bufferLength; + if (end > bufEnd) { + end = bufEnd; + } + } + else { + while (!this.eof) { + this.readBlock(); + } + end = this.bufferLength; + } + this.pos = end; + var subarray = this.buffer.subarray(pos, end); + // `this.buffer` is either a `Uint8Array` or `Uint8ClampedArray` here. + return forceClamped && !(subarray instanceof Uint8ClampedArray) + ? new Uint8ClampedArray(subarray) + : subarray; + }; + DecodeStream.prototype.peekByte = function () { + var peekedByte = this.getByte(); + this.pos--; + return peekedByte; + }; + DecodeStream.prototype.peekBytes = function (length, forceClamped) { + if (forceClamped === void 0) { forceClamped = false; } + var bytes = this.getBytes(length, forceClamped); + this.pos -= bytes.length; + return bytes; + }; + DecodeStream.prototype.skip = function (n) { + if (!n) { + n = 1; + } + this.pos += n; + }; + DecodeStream.prototype.reset = function () { + this.pos = 0; + }; + DecodeStream.prototype.makeSubStream = function (start, length /* dict */) { + var end = start + length; + while (this.bufferLength <= end && !this.eof) { + this.readBlock(); + } + return new Stream(this.buffer, start, length /* dict */); + }; + DecodeStream.prototype.decode = function () { + while (!this.eof) + this.readBlock(); + return this.buffer.subarray(0, this.bufferLength); + }; + DecodeStream.prototype.readBlock = function () { + throw new MethodNotImplementedError(this.constructor.name, 'readBlock'); + }; + DecodeStream.prototype.ensureBuffer = function (requested) { + var buffer = this.buffer; + if (requested <= buffer.byteLength) { + return buffer; + } + var size = this.minBufferLength; + while (size < requested) { + size *= 2; + } + var buffer2 = new Uint8Array(size); + buffer2.set(buffer); + return (this.buffer = buffer2); + }; + return DecodeStream; + }()); + + /* + * Copyright 2012 Mozilla Foundation + * + * The Ascii85Stream class contained in this file is a TypeScript port of the + * JavaScript Ascii85Stream class in Mozilla's pdf.js project, made available + * under the Apache 2.0 open source license. + */ + var isSpace = function (ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; + }; + var Ascii85Stream = /** @class */ (function (_super) { + __extends(Ascii85Stream, _super); + function Ascii85Stream(stream, maybeLength) { + var _this = _super.call(this, maybeLength) || this; + _this.stream = stream; + _this.input = new Uint8Array(5); + // Most streams increase in size when decoded, but Ascii85 streams + // typically shrink by ~20%. + if (maybeLength) { + maybeLength = 0.8 * maybeLength; + } + return _this; + } + Ascii85Stream.prototype.readBlock = function () { + var TILDA_CHAR = 0x7e; // '~' + var Z_LOWER_CHAR = 0x7a; // 'z' + var EOF = -1; + var stream = this.stream; + var c = stream.getByte(); + while (isSpace(c)) { + c = stream.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; + return; + } + var bufferLength = this.bufferLength; + var buffer; + var i; + // special code for z + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + for (i = 0; i < 4; ++i) { + buffer[bufferLength + i] = 0; + } + this.bufferLength += 4; + } + else { + var input = this.input; + input[0] = c; + for (i = 1; i < 5; ++i) { + c = stream.getByte(); + while (isSpace(c)) { + c = stream.getByte(); + } + input[i] = c; + if (c === EOF || c === TILDA_CHAR) { + break; + } + } + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + // partial ending; + if (i < 5) { + for (; i < 5; ++i) { + input[i] = 0x21 + 84; + } + this.eof = true; + } + var t = 0; + for (i = 0; i < 5; ++i) { + t = t * 85 + (input[i] - 0x21); + } + for (i = 3; i >= 0; --i) { + buffer[bufferLength + i] = t & 0xff; + t >>= 8; + } + } + }; + return Ascii85Stream; + }(DecodeStream)); + + /* + * Copyright 2012 Mozilla Foundation + * + * The AsciiHexStream class contained in this file is a TypeScript port of the + * JavaScript AsciiHexStream class in Mozilla's pdf.js project, made available + * under the Apache 2.0 open source license. + */ + var AsciiHexStream = /** @class */ (function (_super) { + __extends(AsciiHexStream, _super); + function AsciiHexStream(stream, maybeLength) { + var _this = _super.call(this, maybeLength) || this; + _this.stream = stream; + _this.firstDigit = -1; + // Most streams increase in size when decoded, but AsciiHex streams shrink + // by 50%. + if (maybeLength) { + maybeLength = 0.5 * maybeLength; + } + return _this; + } + AsciiHexStream.prototype.readBlock = function () { + var UPSTREAM_BLOCK_SIZE = 8000; + var bytes = this.stream.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + var maxDecodeLength = (bytes.length + 1) >> 1; + var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + var bufferLength = this.bufferLength; + var firstDigit = this.firstDigit; + for (var i = 0, ii = bytes.length; i < ii; i++) { + var ch = bytes[i]; + var digit = void 0; + if (ch >= 0x30 && ch <= 0x39) { + // '0'-'9' + digit = ch & 0x0f; + } + else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { + // 'A'-'Z', 'a'-'z' + digit = (ch & 0x0f) + 9; + } + else if (ch === 0x3e) { + // '>' + this.eof = true; + break; + } + else { + // probably whitespace + continue; // ignoring + } + if (firstDigit < 0) { + firstDigit = digit; + } + else { + buffer[bufferLength++] = (firstDigit << 4) | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + // incomplete byte + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; + }; + return AsciiHexStream; + }(DecodeStream)); + + /* + * Copyright 1996-2003 Glyph & Cog, LLC + * + * The flate stream implementation contained in this file is a JavaScript port + * of XPDF's implementation, made available under the Apache 2.0 open source + * license. + */ + // prettier-ignore + var codeLenCodeMap = new Int32Array([ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + ]); + // prettier-ignore + var lengthDecode = new Int32Array([ + 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, + 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, + 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, + 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102 + ]); + // prettier-ignore + var distDecode = new Int32Array([ + 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, + 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, + 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, + 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001 + ]); + // prettier-ignore + var fixedLitCodeTab = [new Int32Array([ + 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, + 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, + 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, + 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, + 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, + 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, + 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, + 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, + 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, + 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, + 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, + 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, + 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, + 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, + 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, + 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, + 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, + 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, + 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, + 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, + 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, + 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, + 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, + 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, + 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, + 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, + 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, + 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, + 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, + 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, + 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, + 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, + 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, + 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, + 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, + 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, + 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, + 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, + 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, + 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, + 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, + 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, + 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, + 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, + 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, + 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, + 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, + 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, + 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, + 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, + 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, + 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, + 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, + 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, + 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, + 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, + 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, + 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, + 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, + 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, + 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, + 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, + 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, + 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff + ]), 9]; + // prettier-ignore + var fixedDistCodeTab = [new Int32Array([ + 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, + 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, + 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, + 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000 + ]), 5]; + var FlateStream = /** @class */ (function (_super) { + __extends(FlateStream, _super); + function FlateStream(stream, maybeLength) { + var _this = _super.call(this, maybeLength) || this; + _this.stream = stream; + var cmf = stream.getByte(); + var flg = stream.getByte(); + if (cmf === -1 || flg === -1) { + throw new Error("Invalid header in flate stream: " + cmf + ", " + flg); + } + if ((cmf & 0x0f) !== 0x08) { + throw new Error("Unknown compression method in flate stream: " + cmf + ", " + flg); + } + if (((cmf << 8) + flg) % 31 !== 0) { + throw new Error("Bad FCHECK in flate stream: " + cmf + ", " + flg); + } + if (flg & 0x20) { + throw new Error("FDICT bit set in flate stream: " + cmf + ", " + flg); + } + _this.codeSize = 0; + _this.codeBuf = 0; + return _this; + } + FlateStream.prototype.readBlock = function () { + var buffer; + var len; + var str = this.stream; + // read block header + var hdr = this.getBits(3); + if (hdr & 1) { + this.eof = true; + } + hdr >>= 1; + if (hdr === 0) { + // uncompressed block + var b = void 0; + if ((b = str.getByte()) === -1) { + throw new Error('Bad block header in flate stream'); + } + var blockLen = b; + if ((b = str.getByte()) === -1) { + throw new Error('Bad block header in flate stream'); + } + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + throw new Error('Bad block header in flate stream'); + } + var check = b; + if ((b = str.getByte()) === -1) { + throw new Error('Bad block header in flate stream'); + } + check |= b << 8; + if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { + // Ignoring error for bad "empty" block (see issue 1277) + throw new Error('Bad uncompressed block length in flate stream'); + } + this.codeBuf = 0; + this.codeSize = 0; + var bufferLength = this.bufferLength; + buffer = this.ensureBuffer(bufferLength + blockLen); + var end = bufferLength + blockLen; + this.bufferLength = end; + if (blockLen === 0) { + if (str.peekByte() === -1) { + this.eof = true; + } + } + else { + for (var n = bufferLength; n < end; ++n) { + if ((b = str.getByte()) === -1) { + this.eof = true; + break; + } + buffer[n] = b; + } + } + return; + } + var litCodeTable; + var distCodeTable; + if (hdr === 1) { + // compressed block, fixed codes + litCodeTable = fixedLitCodeTab; + distCodeTable = fixedDistCodeTab; + } + else if (hdr === 2) { + // compressed block, dynamic codes + var numLitCodes = this.getBits(5) + 257; + var numDistCodes = this.getBits(5) + 1; + var numCodeLenCodes = this.getBits(4) + 4; + // build the code lengths code table + var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); + var i = void 0; + for (i = 0; i < numCodeLenCodes; ++i) { + codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); + } + var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); + // build the literal and distance code tables + len = 0; + i = 0; + var codes = numLitCodes + numDistCodes; + var codeLengths = new Uint8Array(codes); + var bitsLength = void 0; + var bitsOffset = void 0; + var what = void 0; + while (i < codes) { + var code = this.getCode(codeLenCodeTab); + if (code === 16) { + bitsLength = 2; + bitsOffset = 3; + what = len; + } + else if (code === 17) { + bitsLength = 3; + bitsOffset = 3; + what = len = 0; + } + else if (code === 18) { + bitsLength = 7; + bitsOffset = 11; + what = len = 0; + } + else { + codeLengths[i++] = len = code; + continue; + } + var repeatLength = this.getBits(bitsLength) + bitsOffset; + while (repeatLength-- > 0) { + codeLengths[i++] = what; + } + } + litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); + distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); + } + else { + throw new Error('Unknown block type in flate stream'); + } + buffer = this.buffer; + var limit = buffer ? buffer.length : 0; + var pos = this.bufferLength; + while (true) { + var code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; + continue; + } + if (code1 === 256) { + this.bufferLength = pos; + return; + } + code1 -= 257; + code1 = lengthDecode[code1]; + var code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + var dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; + } + for (var k = 0; k < len; ++k, ++pos) { + buffer[pos] = buffer[pos - dist]; + } + } + }; + FlateStream.prototype.getBits = function (bits) { + var str = this.stream; + var codeSize = this.codeSize; + var codeBuf = this.codeBuf; + var b; + while (codeSize < bits) { + if ((b = str.getByte()) === -1) { + throw new Error('Bad encoding in flate stream'); + } + codeBuf |= b << codeSize; + codeSize += 8; + } + b = codeBuf & ((1 << bits) - 1); + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; + }; + FlateStream.prototype.getCode = function (table) { + var str = this.stream; + var codes = table[0]; + var maxLen = table[1]; + var codeSize = this.codeSize; + var codeBuf = this.codeBuf; + var b; + while (codeSize < maxLen) { + if ((b = str.getByte()) === -1) { + // premature end of stream. code might however still be valid. + // codeSize < codeLen check below guards against incomplete codeVal. + break; + } + codeBuf |= b << codeSize; + codeSize += 8; + } + var code = codes[codeBuf & ((1 << maxLen) - 1)]; + if (typeof codes === 'number') { + console.log('FLATE:', code); + } + var codeLen = code >> 16; + var codeVal = code & 0xffff; + if (codeLen < 1 || codeSize < codeLen) { + throw new Error('Bad encoding in flate stream'); + } + this.codeBuf = codeBuf >> codeLen; + this.codeSize = codeSize - codeLen; + return codeVal; + }; + FlateStream.prototype.generateHuffmanTable = function (lengths) { + var n = lengths.length; + // find max code length + var maxLen = 0; + var i; + for (i = 0; i < n; ++i) { + if (lengths[i] > maxLen) { + maxLen = lengths[i]; + } + } + // build the table + var size = 1 << maxLen; + var codes = new Int32Array(size); + for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { + for (var val = 0; val < n; ++val) { + if (lengths[val] === len) { + // bit-reverse the code + var code2 = 0; + var t = code; + for (i = 0; i < len; ++i) { + code2 = (code2 << 1) | (t & 1); + t >>= 1; + } + // fill the table entries + for (i = code2; i < size; i += skip) { + codes[i] = (len << 16) | val; + } + ++code; + } + } + } + return [codes, maxLen]; + }; + return FlateStream; + }(DecodeStream)); + + /* + * Copyright 2012 Mozilla Foundation + * + * The LZWStream class contained in this file is a TypeScript port of the + * JavaScript LZWStream class in Mozilla's pdf.js project, made available + * under the Apache 2.0 open source license. + */ + var LZWStream = /** @class */ (function (_super) { + __extends(LZWStream, _super); + function LZWStream(stream, maybeLength, earlyChange) { + var _this = _super.call(this, maybeLength) || this; + _this.stream = stream; + _this.cachedData = 0; + _this.bitsCached = 0; + var maxLzwDictionarySize = 4096; + var lzwState = { + earlyChange: earlyChange, + codeLength: 9, + nextCode: 258, + dictionaryValues: new Uint8Array(maxLzwDictionarySize), + dictionaryLengths: new Uint16Array(maxLzwDictionarySize), + dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), + currentSequence: new Uint8Array(maxLzwDictionarySize), + currentSequenceLength: 0, + }; + for (var i = 0; i < 256; ++i) { + lzwState.dictionaryValues[i] = i; + lzwState.dictionaryLengths[i] = 1; + } + _this.lzwState = lzwState; + return _this; + } + LZWStream.prototype.readBlock = function () { + var blockSize = 512; + var estimatedDecodedSize = blockSize * 2; + var decodedSizeDelta = blockSize; + var i; + var j; + var q; + var lzwState = this.lzwState; + if (!lzwState) { + return; // eof was found + } + var earlyChange = lzwState.earlyChange; + var nextCode = lzwState.nextCode; + var dictionaryValues = lzwState.dictionaryValues; + var dictionaryLengths = lzwState.dictionaryLengths; + var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; + var codeLength = lzwState.codeLength; + var prevCode = lzwState.prevCode; + var currentSequence = lzwState.currentSequence; + var currentSequenceLength = lzwState.currentSequenceLength; + var decodedLength = 0; + var currentBufferLength = this.bufferLength; + var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + for (i = 0; i < blockSize; i++) { + var code = this.readBits(codeLength); + var hasPrev = currentSequenceLength > 0; + if (!code || code < 256) { + currentSequence[0] = code; + currentSequenceLength = 1; + } + else if (code >= 258) { + if (code < nextCode) { + currentSequenceLength = dictionaryLengths[code]; + for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { + currentSequence[j] = dictionaryValues[q]; + q = dictionaryPrevCodes[q]; + } + } + else { + currentSequence[currentSequenceLength++] = currentSequence[0]; + } + } + else if (code === 256) { + codeLength = 9; + nextCode = 258; + currentSequenceLength = 0; + continue; + } + else { + this.eof = true; + delete this.lzwState; + break; + } + if (hasPrev) { + dictionaryPrevCodes[nextCode] = prevCode; + dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; + dictionaryValues[nextCode] = currentSequence[0]; + nextCode++; + codeLength = + (nextCode + earlyChange) & (nextCode + earlyChange - 1) + ? codeLength + : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; + } + prevCode = code; + decodedLength += currentSequenceLength; + if (estimatedDecodedSize < decodedLength) { + do { + estimatedDecodedSize += decodedSizeDelta; + } while (estimatedDecodedSize < decodedLength); + buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + } + for (j = 0; j < currentSequenceLength; j++) { + buffer[currentBufferLength++] = currentSequence[j]; + } + } + lzwState.nextCode = nextCode; + lzwState.codeLength = codeLength; + lzwState.prevCode = prevCode; + lzwState.currentSequenceLength = currentSequenceLength; + this.bufferLength = currentBufferLength; + }; + LZWStream.prototype.readBits = function (n) { + var bitsCached = this.bitsCached; + var cachedData = this.cachedData; + while (bitsCached < n) { + var c = this.stream.getByte(); + if (c === -1) { + this.eof = true; + return null; + } + cachedData = (cachedData << 8) | c; + bitsCached += 8; + } + this.bitsCached = bitsCached -= n; + this.cachedData = cachedData; + return (cachedData >>> bitsCached) & ((1 << n) - 1); + }; + return LZWStream; + }(DecodeStream)); + + /* + * Copyright 2012 Mozilla Foundation + * + * The RunLengthStream class contained in this file is a TypeScript port of the + * JavaScript RunLengthStream class in Mozilla's pdf.js project, made available + * under the Apache 2.0 open source license. + */ + var RunLengthStream = /** @class */ (function (_super) { + __extends(RunLengthStream, _super); + function RunLengthStream(stream, maybeLength) { + var _this = _super.call(this, maybeLength) || this; + _this.stream = stream; + return _this; + } + RunLengthStream.prototype.readBlock = function () { + // The repeatHeader has following format. The first byte defines type of run + // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes + // (in addition to the second byte from the header), n = 129 through 255 - + // duplicate the second byte from the header (257 - n) times, n = 128 - end. + var repeatHeader = this.stream.getBytes(2); + if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { + this.eof = true; + return; + } + var buffer; + var bufferLength = this.bufferLength; + var n = repeatHeader[0]; + if (n < 128) { + // copy n bytes + buffer = this.ensureBuffer(bufferLength + n + 1); + buffer[bufferLength++] = repeatHeader[1]; + if (n > 0) { + var source = this.stream.getBytes(n); + buffer.set(source, bufferLength); + bufferLength += n; + } + } + else { + n = 257 - n; + var b = repeatHeader[1]; + buffer = this.ensureBuffer(bufferLength + n + 1); + for (var i = 0; i < n; i++) { + buffer[bufferLength++] = b; + } + } + this.bufferLength = bufferLength; + }; + return RunLengthStream; + }(DecodeStream)); + + var decodeStream = function (stream, encoding, params) { + if (encoding === PDFName.of('FlateDecode')) { + return new FlateStream(stream); + } + if (encoding === PDFName.of('LZWDecode')) { + var earlyChange = 1; + if (params instanceof PDFDict) { + var EarlyChange = params.lookup(PDFName.of('EarlyChange')); + if (EarlyChange instanceof PDFNumber) { + earlyChange = EarlyChange.asNumber(); + } + } + return new LZWStream(stream, undefined, earlyChange); + } + if (encoding === PDFName.of('ASCII85Decode')) { + return new Ascii85Stream(stream); + } + if (encoding === PDFName.of('ASCIIHexDecode')) { + return new AsciiHexStream(stream); + } + if (encoding === PDFName.of('RunLengthDecode')) { + return new RunLengthStream(stream); + } + throw new UnsupportedEncodingError(encoding.asString()); + }; + var decodePDFRawStream = function (_a) { + var dict = _a.dict, contents = _a.contents; + var stream = new Stream(contents); + var Filter = dict.lookup(PDFName.of('Filter')); + var DecodeParms = dict.lookup(PDFName.of('DecodeParms')); + if (Filter instanceof PDFName) { + stream = decodeStream(stream, Filter, DecodeParms); + } + else if (Filter instanceof PDFArray) { + for (var idx = 0, len = Filter.size(); idx < len; idx++) { + stream = decodeStream(stream, Filter.lookup(idx, PDFName), DecodeParms && DecodeParms.lookupMaybe(idx, PDFDict)); + } + } + else if (!!Filter) { + throw new UnexpectedObjectTypeError([PDFName, PDFArray], Filter); + } + return stream; + }; + + var fullPageBoundingBox = function (page) { + var mediaBox = page.MediaBox(); + var width = mediaBox.lookup(2, PDFNumber).asNumber() - + mediaBox.lookup(0, PDFNumber).asNumber(); + var height = mediaBox.lookup(3, PDFNumber).asNumber() - + mediaBox.lookup(1, PDFNumber).asNumber(); + return { left: 0, bottom: 0, right: width, top: height }; + }; + // Returns the identity matrix, modified to position the content of the given + // bounding box at (0, 0). + var boundingBoxAdjustedMatrix = function (bb) { return [1, 0, 0, 1, -bb.left, -bb.bottom]; }; + var PDFPageEmbedder = /** @class */ (function () { + function PDFPageEmbedder(page, boundingBox, transformationMatrix) { + this.page = page; + var bb = boundingBox !== null && boundingBox !== void 0 ? boundingBox : fullPageBoundingBox(page); + this.width = bb.right - bb.left; + this.height = bb.top - bb.bottom; + this.boundingBox = bb; + this.transformationMatrix = transformationMatrix !== null && transformationMatrix !== void 0 ? transformationMatrix : boundingBoxAdjustedMatrix(bb); + } + PDFPageEmbedder.for = function (page, boundingBox, transformationMatrix) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, new PDFPageEmbedder(page, boundingBox, transformationMatrix)]; + }); + }); + }; + PDFPageEmbedder.prototype.embedIntoContext = function (context, ref) { + return __awaiter(this, void 0, void 0, function () { + var _a, Contents, Resources, decodedContents, _b, left, bottom, right, top, xObject; + return __generator(this, function (_c) { + _a = this.page.normalizedEntries(), Contents = _a.Contents, Resources = _a.Resources; + if (!Contents) + throw new MissingPageContentsEmbeddingError(); + decodedContents = this.decodeContents(Contents); + _b = this.boundingBox, left = _b.left, bottom = _b.bottom, right = _b.right, top = _b.top; + xObject = context.flateStream(decodedContents, { + Type: 'XObject', + Subtype: 'Form', + FormType: 1, + BBox: [left, bottom, right, top], + Matrix: this.transformationMatrix, + Resources: Resources, + }); + if (ref) { + context.assign(ref, xObject); + return [2 /*return*/, ref]; + } + else { + return [2 /*return*/, context.register(xObject)]; + } + }); + }); + }; + // `contents` is an array of streams which are merged to include them in the XObject. + // This methods extracts each stream and joins them with a newline character. + PDFPageEmbedder.prototype.decodeContents = function (contents) { + var newline = Uint8Array.of(CharCodes$1.Newline); + var decodedContents = []; + for (var idx = 0, len = contents.size(); idx < len; idx++) { + var stream = contents.lookup(idx, PDFStream); + var content = void 0; + if (stream instanceof PDFRawStream) { + content = decodePDFRawStream(stream).decode(); + } + else if (stream instanceof PDFContentStream) { + content = stream.getUnencodedContents(); + } + else { + throw new UnrecognizedStreamTypeError(stream); + } + decodedContents.push(content, newline); + } + return mergeIntoTypedArray.apply(void 0, decodedContents); + }; + return PDFPageEmbedder; + }()); + + var asEnum = function (rawValue, enumType) { + if (rawValue === undefined) + return undefined; + return enumType[rawValue]; + }; + (function (NonFullScreenPageMode) { + /** + * After exiting FullScreen mode, neither the document outline nor thumbnail + * images should be visible. + */ + NonFullScreenPageMode["UseNone"] = "UseNone"; + /** After exiting FullScreen mode, the document outline should be visible. */ + NonFullScreenPageMode["UseOutlines"] = "UseOutlines"; + /** After exiting FullScreen mode, thumbnail images should be visible. */ + NonFullScreenPageMode["UseThumbs"] = "UseThumbs"; + /** + * After exiting FullScreen mode, the optional content group panel should be + * visible. + */ + NonFullScreenPageMode["UseOC"] = "UseOC"; + })(exports.NonFullScreenPageMode || (exports.NonFullScreenPageMode = {})); + (function (ReadingDirection) { + /** The predominant reading order is Left to Right. */ + ReadingDirection["L2R"] = "L2R"; + /** + * The predominant reading order is Right to left (including vertical writing + * systems, such as Chinese, Japanese and Korean). + */ + ReadingDirection["R2L"] = "R2L"; + })(exports.ReadingDirection || (exports.ReadingDirection = {})); + (function (PrintScaling) { + /** No page scaling. */ + PrintScaling["None"] = "None"; + /* Use the PDF reader's default print scaling. */ + PrintScaling["AppDefault"] = "AppDefault"; + })(exports.PrintScaling || (exports.PrintScaling = {})); + (function (Duplex) { + /** The PDF reader should print single-sided. */ + Duplex["Simplex"] = "Simplex"; + /** + * The PDF reader should print double sided and flip on the short edge of the + * sheet. + */ + Duplex["DuplexFlipShortEdge"] = "DuplexFlipShortEdge"; + /** + * The PDF reader should print double sided and flip on the long edge of the + * sheet. + */ + Duplex["DuplexFlipLongEdge"] = "DuplexFlipLongEdge"; + })(exports.Duplex || (exports.Duplex = {})); + var ViewerPreferences = /** @class */ (function () { + /** @ignore */ + function ViewerPreferences(dict) { + this.dict = dict; + } + ViewerPreferences.prototype.lookupBool = function (key) { + var returnObj = this.dict.lookup(PDFName.of(key)); + if (returnObj instanceof PDFBool) + return returnObj; + return undefined; + }; + ViewerPreferences.prototype.lookupName = function (key) { + var returnObj = this.dict.lookup(PDFName.of(key)); + if (returnObj instanceof PDFName) + return returnObj; + return undefined; + }; + /** @ignore */ + ViewerPreferences.prototype.HideToolbar = function () { + return this.lookupBool('HideToolbar'); + }; + /** @ignore */ + ViewerPreferences.prototype.HideMenubar = function () { + return this.lookupBool('HideMenubar'); + }; + /** @ignore */ + ViewerPreferences.prototype.HideWindowUI = function () { + return this.lookupBool('HideWindowUI'); + }; + /** @ignore */ + ViewerPreferences.prototype.FitWindow = function () { + return this.lookupBool('FitWindow'); + }; + /** @ignore */ + ViewerPreferences.prototype.CenterWindow = function () { + return this.lookupBool('CenterWindow'); + }; + /** @ignore */ + ViewerPreferences.prototype.DisplayDocTitle = function () { + return this.lookupBool('DisplayDocTitle'); + }; + /** @ignore */ + ViewerPreferences.prototype.NonFullScreenPageMode = function () { + return this.lookupName('NonFullScreenPageMode'); + }; + /** @ignore */ + ViewerPreferences.prototype.Direction = function () { + return this.lookupName('Direction'); + }; + /** @ignore */ + ViewerPreferences.prototype.PrintScaling = function () { + return this.lookupName('PrintScaling'); + }; + /** @ignore */ + ViewerPreferences.prototype.Duplex = function () { + return this.lookupName('Duplex'); + }; + /** @ignore */ + ViewerPreferences.prototype.PickTrayByPDFSize = function () { + return this.lookupBool('PickTrayByPDFSize'); + }; + /** @ignore */ + ViewerPreferences.prototype.PrintPageRange = function () { + var PrintPageRange = this.dict.lookup(PDFName.of('PrintPageRange')); + if (PrintPageRange instanceof PDFArray) + return PrintPageRange; + return undefined; + }; + /** @ignore */ + ViewerPreferences.prototype.NumCopies = function () { + var NumCopies = this.dict.lookup(PDFName.of('NumCopies')); + if (NumCopies instanceof PDFNumber) + return NumCopies; + return undefined; + }; + /** + * Returns `true` if PDF readers should hide the toolbar menus when displaying + * this document. + * @returns Whether or not toolbars should be hidden. + */ + ViewerPreferences.prototype.getHideToolbar = function () { + var _a, _b; + return (_b = (_a = this.HideToolbar()) === null || _a === void 0 ? void 0 : _a.asBoolean()) !== null && _b !== void 0 ? _b : false; + }; + /** + * Returns `true` if PDF readers should hide the menu bar when displaying this + * document. + * @returns Whether or not the menu bar should be hidden. + */ + ViewerPreferences.prototype.getHideMenubar = function () { + var _a, _b; + return (_b = (_a = this.HideMenubar()) === null || _a === void 0 ? void 0 : _a.asBoolean()) !== null && _b !== void 0 ? _b : false; + }; + /** + * Returns `true` if PDF readers should hide the user interface elements in + * the document's window (such as scroll bars and navigation controls), + * leaving only the document's contents displayed. + * @returns Whether or not user interface elements should be hidden. + */ + ViewerPreferences.prototype.getHideWindowUI = function () { + var _a, _b; + return (_b = (_a = this.HideWindowUI()) === null || _a === void 0 ? void 0 : _a.asBoolean()) !== null && _b !== void 0 ? _b : false; + }; + /** + * Returns `true` if PDF readers should resize the document's window to fit + * the size of the first displayed page. + * @returns Whether or not the window should be resized to fit. + */ + ViewerPreferences.prototype.getFitWindow = function () { + var _a, _b; + return (_b = (_a = this.FitWindow()) === null || _a === void 0 ? void 0 : _a.asBoolean()) !== null && _b !== void 0 ? _b : false; + }; + /** + * Returns `true` if PDF readers should position the document's window in the + * center of the screen. + * @returns Whether or not to center the document window. + */ + ViewerPreferences.prototype.getCenterWindow = function () { + var _a, _b; + return (_b = (_a = this.CenterWindow()) === null || _a === void 0 ? void 0 : _a.asBoolean()) !== null && _b !== void 0 ? _b : false; + }; + /** + * Returns `true` if the window's title bar should display the document + * `Title`, taken from the document metadata (see [[PDFDocument.getTitle]]). + * Returns `false` if the title bar should instead display the filename of the + * PDF file. + * @returns Whether to display the document title. + */ + ViewerPreferences.prototype.getDisplayDocTitle = function () { + var _a, _b; + return (_b = (_a = this.DisplayDocTitle()) === null || _a === void 0 ? void 0 : _a.asBoolean()) !== null && _b !== void 0 ? _b : false; + }; + /** + * Returns the page mode, which tells the PDF reader how to display the + * document after exiting full-screen mode. + * @returns The page mode after exiting full-screen mode. + */ + ViewerPreferences.prototype.getNonFullScreenPageMode = function () { + var _a, _b; + var mode = (_a = this.NonFullScreenPageMode()) === null || _a === void 0 ? void 0 : _a.decodeText(); + return (_b = asEnum(mode, exports.NonFullScreenPageMode)) !== null && _b !== void 0 ? _b : exports.NonFullScreenPageMode.UseNone; + }; + /** + * Returns the predominant reading order for text. + * @returns The text reading order. + */ + ViewerPreferences.prototype.getReadingDirection = function () { + var _a, _b; + var direction = (_a = this.Direction()) === null || _a === void 0 ? void 0 : _a.decodeText(); + return (_b = asEnum(direction, exports.ReadingDirection)) !== null && _b !== void 0 ? _b : exports.ReadingDirection.L2R; + }; + /** + * Returns the page scaling option that the PDF reader should select when the + * print dialog is displayed. + * @returns The page scaling option. + */ + ViewerPreferences.prototype.getPrintScaling = function () { + var _a, _b; + var scaling = (_a = this.PrintScaling()) === null || _a === void 0 ? void 0 : _a.decodeText(); + return (_b = asEnum(scaling, exports.PrintScaling)) !== null && _b !== void 0 ? _b : exports.PrintScaling.AppDefault; + }; + /** + * Returns the paper handling option that should be used when printing the + * file from the print dialog. + * @returns The paper handling option. + */ + ViewerPreferences.prototype.getDuplex = function () { + var _a; + var duplex = (_a = this.Duplex()) === null || _a === void 0 ? void 0 : _a.decodeText(); + return asEnum(duplex, exports.Duplex); + }; + /** + * Returns `true` if the PDF page size should be used to select the input + * paper tray. + * @returns Whether or not the PDF page size should be used to select the + * input paper tray. + */ + ViewerPreferences.prototype.getPickTrayByPDFSize = function () { + var _a; + return (_a = this.PickTrayByPDFSize()) === null || _a === void 0 ? void 0 : _a.asBoolean(); + }; + /** + * Returns an array of page number ranges, which are the values used to + * initialize the print dialog box when the file is printed. Each range + * specifies the first (`start`) and last (`end`) pages in a sub-range of + * pages to be printed. The first page of the PDF file is denoted by 0. + * For example: + * ```js + * const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences() + * const includesPage3 = viewerPrefs + * .getPrintRanges() + * .some(pr => pr.start =< 2 && pr.end >= 2) + * if (includesPage3) console.log('printRange includes page 3') + * ``` + * @returns An array of objects, each with the properties `start` and `end`, + * denoting page indices. If not, specified an empty array is + * returned. + */ + ViewerPreferences.prototype.getPrintPageRange = function () { + var rng = this.PrintPageRange(); + if (!rng) + return []; + var pageRanges = []; + for (var i = 0; i < rng.size(); i += 2) { + // Despite the spec clearly stating that "The first page of the PDF file + // shall be donoted by 1", several test PDFs (spec 1.7) created in + // Acrobat XI 11.0 and also read with Reader DC 2020.013 indicate this is + // actually a 0 based index. + var start = rng.lookup(i, PDFNumber).asNumber(); + var end = rng.lookup(i + 1, PDFNumber).asNumber(); + pageRanges.push({ start: start, end: end }); + } + return pageRanges; + }; + /** + * Returns the number of copies to be printed when the print dialog is opened + * for this document. + * @returns The default number of copies to be printed. + */ + ViewerPreferences.prototype.getNumCopies = function () { + var _a, _b; + return (_b = (_a = this.NumCopies()) === null || _a === void 0 ? void 0 : _a.asNumber()) !== null && _b !== void 0 ? _b : 1; + }; + /** + * Choose whether the PDF reader's toolbars should be hidden while the + * document is active. + * @param hideToolbar `true` if the toolbar should be hidden. + */ + ViewerPreferences.prototype.setHideToolbar = function (hideToolbar) { + var HideToolbar = this.dict.context.obj(hideToolbar); + this.dict.set(PDFName.of('HideToolbar'), HideToolbar); + }; + /** + * Choose whether the PDF reader's menu bar should be hidden while the + * document is active. + * @param hideMenubar `true` if the menu bar should be hidden. + */ + ViewerPreferences.prototype.setHideMenubar = function (hideMenubar) { + var HideMenubar = this.dict.context.obj(hideMenubar); + this.dict.set(PDFName.of('HideMenubar'), HideMenubar); + }; + /** + * Choose whether the PDF reader should hide user interface elements in the + * document's window (such as scroll bars and navigation controls), leaving + * only the document's contents displayed. + * @param hideWindowUI `true` if the user interface elements should be hidden. + */ + ViewerPreferences.prototype.setHideWindowUI = function (hideWindowUI) { + var HideWindowUI = this.dict.context.obj(hideWindowUI); + this.dict.set(PDFName.of('HideWindowUI'), HideWindowUI); + }; + /** + * Choose whether the PDF reader should resize the document's window to fit + * the size of the first displayed page. + * @param fitWindow `true` if the window should be resized. + */ + ViewerPreferences.prototype.setFitWindow = function (fitWindow) { + var FitWindow = this.dict.context.obj(fitWindow); + this.dict.set(PDFName.of('FitWindow'), FitWindow); + }; + /** + * Choose whether the PDF reader should position the document's window in the + * center of the screen. + * @param centerWindow `true` if the window should be centered. + */ + ViewerPreferences.prototype.setCenterWindow = function (centerWindow) { + var CenterWindow = this.dict.context.obj(centerWindow); + this.dict.set(PDFName.of('CenterWindow'), CenterWindow); + }; + /** + * Choose whether the window's title bar should display the document `Title` + * taken from the document metadata (see [[PDFDocument.setTitle]]). If + * `false`, the title bar should instead display the PDF filename. + * @param displayTitle `true` if the document title should be displayed. + */ + ViewerPreferences.prototype.setDisplayDocTitle = function (displayTitle) { + var DisplayDocTitle = this.dict.context.obj(displayTitle); + this.dict.set(PDFName.of('DisplayDocTitle'), DisplayDocTitle); + }; + /** + * Choose how the PDF reader should display the document upon exiting + * full-screen mode. This entry is meaningful only if the value of the + * `PageMode` entry in the document's [[PDFCatalog]] is `FullScreen`. + * + * For example: + * ```js + * import { PDFDocument, NonFullScreenPageMode, PDFName } from 'pdf-lib' + * + * const pdfDoc = await PDFDocument.create() + * + * // Set the PageMode + * pdfDoc.catalog.set(PDFName.of('PageMode'),PDFName.of('FullScreen')) + * + * // Set what happens when full-screen is closed + * const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences() + * viewerPrefs.setNonFullScreenPageMode(NonFullScreenPageMode.UseOutlines) + * ``` + * + * @param nonFullScreenPageMode How the document should be displayed upon + * exiting full screen mode. + */ + ViewerPreferences.prototype.setNonFullScreenPageMode = function (nonFullScreenPageMode) { + assertIsOneOf(nonFullScreenPageMode, 'nonFullScreenPageMode', exports.NonFullScreenPageMode); + var mode = PDFName.of(nonFullScreenPageMode); + this.dict.set(PDFName.of('NonFullScreenPageMode'), mode); + }; + /** + * Choose the predominant reading order for text. + * + * This entry has no direct effect on the document's contents or page + * numbering, but may be used to determine the relative positioning of pages + * when displayed side by side or printed n-up. + * + * For example: + * ```js + * import { PDFDocument, ReadingDirection } from 'pdf-lib' + * + * const pdfDoc = await PDFDocument.create() + * const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences() + * viewerPrefs.setReadingDirection(ReadingDirection.R2L) + * ``` + * + * @param readingDirection The reading order for text. + */ + ViewerPreferences.prototype.setReadingDirection = function (readingDirection) { + assertIsOneOf(readingDirection, 'readingDirection', exports.ReadingDirection); + var direction = PDFName.of(readingDirection); + this.dict.set(PDFName.of('Direction'), direction); + }; + /** + * Choose the page scaling option that should be selected when a print dialog + * is displayed for this document. + * + * For example: + * ```js + * import { PDFDocument, PrintScaling } from 'pdf-lib' + * + * const pdfDoc = await PDFDocument.create() + * const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences() + * viewerPrefs.setPrintScaling(PrintScaling.None) + * ``` + * + * @param printScaling The print scaling option. + */ + ViewerPreferences.prototype.setPrintScaling = function (printScaling) { + assertIsOneOf(printScaling, 'printScaling', exports.PrintScaling); + var scaling = PDFName.of(printScaling); + this.dict.set(PDFName.of('PrintScaling'), scaling); + }; + /** + * Choose the paper handling option that should be selected by default in the + * print dialog. + * + * For example: + * ```js + * import { PDFDocument, Duplex } from 'pdf-lib' + * + * const pdfDoc = await PDFDocument.create() + * const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences() + * viewerPrefs.setDuplex(Duplex.DuplexFlipShortEdge) + * ``` + * + * @param duplex The double or single sided printing option. + */ + ViewerPreferences.prototype.setDuplex = function (duplex) { + assertIsOneOf(duplex, 'duplex', exports.Duplex); + var dup = PDFName.of(duplex); + this.dict.set(PDFName.of('Duplex'), dup); + }; + /** + * Choose whether the PDF document's page size should be used to select the + * input paper tray when printing. This setting influences only the preset + * values used to populate the print dialog presented by a PDF reader. + * + * If PickTrayByPDFSize is true, the check box in the print dialog associated + * with input paper tray should be checked. This setting has no effect on + * operating systems that do not provide the ability to pick the input tray + * by size. + * + * @param pickTrayByPDFSize `true` if the document's page size should be used + * to select the input paper tray. + */ + ViewerPreferences.prototype.setPickTrayByPDFSize = function (pickTrayByPDFSize) { + var PickTrayByPDFSize = this.dict.context.obj(pickTrayByPDFSize); + this.dict.set(PDFName.of('PickTrayByPDFSize'), PickTrayByPDFSize); + }; + /** + * Choose the page numbers used to initialize the print dialog box when the + * file is printed. The first page of the PDF file is denoted by 0. + * + * For example: + * ```js + * import { PDFDocument } from 'pdf-lib' + * + * const pdfDoc = await PDFDocument.create() + * const viewerPrefs = pdfDoc.catalog.getOrCreateViewerPreferences() + * + * // We can set the default print range to only the first page + * viewerPrefs.setPrintPageRange({ start: 0, end: 0 }) + * + * // Or we can supply noncontiguous ranges (e.g. pages 1, 3, and 5-7) + * viewerPrefs.setPrintPageRange([ + * { start: 0, end: 0 }, + * { start: 2, end: 2 }, + * { start: 4, end: 6 }, + * ]) + * ``` + * + * @param printPageRange An object or array of objects, each with the + * properties `start` and `end`, denoting a range of + * page indices. + */ + ViewerPreferences.prototype.setPrintPageRange = function (printPageRange) { + if (!Array.isArray(printPageRange)) + printPageRange = [printPageRange]; + var flatRange = []; + for (var idx = 0, len = printPageRange.length; idx < len; idx++) { + flatRange.push(printPageRange[idx].start); + flatRange.push(printPageRange[idx].end); + } + assertEachIs(flatRange, 'printPageRange', ['number']); + var pageRanges = this.dict.context.obj(flatRange); + this.dict.set(PDFName.of('PrintPageRange'), pageRanges); + }; + /** + * Choose the default number of copies to be printed when the print dialog is + * opened for this file. + * @param numCopies The default number of copies. + */ + ViewerPreferences.prototype.setNumCopies = function (numCopies) { + assertRange(numCopies, 'numCopies', 1, Number.MAX_VALUE); + assertInteger(numCopies, 'numCopies'); + var NumCopies = this.dict.context.obj(numCopies); + this.dict.set(PDFName.of('NumCopies'), NumCopies); + }; + /** @ignore */ + ViewerPreferences.fromDict = function (dict) { + return new ViewerPreferences(dict); + }; + /** @ignore */ + ViewerPreferences.create = function (context) { + var dict = context.obj({}); + return new ViewerPreferences(dict); + }; + return ViewerPreferences; + }()); + + // Examples: + // `/Helv 12 Tf` -> ['Helv', '12'] + // `/HeBo 8.00 Tf` -> ['HeBo', '8.00'] + // `/HeBo Tf` -> ['HeBo', undefined] + var tfRegex = /\/([^\0\t\n\f\r\ ]+)[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]+Tf/; + var PDFAcroField = /** @class */ (function () { + function PDFAcroField(dict, ref) { + this.dict = dict; + this.ref = ref; + } + PDFAcroField.prototype.T = function () { + return this.dict.lookupMaybe(PDFName.of('T'), PDFString, PDFHexString); + }; + PDFAcroField.prototype.Ff = function () { + var numberOrRef = this.getInheritableAttribute(PDFName.of('Ff')); + return this.dict.context.lookupMaybe(numberOrRef, PDFNumber); + }; + PDFAcroField.prototype.V = function () { + var valueOrRef = this.getInheritableAttribute(PDFName.of('V')); + return this.dict.context.lookup(valueOrRef); + }; + PDFAcroField.prototype.Kids = function () { + return this.dict.lookupMaybe(PDFName.of('Kids'), PDFArray); + }; + // Parent(): PDFDict | undefined { + // return this.dict.lookupMaybe(PDFName.of('Parent'), PDFDict); + // } + PDFAcroField.prototype.DA = function () { + var da = this.dict.lookup(PDFName.of('DA')); + if (da instanceof PDFString || da instanceof PDFHexString) + return da; + return undefined; + }; + PDFAcroField.prototype.setKids = function (kids) { + this.dict.set(PDFName.of('Kids'), this.dict.context.obj(kids)); + }; + PDFAcroField.prototype.getParent = function () { + // const parent = this.Parent(); + // if (!parent) return undefined; + // return new PDFAcroField(parent); + var parentRef = this.dict.get(PDFName.of('Parent')); + if (parentRef instanceof PDFRef) { + var parent_1 = this.dict.lookup(PDFName.of('Parent'), PDFDict); + return new PDFAcroField(parent_1, parentRef); + } + return undefined; + }; + PDFAcroField.prototype.setParent = function (parent) { + if (!parent) + this.dict.delete(PDFName.of('Parent')); + else + this.dict.set(PDFName.of('Parent'), parent); + }; + PDFAcroField.prototype.getFullyQualifiedName = function () { + var parent = this.getParent(); + if (!parent) + return this.getPartialName(); + return parent.getFullyQualifiedName() + "." + this.getPartialName(); + }; + PDFAcroField.prototype.getPartialName = function () { + var _a; + return (_a = this.T()) === null || _a === void 0 ? void 0 : _a.decodeText(); + }; + PDFAcroField.prototype.setPartialName = function (partialName) { + if (!partialName) + this.dict.delete(PDFName.of('T')); + else + this.dict.set(PDFName.of('T'), PDFHexString.fromText(partialName)); + }; + PDFAcroField.prototype.setDefaultAppearance = function (appearance) { + this.dict.set(PDFName.of('DA'), PDFString.of(appearance)); + }; + PDFAcroField.prototype.getDefaultAppearance = function () { + var DA = this.DA(); + if (DA instanceof PDFHexString) { + return DA.decodeText(); + } + return DA === null || DA === void 0 ? void 0 : DA.asString(); + }; + PDFAcroField.prototype.setFontSize = function (fontSize) { + var _a; + var name = (_a = this.getFullyQualifiedName()) !== null && _a !== void 0 ? _a : ''; + var da = this.getDefaultAppearance(); + if (!da) + throw new MissingDAEntryError(name); + var daMatch = findLastMatch(da, tfRegex); + if (!daMatch.match) + throw new MissingTfOperatorError(name); + var daStart = da.slice(0, daMatch.pos - daMatch.match[0].length); + var daEnd = daMatch.pos <= da.length ? da.slice(daMatch.pos) : ''; + var fontName = daMatch.match[1]; + var modifiedDa = daStart + " /" + fontName + " " + fontSize + " Tf " + daEnd; + this.setDefaultAppearance(modifiedDa); + }; + PDFAcroField.prototype.getFlags = function () { + var _a, _b; + return (_b = (_a = this.Ff()) === null || _a === void 0 ? void 0 : _a.asNumber()) !== null && _b !== void 0 ? _b : 0; + }; + PDFAcroField.prototype.setFlags = function (flags) { + this.dict.set(PDFName.of('Ff'), PDFNumber.of(flags)); + }; + PDFAcroField.prototype.hasFlag = function (flag) { + var flags = this.getFlags(); + return (flags & flag) !== 0; + }; + PDFAcroField.prototype.setFlag = function (flag) { + var flags = this.getFlags(); + this.setFlags(flags | flag); + }; + PDFAcroField.prototype.clearFlag = function (flag) { + var flags = this.getFlags(); + this.setFlags(flags & ~flag); + }; + PDFAcroField.prototype.setFlagTo = function (flag, enable) { + if (enable) + this.setFlag(flag); + else + this.clearFlag(flag); + }; + PDFAcroField.prototype.getInheritableAttribute = function (name) { + var attribute; + this.ascend(function (node) { + if (!attribute) + attribute = node.dict.get(name); + }); + return attribute; + }; + PDFAcroField.prototype.ascend = function (visitor) { + visitor(this); + var parent = this.getParent(); + if (parent) + parent.ascend(visitor); + }; + return PDFAcroField; + }()); + + // TODO: Also handle the `/S` and `/D` entries + var BorderStyle = /** @class */ (function () { + function BorderStyle(dict) { + this.dict = dict; + } + BorderStyle.prototype.W = function () { + var W = this.dict.lookup(PDFName.of('W')); + if (W instanceof PDFNumber) + return W; + return undefined; + }; + BorderStyle.prototype.getWidth = function () { + var _a, _b; + return (_b = (_a = this.W()) === null || _a === void 0 ? void 0 : _a.asNumber()) !== null && _b !== void 0 ? _b : 1; + }; + BorderStyle.prototype.setWidth = function (width) { + var W = this.dict.context.obj(width); + this.dict.set(PDFName.of('W'), W); + }; + BorderStyle.fromDict = function (dict) { return new BorderStyle(dict); }; + return BorderStyle; + }()); + + var PDFAnnotation = /** @class */ (function () { + function PDFAnnotation(dict) { + this.dict = dict; + } + // This is technically required by the PDF spec + PDFAnnotation.prototype.Rect = function () { + return this.dict.lookup(PDFName.of('Rect'), PDFArray); + }; + PDFAnnotation.prototype.AP = function () { + return this.dict.lookupMaybe(PDFName.of('AP'), PDFDict); + }; + PDFAnnotation.prototype.F = function () { + var numberOrRef = this.dict.lookup(PDFName.of('F')); + return this.dict.context.lookupMaybe(numberOrRef, PDFNumber); + }; + PDFAnnotation.prototype.getRectangle = function () { + var _a; + var Rect = this.Rect(); + return (_a = Rect === null || Rect === void 0 ? void 0 : Rect.asRectangle()) !== null && _a !== void 0 ? _a : { x: 0, y: 0, width: 0, height: 0 }; + }; + PDFAnnotation.prototype.setRectangle = function (rect) { + var x = rect.x, y = rect.y, width = rect.width, height = rect.height; + var Rect = this.dict.context.obj([x, y, x + width, y + height]); + this.dict.set(PDFName.of('Rect'), Rect); + }; + PDFAnnotation.prototype.getAppearanceState = function () { + var AS = this.dict.lookup(PDFName.of('AS')); + if (AS instanceof PDFName) + return AS; + return undefined; + }; + PDFAnnotation.prototype.setAppearanceState = function (state) { + this.dict.set(PDFName.of('AS'), state); + }; + PDFAnnotation.prototype.setAppearances = function (appearances) { + this.dict.set(PDFName.of('AP'), appearances); + }; + PDFAnnotation.prototype.ensureAP = function () { + var AP = this.AP(); + if (!AP) { + AP = this.dict.context.obj({}); + this.dict.set(PDFName.of('AP'), AP); + } + return AP; + }; + PDFAnnotation.prototype.getNormalAppearance = function () { + var AP = this.ensureAP(); + var N = AP.get(PDFName.of('N')); + if (N instanceof PDFRef || N instanceof PDFDict) + return N; + throw new Error("Unexpected N type: " + (N === null || N === void 0 ? void 0 : N.constructor.name)); + }; + /** @param appearance A PDFDict or PDFStream (direct or ref) */ + PDFAnnotation.prototype.setNormalAppearance = function (appearance) { + var AP = this.ensureAP(); + AP.set(PDFName.of('N'), appearance); + }; + /** @param appearance A PDFDict or PDFStream (direct or ref) */ + PDFAnnotation.prototype.setRolloverAppearance = function (appearance) { + var AP = this.ensureAP(); + AP.set(PDFName.of('R'), appearance); + }; + /** @param appearance A PDFDict or PDFStream (direct or ref) */ + PDFAnnotation.prototype.setDownAppearance = function (appearance) { + var AP = this.ensureAP(); + AP.set(PDFName.of('D'), appearance); + }; + PDFAnnotation.prototype.removeRolloverAppearance = function () { + var AP = this.AP(); + AP === null || AP === void 0 ? void 0 : AP.delete(PDFName.of('R')); + }; + PDFAnnotation.prototype.removeDownAppearance = function () { + var AP = this.AP(); + AP === null || AP === void 0 ? void 0 : AP.delete(PDFName.of('D')); + }; + PDFAnnotation.prototype.getAppearances = function () { + var AP = this.AP(); + if (!AP) + return undefined; + var N = AP.lookup(PDFName.of('N'), PDFDict, PDFStream); + var R = AP.lookupMaybe(PDFName.of('R'), PDFDict, PDFStream); + var D = AP.lookupMaybe(PDFName.of('D'), PDFDict, PDFStream); + return { normal: N, rollover: R, down: D }; + }; + PDFAnnotation.prototype.getFlags = function () { + var _a, _b; + return (_b = (_a = this.F()) === null || _a === void 0 ? void 0 : _a.asNumber()) !== null && _b !== void 0 ? _b : 0; + }; + PDFAnnotation.prototype.setFlags = function (flags) { + this.dict.set(PDFName.of('F'), PDFNumber.of(flags)); + }; + PDFAnnotation.prototype.hasFlag = function (flag) { + var flags = this.getFlags(); + return (flags & flag) !== 0; + }; + PDFAnnotation.prototype.setFlag = function (flag) { + var flags = this.getFlags(); + this.setFlags(flags | flag); + }; + PDFAnnotation.prototype.clearFlag = function (flag) { + var flags = this.getFlags(); + this.setFlags(flags & ~flag); + }; + PDFAnnotation.prototype.setFlagTo = function (flag, enable) { + if (enable) + this.setFlag(flag); + else + this.clearFlag(flag); + }; + PDFAnnotation.fromDict = function (dict) { return new PDFAnnotation(dict); }; + return PDFAnnotation; + }()); + + var AppearanceCharacteristics = /** @class */ (function () { + function AppearanceCharacteristics(dict) { + this.dict = dict; + } + AppearanceCharacteristics.prototype.R = function () { + var R = this.dict.lookup(PDFName.of('R')); + if (R instanceof PDFNumber) + return R; + return undefined; + }; + AppearanceCharacteristics.prototype.BC = function () { + var BC = this.dict.lookup(PDFName.of('BC')); + if (BC instanceof PDFArray) + return BC; + return undefined; + }; + AppearanceCharacteristics.prototype.BG = function () { + var BG = this.dict.lookup(PDFName.of('BG')); + if (BG instanceof PDFArray) + return BG; + return undefined; + }; + AppearanceCharacteristics.prototype.CA = function () { + var CA = this.dict.lookup(PDFName.of('CA')); + if (CA instanceof PDFHexString || CA instanceof PDFString) + return CA; + return undefined; + }; + AppearanceCharacteristics.prototype.RC = function () { + var RC = this.dict.lookup(PDFName.of('RC')); + if (RC instanceof PDFHexString || RC instanceof PDFString) + return RC; + return undefined; + }; + AppearanceCharacteristics.prototype.AC = function () { + var AC = this.dict.lookup(PDFName.of('AC')); + if (AC instanceof PDFHexString || AC instanceof PDFString) + return AC; + return undefined; + }; + AppearanceCharacteristics.prototype.getRotation = function () { + var _a; + return (_a = this.R()) === null || _a === void 0 ? void 0 : _a.asNumber(); + }; + AppearanceCharacteristics.prototype.getBorderColor = function () { + var BC = this.BC(); + if (!BC) + return undefined; + var components = []; + for (var idx = 0, len = BC === null || BC === void 0 ? void 0 : BC.size(); idx < len; idx++) { + var component = BC.get(idx); + if (component instanceof PDFNumber) + components.push(component.asNumber()); + } + return components; + }; + AppearanceCharacteristics.prototype.getBackgroundColor = function () { + var BG = this.BG(); + if (!BG) + return undefined; + var components = []; + for (var idx = 0, len = BG === null || BG === void 0 ? void 0 : BG.size(); idx < len; idx++) { + var component = BG.get(idx); + if (component instanceof PDFNumber) + components.push(component.asNumber()); + } + return components; + }; + AppearanceCharacteristics.prototype.getCaptions = function () { + var CA = this.CA(); + var RC = this.RC(); + var AC = this.AC(); + return { + normal: CA === null || CA === void 0 ? void 0 : CA.decodeText(), + rollover: RC === null || RC === void 0 ? void 0 : RC.decodeText(), + down: AC === null || AC === void 0 ? void 0 : AC.decodeText(), + }; + }; + AppearanceCharacteristics.prototype.setRotation = function (rotation) { + var R = this.dict.context.obj(rotation); + this.dict.set(PDFName.of('R'), R); + }; + AppearanceCharacteristics.prototype.setBorderColor = function (color) { + var BC = this.dict.context.obj(color); + this.dict.set(PDFName.of('BC'), BC); + }; + AppearanceCharacteristics.prototype.setBackgroundColor = function (color) { + var BG = this.dict.context.obj(color); + this.dict.set(PDFName.of('BG'), BG); + }; + AppearanceCharacteristics.prototype.setCaptions = function (captions) { + var CA = PDFHexString.fromText(captions.normal); + this.dict.set(PDFName.of('CA'), CA); + if (captions.rollover) { + var RC = PDFHexString.fromText(captions.rollover); + this.dict.set(PDFName.of('RC'), RC); + } + else { + this.dict.delete(PDFName.of('RC')); + } + if (captions.down) { + var AC = PDFHexString.fromText(captions.down); + this.dict.set(PDFName.of('AC'), AC); + } + else { + this.dict.delete(PDFName.of('AC')); + } + }; + AppearanceCharacteristics.fromDict = function (dict) { + return new AppearanceCharacteristics(dict); + }; + return AppearanceCharacteristics; + }()); + + var PDFWidgetAnnotation = /** @class */ (function (_super) { + __extends(PDFWidgetAnnotation, _super); + function PDFWidgetAnnotation() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFWidgetAnnotation.prototype.MK = function () { + var MK = this.dict.lookup(PDFName.of('MK')); + if (MK instanceof PDFDict) + return MK; + return undefined; + }; + PDFWidgetAnnotation.prototype.BS = function () { + var BS = this.dict.lookup(PDFName.of('BS')); + if (BS instanceof PDFDict) + return BS; + return undefined; + }; + PDFWidgetAnnotation.prototype.DA = function () { + var da = this.dict.lookup(PDFName.of('DA')); + if (da instanceof PDFString || da instanceof PDFHexString) + return da; + return undefined; + }; + PDFWidgetAnnotation.prototype.P = function () { + var P = this.dict.get(PDFName.of('P')); + if (P instanceof PDFRef) + return P; + return undefined; + }; + PDFWidgetAnnotation.prototype.setP = function (page) { + this.dict.set(PDFName.of('P'), page); + }; + PDFWidgetAnnotation.prototype.setDefaultAppearance = function (appearance) { + this.dict.set(PDFName.of('DA'), PDFString.of(appearance)); + }; + PDFWidgetAnnotation.prototype.getDefaultAppearance = function () { + var DA = this.DA(); + if (DA instanceof PDFHexString) { + return DA.decodeText(); + } + return DA === null || DA === void 0 ? void 0 : DA.asString(); + }; + PDFWidgetAnnotation.prototype.getAppearanceCharacteristics = function () { + var MK = this.MK(); + if (MK) + return AppearanceCharacteristics.fromDict(MK); + return undefined; + }; + PDFWidgetAnnotation.prototype.getOrCreateAppearanceCharacteristics = function () { + var MK = this.MK(); + if (MK) + return AppearanceCharacteristics.fromDict(MK); + var ac = AppearanceCharacteristics.fromDict(this.dict.context.obj({})); + this.dict.set(PDFName.of('MK'), ac.dict); + return ac; + }; + PDFWidgetAnnotation.prototype.getBorderStyle = function () { + var BS = this.BS(); + if (BS) + return BorderStyle.fromDict(BS); + return undefined; + }; + PDFWidgetAnnotation.prototype.getOrCreateBorderStyle = function () { + var BS = this.BS(); + if (BS) + return BorderStyle.fromDict(BS); + var bs = BorderStyle.fromDict(this.dict.context.obj({})); + this.dict.set(PDFName.of('BS'), bs.dict); + return bs; + }; + PDFWidgetAnnotation.prototype.getOnValue = function () { + var _a; + var normal = (_a = this.getAppearances()) === null || _a === void 0 ? void 0 : _a.normal; + if (normal instanceof PDFDict) { + var keys = normal.keys(); + for (var idx = 0, len = keys.length; idx < len; idx++) { + var key = keys[idx]; + if (key !== PDFName.of('Off')) + return key; + } + } + return undefined; + }; + PDFWidgetAnnotation.fromDict = function (dict) { + return new PDFWidgetAnnotation(dict); + }; + PDFWidgetAnnotation.create = function (context, parent) { + var dict = context.obj({ + Type: 'Annot', + Subtype: 'Widget', + Rect: [0, 0, 0, 0], + Parent: parent, + }); + return new PDFWidgetAnnotation(dict); + }; + return PDFWidgetAnnotation; + }(PDFAnnotation)); + + var PDFAcroTerminal = /** @class */ (function (_super) { + __extends(PDFAcroTerminal, _super); + function PDFAcroTerminal() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroTerminal.prototype.FT = function () { + var nameOrRef = this.getInheritableAttribute(PDFName.of('FT')); + return this.dict.context.lookup(nameOrRef, PDFName); + }; + PDFAcroTerminal.prototype.getWidgets = function () { + var kidDicts = this.Kids(); + // This field is itself a widget + if (!kidDicts) + return [PDFWidgetAnnotation.fromDict(this.dict)]; + // This field's kids are its widgets + var widgets = new Array(kidDicts.size()); + for (var idx = 0, len = kidDicts.size(); idx < len; idx++) { + var dict = kidDicts.lookup(idx, PDFDict); + widgets[idx] = PDFWidgetAnnotation.fromDict(dict); + } + return widgets; + }; + PDFAcroTerminal.prototype.addWidget = function (ref) { + var Kids = this.normalizedEntries().Kids; + Kids.push(ref); + }; + PDFAcroTerminal.prototype.removeWidget = function (idx) { + var kidDicts = this.Kids(); + if (!kidDicts) { + // This field is itself a widget + if (idx !== 0) + throw new IndexOutOfBoundsError(idx, 0, 0); + this.setKids([]); + } + else { + // This field's kids are its widgets + if (idx < 0 || idx > kidDicts.size()) { + throw new IndexOutOfBoundsError(idx, 0, kidDicts.size()); + } + kidDicts.remove(idx); + } + }; + PDFAcroTerminal.prototype.normalizedEntries = function () { + var Kids = this.Kids(); + // If this field is itself a widget (because it was only rendered once in + // the document, so the field and widget properties were merged) then we + // add itself to the `Kids` array. The alternative would be to try + // splitting apart the widget properties and creating a separate object + // for them. + if (!Kids) { + Kids = this.dict.context.obj([this.ref]); + this.dict.set(PDFName.of('Kids'), Kids); + } + return { Kids: Kids }; + }; + PDFAcroTerminal.fromDict = function (dict, ref) { + return new PDFAcroTerminal(dict, ref); + }; + return PDFAcroTerminal; + }(PDFAcroField)); + + var PDFAcroButton = /** @class */ (function (_super) { + __extends(PDFAcroButton, _super); + function PDFAcroButton() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroButton.prototype.Opt = function () { + return this.dict.lookupMaybe(PDFName.of('Opt'), PDFString, PDFHexString, PDFArray); + }; + PDFAcroButton.prototype.setOpt = function (opt) { + this.dict.set(PDFName.of('Opt'), this.dict.context.obj(opt)); + }; + PDFAcroButton.prototype.getExportValues = function () { + var opt = this.Opt(); + if (!opt) + return undefined; + if (opt instanceof PDFString || opt instanceof PDFHexString) { + return [opt]; + } + var values = []; + for (var idx = 0, len = opt.size(); idx < len; idx++) { + var value = opt.lookup(idx); + if (value instanceof PDFString || value instanceof PDFHexString) { + values.push(value); + } + } + return values; + }; + PDFAcroButton.prototype.removeExportValue = function (idx) { + var opt = this.Opt(); + if (!opt) + return; + if (opt instanceof PDFString || opt instanceof PDFHexString) { + if (idx !== 0) + throw new IndexOutOfBoundsError(idx, 0, 0); + this.setOpt([]); + } + else { + if (idx < 0 || idx > opt.size()) { + throw new IndexOutOfBoundsError(idx, 0, opt.size()); + } + opt.remove(idx); + } + }; + // Enforce use use of /Opt even if it isn't strictly necessary + PDFAcroButton.prototype.normalizeExportValues = function () { + var _a, _b, _c, _d; + var exportValues = (_a = this.getExportValues()) !== null && _a !== void 0 ? _a : []; + var Opt = []; + var widgets = this.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var exportVal = (_b = exportValues[idx]) !== null && _b !== void 0 ? _b : PDFHexString.fromText((_d = (_c = widget.getOnValue()) === null || _c === void 0 ? void 0 : _c.decodeText()) !== null && _d !== void 0 ? _d : ''); + Opt.push(exportVal); + } + this.setOpt(Opt); + }; + /** + * Reuses existing opt if one exists with the same value (assuming + * `useExistingIdx` is `true`). Returns index of existing (or new) opt. + */ + PDFAcroButton.prototype.addOpt = function (opt, useExistingOptIdx) { + var _a; + this.normalizeExportValues(); + var optText = opt.decodeText(); + var existingIdx; + if (useExistingOptIdx) { + var exportValues = (_a = this.getExportValues()) !== null && _a !== void 0 ? _a : []; + for (var idx = 0, len = exportValues.length; idx < len; idx++) { + var exportVal = exportValues[idx]; + if (exportVal.decodeText() === optText) + existingIdx = idx; + } + } + var Opt = this.Opt(); + Opt.push(opt); + return existingIdx !== null && existingIdx !== void 0 ? existingIdx : Opt.size() - 1; + }; + PDFAcroButton.prototype.addWidgetWithOpt = function (widget, opt, useExistingOptIdx) { + var optIdx = this.addOpt(opt, useExistingOptIdx); + var apStateValue = PDFName.of(String(optIdx)); + this.addWidget(widget); + return apStateValue; + }; + return PDFAcroButton; + }(PDFAcroTerminal)); + + var PDFAcroCheckBox = /** @class */ (function (_super) { + __extends(PDFAcroCheckBox, _super); + function PDFAcroCheckBox() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroCheckBox.prototype.setValue = function (value) { + var _a; + var onValue = (_a = this.getOnValue()) !== null && _a !== void 0 ? _a : PDFName.of('Yes'); + if (value !== onValue && value !== PDFName.of('Off')) { + throw new InvalidAcroFieldValueError(); + } + this.dict.set(PDFName.of('V'), value); + var widgets = this.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var state = widget.getOnValue() === value ? value : PDFName.of('Off'); + widget.setAppearanceState(state); + } + }; + PDFAcroCheckBox.prototype.getValue = function () { + var v = this.V(); + if (v instanceof PDFName) + return v; + return PDFName.of('Off'); + }; + PDFAcroCheckBox.prototype.getOnValue = function () { + var widget = this.getWidgets()[0]; + return widget === null || widget === void 0 ? void 0 : widget.getOnValue(); + }; + PDFAcroCheckBox.fromDict = function (dict, ref) { + return new PDFAcroCheckBox(dict, ref); + }; + PDFAcroCheckBox.create = function (context) { + var dict = context.obj({ + FT: 'Btn', + Kids: [], + }); + var ref = context.register(dict); + return new PDFAcroCheckBox(dict, ref); + }; + return PDFAcroCheckBox; + }(PDFAcroButton)); + + var flag = function (bitIndex) { return 1 << bitIndex; }; + (function (AcroFieldFlags) { + /** + * If set, the user may not change the value of the field. Any associated + * widget annotations will not interact with the user; that is, they will not + * respond to mouse clicks or change their appearance in response to mouse + * motions. This flag is useful for fields whose values are computed or + * imported from a database. + */ + AcroFieldFlags[AcroFieldFlags["ReadOnly"] = flag(1 - 1)] = "ReadOnly"; + /** + * If set, the field shall have a value at the time it is exported by a + * submit-form action (see 12.7.5.2, "Submit-Form Action"). + */ + AcroFieldFlags[AcroFieldFlags["Required"] = flag(2 - 1)] = "Required"; + /** + * If set, the field shall not be exported by a submit-form action + * (see 12.7.5.2, "Submit-Form Action"). + */ + AcroFieldFlags[AcroFieldFlags["NoExport"] = flag(3 - 1)] = "NoExport"; + })(exports.AcroFieldFlags || (exports.AcroFieldFlags = {})); + (function (AcroButtonFlags) { + /** + * (Radio buttons only) If set, exactly one radio button shall be selected at + * all times; selecting the currently selected button has no effect. If clear, + * clicking the selected button deselects it, leaving no button selected. + */ + AcroButtonFlags[AcroButtonFlags["NoToggleToOff"] = flag(15 - 1)] = "NoToggleToOff"; + /** + * If set, the field is a set of radio buttons; if clear, the field is a check + * box. This flag may be set only if the Pushbutton flag is clear. + */ + AcroButtonFlags[AcroButtonFlags["Radio"] = flag(16 - 1)] = "Radio"; + /** + * If set, the field is a pushbutton that does not retain a permanent value. + */ + AcroButtonFlags[AcroButtonFlags["PushButton"] = flag(17 - 1)] = "PushButton"; + /** + * If set, a group of radio buttons within a radio button field that use the + * same value for the on state will turn on and off in unison; that is if one + * is checked, they are all checked. If clear, the buttons are mutually + * exclusive (the same behavior as HTML radio buttons). + */ + AcroButtonFlags[AcroButtonFlags["RadiosInUnison"] = flag(26 - 1)] = "RadiosInUnison"; + })(exports.AcroButtonFlags || (exports.AcroButtonFlags = {})); + (function (AcroTextFlags) { + /** + * If set, the field may contain multiple lines of text; if clear, the field's + * text shall be restricted to a single line. + */ + AcroTextFlags[AcroTextFlags["Multiline"] = flag(13 - 1)] = "Multiline"; + /** + * If set, the field is intended for entering a secure password that should + * not be echoed visibly to the screen. Characters typed from the keyboard + * shall instead be echoed in some unreadable form, such as asterisks or + * bullet characters. + * > NOTE To protect password confidentiality, readers should never store + * > the value of the text field in the PDF file if this flag is set. + */ + AcroTextFlags[AcroTextFlags["Password"] = flag(14 - 1)] = "Password"; + /** + * If set, the text entered in the field represents the pathname of a file + * whose contents shall be submitted as the value of the field. + */ + AcroTextFlags[AcroTextFlags["FileSelect"] = flag(21 - 1)] = "FileSelect"; + /** + * If set, text entered in the field shall not be spell-checked. + */ + AcroTextFlags[AcroTextFlags["DoNotSpellCheck"] = flag(23 - 1)] = "DoNotSpellCheck"; + /** + * If set, the field shall not scroll (horizontally for single-line fields, + * vertically for multiple-line fields) to accommodate more text than fits + * within its annotation rectangle. Once the field is full, no further text + * shall be accepted for interactive form filling; for non-interactive form + * filling, the filler should take care not to add more character than will + * visibly fit in the defined area. + */ + AcroTextFlags[AcroTextFlags["DoNotScroll"] = flag(24 - 1)] = "DoNotScroll"; + /** + * May be set only if the MaxLen entry is present in the text field dictionary + * (see Table 229) and if the Multiline, Password, and FileSelect flags are + * clear. If set, the field shall be automatically divided into as many + * equally spaced positions, or combs, as the value of MaxLen, and the text + * is laid out into those combs. + */ + AcroTextFlags[AcroTextFlags["Comb"] = flag(25 - 1)] = "Comb"; + /** + * If set, the value of this field shall be a rich text string + * (see 12.7.3.4, "Rich Text Strings"). If the field has a value, the RV + * entry of the field dictionary (Table 222) shall specify the rich text + * string. + */ + AcroTextFlags[AcroTextFlags["RichText"] = flag(26 - 1)] = "RichText"; + })(exports.AcroTextFlags || (exports.AcroTextFlags = {})); + (function (AcroChoiceFlags) { + /** + * If set, the field is a combo box; if clear, the field is a list box. + */ + AcroChoiceFlags[AcroChoiceFlags["Combo"] = flag(18 - 1)] = "Combo"; + /** + * If set, the combo box shall include an editable text box as well as a + * drop-down list; if clear, it shall include only a drop-down list. This + * flag shall be used only if the Combo flag is set. + */ + AcroChoiceFlags[AcroChoiceFlags["Edit"] = flag(19 - 1)] = "Edit"; + /** + * If set, the field's option items shall be sorted alphabetically. This flag + * is intended for use by writers, not by readers. Conforming readers shall + * display the options in the order in which they occur in the Opt array + * (see Table 231). + */ + AcroChoiceFlags[AcroChoiceFlags["Sort"] = flag(20 - 1)] = "Sort"; + /** + * If set, more than one of the field's option items may be selected + * simultaneously; if clear, at most one item shall be selected. + */ + AcroChoiceFlags[AcroChoiceFlags["MultiSelect"] = flag(22 - 1)] = "MultiSelect"; + /** + * If set, text entered in the field shall not be spell-checked. This flag + * shall not be used unless the Combo and Edit flags are both set. + */ + AcroChoiceFlags[AcroChoiceFlags["DoNotSpellCheck"] = flag(23 - 1)] = "DoNotSpellCheck"; + /** + * If set, the new value shall be committed as soon as a selection is made + * (commonly with the pointing device). In this case, supplying a value for + * a field involves three actions: selecting the field for fill-in, + * selecting a choice for the fill-in value, and leaving that field, which + * finalizes or "commits" the data choice and triggers any actions associated + * with the entry or changing of this data. If this flag is on, then + * processing does not wait for leaving the field action to occur, but + * immediately proceeds to the third step. + * + * This option enables applications to perform an action once a selection is + * made, without requiring the user to exit the field. If clear, the new + * value is not committed until the user exits the field. + */ + AcroChoiceFlags[AcroChoiceFlags["CommitOnSelChange"] = flag(27 - 1)] = "CommitOnSelChange"; + })(exports.AcroChoiceFlags || (exports.AcroChoiceFlags = {})); + + var PDFAcroChoice = /** @class */ (function (_super) { + __extends(PDFAcroChoice, _super); + function PDFAcroChoice() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroChoice.prototype.setValues = function (values) { + if (this.hasFlag(exports.AcroChoiceFlags.Combo) && + !this.hasFlag(exports.AcroChoiceFlags.Edit) && + !this.valuesAreValid(values)) { + throw new InvalidAcroFieldValueError(); + } + if (values.length === 0) { + this.dict.delete(PDFName.of('V')); + } + if (values.length === 1) { + this.dict.set(PDFName.of('V'), values[0]); + } + if (values.length > 1) { + if (!this.hasFlag(exports.AcroChoiceFlags.MultiSelect)) { + throw new MultiSelectValueError(); + } + this.dict.set(PDFName.of('V'), this.dict.context.obj(values)); + } + this.updateSelectedIndices(values); + }; + PDFAcroChoice.prototype.valuesAreValid = function (values) { + var options = this.getOptions(); + var _loop_1 = function (idx, len) { + var val = values[idx].decodeText(); + if (!options.find(function (o) { return val === (o.display || o.value).decodeText(); })) { + return { value: false }; + } + }; + for (var idx = 0, len = values.length; idx < len; idx++) { + var state_1 = _loop_1(idx); + if (typeof state_1 === "object") + return state_1.value; + } + return true; + }; + PDFAcroChoice.prototype.updateSelectedIndices = function (values) { + if (values.length > 1) { + var indices = new Array(values.length); + var options = this.getOptions(); + var _loop_2 = function (idx, len) { + var val = values[idx].decodeText(); + indices[idx] = options.findIndex(function (o) { return val === (o.display || o.value).decodeText(); }); + }; + for (var idx = 0, len = values.length; idx < len; idx++) { + _loop_2(idx, len); + } + this.dict.set(PDFName.of('I'), this.dict.context.obj(indices.sort())); + } + else { + this.dict.delete(PDFName.of('I')); + } + }; + PDFAcroChoice.prototype.getValues = function () { + var v = this.V(); + if (v instanceof PDFString || v instanceof PDFHexString) + return [v]; + if (v instanceof PDFArray) { + var values = []; + for (var idx = 0, len = v.size(); idx < len; idx++) { + var value = v.lookup(idx); + if (value instanceof PDFString || value instanceof PDFHexString) { + values.push(value); + } + } + return values; + } + return []; + }; + PDFAcroChoice.prototype.Opt = function () { + return this.dict.lookupMaybe(PDFName.of('Opt'), PDFString, PDFHexString, PDFArray); + }; + PDFAcroChoice.prototype.setOptions = function (options) { + var newOpt = new Array(options.length); + for (var idx = 0, len = options.length; idx < len; idx++) { + var _a = options[idx], value = _a.value, display = _a.display; + newOpt[idx] = this.dict.context.obj([value, display || value]); + } + this.dict.set(PDFName.of('Opt'), this.dict.context.obj(newOpt)); + }; + PDFAcroChoice.prototype.getOptions = function () { + var Opt = this.Opt(); + // Not supposed to happen - Opt _should_ always be `PDFArray | undefined` + if (Opt instanceof PDFString || Opt instanceof PDFHexString) { + return [{ value: Opt, display: Opt }]; + } + if (Opt instanceof PDFArray) { + var res = []; + for (var idx = 0, len = Opt.size(); idx < len; idx++) { + var item = Opt.lookup(idx); + // If `item` is a string, use that as both the export and text value + if (item instanceof PDFString || item instanceof PDFHexString) { + res.push({ value: item, display: item }); + } + // If `item` is an array of one, treat it the same as just a string, + // if it's an array of two then `item[0]` is the export value and + // `item[1]` is the text value + if (item instanceof PDFArray) { + if (item.size() > 0) { + var first = item.lookup(0, PDFString, PDFHexString); + var second = item.lookupMaybe(1, PDFString, PDFHexString); + res.push({ value: first, display: second || first }); + } + } + } + return res; + } + return []; + }; + return PDFAcroChoice; + }(PDFAcroTerminal)); + + var PDFAcroComboBox = /** @class */ (function (_super) { + __extends(PDFAcroComboBox, _super); + function PDFAcroComboBox() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroComboBox.fromDict = function (dict, ref) { + return new PDFAcroComboBox(dict, ref); + }; + PDFAcroComboBox.create = function (context) { + var dict = context.obj({ + FT: 'Ch', + Ff: exports.AcroChoiceFlags.Combo, + Kids: [], + }); + var ref = context.register(dict); + return new PDFAcroComboBox(dict, ref); + }; + return PDFAcroComboBox; + }(PDFAcroChoice)); + + var PDFAcroNonTerminal = /** @class */ (function (_super) { + __extends(PDFAcroNonTerminal, _super); + function PDFAcroNonTerminal() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroNonTerminal.prototype.addField = function (field) { + var Kids = this.normalizedEntries().Kids; + Kids === null || Kids === void 0 ? void 0 : Kids.push(field); + }; + PDFAcroNonTerminal.prototype.normalizedEntries = function () { + var Kids = this.Kids(); + if (!Kids) { + Kids = this.dict.context.obj([]); + this.dict.set(PDFName.of('Kids'), Kids); + } + return { Kids: Kids }; + }; + PDFAcroNonTerminal.fromDict = function (dict, ref) { + return new PDFAcroNonTerminal(dict, ref); + }; + PDFAcroNonTerminal.create = function (context) { + var dict = context.obj({}); + var ref = context.register(dict); + return new PDFAcroNonTerminal(dict, ref); + }; + return PDFAcroNonTerminal; + }(PDFAcroField)); + + var PDFAcroSignature = /** @class */ (function (_super) { + __extends(PDFAcroSignature, _super); + function PDFAcroSignature() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroSignature.fromDict = function (dict, ref) { + return new PDFAcroSignature(dict, ref); + }; + return PDFAcroSignature; + }(PDFAcroTerminal)); + + var PDFAcroText = /** @class */ (function (_super) { + __extends(PDFAcroText, _super); + function PDFAcroText() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroText.prototype.MaxLen = function () { + var maxLen = this.dict.lookup(PDFName.of('MaxLen')); + if (maxLen instanceof PDFNumber) + return maxLen; + return undefined; + }; + PDFAcroText.prototype.Q = function () { + var q = this.dict.lookup(PDFName.of('Q')); + if (q instanceof PDFNumber) + return q; + return undefined; + }; + PDFAcroText.prototype.setMaxLength = function (maxLength) { + this.dict.set(PDFName.of('MaxLen'), PDFNumber.of(maxLength)); + }; + PDFAcroText.prototype.removeMaxLength = function () { + this.dict.delete(PDFName.of('MaxLen')); + }; + PDFAcroText.prototype.getMaxLength = function () { + var _a; + return (_a = this.MaxLen()) === null || _a === void 0 ? void 0 : _a.asNumber(); + }; + PDFAcroText.prototype.setQuadding = function (quadding) { + this.dict.set(PDFName.of('Q'), PDFNumber.of(quadding)); + }; + PDFAcroText.prototype.getQuadding = function () { + var _a; + return (_a = this.Q()) === null || _a === void 0 ? void 0 : _a.asNumber(); + }; + PDFAcroText.prototype.setValue = function (value) { + this.dict.set(PDFName.of('V'), value); + // const widgets = this.getWidgets(); + // for (let idx = 0, len = widgets.length; idx < len; idx++) { + // const widget = widgets[idx]; + // const state = widget.getOnValue() === value ? value : PDFName.of('Off'); + // widget.setAppearanceState(state); + // } + }; + PDFAcroText.prototype.removeValue = function () { + this.dict.delete(PDFName.of('V')); + }; + PDFAcroText.prototype.getValue = function () { + var v = this.V(); + if (v instanceof PDFString || v instanceof PDFHexString) + return v; + return undefined; + }; + PDFAcroText.fromDict = function (dict, ref) { return new PDFAcroText(dict, ref); }; + PDFAcroText.create = function (context) { + var dict = context.obj({ + FT: 'Tx', + Kids: [], + }); + var ref = context.register(dict); + return new PDFAcroText(dict, ref); + }; + return PDFAcroText; + }(PDFAcroTerminal)); + + var PDFAcroPushButton = /** @class */ (function (_super) { + __extends(PDFAcroPushButton, _super); + function PDFAcroPushButton() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroPushButton.fromDict = function (dict, ref) { + return new PDFAcroPushButton(dict, ref); + }; + PDFAcroPushButton.create = function (context) { + var dict = context.obj({ + FT: 'Btn', + Ff: exports.AcroButtonFlags.PushButton, + Kids: [], + }); + var ref = context.register(dict); + return new PDFAcroPushButton(dict, ref); + }; + return PDFAcroPushButton; + }(PDFAcroButton)); + + var PDFAcroRadioButton = /** @class */ (function (_super) { + __extends(PDFAcroRadioButton, _super); + function PDFAcroRadioButton() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroRadioButton.prototype.setValue = function (value) { + var onValues = this.getOnValues(); + if (!onValues.includes(value) && value !== PDFName.of('Off')) { + throw new InvalidAcroFieldValueError(); + } + this.dict.set(PDFName.of('V'), value); + var widgets = this.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var state = widget.getOnValue() === value ? value : PDFName.of('Off'); + widget.setAppearanceState(state); + } + }; + PDFAcroRadioButton.prototype.getValue = function () { + var v = this.V(); + if (v instanceof PDFName) + return v; + return PDFName.of('Off'); + }; + PDFAcroRadioButton.prototype.getOnValues = function () { + var widgets = this.getWidgets(); + var onValues = []; + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var onValue = widgets[idx].getOnValue(); + if (onValue) + onValues.push(onValue); + } + return onValues; + }; + PDFAcroRadioButton.fromDict = function (dict, ref) { + return new PDFAcroRadioButton(dict, ref); + }; + PDFAcroRadioButton.create = function (context) { + var dict = context.obj({ + FT: 'Btn', + Ff: exports.AcroButtonFlags.Radio, + Kids: [], + }); + var ref = context.register(dict); + return new PDFAcroRadioButton(dict, ref); + }; + return PDFAcroRadioButton; + }(PDFAcroButton)); + + var PDFAcroListBox = /** @class */ (function (_super) { + __extends(PDFAcroListBox, _super); + function PDFAcroListBox() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFAcroListBox.fromDict = function (dict, ref) { + return new PDFAcroListBox(dict, ref); + }; + PDFAcroListBox.create = function (context) { + var dict = context.obj({ + FT: 'Ch', + Kids: [], + }); + var ref = context.register(dict); + return new PDFAcroListBox(dict, ref); + }; + return PDFAcroListBox; + }(PDFAcroChoice)); + + var createPDFAcroFields = function (kidDicts) { + if (!kidDicts) + return []; + var kids = []; + for (var idx = 0, len = kidDicts.size(); idx < len; idx++) { + var ref = kidDicts.get(idx); + var dict = kidDicts.lookup(idx); + // if (dict instanceof PDFDict) kids.push(PDFAcroField.fromDict(dict)); + if (ref instanceof PDFRef && dict instanceof PDFDict) { + kids.push([createPDFAcroField(dict, ref), ref]); + } + } + return kids; + }; + var createPDFAcroField = function (dict, ref) { + var isNonTerminal = isNonTerminalAcroField(dict); + if (isNonTerminal) + return PDFAcroNonTerminal.fromDict(dict, ref); + return createPDFAcroTerminal(dict, ref); + }; + // TODO: Maybe just check if the dict is *not* a widget? That might be better. + // According to the PDF spec: + // + // > A field's children in the hierarchy may also include widget annotations + // > that define its appearance on the page. A field that has children that + // > are fields is called a non-terminal field. A field that does not have + // > children that are fields is called a terminal field. + // + // The spec is not entirely clear about how to determine whether a given + // dictionary represents an acrofield or a widget annotation. So we will assume + // that a dictionary is an acrofield if it is a member of the `/Kids` array + // and it contains a `/T` entry (widgets do not have `/T` entries). This isn't + // a bullet proof solution, because the `/T` entry is technically defined as + // optional for acrofields by the PDF spec. But in practice all acrofields seem + // to have a `/T` entry defined. + var isNonTerminalAcroField = function (dict) { + var kids = dict.lookup(PDFName.of('Kids')); + if (kids instanceof PDFArray) { + for (var idx = 0, len = kids.size(); idx < len; idx++) { + var kid = kids.lookup(idx); + var kidIsField = kid instanceof PDFDict && kid.has(PDFName.of('T')); + if (kidIsField) + return true; + } + } + return false; + }; + var createPDFAcroTerminal = function (dict, ref) { + var ftNameOrRef = getInheritableAttribute(dict, PDFName.of('FT')); + var type = dict.context.lookup(ftNameOrRef, PDFName); + if (type === PDFName.of('Btn')) + return createPDFAcroButton(dict, ref); + if (type === PDFName.of('Ch')) + return createPDFAcroChoice(dict, ref); + if (type === PDFName.of('Tx')) + return PDFAcroText.fromDict(dict, ref); + if (type === PDFName.of('Sig')) + return PDFAcroSignature.fromDict(dict, ref); + // We should never reach this line. But there are a lot of weird PDFs out + // there. So, just to be safe, we'll try to handle things gracefully instead + // of throwing an error. + return PDFAcroTerminal.fromDict(dict, ref); + }; + var createPDFAcroButton = function (dict, ref) { + var _a; + var ffNumberOrRef = getInheritableAttribute(dict, PDFName.of('Ff')); + var ffNumber = dict.context.lookupMaybe(ffNumberOrRef, PDFNumber); + var flags = (_a = ffNumber === null || ffNumber === void 0 ? void 0 : ffNumber.asNumber()) !== null && _a !== void 0 ? _a : 0; + if (flagIsSet(flags, exports.AcroButtonFlags.PushButton)) { + return PDFAcroPushButton.fromDict(dict, ref); + } + else if (flagIsSet(flags, exports.AcroButtonFlags.Radio)) { + return PDFAcroRadioButton.fromDict(dict, ref); + } + else { + return PDFAcroCheckBox.fromDict(dict, ref); + } + }; + var createPDFAcroChoice = function (dict, ref) { + var _a; + var ffNumberOrRef = getInheritableAttribute(dict, PDFName.of('Ff')); + var ffNumber = dict.context.lookupMaybe(ffNumberOrRef, PDFNumber); + var flags = (_a = ffNumber === null || ffNumber === void 0 ? void 0 : ffNumber.asNumber()) !== null && _a !== void 0 ? _a : 0; + if (flagIsSet(flags, exports.AcroChoiceFlags.Combo)) { + return PDFAcroComboBox.fromDict(dict, ref); + } + else { + return PDFAcroListBox.fromDict(dict, ref); + } + }; + var flagIsSet = function (flags, flag) { + return (flags & flag) !== 0; + }; + var getInheritableAttribute = function (startNode, name) { + var attribute; + ascend(startNode, function (node) { + if (!attribute) + attribute = node.get(name); + }); + return attribute; + }; + var ascend = function (startNode, visitor) { + visitor(startNode); + var Parent = startNode.lookupMaybe(PDFName.of('Parent'), PDFDict); + if (Parent) + ascend(Parent, visitor); + }; + + var PDFAcroForm = /** @class */ (function () { + function PDFAcroForm(dict) { + this.dict = dict; + } + PDFAcroForm.prototype.Fields = function () { + var fields = this.dict.lookup(PDFName.of('Fields')); + if (fields instanceof PDFArray) + return fields; + return undefined; + }; + PDFAcroForm.prototype.getFields = function () { + var Fields = this.normalizedEntries().Fields; + var fields = new Array(Fields.size()); + for (var idx = 0, len = Fields.size(); idx < len; idx++) { + var ref = Fields.get(idx); + var dict = Fields.lookup(idx, PDFDict); + fields[idx] = [createPDFAcroField(dict, ref), ref]; + } + return fields; + }; + PDFAcroForm.prototype.getAllFields = function () { + var allFields = []; + var pushFields = function (fields) { + if (!fields) + return; + for (var idx = 0, len = fields.length; idx < len; idx++) { + var field = fields[idx]; + allFields.push(field); + var fieldModel = field[0]; + if (fieldModel instanceof PDFAcroNonTerminal) { + pushFields(createPDFAcroFields(fieldModel.Kids())); + } + } + }; + pushFields(this.getFields()); + return allFields; + }; + PDFAcroForm.prototype.addField = function (field) { + var Fields = this.normalizedEntries().Fields; + Fields === null || Fields === void 0 ? void 0 : Fields.push(field); + }; + PDFAcroForm.prototype.removeField = function (field) { + var parent = field.getParent(); + var fields = parent === undefined ? this.normalizedEntries().Fields : parent.Kids(); + var index = fields === null || fields === void 0 ? void 0 : fields.indexOf(field.ref); + if (fields === undefined || index === undefined) { + throw new Error("Tried to remove inexistent field " + field.getFullyQualifiedName()); + } + fields.remove(index); + if (parent !== undefined && fields.size() === 0) { + this.removeField(parent); + } + }; + PDFAcroForm.prototype.normalizedEntries = function () { + var Fields = this.Fields(); + if (!Fields) { + Fields = this.dict.context.obj([]); + this.dict.set(PDFName.of('Fields'), Fields); + } + return { Fields: Fields }; + }; + PDFAcroForm.fromDict = function (dict) { return new PDFAcroForm(dict); }; + PDFAcroForm.create = function (context) { + var dict = context.obj({ Fields: [] }); + return new PDFAcroForm(dict); + }; + return PDFAcroForm; + }()); + + var PDFCatalog = /** @class */ (function (_super) { + __extends(PDFCatalog, _super); + function PDFCatalog() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFCatalog.prototype.Pages = function () { + return this.lookup(PDFName.of('Pages'), PDFDict); + }; + PDFCatalog.prototype.AcroForm = function () { + return this.lookupMaybe(PDFName.of('AcroForm'), PDFDict); + }; + PDFCatalog.prototype.getAcroForm = function () { + var dict = this.AcroForm(); + if (!dict) + return undefined; + return PDFAcroForm.fromDict(dict); + }; + PDFCatalog.prototype.getOrCreateAcroForm = function () { + var acroForm = this.getAcroForm(); + if (!acroForm) { + acroForm = PDFAcroForm.create(this.context); + var acroFormRef = this.context.register(acroForm.dict); + this.set(PDFName.of('AcroForm'), acroFormRef); + } + return acroForm; + }; + PDFCatalog.prototype.ViewerPreferences = function () { + return this.lookupMaybe(PDFName.of('ViewerPreferences'), PDFDict); + }; + PDFCatalog.prototype.getViewerPreferences = function () { + var dict = this.ViewerPreferences(); + if (!dict) + return undefined; + return ViewerPreferences.fromDict(dict); + }; + PDFCatalog.prototype.getOrCreateViewerPreferences = function () { + var viewerPrefs = this.getViewerPreferences(); + if (!viewerPrefs) { + viewerPrefs = ViewerPreferences.create(this.context); + var viewerPrefsRef = this.context.register(viewerPrefs.dict); + this.set(PDFName.of('ViewerPreferences'), viewerPrefsRef); + } + return viewerPrefs; + }; + /** + * Inserts the given ref as a leaf node of this catalog's page tree at the + * specified index (zero-based). Also increments the `Count` of each node in + * the page tree hierarchy to accomodate the new page. + * + * Returns the ref of the PDFPageTree node into which `leafRef` was inserted. + */ + PDFCatalog.prototype.insertLeafNode = function (leafRef, index) { + var pagesRef = this.get(PDFName.of('Pages')); + var maybeParentRef = this.Pages().insertLeafNode(leafRef, index); + return maybeParentRef || pagesRef; + }; + PDFCatalog.prototype.removeLeafNode = function (index) { + this.Pages().removeLeafNode(index); + }; + PDFCatalog.withContextAndPages = function (context, pages) { + var dict = new Map(); + dict.set(PDFName.of('Type'), PDFName.of('Catalog')); + dict.set(PDFName.of('Pages'), pages); + return new PDFCatalog(dict, context); + }; + PDFCatalog.fromMapWithContext = function (map, context) { + return new PDFCatalog(map, context); + }; + return PDFCatalog; + }(PDFDict)); + + var PDFPageTree = /** @class */ (function (_super) { + __extends(PDFPageTree, _super); + function PDFPageTree() { + return _super !== null && _super.apply(this, arguments) || this; + } + PDFPageTree.prototype.Parent = function () { + return this.lookup(PDFName.of('Parent')); + }; + PDFPageTree.prototype.Kids = function () { + return this.lookup(PDFName.of('Kids'), PDFArray); + }; + PDFPageTree.prototype.Count = function () { + return this.lookup(PDFName.of('Count'), PDFNumber); + }; + PDFPageTree.prototype.pushTreeNode = function (treeRef) { + var Kids = this.Kids(); + Kids.push(treeRef); + }; + PDFPageTree.prototype.pushLeafNode = function (leafRef) { + var Kids = this.Kids(); + this.insertLeafKid(Kids.size(), leafRef); + }; + /** + * Inserts the given ref as a leaf node of this page tree at the specified + * index (zero-based). Also increments the `Count` of each page tree in the + * hierarchy to accomodate the new page. + * + * Returns the ref of the PDFPageTree node into which `leafRef` was inserted, + * or `undefined` if it was inserted into the root node (the PDFPageTree upon + * which the method was first called). + */ + PDFPageTree.prototype.insertLeafNode = function (leafRef, targetIndex) { + var Kids = this.Kids(); + var Count = this.Count().asNumber(); + if (targetIndex > Count) { + throw new InvalidTargetIndexError(targetIndex, Count); + } + var leafsRemainingUntilTarget = targetIndex; + for (var idx = 0, len = Kids.size(); idx < len; idx++) { + if (leafsRemainingUntilTarget === 0) { + // Insert page and return + this.insertLeafKid(idx, leafRef); + return undefined; + } + var kidRef = Kids.get(idx); + var kid = this.context.lookup(kidRef); + if (kid instanceof PDFPageTree) { + if (kid.Count().asNumber() > leafsRemainingUntilTarget) { + // Dig in + return (kid.insertLeafNode(leafRef, leafsRemainingUntilTarget) || kidRef); + } + else { + // Move on + leafsRemainingUntilTarget -= kid.Count().asNumber(); + } + } + if (kid instanceof PDFPageLeaf) { + // Move on + leafsRemainingUntilTarget -= 1; + } + } + if (leafsRemainingUntilTarget === 0) { + // Insert page at the end and return + this.insertLeafKid(Kids.size(), leafRef); + return undefined; + } + // Should never get here if `targetIndex` is valid + throw new CorruptPageTreeError(targetIndex, 'insertLeafNode'); + }; + /** + * Removes the leaf node at the specified index (zero-based) from this page + * tree. Also decrements the `Count` of each page tree in the hierarchy to + * account for the removed page. + * + * If `prune` is true, then intermediate tree nodes will be removed from the + * tree if they contain 0 children after the leaf node is removed. + */ + PDFPageTree.prototype.removeLeafNode = function (targetIndex, prune) { + if (prune === void 0) { prune = true; } + var Kids = this.Kids(); + var Count = this.Count().asNumber(); + if (targetIndex >= Count) { + throw new InvalidTargetIndexError(targetIndex, Count); + } + var leafsRemainingUntilTarget = targetIndex; + for (var idx = 0, len = Kids.size(); idx < len; idx++) { + var kidRef = Kids.get(idx); + var kid = this.context.lookup(kidRef); + if (kid instanceof PDFPageTree) { + if (kid.Count().asNumber() > leafsRemainingUntilTarget) { + // Dig in + kid.removeLeafNode(leafsRemainingUntilTarget, prune); + if (prune && kid.Kids().size() === 0) + Kids.remove(idx); + return; + } + else { + // Move on + leafsRemainingUntilTarget -= kid.Count().asNumber(); + } + } + if (kid instanceof PDFPageLeaf) { + if (leafsRemainingUntilTarget === 0) { + // Remove page and return + this.removeKid(idx); + return; + } + else { + // Move on + leafsRemainingUntilTarget -= 1; + } + } + } + // Should never get here if `targetIndex` is valid + throw new CorruptPageTreeError(targetIndex, 'removeLeafNode'); + }; + PDFPageTree.prototype.ascend = function (visitor) { + visitor(this); + var Parent = this.Parent(); + if (Parent) + Parent.ascend(visitor); + }; + /** Performs a Post-Order traversal of this page tree */ + PDFPageTree.prototype.traverse = function (visitor) { + var Kids = this.Kids(); + for (var idx = 0, len = Kids.size(); idx < len; idx++) { + var kidRef = Kids.get(idx); + var kid = this.context.lookup(kidRef); + if (kid instanceof PDFPageTree) + kid.traverse(visitor); + visitor(kid, kidRef); + } + }; + PDFPageTree.prototype.insertLeafKid = function (kidIdx, leafRef) { + var Kids = this.Kids(); + this.ascend(function (node) { + var newCount = node.Count().asNumber() + 1; + node.set(PDFName.of('Count'), PDFNumber.of(newCount)); + }); + Kids.insert(kidIdx, leafRef); + }; + PDFPageTree.prototype.removeKid = function (kidIdx) { + var Kids = this.Kids(); + var kid = Kids.lookup(kidIdx); + if (kid instanceof PDFPageLeaf) { + this.ascend(function (node) { + var newCount = node.Count().asNumber() - 1; + node.set(PDFName.of('Count'), PDFNumber.of(newCount)); + }); + } + Kids.remove(kidIdx); + }; + PDFPageTree.withContext = function (context, parent) { + var dict = new Map(); + dict.set(PDFName.of('Type'), PDFName.of('Pages')); + dict.set(PDFName.of('Kids'), context.obj([])); + dict.set(PDFName.of('Count'), context.obj(0)); + if (parent) + dict.set(PDFName.of('Parent'), parent); + return new PDFPageTree(dict, context); + }; + PDFPageTree.fromMapWithContext = function (map, context) { + return new PDFPageTree(map, context); + }; + return PDFPageTree; + }(PDFDict)); + + var IsDigit = new Uint8Array(256); + IsDigit[CharCodes$1.Zero] = 1; + IsDigit[CharCodes$1.One] = 1; + IsDigit[CharCodes$1.Two] = 1; + IsDigit[CharCodes$1.Three] = 1; + IsDigit[CharCodes$1.Four] = 1; + IsDigit[CharCodes$1.Five] = 1; + IsDigit[CharCodes$1.Six] = 1; + IsDigit[CharCodes$1.Seven] = 1; + IsDigit[CharCodes$1.Eight] = 1; + IsDigit[CharCodes$1.Nine] = 1; + var IsNumericPrefix = new Uint8Array(256); + IsNumericPrefix[CharCodes$1.Period] = 1; + IsNumericPrefix[CharCodes$1.Plus] = 1; + IsNumericPrefix[CharCodes$1.Minus] = 1; + var IsNumeric = new Uint8Array(256); + for (var idx$2 = 0, len$1 = 256; idx$2 < len$1; idx$2++) { + IsNumeric[idx$2] = IsDigit[idx$2] || IsNumericPrefix[idx$2] ? 1 : 0; + } + + var Newline = CharCodes$1.Newline, CarriageReturn = CharCodes$1.CarriageReturn; + // TODO: Throw error if eof is reached before finishing object parse... + var BaseParser = /** @class */ (function () { + function BaseParser(bytes, capNumbers) { + if (capNumbers === void 0) { capNumbers = false; } + this.bytes = bytes; + this.capNumbers = capNumbers; + } + BaseParser.prototype.parseRawInt = function () { + var value = ''; + while (!this.bytes.done()) { + var byte = this.bytes.peek(); + if (!IsDigit[byte]) + break; + value += charFromCode(this.bytes.next()); + } + var numberValue = Number(value); + if (!value || !isFinite(numberValue)) { + throw new NumberParsingError(this.bytes.position(), value); + } + return numberValue; + }; + // TODO: Maybe handle exponential format? + // TODO: Compare performance of string concatenation to charFromCode(...bytes) + BaseParser.prototype.parseRawNumber = function () { + var value = ''; + // Parse integer-part, the leading (+ | - | . | 0-9) + while (!this.bytes.done()) { + var byte = this.bytes.peek(); + if (!IsNumeric[byte]) + break; + value += charFromCode(this.bytes.next()); + if (byte === CharCodes$1.Period) + break; + } + // Parse decimal-part, the trailing (0-9) + while (!this.bytes.done()) { + var byte = this.bytes.peek(); + if (!IsDigit[byte]) + break; + value += charFromCode(this.bytes.next()); + } + var numberValue = Number(value); + if (!value || !isFinite(numberValue)) { + throw new NumberParsingError(this.bytes.position(), value); + } + if (numberValue > Number.MAX_SAFE_INTEGER) { + if (this.capNumbers) { + var msg = "Parsed number that is too large for some PDF readers: " + value + ", using Number.MAX_SAFE_INTEGER instead."; + console.warn(msg); + return Number.MAX_SAFE_INTEGER; + } + else { + var msg = "Parsed number that is too large for some PDF readers: " + value + ", not capping."; + console.warn(msg); + } + } + return numberValue; + }; + BaseParser.prototype.skipWhitespace = function () { + while (!this.bytes.done() && IsWhitespace[this.bytes.peek()]) { + this.bytes.next(); + } + }; + BaseParser.prototype.skipLine = function () { + while (!this.bytes.done()) { + var byte = this.bytes.peek(); + if (byte === Newline || byte === CarriageReturn) + return; + this.bytes.next(); + } + }; + BaseParser.prototype.skipComment = function () { + if (this.bytes.peek() !== CharCodes$1.Percent) + return false; + while (!this.bytes.done()) { + var byte = this.bytes.peek(); + if (byte === Newline || byte === CarriageReturn) + return true; + this.bytes.next(); + } + return true; + }; + BaseParser.prototype.skipWhitespaceAndComments = function () { + this.skipWhitespace(); + while (this.skipComment()) + this.skipWhitespace(); + }; + BaseParser.prototype.matchKeyword = function (keyword) { + var initialOffset = this.bytes.offset(); + for (var idx = 0, len = keyword.length; idx < len; idx++) { + if (this.bytes.done() || this.bytes.next() !== keyword[idx]) { + this.bytes.moveTo(initialOffset); + return false; + } + } + return true; + }; + return BaseParser; + }()); + + // TODO: See how line/col tracking affects performance + var ByteStream = /** @class */ (function () { + function ByteStream(bytes) { + this.idx = 0; + this.line = 0; + this.column = 0; + this.bytes = bytes; + this.length = this.bytes.length; + } + ByteStream.prototype.moveTo = function (offset) { + this.idx = offset; + }; + ByteStream.prototype.next = function () { + var byte = this.bytes[this.idx++]; + if (byte === CharCodes$1.Newline) { + this.line += 1; + this.column = 0; + } + else { + this.column += 1; + } + return byte; + }; + ByteStream.prototype.assertNext = function (expected) { + if (this.peek() !== expected) { + throw new NextByteAssertionError(this.position(), expected, this.peek()); + } + return this.next(); + }; + ByteStream.prototype.peek = function () { + return this.bytes[this.idx]; + }; + ByteStream.prototype.peekAhead = function (steps) { + return this.bytes[this.idx + steps]; + }; + ByteStream.prototype.peekAt = function (offset) { + return this.bytes[offset]; + }; + ByteStream.prototype.done = function () { + return this.idx >= this.length; + }; + ByteStream.prototype.offset = function () { + return this.idx; + }; + ByteStream.prototype.slice = function (start, end) { + return this.bytes.slice(start, end); + }; + ByteStream.prototype.position = function () { + return { line: this.line, column: this.column, offset: this.idx }; + }; + ByteStream.of = function (bytes) { return new ByteStream(bytes); }; + ByteStream.fromPDFRawStream = function (rawStream) { + return ByteStream.of(decodePDFRawStream(rawStream).decode()); + }; + return ByteStream; + }()); + + var Space = CharCodes$1.Space, CarriageReturn$1 = CharCodes$1.CarriageReturn, Newline$1 = CharCodes$1.Newline; + var stream = [ + CharCodes$1.s, + CharCodes$1.t, + CharCodes$1.r, + CharCodes$1.e, + CharCodes$1.a, + CharCodes$1.m, + ]; + var endstream = [ + CharCodes$1.e, + CharCodes$1.n, + CharCodes$1.d, + CharCodes$1.s, + CharCodes$1.t, + CharCodes$1.r, + CharCodes$1.e, + CharCodes$1.a, + CharCodes$1.m, + ]; + var Keywords = { + header: [ + CharCodes$1.Percent, + CharCodes$1.P, + CharCodes$1.D, + CharCodes$1.F, + CharCodes$1.Dash, + ], + eof: [ + CharCodes$1.Percent, + CharCodes$1.Percent, + CharCodes$1.E, + CharCodes$1.O, + CharCodes$1.F, + ], + obj: [CharCodes$1.o, CharCodes$1.b, CharCodes$1.j], + endobj: [ + CharCodes$1.e, + CharCodes$1.n, + CharCodes$1.d, + CharCodes$1.o, + CharCodes$1.b, + CharCodes$1.j, + ], + xref: [CharCodes$1.x, CharCodes$1.r, CharCodes$1.e, CharCodes$1.f], + trailer: [ + CharCodes$1.t, + CharCodes$1.r, + CharCodes$1.a, + CharCodes$1.i, + CharCodes$1.l, + CharCodes$1.e, + CharCodes$1.r, + ], + startxref: [ + CharCodes$1.s, + CharCodes$1.t, + CharCodes$1.a, + CharCodes$1.r, + CharCodes$1.t, + CharCodes$1.x, + CharCodes$1.r, + CharCodes$1.e, + CharCodes$1.f, + ], + true: [CharCodes$1.t, CharCodes$1.r, CharCodes$1.u, CharCodes$1.e], + false: [CharCodes$1.f, CharCodes$1.a, CharCodes$1.l, CharCodes$1.s, CharCodes$1.e], + null: [CharCodes$1.n, CharCodes$1.u, CharCodes$1.l, CharCodes$1.l], + stream: stream, + streamEOF1: __spreadArrays(stream, [Space, CarriageReturn$1, Newline$1]), + streamEOF2: __spreadArrays(stream, [CarriageReturn$1, Newline$1]), + streamEOF3: __spreadArrays(stream, [CarriageReturn$1]), + streamEOF4: __spreadArrays(stream, [Newline$1]), + endstream: endstream, + EOF1endstream: __spreadArrays([CarriageReturn$1, Newline$1], endstream), + EOF2endstream: __spreadArrays([CarriageReturn$1], endstream), + EOF3endstream: __spreadArrays([Newline$1], endstream), + }; + + // TODO: Throw error if eof is reached before finishing object parse... + var PDFObjectParser = /** @class */ (function (_super) { + __extends(PDFObjectParser, _super); + function PDFObjectParser(byteStream, context, capNumbers) { + if (capNumbers === void 0) { capNumbers = false; } + var _this = _super.call(this, byteStream, capNumbers) || this; + _this.context = context; + return _this; + } + // TODO: Is it possible to reduce duplicate parsing for ref lookaheads? + PDFObjectParser.prototype.parseObject = function () { + this.skipWhitespaceAndComments(); + if (this.matchKeyword(Keywords.true)) + return PDFBool.True; + if (this.matchKeyword(Keywords.false)) + return PDFBool.False; + if (this.matchKeyword(Keywords.null)) + return PDFNull$1; + var byte = this.bytes.peek(); + if (byte === CharCodes$1.LessThan && + this.bytes.peekAhead(1) === CharCodes$1.LessThan) { + return this.parseDictOrStream(); + } + if (byte === CharCodes$1.LessThan) + return this.parseHexString(); + if (byte === CharCodes$1.LeftParen) + return this.parseString(); + if (byte === CharCodes$1.ForwardSlash) + return this.parseName(); + if (byte === CharCodes$1.LeftSquareBracket) + return this.parseArray(); + if (IsNumeric[byte]) + return this.parseNumberOrRef(); + throw new PDFObjectParsingError(this.bytes.position(), byte); + }; + PDFObjectParser.prototype.parseNumberOrRef = function () { + var firstNum = this.parseRawNumber(); + this.skipWhitespaceAndComments(); + var lookaheadStart = this.bytes.offset(); + if (IsDigit[this.bytes.peek()]) { + var secondNum = this.parseRawNumber(); + this.skipWhitespaceAndComments(); + if (this.bytes.peek() === CharCodes$1.R) { + this.bytes.assertNext(CharCodes$1.R); + return PDFRef.of(firstNum, secondNum); + } + } + this.bytes.moveTo(lookaheadStart); + return PDFNumber.of(firstNum); + }; + // TODO: Maybe update PDFHexString.of() logic to remove whitespace and validate input? + PDFObjectParser.prototype.parseHexString = function () { + var value = ''; + this.bytes.assertNext(CharCodes$1.LessThan); + while (!this.bytes.done() && this.bytes.peek() !== CharCodes$1.GreaterThan) { + value += charFromCode(this.bytes.next()); + } + this.bytes.assertNext(CharCodes$1.GreaterThan); + return PDFHexString.of(value); + }; + PDFObjectParser.prototype.parseString = function () { + var nestingLvl = 0; + var isEscaped = false; + var value = ''; + while (!this.bytes.done()) { + var byte = this.bytes.next(); + value += charFromCode(byte); + // Check for unescaped parenthesis + if (!isEscaped) { + if (byte === CharCodes$1.LeftParen) + nestingLvl += 1; + if (byte === CharCodes$1.RightParen) + nestingLvl -= 1; + } + // Track whether current character is being escaped or not + if (byte === CharCodes$1.BackSlash) { + isEscaped = !isEscaped; + } + else if (isEscaped) { + isEscaped = false; + } + // Once (if) the unescaped parenthesis balance out, return their contents + if (nestingLvl === 0) { + // Remove the outer parens so they aren't part of the contents + return PDFString.of(value.substring(1, value.length - 1)); + } + } + throw new UnbalancedParenthesisError(this.bytes.position()); + }; + // TODO: Compare performance of string concatenation to charFromCode(...bytes) + // TODO: Maybe preallocate small Uint8Array if can use charFromCode? + PDFObjectParser.prototype.parseName = function () { + this.bytes.assertNext(CharCodes$1.ForwardSlash); + var name = ''; + while (!this.bytes.done()) { + var byte = this.bytes.peek(); + if (IsWhitespace[byte] || IsDelimiter[byte]) + break; + name += charFromCode(byte); + this.bytes.next(); + } + return PDFName.of(name); + }; + PDFObjectParser.prototype.parseArray = function () { + this.bytes.assertNext(CharCodes$1.LeftSquareBracket); + this.skipWhitespaceAndComments(); + var pdfArray = PDFArray.withContext(this.context); + while (this.bytes.peek() !== CharCodes$1.RightSquareBracket) { + var element = this.parseObject(); + pdfArray.push(element); + this.skipWhitespaceAndComments(); + } + this.bytes.assertNext(CharCodes$1.RightSquareBracket); + return pdfArray; + }; + PDFObjectParser.prototype.parseDict = function () { + this.bytes.assertNext(CharCodes$1.LessThan); + this.bytes.assertNext(CharCodes$1.LessThan); + this.skipWhitespaceAndComments(); + var dict = new Map(); + while (!this.bytes.done() && + this.bytes.peek() !== CharCodes$1.GreaterThan && + this.bytes.peekAhead(1) !== CharCodes$1.GreaterThan) { + var key = this.parseName(); + var value = this.parseObject(); + dict.set(key, value); + this.skipWhitespaceAndComments(); + } + this.skipWhitespaceAndComments(); + this.bytes.assertNext(CharCodes$1.GreaterThan); + this.bytes.assertNext(CharCodes$1.GreaterThan); + var Type = dict.get(PDFName.of('Type')); + if (Type === PDFName.of('Catalog')) { + return PDFCatalog.fromMapWithContext(dict, this.context); + } + else if (Type === PDFName.of('Pages')) { + return PDFPageTree.fromMapWithContext(dict, this.context); + } + else if (Type === PDFName.of('Page')) { + return PDFPageLeaf.fromMapWithContext(dict, this.context); + } + else { + return PDFDict.fromMapWithContext(dict, this.context); + } + }; + PDFObjectParser.prototype.parseDictOrStream = function () { + var startPos = this.bytes.position(); + var dict = this.parseDict(); + this.skipWhitespaceAndComments(); + if (!this.matchKeyword(Keywords.streamEOF1) && + !this.matchKeyword(Keywords.streamEOF2) && + !this.matchKeyword(Keywords.streamEOF3) && + !this.matchKeyword(Keywords.streamEOF4) && + !this.matchKeyword(Keywords.stream)) { + return dict; + } + var start = this.bytes.offset(); + var end; + var Length = dict.get(PDFName.of('Length')); + if (Length instanceof PDFNumber) { + end = start + Length.asNumber(); + this.bytes.moveTo(end); + this.skipWhitespaceAndComments(); + if (!this.matchKeyword(Keywords.endstream)) { + this.bytes.moveTo(start); + end = this.findEndOfStreamFallback(startPos); + } + } + else { + end = this.findEndOfStreamFallback(startPos); + } + var contents = this.bytes.slice(start, end); + return PDFRawStream.of(dict, contents); + }; + PDFObjectParser.prototype.findEndOfStreamFallback = function (startPos) { + // Move to end of stream, while handling nested streams + var nestingLvl = 1; + var end = this.bytes.offset(); + while (!this.bytes.done()) { + end = this.bytes.offset(); + if (this.matchKeyword(Keywords.stream)) { + nestingLvl += 1; + } + else if (this.matchKeyword(Keywords.EOF1endstream) || + this.matchKeyword(Keywords.EOF2endstream) || + this.matchKeyword(Keywords.EOF3endstream) || + this.matchKeyword(Keywords.endstream)) { + nestingLvl -= 1; + } + else { + this.bytes.next(); + } + if (nestingLvl === 0) + break; + } + if (nestingLvl !== 0) + throw new PDFStreamParsingError(startPos); + return end; + }; + PDFObjectParser.forBytes = function (bytes, context, capNumbers) { return new PDFObjectParser(ByteStream.of(bytes), context, capNumbers); }; + PDFObjectParser.forByteStream = function (byteStream, context, capNumbers) { + if (capNumbers === void 0) { capNumbers = false; } + return new PDFObjectParser(byteStream, context, capNumbers); + }; + return PDFObjectParser; + }(BaseParser)); + + var PDFObjectStreamParser = /** @class */ (function (_super) { + __extends(PDFObjectStreamParser, _super); + function PDFObjectStreamParser(rawStream, shouldWaitForTick) { + var _this = _super.call(this, ByteStream.fromPDFRawStream(rawStream), rawStream.dict.context) || this; + var dict = rawStream.dict; + _this.alreadyParsed = false; + _this.shouldWaitForTick = shouldWaitForTick || (function () { return false; }); + _this.firstOffset = dict.lookup(PDFName.of('First'), PDFNumber).asNumber(); + _this.objectCount = dict.lookup(PDFName.of('N'), PDFNumber).asNumber(); + return _this; + } + PDFObjectStreamParser.prototype.parseIntoContext = function () { + return __awaiter(this, void 0, void 0, function () { + var offsetsAndObjectNumbers, idx, len, _a, objectNumber, offset, object, ref; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (this.alreadyParsed) { + throw new ReparseError('PDFObjectStreamParser', 'parseIntoContext'); + } + this.alreadyParsed = true; + offsetsAndObjectNumbers = this.parseOffsetsAndObjectNumbers(); + idx = 0, len = offsetsAndObjectNumbers.length; + _b.label = 1; + case 1: + if (!(idx < len)) return [3 /*break*/, 4]; + _a = offsetsAndObjectNumbers[idx], objectNumber = _a.objectNumber, offset = _a.offset; + this.bytes.moveTo(this.firstOffset + offset); + object = this.parseObject(); + ref = PDFRef.of(objectNumber, 0); + this.context.assign(ref, object); + if (!this.shouldWaitForTick()) return [3 /*break*/, 3]; + return [4 /*yield*/, waitForTick()]; + case 2: + _b.sent(); + _b.label = 3; + case 3: + idx++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/]; + } + }); + }); + }; + PDFObjectStreamParser.prototype.parseOffsetsAndObjectNumbers = function () { + var offsetsAndObjectNumbers = []; + for (var idx = 0, len = this.objectCount; idx < len; idx++) { + this.skipWhitespaceAndComments(); + var objectNumber = this.parseRawInt(); + this.skipWhitespaceAndComments(); + var offset = this.parseRawInt(); + offsetsAndObjectNumbers.push({ objectNumber: objectNumber, offset: offset }); + } + return offsetsAndObjectNumbers; + }; + PDFObjectStreamParser.forStream = function (rawStream, shouldWaitForTick) { return new PDFObjectStreamParser(rawStream, shouldWaitForTick); }; + return PDFObjectStreamParser; + }(PDFObjectParser)); + + var PDFXRefStreamParser = /** @class */ (function () { + function PDFXRefStreamParser(rawStream) { + this.alreadyParsed = false; + this.dict = rawStream.dict; + this.bytes = ByteStream.fromPDFRawStream(rawStream); + this.context = this.dict.context; + var Size = this.dict.lookup(PDFName.of('Size'), PDFNumber); + var Index = this.dict.lookup(PDFName.of('Index')); + if (Index instanceof PDFArray) { + this.subsections = []; + for (var idx = 0, len = Index.size(); idx < len; idx += 2) { + var firstObjectNumber = Index.lookup(idx + 0, PDFNumber).asNumber(); + var length_1 = Index.lookup(idx + 1, PDFNumber).asNumber(); + this.subsections.push({ firstObjectNumber: firstObjectNumber, length: length_1 }); + } + } + else { + this.subsections = [{ firstObjectNumber: 0, length: Size.asNumber() }]; + } + var W = this.dict.lookup(PDFName.of('W'), PDFArray); + this.byteWidths = [-1, -1, -1]; + for (var idx = 0, len = W.size(); idx < len; idx++) { + this.byteWidths[idx] = W.lookup(idx, PDFNumber).asNumber(); + } + } + PDFXRefStreamParser.prototype.parseIntoContext = function () { + if (this.alreadyParsed) { + throw new ReparseError('PDFXRefStreamParser', 'parseIntoContext'); + } + this.alreadyParsed = true; + this.context.trailerInfo = { + Root: this.dict.get(PDFName.of('Root')), + Encrypt: this.dict.get(PDFName.of('Encrypt')), + Info: this.dict.get(PDFName.of('Info')), + ID: this.dict.get(PDFName.of('ID')), + }; + var entries = this.parseEntries(); + // for (let idx = 0, len = entries.length; idx < len; idx++) { + // const entry = entries[idx]; + // if (entry.deleted) this.context.delete(entry.ref); + // } + return entries; + }; + PDFXRefStreamParser.prototype.parseEntries = function () { + var entries = []; + var _a = this.byteWidths, typeFieldWidth = _a[0], offsetFieldWidth = _a[1], genFieldWidth = _a[2]; + for (var subsectionIdx = 0, subsectionLen = this.subsections.length; subsectionIdx < subsectionLen; subsectionIdx++) { + var _b = this.subsections[subsectionIdx], firstObjectNumber = _b.firstObjectNumber, length_2 = _b.length; + for (var objIdx = 0; objIdx < length_2; objIdx++) { + var type = 0; + for (var idx = 0, len = typeFieldWidth; idx < len; idx++) { + type = (type << 8) | this.bytes.next(); + } + var offset = 0; + for (var idx = 0, len = offsetFieldWidth; idx < len; idx++) { + offset = (offset << 8) | this.bytes.next(); + } + var generationNumber = 0; + for (var idx = 0, len = genFieldWidth; idx < len; idx++) { + generationNumber = (generationNumber << 8) | this.bytes.next(); + } + // When the `type` field is absent, it defaults to 1 + if (typeFieldWidth === 0) + type = 1; + var objectNumber = firstObjectNumber + objIdx; + var entry = { + ref: PDFRef.of(objectNumber, generationNumber), + offset: offset, + deleted: type === 0, + inObjectStream: type === 2, + }; + entries.push(entry); + } + } + return entries; + }; + PDFXRefStreamParser.forStream = function (rawStream) { + return new PDFXRefStreamParser(rawStream); + }; + return PDFXRefStreamParser; + }()); + + var PDFParser = /** @class */ (function (_super) { + __extends(PDFParser, _super); + function PDFParser(pdfBytes, objectsPerTick, throwOnInvalidObject, capNumbers) { + if (objectsPerTick === void 0) { objectsPerTick = Infinity; } + if (throwOnInvalidObject === void 0) { throwOnInvalidObject = false; } + if (capNumbers === void 0) { capNumbers = false; } + var _this = _super.call(this, ByteStream.of(pdfBytes), PDFContext.create(), capNumbers) || this; + _this.alreadyParsed = false; + _this.parsedObjects = 0; + _this.shouldWaitForTick = function () { + _this.parsedObjects += 1; + return _this.parsedObjects % _this.objectsPerTick === 0; + }; + _this.objectsPerTick = objectsPerTick; + _this.throwOnInvalidObject = throwOnInvalidObject; + return _this; + } + PDFParser.prototype.parseDocument = function () { + return __awaiter(this, void 0, void 0, function () { + var prevOffset, offset; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (this.alreadyParsed) { + throw new ReparseError('PDFParser', 'parseDocument'); + } + this.alreadyParsed = true; + this.context.header = this.parseHeader(); + _a.label = 1; + case 1: + if (!!this.bytes.done()) return [3 /*break*/, 3]; + return [4 /*yield*/, this.parseDocumentSection()]; + case 2: + _a.sent(); + offset = this.bytes.offset(); + if (offset === prevOffset) { + throw new StalledParserError(this.bytes.position()); + } + prevOffset = offset; + return [3 /*break*/, 1]; + case 3: + this.maybeRecoverRoot(); + if (this.context.lookup(PDFRef.of(0))) { + console.warn('Removing parsed object: 0 0 R'); + this.context.delete(PDFRef.of(0)); + } + return [2 /*return*/, this.context]; + } + }); + }); + }; + PDFParser.prototype.maybeRecoverRoot = function () { + var isValidCatalog = function (obj) { + return obj instanceof PDFDict && + obj.lookup(PDFName.of('Type')) === PDFName.of('Catalog'); + }; + var catalog = this.context.lookup(this.context.trailerInfo.Root); + if (!isValidCatalog(catalog)) { + var indirectObjects = this.context.enumerateIndirectObjects(); + for (var idx = 0, len = indirectObjects.length; idx < len; idx++) { + var _a = indirectObjects[idx], ref = _a[0], object = _a[1]; + if (isValidCatalog(object)) { + this.context.trailerInfo.Root = ref; + } + } + } + }; + PDFParser.prototype.parseHeader = function () { + while (!this.bytes.done()) { + if (this.matchKeyword(Keywords.header)) { + var major = this.parseRawInt(); + this.bytes.assertNext(CharCodes$1.Period); + var minor = this.parseRawInt(); + var header = PDFHeader.forVersion(major, minor); + this.skipBinaryHeaderComment(); + return header; + } + this.bytes.next(); + } + throw new MissingPDFHeaderError(this.bytes.position()); + }; + PDFParser.prototype.parseIndirectObjectHeader = function () { + this.skipWhitespaceAndComments(); + var objectNumber = this.parseRawInt(); + this.skipWhitespaceAndComments(); + var generationNumber = this.parseRawInt(); + this.skipWhitespaceAndComments(); + if (!this.matchKeyword(Keywords.obj)) { + throw new MissingKeywordError(this.bytes.position(), Keywords.obj); + } + return PDFRef.of(objectNumber, generationNumber); + }; + PDFParser.prototype.matchIndirectObjectHeader = function () { + var initialOffset = this.bytes.offset(); + try { + this.parseIndirectObjectHeader(); + return true; + } + catch (e) { + this.bytes.moveTo(initialOffset); + return false; + } + }; + PDFParser.prototype.parseIndirectObject = function () { + return __awaiter(this, void 0, void 0, function () { + var ref, object; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + ref = this.parseIndirectObjectHeader(); + this.skipWhitespaceAndComments(); + object = this.parseObject(); + this.skipWhitespaceAndComments(); + // if (!this.matchKeyword(Keywords.endobj)) { + // throw new MissingKeywordError(this.bytes.position(), Keywords.endobj); + // } + // TODO: Log a warning if this fails... + this.matchKeyword(Keywords.endobj); + if (!(object instanceof PDFRawStream && + object.dict.lookup(PDFName.of('Type')) === PDFName.of('ObjStm'))) return [3 /*break*/, 2]; + return [4 /*yield*/, PDFObjectStreamParser.forStream(object, this.shouldWaitForTick).parseIntoContext()]; + case 1: + _a.sent(); + return [3 /*break*/, 3]; + case 2: + if (object instanceof PDFRawStream && + object.dict.lookup(PDFName.of('Type')) === PDFName.of('XRef')) { + PDFXRefStreamParser.forStream(object).parseIntoContext(); + } + else { + this.context.assign(ref, object); + } + _a.label = 3; + case 3: return [2 /*return*/, ref]; + } + }); + }); + }; + // TODO: Improve and clean this up + PDFParser.prototype.tryToParseInvalidIndirectObject = function () { + var startPos = this.bytes.position(); + var msg = "Trying to parse invalid object: " + JSON.stringify(startPos) + ")"; + if (this.throwOnInvalidObject) + throw new Error(msg); + console.warn(msg); + var ref = this.parseIndirectObjectHeader(); + console.warn("Invalid object ref: " + ref); + this.skipWhitespaceAndComments(); + var start = this.bytes.offset(); + var failed = true; + while (!this.bytes.done()) { + if (this.matchKeyword(Keywords.endobj)) { + failed = false; + } + if (!failed) + break; + this.bytes.next(); + } + if (failed) + throw new PDFInvalidObjectParsingError(startPos); + var end = this.bytes.offset() - Keywords.endobj.length; + var object = PDFInvalidObject.of(this.bytes.slice(start, end)); + this.context.assign(ref, object); + return ref; + }; + PDFParser.prototype.parseIndirectObjects = function () { + return __awaiter(this, void 0, void 0, function () { + var initialOffset, e_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.skipWhitespaceAndComments(); + _a.label = 1; + case 1: + if (!(!this.bytes.done() && IsDigit[this.bytes.peek()])) return [3 /*break*/, 8]; + initialOffset = this.bytes.offset(); + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 5]); + return [4 /*yield*/, this.parseIndirectObject()]; + case 3: + _a.sent(); + return [3 /*break*/, 5]; + case 4: + e_1 = _a.sent(); + // TODO: Add tracing/logging mechanism to track when this happens! + this.bytes.moveTo(initialOffset); + this.tryToParseInvalidIndirectObject(); + return [3 /*break*/, 5]; + case 5: + this.skipWhitespaceAndComments(); + // TODO: Can this be done only when needed, to avoid harming performance? + this.skipJibberish(); + if (!this.shouldWaitForTick()) return [3 /*break*/, 7]; + return [4 /*yield*/, waitForTick()]; + case 6: + _a.sent(); + _a.label = 7; + case 7: return [3 /*break*/, 1]; + case 8: return [2 /*return*/]; + } + }); + }); + }; + PDFParser.prototype.maybeParseCrossRefSection = function () { + this.skipWhitespaceAndComments(); + if (!this.matchKeyword(Keywords.xref)) + return; + this.skipWhitespaceAndComments(); + var objectNumber = -1; + var xref = PDFCrossRefSection.createEmpty(); + while (!this.bytes.done() && IsDigit[this.bytes.peek()]) { + var firstInt = this.parseRawInt(); + this.skipWhitespaceAndComments(); + var secondInt = this.parseRawInt(); + this.skipWhitespaceAndComments(); + var byte = this.bytes.peek(); + if (byte === CharCodes$1.n || byte === CharCodes$1.f) { + var ref = PDFRef.of(objectNumber, secondInt); + if (this.bytes.next() === CharCodes$1.n) { + xref.addEntry(ref, firstInt); + } + else { + // this.context.delete(ref); + xref.addDeletedEntry(ref, firstInt); + } + objectNumber += 1; + } + else { + objectNumber = firstInt; + } + this.skipWhitespaceAndComments(); + } + return xref; + }; + PDFParser.prototype.maybeParseTrailerDict = function () { + this.skipWhitespaceAndComments(); + if (!this.matchKeyword(Keywords.trailer)) + return; + this.skipWhitespaceAndComments(); + var dict = this.parseDict(); + var context = this.context; + context.trailerInfo = { + Root: dict.get(PDFName.of('Root')) || context.trailerInfo.Root, + Encrypt: dict.get(PDFName.of('Encrypt')) || context.trailerInfo.Encrypt, + Info: dict.get(PDFName.of('Info')) || context.trailerInfo.Info, + ID: dict.get(PDFName.of('ID')) || context.trailerInfo.ID, + }; + }; + PDFParser.prototype.maybeParseTrailer = function () { + this.skipWhitespaceAndComments(); + if (!this.matchKeyword(Keywords.startxref)) + return; + this.skipWhitespaceAndComments(); + var offset = this.parseRawInt(); + this.skipWhitespace(); + this.matchKeyword(Keywords.eof); + this.skipWhitespaceAndComments(); + this.matchKeyword(Keywords.eof); + this.skipWhitespaceAndComments(); + return PDFTrailer.forLastCrossRefSectionOffset(offset); + }; + PDFParser.prototype.parseDocumentSection = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.parseIndirectObjects()]; + case 1: + _a.sent(); + this.maybeParseCrossRefSection(); + this.maybeParseTrailerDict(); + this.maybeParseTrailer(); + // TODO: Can this be done only when needed, to avoid harming performance? + this.skipJibberish(); + return [2 /*return*/]; + } + }); + }); + }; + /** + * This operation is not necessary for valid PDF files. But some invalid PDFs + * contain jibberish in between indirect objects. This method is designed to + * skip past that jibberish, should it exist, until it reaches the next + * indirect object header, an xref table section, or the file trailer. + */ + PDFParser.prototype.skipJibberish = function () { + this.skipWhitespaceAndComments(); + while (!this.bytes.done()) { + var initialOffset = this.bytes.offset(); + var byte = this.bytes.peek(); + var isAlphaNumeric = byte >= CharCodes$1.Space && byte <= CharCodes$1.Tilde; + if (isAlphaNumeric) { + if (this.matchKeyword(Keywords.xref) || + this.matchKeyword(Keywords.trailer) || + this.matchKeyword(Keywords.startxref) || + this.matchIndirectObjectHeader()) { + this.bytes.moveTo(initialOffset); + break; + } + } + this.bytes.next(); + } + }; + /** + * Skips the binary comment following a PDF header. The specification + * defines this binary comment (section 7.5.2 File Header) as a sequence of 4 + * or more bytes that are 128 or greater, and which are preceded by a "%". + * + * This would imply that to strip out this binary comment, we could check for + * a sequence of bytes starting with "%", and remove all subsequent bytes that + * are 128 or greater. This works for many documents that properly comply with + * the spec. But in the wild, there are PDFs that omit the leading "%", and + * include bytes that are less than 128 (e.g. 0 or 1). So in order to parse + * these headers correctly, we just throw out all bytes leading up to the + * first indirect object header. + */ + PDFParser.prototype.skipBinaryHeaderComment = function () { + this.skipWhitespaceAndComments(); + try { + var initialOffset = this.bytes.offset(); + this.parseIndirectObjectHeader(); + this.bytes.moveTo(initialOffset); + } + catch (e) { + this.bytes.next(); + this.skipWhitespaceAndComments(); + } + }; + PDFParser.forBytesWithOptions = function (pdfBytes, objectsPerTick, throwOnInvalidObject, capNumbers) { + return new PDFParser(pdfBytes, objectsPerTick, throwOnInvalidObject, capNumbers); + }; + return PDFParser; + }(PDFObjectParser)); + + var flag$1 = function (bitIndex) { return 1 << bitIndex; }; + (function (AnnotationFlags) { + /** + * If set, do not display the annotation if it does not belong to one of the + * standard annotation types and no annotation handler is available. If clear, + * display such an unknown annotation using an appearance stream specified by + * its appearance dictionary, if any. + */ + AnnotationFlags[AnnotationFlags["Invisible"] = flag$1(1 - 1)] = "Invisible"; + /** + * If set, do not display or print the annotation or allow it to interact with + * the user, regardless of its annotation type or whether an annotation + * handler is available. + * + * In cases where screen space is limited, the ability to hide and show + * annotations selectively can be used in combination with appearance streams + * to display auxiliary pop-up information similar in function to online help + * systems. + */ + AnnotationFlags[AnnotationFlags["Hidden"] = flag$1(2 - 1)] = "Hidden"; + /** + * If set, print the annotation when the page is printed. If clear, never + * print the annotation, regardless of whether it is displayed on the screen. + * + * This can be useful for annotations representing interactive pushbuttons, + * which would serve no meaningful purpose on the printed page. + */ + AnnotationFlags[AnnotationFlags["Print"] = flag$1(3 - 1)] = "Print"; + /** + * If set, do not scale the annotation’s appearance to match the magnification + * of the page. The location of the annotation on the page (defined by the + * upper-left corner of its annotation rectangle) shall remain fixed, + * regardless of the page magnification. + */ + AnnotationFlags[AnnotationFlags["NoZoom"] = flag$1(4 - 1)] = "NoZoom"; + /** + * If set, do not rotate the annotation’s appearance to match the rotation of + * the page. The upper-left corner of the annotation rectangle shall remain in + * a fixed location on the page, regardless of the page rotation. + */ + AnnotationFlags[AnnotationFlags["NoRotate"] = flag$1(5 - 1)] = "NoRotate"; + /** + * If set, do not display the annotation on the screen or allow it to interact + * with the user. The annotation may be printed (depending on the setting of + * the Print flag) but should be considered hidden for purposes of on-screen + * display and user interaction. + */ + AnnotationFlags[AnnotationFlags["NoView"] = flag$1(6 - 1)] = "NoView"; + /** + * If set, do not allow the annotation to interact with the user. The + * annotation may be displayed or printed (depending on the settings of the + * NoView and Print flags) but should not respond to mouse clicks or change + * its appearance in response to mouse motions. + * + * This flag shall be ignored for widget annotations; its function is + * subsumed by the ReadOnly flag of the associated form field. + */ + AnnotationFlags[AnnotationFlags["ReadOnly"] = flag$1(7 - 1)] = "ReadOnly"; + /** + * If set, do not allow the annotation to be deleted or its properties + * (including position and size) to be modified by the user. However, this + * flag does not restrict changes to the annotation’s contents, such as the + * value of a form field. + */ + AnnotationFlags[AnnotationFlags["Locked"] = flag$1(8 - 1)] = "Locked"; + /** + * If set, invert the interpretation of the NoView flag for certain events. + * + * A typical use is to have an annotation that appears only when a mouse + * cursor is held over it. + */ + AnnotationFlags[AnnotationFlags["ToggleNoView"] = flag$1(9 - 1)] = "ToggleNoView"; + /** + * If set, do not allow the contents of the annotation to be modified by the + * user. This flag does not restrict deletion of the annotation or changes to + * other annotation properties, such as position and size. + */ + AnnotationFlags[AnnotationFlags["LockedContents"] = flag$1(10 - 1)] = "LockedContents"; + })(exports.AnnotationFlags || (exports.AnnotationFlags = {})); + + var asPDFName = function (name) { + return name instanceof PDFName ? name : PDFName.of(name); + }; + var asPDFNumber = function (num) { + return num instanceof PDFNumber ? num : PDFNumber.of(num); + }; + var asNumber = function (num) { + return num instanceof PDFNumber ? num.asNumber() : num; + }; + + (function (RotationTypes) { + RotationTypes["Degrees"] = "degrees"; + RotationTypes["Radians"] = "radians"; + })(exports.RotationTypes || (exports.RotationTypes = {})); + var radians = function (radianAngle) { + assertIs(radianAngle, 'radianAngle', ['number']); + return { type: exports.RotationTypes.Radians, angle: radianAngle }; + }; + var degrees = function (degreeAngle) { + assertIs(degreeAngle, 'degreeAngle', ['number']); + return { type: exports.RotationTypes.Degrees, angle: degreeAngle }; + }; + var Radians = exports.RotationTypes.Radians, Degrees = exports.RotationTypes.Degrees; + var degreesToRadians = function (degree) { return (degree * Math.PI) / 180; }; + var radiansToDegrees = function (radian) { return (radian * 180) / Math.PI; }; + // prettier-ignore + var toRadians = function (rotation) { + return rotation.type === Radians ? rotation.angle + : rotation.type === Degrees ? degreesToRadians(rotation.angle) + : error("Invalid rotation: " + JSON.stringify(rotation)); + }; + // prettier-ignore + var toDegrees = function (rotation) { + return rotation.type === Radians ? radiansToDegrees(rotation.angle) + : rotation.type === Degrees ? rotation.angle + : error("Invalid rotation: " + JSON.stringify(rotation)); + }; + var reduceRotation = function (degreeAngle) { + if (degreeAngle === void 0) { degreeAngle = 0; } + var quadrants = (degreeAngle / 90) % 4; + if (quadrants === 0) + return 0; + if (quadrants === 1) + return 90; + if (quadrants === 2) + return 180; + if (quadrants === 3) + return 270; + return 0; // `degreeAngle` is not a multiple of 90 + }; + var adjustDimsForRotation = function (dims, degreeAngle) { + if (degreeAngle === void 0) { degreeAngle = 0; } + var rotation = reduceRotation(degreeAngle); + return rotation === 90 || rotation === 270 + ? { width: dims.height, height: dims.width } + : { width: dims.width, height: dims.height }; + }; + var rotateRectangle = function (rectangle, borderWidth, degreeAngle) { + if (borderWidth === void 0) { borderWidth = 0; } + if (degreeAngle === void 0) { degreeAngle = 0; } + var x = rectangle.x, y = rectangle.y, w = rectangle.width, h = rectangle.height; + var r = reduceRotation(degreeAngle); + var b = borderWidth / 2; + // prettier-ignore + if (r === 0) + return { x: x - b, y: y - b, width: w, height: h }; + else if (r === 90) + return { x: x - h + b, y: y - b, width: h, height: w }; + else if (r === 180) + return { x: x - w + b, y: y - h + b, width: w, height: h }; + else if (r === 270) + return { x: x - b, y: y - w + b, width: h, height: w }; + else + return { x: x - b, y: y - b, width: w, height: h }; + }; + + /* ==================== Clipping Path Operators ==================== */ + var clip = function () { return PDFOperator.of(Ops.ClipNonZero); }; + var clipEvenOdd = function () { return PDFOperator.of(Ops.ClipEvenOdd); }; + /* ==================== Graphics State Operators ==================== */ + var cos = Math.cos, sin = Math.sin, tan = Math.tan; + var concatTransformationMatrix = function (a, b, c, d, e, f) { + return PDFOperator.of(Ops.ConcatTransformationMatrix, [ + asPDFNumber(a), + asPDFNumber(b), + asPDFNumber(c), + asPDFNumber(d), + asPDFNumber(e), + asPDFNumber(f), + ]); + }; + var translate = function (xPos, yPos) { + return concatTransformationMatrix(1, 0, 0, 1, xPos, yPos); + }; + var scale = function (xPos, yPos) { + return concatTransformationMatrix(xPos, 0, 0, yPos, 0, 0); + }; + var rotateRadians = function (angle) { + return concatTransformationMatrix(cos(asNumber(angle)), sin(asNumber(angle)), -sin(asNumber(angle)), cos(asNumber(angle)), 0, 0); + }; + var rotateDegrees = function (angle) { + return rotateRadians(degreesToRadians(asNumber(angle))); + }; + var skewRadians = function (xSkewAngle, ySkewAngle) { + return concatTransformationMatrix(1, tan(asNumber(xSkewAngle)), tan(asNumber(ySkewAngle)), 1, 0, 0); + }; + var skewDegrees = function (xSkewAngle, ySkewAngle) { + return skewRadians(degreesToRadians(asNumber(xSkewAngle)), degreesToRadians(asNumber(ySkewAngle))); + }; + var setDashPattern = function (dashArray, dashPhase) { + return PDFOperator.of(Ops.SetLineDashPattern, [ + "[" + dashArray.map(asPDFNumber).join(' ') + "]", + asPDFNumber(dashPhase), + ]); + }; + var restoreDashPattern = function () { return setDashPattern([], 0); }; + (function (LineCapStyle) { + LineCapStyle[LineCapStyle["Butt"] = 0] = "Butt"; + LineCapStyle[LineCapStyle["Round"] = 1] = "Round"; + LineCapStyle[LineCapStyle["Projecting"] = 2] = "Projecting"; + })(exports.LineCapStyle || (exports.LineCapStyle = {})); + var setLineCap = function (style) { + return PDFOperator.of(Ops.SetLineCapStyle, [asPDFNumber(style)]); + }; + (function (LineJoinStyle) { + LineJoinStyle[LineJoinStyle["Miter"] = 0] = "Miter"; + LineJoinStyle[LineJoinStyle["Round"] = 1] = "Round"; + LineJoinStyle[LineJoinStyle["Bevel"] = 2] = "Bevel"; + })(exports.LineJoinStyle || (exports.LineJoinStyle = {})); + var setLineJoin = function (style) { + return PDFOperator.of(Ops.SetLineJoinStyle, [asPDFNumber(style)]); + }; + var setGraphicsState = function (state) { + return PDFOperator.of(Ops.SetGraphicsStateParams, [asPDFName(state)]); + }; + var pushGraphicsState = function () { return PDFOperator.of(Ops.PushGraphicsState); }; + var popGraphicsState = function () { return PDFOperator.of(Ops.PopGraphicsState); }; + var setLineWidth = function (width) { + return PDFOperator.of(Ops.SetLineWidth, [asPDFNumber(width)]); + }; + /* ==================== Path Construction Operators ==================== */ + var appendBezierCurve = function (x1, y1, x2, y2, x3, y3) { + return PDFOperator.of(Ops.AppendBezierCurve, [ + asPDFNumber(x1), + asPDFNumber(y1), + asPDFNumber(x2), + asPDFNumber(y2), + asPDFNumber(x3), + asPDFNumber(y3), + ]); + }; + var appendQuadraticCurve = function (x1, y1, x2, y2) { + return PDFOperator.of(Ops.CurveToReplicateInitialPoint, [ + asPDFNumber(x1), + asPDFNumber(y1), + asPDFNumber(x2), + asPDFNumber(y2), + ]); + }; + var closePath = function () { return PDFOperator.of(Ops.ClosePath); }; + var moveTo = function (xPos, yPos) { + return PDFOperator.of(Ops.MoveTo, [asPDFNumber(xPos), asPDFNumber(yPos)]); + }; + var lineTo = function (xPos, yPos) { + return PDFOperator.of(Ops.LineTo, [asPDFNumber(xPos), asPDFNumber(yPos)]); + }; + /** + * @param xPos x coordinate for the lower left corner of the rectangle + * @param yPos y coordinate for the lower left corner of the rectangle + * @param width width of the rectangle + * @param height height of the rectangle + */ + var rectangle = function (xPos, yPos, width, height) { + return PDFOperator.of(Ops.AppendRectangle, [ + asPDFNumber(xPos), + asPDFNumber(yPos), + asPDFNumber(width), + asPDFNumber(height), + ]); + }; + /** + * @param xPos x coordinate for the lower left corner of the square + * @param yPos y coordinate for the lower left corner of the square + * @param size width and height of the square + */ + var square = function (xPos, yPos, size) { + return rectangle(xPos, yPos, size, size); + }; + /* ==================== Path Painting Operators ==================== */ + var stroke = function () { return PDFOperator.of(Ops.StrokePath); }; + var fill = function () { return PDFOperator.of(Ops.FillNonZero); }; + var fillAndStroke = function () { return PDFOperator.of(Ops.FillNonZeroAndStroke); }; + var endPath = function () { return PDFOperator.of(Ops.EndPath); }; + /* ==================== Text Positioning Operators ==================== */ + var nextLine = function () { return PDFOperator.of(Ops.NextLine); }; + var moveText = function (x, y) { + return PDFOperator.of(Ops.MoveText, [asPDFNumber(x), asPDFNumber(y)]); + }; + /* ==================== Text Showing Operators ==================== */ + var showText = function (text) { + return PDFOperator.of(Ops.ShowText, [text]); + }; + /* ==================== Text State Operators ==================== */ + var beginText = function () { return PDFOperator.of(Ops.BeginText); }; + var endText = function () { return PDFOperator.of(Ops.EndText); }; + var setFontAndSize = function (name, size) { return PDFOperator.of(Ops.SetFontAndSize, [asPDFName(name), asPDFNumber(size)]); }; + var setCharacterSpacing = function (spacing) { + return PDFOperator.of(Ops.SetCharacterSpacing, [asPDFNumber(spacing)]); + }; + var setWordSpacing = function (spacing) { + return PDFOperator.of(Ops.SetWordSpacing, [asPDFNumber(spacing)]); + }; + /** @param squeeze horizontal character spacing */ + var setCharacterSqueeze = function (squeeze) { + return PDFOperator.of(Ops.SetTextHorizontalScaling, [asPDFNumber(squeeze)]); + }; + var setLineHeight = function (lineHeight) { + return PDFOperator.of(Ops.SetTextLineHeight, [asPDFNumber(lineHeight)]); + }; + var setTextRise = function (rise) { + return PDFOperator.of(Ops.SetTextRise, [asPDFNumber(rise)]); + }; + (function (TextRenderingMode) { + TextRenderingMode[TextRenderingMode["Fill"] = 0] = "Fill"; + TextRenderingMode[TextRenderingMode["Outline"] = 1] = "Outline"; + TextRenderingMode[TextRenderingMode["FillAndOutline"] = 2] = "FillAndOutline"; + TextRenderingMode[TextRenderingMode["Invisible"] = 3] = "Invisible"; + TextRenderingMode[TextRenderingMode["FillAndClip"] = 4] = "FillAndClip"; + TextRenderingMode[TextRenderingMode["OutlineAndClip"] = 5] = "OutlineAndClip"; + TextRenderingMode[TextRenderingMode["FillAndOutlineAndClip"] = 6] = "FillAndOutlineAndClip"; + TextRenderingMode[TextRenderingMode["Clip"] = 7] = "Clip"; + })(exports.TextRenderingMode || (exports.TextRenderingMode = {})); + var setTextRenderingMode = function (mode) { + return PDFOperator.of(Ops.SetTextRenderingMode, [asPDFNumber(mode)]); + }; + var setTextMatrix = function (a, b, c, d, e, f) { + return PDFOperator.of(Ops.SetTextMatrix, [ + asPDFNumber(a), + asPDFNumber(b), + asPDFNumber(c), + asPDFNumber(d), + asPDFNumber(e), + asPDFNumber(f), + ]); + }; + var rotateAndSkewTextRadiansAndTranslate = function (rotationAngle, xSkewAngle, ySkewAngle, x, y) { + return setTextMatrix(cos(asNumber(rotationAngle)), sin(asNumber(rotationAngle)) + tan(asNumber(xSkewAngle)), -sin(asNumber(rotationAngle)) + tan(asNumber(ySkewAngle)), cos(asNumber(rotationAngle)), x, y); + }; + var rotateAndSkewTextDegreesAndTranslate = function (rotationAngle, xSkewAngle, ySkewAngle, x, y) { + return rotateAndSkewTextRadiansAndTranslate(degreesToRadians(asNumber(rotationAngle)), degreesToRadians(asNumber(xSkewAngle)), degreesToRadians(asNumber(ySkewAngle)), x, y); + }; + /* ==================== XObject Operator ==================== */ + var drawObject = function (name) { + return PDFOperator.of(Ops.DrawObject, [asPDFName(name)]); + }; + /* ==================== Color Operators ==================== */ + var setFillingGrayscaleColor = function (gray) { + return PDFOperator.of(Ops.NonStrokingColorGray, [asPDFNumber(gray)]); + }; + var setStrokingGrayscaleColor = function (gray) { + return PDFOperator.of(Ops.StrokingColorGray, [asPDFNumber(gray)]); + }; + var setFillingRgbColor = function (red, green, blue) { + return PDFOperator.of(Ops.NonStrokingColorRgb, [ + asPDFNumber(red), + asPDFNumber(green), + asPDFNumber(blue), + ]); + }; + var setStrokingRgbColor = function (red, green, blue) { + return PDFOperator.of(Ops.StrokingColorRgb, [ + asPDFNumber(red), + asPDFNumber(green), + asPDFNumber(blue), + ]); + }; + var setFillingCmykColor = function (cyan, magenta, yellow, key) { + return PDFOperator.of(Ops.NonStrokingColorCmyk, [ + asPDFNumber(cyan), + asPDFNumber(magenta), + asPDFNumber(yellow), + asPDFNumber(key), + ]); + }; + var setStrokingCmykColor = function (cyan, magenta, yellow, key) { + return PDFOperator.of(Ops.StrokingColorCmyk, [ + asPDFNumber(cyan), + asPDFNumber(magenta), + asPDFNumber(yellow), + asPDFNumber(key), + ]); + }; + /* ==================== Marked Content Operators ==================== */ + var beginMarkedContent = function (tag) { + return PDFOperator.of(Ops.BeginMarkedContent, [asPDFName(tag)]); + }; + var endMarkedContent = function () { return PDFOperator.of(Ops.EndMarkedContent); }; + + (function (ColorTypes) { + ColorTypes["Grayscale"] = "Grayscale"; + ColorTypes["RGB"] = "RGB"; + ColorTypes["CMYK"] = "CMYK"; + })(exports.ColorTypes || (exports.ColorTypes = {})); + var grayscale = function (gray) { + assertRange(gray, 'gray', 0.0, 1.0); + return { type: exports.ColorTypes.Grayscale, gray: gray }; + }; + var rgb = function (red, green, blue) { + assertRange(red, 'red', 0, 1); + assertRange(green, 'green', 0, 1); + assertRange(blue, 'blue', 0, 1); + return { type: exports.ColorTypes.RGB, red: red, green: green, blue: blue }; + }; + var cmyk = function (cyan, magenta, yellow, key) { + assertRange(cyan, 'cyan', 0, 1); + assertRange(magenta, 'magenta', 0, 1); + assertRange(yellow, 'yellow', 0, 1); + assertRange(key, 'key', 0, 1); + return { type: exports.ColorTypes.CMYK, cyan: cyan, magenta: magenta, yellow: yellow, key: key }; + }; + var Grayscale = exports.ColorTypes.Grayscale, RGB = exports.ColorTypes.RGB, CMYK = exports.ColorTypes.CMYK; + // prettier-ignore + var setFillingColor = function (color) { + return color.type === Grayscale ? setFillingGrayscaleColor(color.gray) + : color.type === RGB ? setFillingRgbColor(color.red, color.green, color.blue) + : color.type === CMYK ? setFillingCmykColor(color.cyan, color.magenta, color.yellow, color.key) + : error("Invalid color: " + JSON.stringify(color)); + }; + // prettier-ignore + var setStrokingColor = function (color) { + return color.type === Grayscale ? setStrokingGrayscaleColor(color.gray) + : color.type === RGB ? setStrokingRgbColor(color.red, color.green, color.blue) + : color.type === CMYK ? setStrokingCmykColor(color.cyan, color.magenta, color.yellow, color.key) + : error("Invalid color: " + JSON.stringify(color)); + }; + // prettier-ignore + var componentsToColor = function (comps, scale) { + if (scale === void 0) { scale = 1; } + return ((comps === null || comps === void 0 ? void 0 : comps.length) === 1 ? grayscale(comps[0] * scale) + : (comps === null || comps === void 0 ? void 0 : comps.length) === 3 ? rgb(comps[0] * scale, comps[1] * scale, comps[2] * scale) + : (comps === null || comps === void 0 ? void 0 : comps.length) === 4 ? cmyk(comps[0] * scale, comps[1] * scale, comps[2] * scale, comps[3] * scale) + : undefined); + }; + // prettier-ignore + var colorToComponents = function (color) { + return color.type === Grayscale ? [color.gray] + : color.type === RGB ? [color.red, color.green, color.blue] + : color.type === CMYK ? [color.cyan, color.magenta, color.yellow, color.key] + : error("Invalid color: " + JSON.stringify(color)); + }; + + // Originated from pdfkit Copyright (c) 2014 Devon Govett + var cx = 0; + var cy = 0; + var px = 0; + var py = 0; + var sx = 0; + var sy = 0; + var parameters = new Map([ + ['A', 7], + ['a', 7], + ['C', 6], + ['c', 6], + ['H', 1], + ['h', 1], + ['L', 2], + ['l', 2], + ['M', 2], + ['m', 2], + ['Q', 4], + ['q', 4], + ['S', 4], + ['s', 4], + ['T', 2], + ['t', 2], + ['V', 1], + ['v', 1], + ['Z', 0], + ['z', 0], + ]); + var parse = function (path) { + var cmd; + var ret = []; + var args = []; + var curArg = ''; + var foundDecimal = false; + var params = 0; + for (var _i = 0, path_1 = path; _i < path_1.length; _i++) { + var c = path_1[_i]; + if (parameters.has(c)) { + params = parameters.get(c); + if (cmd) { + // save existing command + if (curArg.length > 0) { + args[args.length] = +curArg; + } + ret[ret.length] = { cmd: cmd, args: args }; + args = []; + curArg = ''; + foundDecimal = false; + } + cmd = c; + } + else if ([' ', ','].includes(c) || + (c === '-' && curArg.length > 0 && curArg[curArg.length - 1] !== 'e') || + (c === '.' && foundDecimal)) { + if (curArg.length === 0) { + continue; + } + if (args.length === params) { + // handle reused commands + ret[ret.length] = { cmd: cmd, args: args }; + args = [+curArg]; + // handle assumed commands + if (cmd === 'M') { + cmd = 'L'; + } + if (cmd === 'm') { + cmd = 'l'; + } + } + else { + args[args.length] = +curArg; + } + foundDecimal = c === '.'; + // fix for negative numbers or repeated decimals with no delimeter between commands + curArg = ['-', '.'].includes(c) ? c : ''; + } + else { + curArg += c; + if (c === '.') { + foundDecimal = true; + } + } + } + // add the last command + if (curArg.length > 0) { + if (args.length === params) { + // handle reused commands + ret[ret.length] = { cmd: cmd, args: args }; + args = [+curArg]; + // handle assumed commands + if (cmd === 'M') { + cmd = 'L'; + } + if (cmd === 'm') { + cmd = 'l'; + } + } + else { + args[args.length] = +curArg; + } + } + ret[ret.length] = { cmd: cmd, args: args }; + return ret; + }; + var apply = function (commands) { + // current point, control point, and subpath starting point + cx = cy = px = py = sx = sy = 0; + // run the commands + var cmds = []; + for (var i = 0; i < commands.length; i++) { + var c = commands[i]; + if (c.cmd && typeof runners[c.cmd] === 'function') { + var cmd = runners[c.cmd](c.args); + if (Array.isArray(cmd)) { + cmds = cmds.concat(cmd); + } + else { + cmds.push(cmd); + } + } + } + return cmds; + }; + var runners = { + M: function (a) { + cx = a[0]; + cy = a[1]; + px = py = null; + sx = cx; + sy = cy; + return moveTo(cx, cy); + }, + m: function (a) { + cx += a[0]; + cy += a[1]; + px = py = null; + sx = cx; + sy = cy; + return moveTo(cx, cy); + }, + C: function (a) { + cx = a[4]; + cy = a[5]; + px = a[2]; + py = a[3]; + return appendBezierCurve(a[0], a[1], a[2], a[3], a[4], a[5]); + }, + c: function (a) { + var cmd = appendBezierCurve(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy, a[4] + cx, a[5] + cy); + px = cx + a[2]; + py = cy + a[3]; + cx += a[4]; + cy += a[5]; + return cmd; + }, + S: function (a) { + if (px === null || py === null) { + px = cx; + py = cy; + } + var cmd = appendBezierCurve(cx - (px - cx), cy - (py - cy), a[0], a[1], a[2], a[3]); + px = a[0]; + py = a[1]; + cx = a[2]; + cy = a[3]; + return cmd; + }, + s: function (a) { + if (px === null || py === null) { + px = cx; + py = cy; + } + var cmd = appendBezierCurve(cx - (px - cx), cy - (py - cy), cx + a[0], cy + a[1], cx + a[2], cy + a[3]); + px = cx + a[0]; + py = cy + a[1]; + cx += a[2]; + cy += a[3]; + return cmd; + }, + Q: function (a) { + px = a[0]; + py = a[1]; + cx = a[2]; + cy = a[3]; + return appendQuadraticCurve(a[0], a[1], cx, cy); + }, + q: function (a) { + var cmd = appendQuadraticCurve(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy); + px = cx + a[0]; + py = cy + a[1]; + cx += a[2]; + cy += a[3]; + return cmd; + }, + T: function (a) { + if (px === null || py === null) { + px = cx; + py = cy; + } + else { + px = cx - (px - cx); + py = cy - (py - cy); + } + var cmd = appendQuadraticCurve(px, py, a[0], a[1]); + px = cx - (px - cx); + py = cy - (py - cy); + cx = a[0]; + cy = a[1]; + return cmd; + }, + t: function (a) { + if (px === null || py === null) { + px = cx; + py = cy; + } + else { + px = cx - (px - cx); + py = cy - (py - cy); + } + var cmd = appendQuadraticCurve(px, py, cx + a[0], cy + a[1]); + cx += a[0]; + cy += a[1]; + return cmd; + }, + A: function (a) { + var cmds = solveArc(cx, cy, a); + cx = a[5]; + cy = a[6]; + return cmds; + }, + a: function (a) { + a[5] += cx; + a[6] += cy; + var cmds = solveArc(cx, cy, a); + cx = a[5]; + cy = a[6]; + return cmds; + }, + L: function (a) { + cx = a[0]; + cy = a[1]; + px = py = null; + return lineTo(cx, cy); + }, + l: function (a) { + cx += a[0]; + cy += a[1]; + px = py = null; + return lineTo(cx, cy); + }, + H: function (a) { + cx = a[0]; + px = py = null; + return lineTo(cx, cy); + }, + h: function (a) { + cx += a[0]; + px = py = null; + return lineTo(cx, cy); + }, + V: function (a) { + cy = a[0]; + px = py = null; + return lineTo(cx, cy); + }, + v: function (a) { + cy += a[0]; + px = py = null; + return lineTo(cx, cy); + }, + Z: function () { + var cmd = closePath(); + cx = sx; + cy = sy; + return cmd; + }, + z: function () { + var cmd = closePath(); + cx = sx; + cy = sy; + return cmd; + }, + }; + var solveArc = function (x, y, coords) { + var rx = coords[0], ry = coords[1], rot = coords[2], large = coords[3], sweep = coords[4], ex = coords[5], ey = coords[6]; + var segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y); + var cmds = []; + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + var bez = segmentToBezier.apply(void 0, seg); + cmds.push(appendBezierCurve.apply(void 0, bez)); + } + return cmds; + }; + // from Inkscape svgtopdf, thanks! + var arcToSegments = function (x, y, rx, ry, large, sweep, rotateX, ox, oy) { + var th = rotateX * (Math.PI / 180); + var sinTh = Math.sin(th); + var cosTh = Math.cos(th); + rx = Math.abs(rx); + ry = Math.abs(ry); + px = cosTh * (ox - x) * 0.5 + sinTh * (oy - y) * 0.5; + py = cosTh * (oy - y) * 0.5 - sinTh * (ox - x) * 0.5; + var pl = (px * px) / (rx * rx) + (py * py) / (ry * ry); + if (pl > 1) { + pl = Math.sqrt(pl); + rx *= pl; + ry *= pl; + } + var a00 = cosTh / rx; + var a01 = sinTh / rx; + var a10 = -sinTh / ry; + var a11 = cosTh / ry; + var x0 = a00 * ox + a01 * oy; + var y0 = a10 * ox + a11 * oy; + var x1 = a00 * x + a01 * y; + var y1 = a10 * x + a11 * y; + var d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0); + var sfactorSq = 1 / d - 0.25; + if (sfactorSq < 0) { + sfactorSq = 0; + } + var sfactor = Math.sqrt(sfactorSq); + if (sweep === large) { + sfactor = -sfactor; + } + var xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0); + var yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0); + var th0 = Math.atan2(y0 - yc, x0 - xc); + var th1 = Math.atan2(y1 - yc, x1 - xc); + var thArc = th1 - th0; + if (thArc < 0 && sweep === 1) { + thArc += 2 * Math.PI; + } + else if (thArc > 0 && sweep === 0) { + thArc -= 2 * Math.PI; + } + var segments = Math.ceil(Math.abs(thArc / (Math.PI * 0.5 + 0.001))); + var result = []; + for (var i = 0; i < segments; i++) { + var th2 = th0 + (i * thArc) / segments; + var th3 = th0 + ((i + 1) * thArc) / segments; + result[i] = [xc, yc, th2, th3, rx, ry, sinTh, cosTh]; + } + return result; + }; + var segmentToBezier = function (cx1, cy1, th0, th1, rx, ry, sinTh, cosTh) { + var a00 = cosTh * rx; + var a01 = -sinTh * ry; + var a10 = sinTh * rx; + var a11 = cosTh * ry; + var thHalf = 0.5 * (th1 - th0); + var t = ((8 / 3) * Math.sin(thHalf * 0.5) * Math.sin(thHalf * 0.5)) / + Math.sin(thHalf); + var x1 = cx1 + Math.cos(th0) - t * Math.sin(th0); + var y1 = cy1 + Math.sin(th0) + t * Math.cos(th0); + var x3 = cx1 + Math.cos(th1); + var y3 = cy1 + Math.sin(th1); + var x2 = x3 + t * Math.sin(th1); + var y2 = y3 - t * Math.cos(th1); + var result = [ + a00 * x1 + a01 * y1, + a10 * x1 + a11 * y1, + a00 * x2 + a01 * y2, + a10 * x2 + a11 * y2, + a00 * x3 + a01 * y3, + a10 * x3 + a11 * y3, + ]; + return result; + }; + var svgPathToOperators = function (path) { return apply(parse(path)); }; + + var drawText = function (line, options) { + return [ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + beginText(), + setFillingColor(options.color), + setFontAndSize(options.font, options.size), + rotateAndSkewTextRadiansAndTranslate(toRadians(options.rotate), toRadians(options.xSkew), toRadians(options.ySkew), options.x, options.y), + showText(line), + endText(), + popGraphicsState(), + ].filter(Boolean); + }; + var drawLinesOfText = function (lines, options) { + var operators = [ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + beginText(), + setFillingColor(options.color), + setFontAndSize(options.font, options.size), + setLineHeight(options.lineHeight), + rotateAndSkewTextRadiansAndTranslate(toRadians(options.rotate), toRadians(options.xSkew), toRadians(options.ySkew), options.x, options.y), + ].filter(Boolean); + for (var idx = 0, len = lines.length; idx < len; idx++) { + operators.push(showText(lines[idx]), nextLine()); + } + operators.push(endText(), popGraphicsState()); + return operators; + }; + var drawImage = function (name, options) { + return [ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + translate(options.x, options.y), + rotateRadians(toRadians(options.rotate)), + scale(options.width, options.height), + skewRadians(toRadians(options.xSkew), toRadians(options.ySkew)), + drawObject(name), + popGraphicsState(), + ].filter(Boolean); + }; + var drawPage = function (name, options) { + return [ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + translate(options.x, options.y), + rotateRadians(toRadians(options.rotate)), + scale(options.xScale, options.yScale), + skewRadians(toRadians(options.xSkew), toRadians(options.ySkew)), + drawObject(name), + popGraphicsState(), + ].filter(Boolean); + }; + var drawLine = function (options) { + var _a, _b; + return [ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + options.color && setStrokingColor(options.color), + setLineWidth(options.thickness), + setDashPattern((_a = options.dashArray) !== null && _a !== void 0 ? _a : [], (_b = options.dashPhase) !== null && _b !== void 0 ? _b : 0), + moveTo(options.start.x, options.start.y), + options.lineCap && setLineCap(options.lineCap), + moveTo(options.start.x, options.start.y), + lineTo(options.end.x, options.end.y), + stroke(), + popGraphicsState(), + ].filter(Boolean); + }; + var drawRectangle = function (options) { + var _a, _b; + return [ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + options.color && setFillingColor(options.color), + options.borderColor && setStrokingColor(options.borderColor), + setLineWidth(options.borderWidth), + options.borderLineCap && setLineCap(options.borderLineCap), + setDashPattern((_a = options.borderDashArray) !== null && _a !== void 0 ? _a : [], (_b = options.borderDashPhase) !== null && _b !== void 0 ? _b : 0), + translate(options.x, options.y), + rotateRadians(toRadians(options.rotate)), + skewRadians(toRadians(options.xSkew), toRadians(options.ySkew)), + moveTo(0, 0), + lineTo(0, options.height), + lineTo(options.width, options.height), + lineTo(options.width, 0), + closePath(), + // prettier-ignore + options.color && options.borderWidth ? fillAndStroke() + : options.color ? fill() + : options.borderColor ? stroke() + : closePath(), + popGraphicsState(), + ].filter(Boolean); + }; + var KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0); + /** @deprecated */ + var drawEllipsePath = function (config) { + var x = asNumber(config.x); + var y = asNumber(config.y); + var xScale = asNumber(config.xScale); + var yScale = asNumber(config.yScale); + x -= xScale; + y -= yScale; + var ox = xScale * KAPPA; + var oy = yScale * KAPPA; + var xe = x + xScale * 2; + var ye = y + yScale * 2; + var xm = x + xScale; + var ym = y + yScale; + return [ + pushGraphicsState(), + moveTo(x, ym), + appendBezierCurve(x, ym - oy, xm - ox, y, xm, y), + appendBezierCurve(xm + ox, y, xe, ym - oy, xe, ym), + appendBezierCurve(xe, ym + oy, xm + ox, ye, xm, ye), + appendBezierCurve(xm - ox, ye, x, ym + oy, x, ym), + popGraphicsState(), + ]; + }; + var drawEllipseCurves = function (config) { + var centerX = asNumber(config.x); + var centerY = asNumber(config.y); + var xScale = asNumber(config.xScale); + var yScale = asNumber(config.yScale); + var x = -xScale; + var y = -yScale; + var ox = xScale * KAPPA; + var oy = yScale * KAPPA; + var xe = x + xScale * 2; + var ye = y + yScale * 2; + var xm = x + xScale; + var ym = y + yScale; + return [ + translate(centerX, centerY), + rotateRadians(toRadians(config.rotate)), + moveTo(x, ym), + appendBezierCurve(x, ym - oy, xm - ox, y, xm, y), + appendBezierCurve(xm + ox, y, xe, ym - oy, xe, ym), + appendBezierCurve(xe, ym + oy, xm + ox, ye, xm, ye), + appendBezierCurve(xm - ox, ye, x, ym + oy, x, ym), + ]; + }; + var drawEllipse = function (options) { + var _a, _b, _c; + return __spreadArrays([ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + options.color && setFillingColor(options.color), + options.borderColor && setStrokingColor(options.borderColor), + setLineWidth(options.borderWidth), + options.borderLineCap && setLineCap(options.borderLineCap), + setDashPattern((_a = options.borderDashArray) !== null && _a !== void 0 ? _a : [], (_b = options.borderDashPhase) !== null && _b !== void 0 ? _b : 0) + ], (options.rotate === undefined + ? drawEllipsePath({ + x: options.x, + y: options.y, + xScale: options.xScale, + yScale: options.yScale, + }) + : drawEllipseCurves({ + x: options.x, + y: options.y, + xScale: options.xScale, + yScale: options.yScale, + rotate: (_c = options.rotate) !== null && _c !== void 0 ? _c : degrees(0), + })), [ + // prettier-ignore + options.color && options.borderWidth ? fillAndStroke() + : options.color ? fill() + : options.borderColor ? stroke() + : closePath(), + popGraphicsState(), + ]).filter(Boolean); + }; + var drawSvgPath = function (path, options) { + var _a, _b, _c; + return __spreadArrays([ + pushGraphicsState(), + options.graphicsState && setGraphicsState(options.graphicsState), + translate(options.x, options.y), + rotateRadians(toRadians((_a = options.rotate) !== null && _a !== void 0 ? _a : degrees(0))), + // SVG path Y axis is opposite pdf-lib's + options.scale ? scale(options.scale, -options.scale) : scale(1, -1), + options.color && setFillingColor(options.color), + options.borderColor && setStrokingColor(options.borderColor), + options.borderWidth && setLineWidth(options.borderWidth), + options.borderLineCap && setLineCap(options.borderLineCap), + setDashPattern((_b = options.borderDashArray) !== null && _b !== void 0 ? _b : [], (_c = options.borderDashPhase) !== null && _c !== void 0 ? _c : 0) + ], svgPathToOperators(path), [ + // prettier-ignore + options.color && options.borderWidth ? fillAndStroke() + : options.color ? fill() + : options.borderColor ? stroke() + : closePath(), + popGraphicsState(), + ]).filter(Boolean); + }; + var drawCheckMark = function (options) { + var size = asNumber(options.size); + /*********************** Define Check Mark Points ***************************/ + // A check mark is defined by three points in some coordinate space. Here, we + // define these points in a unit coordinate system, where the range of the x + // and y axis are both [-1, 1]. + // + // Note that we do not hard code `p1y` in case we wish to change the + // size/shape of the check mark in the future. We want the check mark to + // always form a right angle. This means that the dot product between (p1-p2) + // and (p3-p2) should be zero: + // + // (p1x-p2x) * (p3x-p2x) + (p1y-p2y) * (p3y-p2y) = 0 + // + // We can now rejigger this equation to solve for `p1y`: + // + // (p1y-p2y) * (p3y-p2y) = -((p1x-p2x) * (p3x-p2x)) + // (p1y-p2y) = -((p1x-p2x) * (p3x-p2x)) / (p3y-p2y) + // p1y = -((p1x-p2x) * (p3x-p2x)) / (p3y-p2y) + p2y + // + // Thanks to my friend Joel Walker (https://github.com/JWalker1995) for + // devising the above equation and unit coordinate system approach! + // (x, y) coords of the check mark's bottommost point + var p2x = -1 + 0.75; + var p2y = -1 + 0.51; + // (x, y) coords of the check mark's topmost point + var p3y = 1 - 0.525; + var p3x = 1 - 0.31; + // (x, y) coords of the check mark's center (vertically) point + var p1x = -1 + 0.325; + var p1y = -((p1x - p2x) * (p3x - p2x)) / (p3y - p2y) + p2y; + /****************************************************************************/ + return [ + pushGraphicsState(), + options.color && setStrokingColor(options.color), + setLineWidth(options.thickness), + translate(options.x, options.y), + moveTo(p1x * size, p1y * size), + lineTo(p2x * size, p2y * size), + lineTo(p3x * size, p3y * size), + stroke(), + popGraphicsState(), + ].filter(Boolean); + }; + // prettier-ignore + var rotateInPlace = function (options) { + return options.rotation === 0 ? [ + translate(0, 0), + rotateDegrees(0) + ] + : options.rotation === 90 ? [ + translate(options.width, 0), + rotateDegrees(90) + ] + : options.rotation === 180 ? [ + translate(options.width, options.height), + rotateDegrees(180) + ] + : options.rotation === 270 ? [ + translate(0, options.height), + rotateDegrees(270) + ] + : []; + }; // Invalid rotation - noop + var drawCheckBox = function (options) { + var outline = drawRectangle({ + x: options.x, + y: options.y, + width: options.width, + height: options.height, + borderWidth: options.borderWidth, + color: options.color, + borderColor: options.borderColor, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }); + if (!options.filled) + return outline; + var width = asNumber(options.width); + var height = asNumber(options.height); + var checkMarkSize = Math.min(width, height) / 2; + var checkMark = drawCheckMark({ + x: width / 2, + y: height / 2, + size: checkMarkSize, + thickness: options.thickness, + color: options.markColor, + }); + return __spreadArrays([pushGraphicsState()], outline, checkMark, [popGraphicsState()]); + }; + var drawRadioButton = function (options) { + var width = asNumber(options.width); + var height = asNumber(options.height); + var outlineScale = Math.min(width, height) / 2; + var outline = drawEllipse({ + x: options.x, + y: options.y, + xScale: outlineScale, + yScale: outlineScale, + color: options.color, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + }); + if (!options.filled) + return outline; + var dot = drawEllipse({ + x: options.x, + y: options.y, + xScale: outlineScale * 0.45, + yScale: outlineScale * 0.45, + color: options.dotColor, + borderColor: undefined, + borderWidth: 0, + }); + return __spreadArrays([pushGraphicsState()], outline, dot, [popGraphicsState()]); + }; + var drawButton = function (options) { + var x = asNumber(options.x); + var y = asNumber(options.y); + var width = asNumber(options.width); + var height = asNumber(options.height); + var background = drawRectangle({ + x: x, + y: y, + width: width, + height: height, + borderWidth: options.borderWidth, + color: options.color, + borderColor: options.borderColor, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }); + var lines = drawTextLines(options.textLines, { + color: options.textColor, + font: options.font, + size: options.fontSize, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }); + return __spreadArrays([pushGraphicsState()], background, lines, [popGraphicsState()]); + }; + var drawTextLines = function (lines, options) { + var operators = [ + beginText(), + setFillingColor(options.color), + setFontAndSize(options.font, options.size), + ]; + for (var idx = 0, len = lines.length; idx < len; idx++) { + var _a = lines[idx], encoded = _a.encoded, x = _a.x, y = _a.y; + operators.push(rotateAndSkewTextRadiansAndTranslate(toRadians(options.rotate), toRadians(options.xSkew), toRadians(options.ySkew), x, y), showText(encoded)); + } + operators.push(endText()); + return operators; + }; + var drawTextField = function (options) { + var x = asNumber(options.x); + var y = asNumber(options.y); + var width = asNumber(options.width); + var height = asNumber(options.height); + var borderWidth = asNumber(options.borderWidth); + var padding = asNumber(options.padding); + var clipX = x + borderWidth / 2 + padding; + var clipY = y + borderWidth / 2 + padding; + var clipWidth = width - (borderWidth / 2 + padding) * 2; + var clipHeight = height - (borderWidth / 2 + padding) * 2; + var clippingArea = [ + moveTo(clipX, clipY), + lineTo(clipX, clipY + clipHeight), + lineTo(clipX + clipWidth, clipY + clipHeight), + lineTo(clipX + clipWidth, clipY), + closePath(), + clip(), + endPath(), + ]; + var background = drawRectangle({ + x: x, + y: y, + width: width, + height: height, + borderWidth: options.borderWidth, + color: options.color, + borderColor: options.borderColor, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }); + var lines = drawTextLines(options.textLines, { + color: options.textColor, + font: options.font, + size: options.fontSize, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }); + var markedContent = __spreadArrays([ + beginMarkedContent('Tx'), + pushGraphicsState() + ], lines, [ + popGraphicsState(), + endMarkedContent(), + ]); + return __spreadArrays([ + pushGraphicsState() + ], background, clippingArea, markedContent, [ + popGraphicsState(), + ]); + }; + var drawOptionList = function (options) { + var x = asNumber(options.x); + var y = asNumber(options.y); + var width = asNumber(options.width); + var height = asNumber(options.height); + var lineHeight = asNumber(options.lineHeight); + var borderWidth = asNumber(options.borderWidth); + var padding = asNumber(options.padding); + var clipX = x + borderWidth / 2 + padding; + var clipY = y + borderWidth / 2 + padding; + var clipWidth = width - (borderWidth / 2 + padding) * 2; + var clipHeight = height - (borderWidth / 2 + padding) * 2; + var clippingArea = [ + moveTo(clipX, clipY), + lineTo(clipX, clipY + clipHeight), + lineTo(clipX + clipWidth, clipY + clipHeight), + lineTo(clipX + clipWidth, clipY), + closePath(), + clip(), + endPath(), + ]; + var background = drawRectangle({ + x: x, + y: y, + width: width, + height: height, + borderWidth: options.borderWidth, + color: options.color, + borderColor: options.borderColor, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }); + var highlights = []; + for (var idx = 0, len = options.selectedLines.length; idx < len; idx++) { + var line = options.textLines[options.selectedLines[idx]]; + highlights.push.apply(highlights, drawRectangle({ + x: line.x - padding, + y: line.y - (lineHeight - line.height) / 2, + width: width - borderWidth, + height: line.height + (lineHeight - line.height) / 2, + borderWidth: 0, + color: options.selectedColor, + borderColor: undefined, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + })); + } + var lines = drawTextLines(options.textLines, { + color: options.textColor, + font: options.font, + size: options.fontSize, + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }); + var markedContent = __spreadArrays([ + beginMarkedContent('Tx'), + pushGraphicsState() + ], lines, [ + popGraphicsState(), + endMarkedContent(), + ]); + return __spreadArrays([ + pushGraphicsState() + ], background, highlights, clippingArea, markedContent, [ + popGraphicsState(), + ]); + }; + + // tslint:disable: max-classes-per-file + // TODO: Include link to documentation with example + var EncryptedPDFError = /** @class */ (function (_super) { + __extends(EncryptedPDFError, _super); + function EncryptedPDFError() { + var _this = this; + var msg = 'Input document to `PDFDocument.load` is encrypted. You can use `PDFDocument.load(..., { ignoreEncryption: true })` if you wish to load the document anyways.'; + _this = _super.call(this, msg) || this; + return _this; + } + return EncryptedPDFError; + }(Error)); + // TODO: Include link to documentation with example + var FontkitNotRegisteredError = /** @class */ (function (_super) { + __extends(FontkitNotRegisteredError, _super); + function FontkitNotRegisteredError() { + var _this = this; + var msg = 'Input to `PDFDocument.embedFont` was a custom font, but no `fontkit` instance was found. You must register a `fontkit` instance with `PDFDocument.registerFontkit(...)` before embedding custom fonts.'; + _this = _super.call(this, msg) || this; + return _this; + } + return FontkitNotRegisteredError; + }(Error)); + // TODO: Include link to documentation with example + var ForeignPageError = /** @class */ (function (_super) { + __extends(ForeignPageError, _super); + function ForeignPageError() { + var _this = this; + var msg = 'A `page` passed to `PDFDocument.addPage` or `PDFDocument.insertPage` was from a different (foreign) PDF document. If you want to copy pages from one PDFDocument to another, you must use `PDFDocument.copyPages(...)` to copy the pages before adding or inserting them.'; + _this = _super.call(this, msg) || this; + return _this; + } + return ForeignPageError; + }(Error)); + // TODO: Include link to documentation with example + var RemovePageFromEmptyDocumentError = /** @class */ (function (_super) { + __extends(RemovePageFromEmptyDocumentError, _super); + function RemovePageFromEmptyDocumentError() { + var _this = this; + var msg = 'PDFDocument has no pages so `PDFDocument.removePage` cannot be called'; + _this = _super.call(this, msg) || this; + return _this; + } + return RemovePageFromEmptyDocumentError; + }(Error)); + var NoSuchFieldError = /** @class */ (function (_super) { + __extends(NoSuchFieldError, _super); + function NoSuchFieldError(name) { + var _this = this; + var msg = "PDFDocument has no form field with the name \"" + name + "\""; + _this = _super.call(this, msg) || this; + return _this; + } + return NoSuchFieldError; + }(Error)); + var UnexpectedFieldTypeError = /** @class */ (function (_super) { + __extends(UnexpectedFieldTypeError, _super); + function UnexpectedFieldTypeError(name, expected, actual) { + var _a, _b; + var _this = this; + var expectedType = expected === null || expected === void 0 ? void 0 : expected.name; + var actualType = (_b = (_a = actual === null || actual === void 0 ? void 0 : actual.constructor) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : actual; + var msg = "Expected field \"" + name + "\" to be of type " + expectedType + ", " + + ("but it is actually of type " + actualType); + _this = _super.call(this, msg) || this; + return _this; + } + return UnexpectedFieldTypeError; + }(Error)); + var MissingOnValueCheckError = /** @class */ (function (_super) { + __extends(MissingOnValueCheckError, _super); + function MissingOnValueCheckError(onValue) { + var _this = this; + var msg = "Failed to select check box due to missing onValue: \"" + onValue + "\""; + _this = _super.call(this, msg) || this; + return _this; + } + return MissingOnValueCheckError; + }(Error)); + var FieldAlreadyExistsError = /** @class */ (function (_super) { + __extends(FieldAlreadyExistsError, _super); + function FieldAlreadyExistsError(name) { + var _this = this; + var msg = "A field already exists with the specified name: \"" + name + "\""; + _this = _super.call(this, msg) || this; + return _this; + } + return FieldAlreadyExistsError; + }(Error)); + var InvalidFieldNamePartError = /** @class */ (function (_super) { + __extends(InvalidFieldNamePartError, _super); + function InvalidFieldNamePartError(namePart) { + var _this = this; + var msg = "Field name contains invalid component: \"" + namePart + "\""; + _this = _super.call(this, msg) || this; + return _this; + } + return InvalidFieldNamePartError; + }(Error)); + var FieldExistsAsNonTerminalError = /** @class */ (function (_super) { + __extends(FieldExistsAsNonTerminalError, _super); + function FieldExistsAsNonTerminalError(name) { + var _this = this; + var msg = "A non-terminal field already exists with the specified name: \"" + name + "\""; + _this = _super.call(this, msg) || this; + return _this; + } + return FieldExistsAsNonTerminalError; + }(Error)); + var RichTextFieldReadError = /** @class */ (function (_super) { + __extends(RichTextFieldReadError, _super); + function RichTextFieldReadError(fieldName) { + var _this = this; + var msg = "Reading rich text fields is not supported: Attempted to read rich text field: " + fieldName; + _this = _super.call(this, msg) || this; + return _this; + } + return RichTextFieldReadError; + }(Error)); + var CombedTextLayoutError = /** @class */ (function (_super) { + __extends(CombedTextLayoutError, _super); + function CombedTextLayoutError(lineLength, cellCount) { + var _this = this; + var msg = "Failed to layout combed text as lineLength=" + lineLength + " is greater than cellCount=" + cellCount; + _this = _super.call(this, msg) || this; + return _this; + } + return CombedTextLayoutError; + }(Error)); + var ExceededMaxLengthError = /** @class */ (function (_super) { + __extends(ExceededMaxLengthError, _super); + function ExceededMaxLengthError(textLength, maxLength, name) { + var _this = this; + var msg = "Attempted to set text with length=" + textLength + " for TextField with maxLength=" + maxLength + " and name=" + name; + _this = _super.call(this, msg) || this; + return _this; + } + return ExceededMaxLengthError; + }(Error)); + var InvalidMaxLengthError = /** @class */ (function (_super) { + __extends(InvalidMaxLengthError, _super); + function InvalidMaxLengthError(textLength, maxLength, name) { + var _this = this; + var msg = "Attempted to set maxLength=" + maxLength + ", which is less than " + textLength + ", the length of this field's current value (name=" + name + ")"; + _this = _super.call(this, msg) || this; + return _this; + } + return InvalidMaxLengthError; + }(Error)); + + (function (TextAlignment) { + TextAlignment[TextAlignment["Left"] = 0] = "Left"; + TextAlignment[TextAlignment["Center"] = 1] = "Center"; + TextAlignment[TextAlignment["Right"] = 2] = "Right"; + })(exports.TextAlignment || (exports.TextAlignment = {})); + + var MIN_FONT_SIZE = 4; + var MAX_FONT_SIZE = 500; + var computeFontSize = function (lines, font, bounds, multiline) { + if (multiline === void 0) { multiline = false; } + var fontSize = MIN_FONT_SIZE; + while (fontSize < MAX_FONT_SIZE) { + var linesUsed = 0; + for (var lineIdx = 0, lineLen = lines.length; lineIdx < lineLen; lineIdx++) { + linesUsed += 1; + var line = lines[lineIdx]; + var words = line.split(' '); + // Layout the words using the current `fontSize`, line wrapping + // whenever we reach the end of the current line. + var spaceInLineRemaining = bounds.width; + for (var idx = 0, len = words.length; idx < len; idx++) { + var isLastWord = idx === len - 1; + var word = isLastWord ? words[idx] : words[idx] + ' '; + var widthOfWord = font.widthOfTextAtSize(word, fontSize); + spaceInLineRemaining -= widthOfWord; + if (spaceInLineRemaining <= 0) { + linesUsed += 1; + spaceInLineRemaining = bounds.width - widthOfWord; + } + } + } + // Return if we exceeded the allowed width + if (!multiline && linesUsed > lines.length) + return fontSize - 1; + var height = font.heightAtSize(fontSize); + var lineHeight = height + height * 0.2; + var totalHeight = lineHeight * linesUsed; + // Return if we exceeded the allowed height + if (totalHeight > Math.abs(bounds.height)) + return fontSize - 1; + fontSize += 1; + } + return fontSize; + }; + var computeCombedFontSize = function (line, font, bounds, cellCount) { + var cellWidth = bounds.width / cellCount; + var cellHeight = bounds.height; + var fontSize = MIN_FONT_SIZE; + var chars = charSplit(line); + while (fontSize < MAX_FONT_SIZE) { + for (var idx = 0, len = chars.length; idx < len; idx++) { + var c = chars[idx]; + var tooLong = font.widthOfTextAtSize(c, fontSize) > cellWidth * 0.75; + if (tooLong) + return fontSize - 1; + } + var height = font.heightAtSize(fontSize, { descender: false }); + if (height > cellHeight) + return fontSize - 1; + fontSize += 1; + } + return fontSize; + }; + var lastIndexOfWhitespace = function (line) { + for (var idx = line.length; idx > 0; idx--) { + if (/\s/.test(line[idx])) + return idx; + } + return undefined; + }; + var splitOutLines = function (input, maxWidth, font, fontSize) { + var _a; + var lastWhitespaceIdx = input.length; + while (lastWhitespaceIdx > 0) { + var line = input.substring(0, lastWhitespaceIdx); + var encoded = font.encodeText(line); + var width = font.widthOfTextAtSize(line, fontSize); + if (width < maxWidth) { + var remainder = input.substring(lastWhitespaceIdx) || undefined; + return { line: line, encoded: encoded, width: width, remainder: remainder }; + } + lastWhitespaceIdx = (_a = lastIndexOfWhitespace(line)) !== null && _a !== void 0 ? _a : 0; + } + // We were unable to split the input enough to get a chunk that would fit + // within the specified `maxWidth` so we'll just return everything + return { + line: input, + encoded: font.encodeText(input), + width: font.widthOfTextAtSize(input, fontSize), + remainder: undefined, + }; + }; + var layoutMultilineText = function (text, _a) { + var alignment = _a.alignment, fontSize = _a.fontSize, font = _a.font, bounds = _a.bounds; + var lines = lineSplit(cleanText(text)); + if (fontSize === undefined || fontSize === 0) { + fontSize = computeFontSize(lines, font, bounds, true); + } + var height = font.heightAtSize(fontSize); + var lineHeight = height + height * 0.2; + var textLines = []; + var minX = bounds.x; + var minY = bounds.y; + var maxX = bounds.x + bounds.width; + var maxY = bounds.y + bounds.height; + var y = bounds.y + bounds.height; + for (var idx = 0, len = lines.length; idx < len; idx++) { + var prevRemainder = lines[idx]; + while (prevRemainder !== undefined) { + var _b = splitOutLines(prevRemainder, bounds.width, font, fontSize), line = _b.line, encoded = _b.encoded, width = _b.width, remainder = _b.remainder; + // prettier-ignore + var x = (alignment === exports.TextAlignment.Left ? bounds.x + : alignment === exports.TextAlignment.Center ? bounds.x + (bounds.width / 2) - (width / 2) + : alignment === exports.TextAlignment.Right ? bounds.x + bounds.width - width + : bounds.x); + y -= lineHeight; + if (x < minX) + minX = x; + if (y < minY) + minY = y; + if (x + width > maxX) + maxX = x + width; + if (y + height > maxY) + maxY = y + height; + textLines.push({ text: line, encoded: encoded, width: width, height: height, x: x, y: y }); + // Only trim lines that we had to split ourselves. So we won't trim lines + // that the user provided themselves with whitespace. + prevRemainder = remainder === null || remainder === void 0 ? void 0 : remainder.trim(); + } + } + return { + fontSize: fontSize, + lineHeight: lineHeight, + lines: textLines, + bounds: { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }, + }; + }; + var layoutCombedText = function (text, _a) { + var fontSize = _a.fontSize, font = _a.font, bounds = _a.bounds, cellCount = _a.cellCount; + var line = mergeLines(cleanText(text)); + if (line.length > cellCount) { + throw new CombedTextLayoutError(line.length, cellCount); + } + if (fontSize === undefined || fontSize === 0) { + fontSize = computeCombedFontSize(line, font, bounds, cellCount); + } + var cellWidth = bounds.width / cellCount; + var height = font.heightAtSize(fontSize, { descender: false }); + var y = bounds.y + (bounds.height / 2 - height / 2); + var cells = []; + var minX = bounds.x; + var minY = bounds.y; + var maxX = bounds.x + bounds.width; + var maxY = bounds.y + bounds.height; + var cellOffset = 0; + var charOffset = 0; + while (cellOffset < cellCount) { + var _b = charAtIndex(line, charOffset), char = _b[0], charLength = _b[1]; + var encoded = font.encodeText(char); + var width = font.widthOfTextAtSize(char, fontSize); + var cellCenter = bounds.x + (cellWidth * cellOffset + cellWidth / 2); + var x = cellCenter - width / 2; + if (x < minX) + minX = x; + if (y < minY) + minY = y; + if (x + width > maxX) + maxX = x + width; + if (y + height > maxY) + maxY = y + height; + cells.push({ text: line, encoded: encoded, width: width, height: height, x: x, y: y }); + cellOffset += 1; + charOffset += charLength; + } + return { + fontSize: fontSize, + cells: cells, + bounds: { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }, + }; + }; + var layoutSinglelineText = function (text, _a) { + var alignment = _a.alignment, fontSize = _a.fontSize, font = _a.font, bounds = _a.bounds; + var line = mergeLines(cleanText(text)); + if (fontSize === undefined || fontSize === 0) { + fontSize = computeFontSize([line], font, bounds); + } + var encoded = font.encodeText(line); + var width = font.widthOfTextAtSize(line, fontSize); + var height = font.heightAtSize(fontSize, { descender: false }); + // prettier-ignore + var x = (alignment === exports.TextAlignment.Left ? bounds.x + : alignment === exports.TextAlignment.Center ? bounds.x + (bounds.width / 2) - (width / 2) + : alignment === exports.TextAlignment.Right ? bounds.x + bounds.width - width + : bounds.x); + var y = bounds.y + (bounds.height / 2 - height / 2); + return { + fontSize: fontSize, + line: { text: line, encoded: encoded, width: width, height: height, x: x, y: y }, + bounds: { x: x, y: y, width: width, height: height }, + }; + }; + + /********************* Appearance Provider Functions **************************/ + var normalizeAppearance = function (appearance) { + if ('normal' in appearance) + return appearance; + return { normal: appearance }; + }; + // Examples: + // `/Helv 12 Tf` -> ['/Helv 12 Tf', 'Helv', '12'] + // `/HeBo 8.00 Tf` -> ['/HeBo 8 Tf', 'HeBo', '8.00'] + var tfRegex$1 = /\/([^\0\t\n\f\r\ ]+)[\0\t\n\f\r\ ]+(\d*\.\d+|\d+)[\0\t\n\f\r\ ]+Tf/; + var getDefaultFontSize = function (field) { + var _a, _b; + var da = (_a = field.getDefaultAppearance()) !== null && _a !== void 0 ? _a : ''; + var daMatch = (_b = findLastMatch(da, tfRegex$1).match) !== null && _b !== void 0 ? _b : []; + var defaultFontSize = Number(daMatch[2]); + return isFinite(defaultFontSize) ? defaultFontSize : undefined; + }; + // Examples: + // `0.3 g` -> ['0.3', 'g'] + // `0.3 1 .3 rg` -> ['0.3', '1', '.3', 'rg'] + // `0.3 1 .3 0 k` -> ['0.3', '1', '.3', '0', 'k'] + var colorRegex = /(\d*\.\d+|\d+)[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]+(g|rg|k)/; + var getDefaultColor = function (field) { + var _a; + var da = (_a = field.getDefaultAppearance()) !== null && _a !== void 0 ? _a : ''; + var daMatch = findLastMatch(da, colorRegex).match; + var _b = daMatch !== null && daMatch !== void 0 ? daMatch : [], c1 = _b[1], c2 = _b[2], c3 = _b[3], c4 = _b[4], colorSpace = _b[5]; + if (colorSpace === 'g' && c1) { + return grayscale(Number(c1)); + } + if (colorSpace === 'rg' && c1 && c2 && c3) { + return rgb(Number(c1), Number(c2), Number(c3)); + } + if (colorSpace === 'k' && c1 && c2 && c3 && c4) { + return cmyk(Number(c1), Number(c2), Number(c3), Number(c4)); + } + return undefined; + }; + var updateDefaultAppearance = function (field, color, font, fontSize) { + var _a; + if (fontSize === void 0) { fontSize = 0; } + var da = [ + setFillingColor(color).toString(), + setFontAndSize((_a = font === null || font === void 0 ? void 0 : font.name) !== null && _a !== void 0 ? _a : 'dummy__noop', fontSize).toString(), + ].join('\n'); + field.setDefaultAppearance(da); + }; + var defaultCheckBoxAppearanceProvider = function (checkBox, widget) { + var _a, _b, _c; + // The `/DA` entry can be at the widget or field level - so we handle both + var widgetColor = getDefaultColor(widget); + var fieldColor = getDefaultColor(checkBox.acroField); + var rectangle = widget.getRectangle(); + var ap = widget.getAppearanceCharacteristics(); + var bs = widget.getBorderStyle(); + var borderWidth = (_a = bs === null || bs === void 0 ? void 0 : bs.getWidth()) !== null && _a !== void 0 ? _a : 0; + var rotation = reduceRotation(ap === null || ap === void 0 ? void 0 : ap.getRotation()); + var _d = adjustDimsForRotation(rectangle, rotation), width = _d.width, height = _d.height; + var rotate = rotateInPlace(__assign(__assign({}, rectangle), { rotation: rotation })); + var black = rgb(0, 0, 0); + var borderColor = (_b = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBorderColor())) !== null && _b !== void 0 ? _b : black; + var normalBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor()); + var downBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor(), 0.8); + // Update color + var textColor = (_c = widgetColor !== null && widgetColor !== void 0 ? widgetColor : fieldColor) !== null && _c !== void 0 ? _c : black; + if (widgetColor) { + updateDefaultAppearance(widget, textColor); + } + else { + updateDefaultAppearance(checkBox.acroField, textColor); + } + var options = { + x: 0 + borderWidth / 2, + y: 0 + borderWidth / 2, + width: width - borderWidth, + height: height - borderWidth, + thickness: 1.5, + borderWidth: borderWidth, + borderColor: borderColor, + markColor: textColor, + }; + return { + normal: { + on: __spreadArrays(rotate, drawCheckBox(__assign(__assign({}, options), { color: normalBackgroundColor, filled: true }))), + off: __spreadArrays(rotate, drawCheckBox(__assign(__assign({}, options), { color: normalBackgroundColor, filled: false }))), + }, + down: { + on: __spreadArrays(rotate, drawCheckBox(__assign(__assign({}, options), { color: downBackgroundColor, filled: true }))), + off: __spreadArrays(rotate, drawCheckBox(__assign(__assign({}, options), { color: downBackgroundColor, filled: false }))), + }, + }; + }; + var defaultRadioGroupAppearanceProvider = function (radioGroup, widget) { + var _a, _b, _c; + // The `/DA` entry can be at the widget or field level - so we handle both + var widgetColor = getDefaultColor(widget); + var fieldColor = getDefaultColor(radioGroup.acroField); + var rectangle = widget.getRectangle(); + var ap = widget.getAppearanceCharacteristics(); + var bs = widget.getBorderStyle(); + var borderWidth = (_a = bs === null || bs === void 0 ? void 0 : bs.getWidth()) !== null && _a !== void 0 ? _a : 0; + var rotation = reduceRotation(ap === null || ap === void 0 ? void 0 : ap.getRotation()); + var _d = adjustDimsForRotation(rectangle, rotation), width = _d.width, height = _d.height; + var rotate = rotateInPlace(__assign(__assign({}, rectangle), { rotation: rotation })); + var black = rgb(0, 0, 0); + var borderColor = (_b = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBorderColor())) !== null && _b !== void 0 ? _b : black; + var normalBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor()); + var downBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor(), 0.8); + // Update color + var textColor = (_c = widgetColor !== null && widgetColor !== void 0 ? widgetColor : fieldColor) !== null && _c !== void 0 ? _c : black; + if (widgetColor) { + updateDefaultAppearance(widget, textColor); + } + else { + updateDefaultAppearance(radioGroup.acroField, textColor); + } + var options = { + x: width / 2, + y: height / 2, + width: width - borderWidth, + height: height - borderWidth, + borderWidth: borderWidth, + borderColor: borderColor, + dotColor: textColor, + }; + return { + normal: { + on: __spreadArrays(rotate, drawRadioButton(__assign(__assign({}, options), { color: normalBackgroundColor, filled: true }))), + off: __spreadArrays(rotate, drawRadioButton(__assign(__assign({}, options), { color: normalBackgroundColor, filled: false }))), + }, + down: { + on: __spreadArrays(rotate, drawRadioButton(__assign(__assign({}, options), { color: downBackgroundColor, filled: true }))), + off: __spreadArrays(rotate, drawRadioButton(__assign(__assign({}, options), { color: downBackgroundColor, filled: false }))), + }, + }; + }; + var defaultButtonAppearanceProvider = function (button, widget, font) { + var _a, _b, _c, _d, _e; + // The `/DA` entry can be at the widget or field level - so we handle both + var widgetColor = getDefaultColor(widget); + var fieldColor = getDefaultColor(button.acroField); + var widgetFontSize = getDefaultFontSize(widget); + var fieldFontSize = getDefaultFontSize(button.acroField); + var rectangle = widget.getRectangle(); + var ap = widget.getAppearanceCharacteristics(); + var bs = widget.getBorderStyle(); + var captions = ap === null || ap === void 0 ? void 0 : ap.getCaptions(); + var normalText = (_a = captions === null || captions === void 0 ? void 0 : captions.normal) !== null && _a !== void 0 ? _a : ''; + var downText = (_c = (_b = captions === null || captions === void 0 ? void 0 : captions.down) !== null && _b !== void 0 ? _b : normalText) !== null && _c !== void 0 ? _c : ''; + var borderWidth = (_d = bs === null || bs === void 0 ? void 0 : bs.getWidth()) !== null && _d !== void 0 ? _d : 0; + var rotation = reduceRotation(ap === null || ap === void 0 ? void 0 : ap.getRotation()); + var _f = adjustDimsForRotation(rectangle, rotation), width = _f.width, height = _f.height; + var rotate = rotateInPlace(__assign(__assign({}, rectangle), { rotation: rotation })); + var black = rgb(0, 0, 0); + var borderColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBorderColor()); + var normalBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor()); + var downBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor(), 0.8); + var bounds = { + x: borderWidth, + y: borderWidth, + width: width - borderWidth * 2, + height: height - borderWidth * 2, + }; + var normalLayout = layoutSinglelineText(normalText, { + alignment: exports.TextAlignment.Center, + fontSize: widgetFontSize !== null && widgetFontSize !== void 0 ? widgetFontSize : fieldFontSize, + font: font, + bounds: bounds, + }); + var downLayout = layoutSinglelineText(downText, { + alignment: exports.TextAlignment.Center, + fontSize: widgetFontSize !== null && widgetFontSize !== void 0 ? widgetFontSize : fieldFontSize, + font: font, + bounds: bounds, + }); + // Update font size and color + var fontSize = Math.min(normalLayout.fontSize, downLayout.fontSize); + var textColor = (_e = widgetColor !== null && widgetColor !== void 0 ? widgetColor : fieldColor) !== null && _e !== void 0 ? _e : black; + if (widgetColor || widgetFontSize !== undefined) { + updateDefaultAppearance(widget, textColor, font, fontSize); + } + else { + updateDefaultAppearance(button.acroField, textColor, font, fontSize); + } + var options = { + x: 0 + borderWidth / 2, + y: 0 + borderWidth / 2, + width: width - borderWidth, + height: height - borderWidth, + borderWidth: borderWidth, + borderColor: borderColor, + textColor: textColor, + font: font.name, + fontSize: fontSize, + }; + return { + normal: __spreadArrays(rotate, drawButton(__assign(__assign({}, options), { color: normalBackgroundColor, textLines: [normalLayout.line] }))), + down: __spreadArrays(rotate, drawButton(__assign(__assign({}, options), { color: downBackgroundColor, textLines: [downLayout.line] }))), + }; + }; + var defaultTextFieldAppearanceProvider = function (textField, widget, font) { + var _a, _b, _c, _d; + // The `/DA` entry can be at the widget or field level - so we handle both + var widgetColor = getDefaultColor(widget); + var fieldColor = getDefaultColor(textField.acroField); + var widgetFontSize = getDefaultFontSize(widget); + var fieldFontSize = getDefaultFontSize(textField.acroField); + var rectangle = widget.getRectangle(); + var ap = widget.getAppearanceCharacteristics(); + var bs = widget.getBorderStyle(); + var text = (_a = textField.getText()) !== null && _a !== void 0 ? _a : ''; + var borderWidth = (_b = bs === null || bs === void 0 ? void 0 : bs.getWidth()) !== null && _b !== void 0 ? _b : 0; + var rotation = reduceRotation(ap === null || ap === void 0 ? void 0 : ap.getRotation()); + var _e = adjustDimsForRotation(rectangle, rotation), width = _e.width, height = _e.height; + var rotate = rotateInPlace(__assign(__assign({}, rectangle), { rotation: rotation })); + var black = rgb(0, 0, 0); + var borderColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBorderColor()); + var normalBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor()); + var textLines; + var fontSize; + var padding = textField.isCombed() ? 0 : 1; + var bounds = { + x: borderWidth + padding, + y: borderWidth + padding, + width: width - (borderWidth + padding) * 2, + height: height - (borderWidth + padding) * 2, + }; + if (textField.isMultiline()) { + var layout = layoutMultilineText(text, { + alignment: textField.getAlignment(), + fontSize: widgetFontSize !== null && widgetFontSize !== void 0 ? widgetFontSize : fieldFontSize, + font: font, + bounds: bounds, + }); + textLines = layout.lines; + fontSize = layout.fontSize; + } + else if (textField.isCombed()) { + var layout = layoutCombedText(text, { + fontSize: widgetFontSize !== null && widgetFontSize !== void 0 ? widgetFontSize : fieldFontSize, + font: font, + bounds: bounds, + cellCount: (_c = textField.getMaxLength()) !== null && _c !== void 0 ? _c : 0, + }); + textLines = layout.cells; + fontSize = layout.fontSize; + } + else { + var layout = layoutSinglelineText(text, { + alignment: textField.getAlignment(), + fontSize: widgetFontSize !== null && widgetFontSize !== void 0 ? widgetFontSize : fieldFontSize, + font: font, + bounds: bounds, + }); + textLines = [layout.line]; + fontSize = layout.fontSize; + } + // Update font size and color + var textColor = (_d = widgetColor !== null && widgetColor !== void 0 ? widgetColor : fieldColor) !== null && _d !== void 0 ? _d : black; + if (widgetColor || widgetFontSize !== undefined) { + updateDefaultAppearance(widget, textColor, font, fontSize); + } + else { + updateDefaultAppearance(textField.acroField, textColor, font, fontSize); + } + var options = { + x: 0 + borderWidth / 2, + y: 0 + borderWidth / 2, + width: width - borderWidth, + height: height - borderWidth, + borderWidth: borderWidth !== null && borderWidth !== void 0 ? borderWidth : 0, + borderColor: borderColor, + textColor: textColor, + font: font.name, + fontSize: fontSize, + color: normalBackgroundColor, + textLines: textLines, + padding: padding, + }; + return __spreadArrays(rotate, drawTextField(options)); + }; + var defaultDropdownAppearanceProvider = function (dropdown, widget, font) { + var _a, _b, _c; + // The `/DA` entry can be at the widget or field level - so we handle both + var widgetColor = getDefaultColor(widget); + var fieldColor = getDefaultColor(dropdown.acroField); + var widgetFontSize = getDefaultFontSize(widget); + var fieldFontSize = getDefaultFontSize(dropdown.acroField); + var rectangle = widget.getRectangle(); + var ap = widget.getAppearanceCharacteristics(); + var bs = widget.getBorderStyle(); + var text = (_a = dropdown.getSelected()[0]) !== null && _a !== void 0 ? _a : ''; + var borderWidth = (_b = bs === null || bs === void 0 ? void 0 : bs.getWidth()) !== null && _b !== void 0 ? _b : 0; + var rotation = reduceRotation(ap === null || ap === void 0 ? void 0 : ap.getRotation()); + var _d = adjustDimsForRotation(rectangle, rotation), width = _d.width, height = _d.height; + var rotate = rotateInPlace(__assign(__assign({}, rectangle), { rotation: rotation })); + var black = rgb(0, 0, 0); + var borderColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBorderColor()); + var normalBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor()); + var padding = 1; + var bounds = { + x: borderWidth + padding, + y: borderWidth + padding, + width: width - (borderWidth + padding) * 2, + height: height - (borderWidth + padding) * 2, + }; + var _e = layoutSinglelineText(text, { + alignment: exports.TextAlignment.Left, + fontSize: widgetFontSize !== null && widgetFontSize !== void 0 ? widgetFontSize : fieldFontSize, + font: font, + bounds: bounds, + }), line = _e.line, fontSize = _e.fontSize; + // Update font size and color + var textColor = (_c = widgetColor !== null && widgetColor !== void 0 ? widgetColor : fieldColor) !== null && _c !== void 0 ? _c : black; + if (widgetColor || widgetFontSize !== undefined) { + updateDefaultAppearance(widget, textColor, font, fontSize); + } + else { + updateDefaultAppearance(dropdown.acroField, textColor, font, fontSize); + } + var options = { + x: 0 + borderWidth / 2, + y: 0 + borderWidth / 2, + width: width - borderWidth, + height: height - borderWidth, + borderWidth: borderWidth !== null && borderWidth !== void 0 ? borderWidth : 0, + borderColor: borderColor, + textColor: textColor, + font: font.name, + fontSize: fontSize, + color: normalBackgroundColor, + textLines: [line], + padding: padding, + }; + return __spreadArrays(rotate, drawTextField(options)); + }; + var defaultOptionListAppearanceProvider = function (optionList, widget, font) { + var _a, _b; + // The `/DA` entry can be at the widget or field level - so we handle both + var widgetColor = getDefaultColor(widget); + var fieldColor = getDefaultColor(optionList.acroField); + var widgetFontSize = getDefaultFontSize(widget); + var fieldFontSize = getDefaultFontSize(optionList.acroField); + var rectangle = widget.getRectangle(); + var ap = widget.getAppearanceCharacteristics(); + var bs = widget.getBorderStyle(); + var borderWidth = (_a = bs === null || bs === void 0 ? void 0 : bs.getWidth()) !== null && _a !== void 0 ? _a : 0; + var rotation = reduceRotation(ap === null || ap === void 0 ? void 0 : ap.getRotation()); + var _c = adjustDimsForRotation(rectangle, rotation), width = _c.width, height = _c.height; + var rotate = rotateInPlace(__assign(__assign({}, rectangle), { rotation: rotation })); + var black = rgb(0, 0, 0); + var borderColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBorderColor()); + var normalBackgroundColor = componentsToColor(ap === null || ap === void 0 ? void 0 : ap.getBackgroundColor()); + var options = optionList.getOptions(); + var selected = optionList.getSelected(); + if (optionList.isSorted()) + options.sort(); + var text = ''; + for (var idx = 0, len = options.length; idx < len; idx++) { + text += options[idx]; + if (idx < len - 1) + text += '\n'; + } + var padding = 1; + var bounds = { + x: borderWidth + padding, + y: borderWidth + padding, + width: width - (borderWidth + padding) * 2, + height: height - (borderWidth + padding) * 2, + }; + var _d = layoutMultilineText(text, { + alignment: exports.TextAlignment.Left, + fontSize: widgetFontSize !== null && widgetFontSize !== void 0 ? widgetFontSize : fieldFontSize, + font: font, + bounds: bounds, + }), lines = _d.lines, fontSize = _d.fontSize, lineHeight = _d.lineHeight; + var selectedLines = []; + for (var idx = 0, len = lines.length; idx < len; idx++) { + var line = lines[idx]; + if (selected.includes(line.text)) + selectedLines.push(idx); + } + var blue = rgb(153 / 255, 193 / 255, 218 / 255); + // Update font size and color + var textColor = (_b = widgetColor !== null && widgetColor !== void 0 ? widgetColor : fieldColor) !== null && _b !== void 0 ? _b : black; + if (widgetColor || widgetFontSize !== undefined) { + updateDefaultAppearance(widget, textColor, font, fontSize); + } + else { + updateDefaultAppearance(optionList.acroField, textColor, font, fontSize); + } + return __spreadArrays(rotate, drawOptionList({ + x: 0 + borderWidth / 2, + y: 0 + borderWidth / 2, + width: width - borderWidth, + height: height - borderWidth, + borderWidth: borderWidth !== null && borderWidth !== void 0 ? borderWidth : 0, + borderColor: borderColor, + textColor: textColor, + font: font.name, + fontSize: fontSize, + color: normalBackgroundColor, + textLines: lines, + lineHeight: lineHeight, + selectedColor: blue, + selectedLines: selectedLines, + padding: padding, + })); + }; + + /** + * Represents a PDF page that has been embedded in a [[PDFDocument]]. + */ + var PDFEmbeddedPage = /** @class */ (function () { + function PDFEmbeddedPage(ref, doc, embedder) { + this.alreadyEmbedded = false; + assertIs(ref, 'ref', [[PDFRef, 'PDFRef']]); + assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]); + assertIs(embedder, 'embedder', [[PDFPageEmbedder, 'PDFPageEmbedder']]); + this.ref = ref; + this.doc = doc; + this.width = embedder.width; + this.height = embedder.height; + this.embedder = embedder; + } + /** + * Compute the width and height of this page after being scaled by the + * given `factor`. For example: + * ```js + * embeddedPage.width // => 500 + * embeddedPage.height // => 250 + * + * const scaled = embeddedPage.scale(0.5) + * scaled.width // => 250 + * scaled.height // => 125 + * ``` + * This operation is often useful before drawing a page with + * [[PDFPage.drawPage]] to compute the `width` and `height` options. + * @param factor The factor by which this page should be scaled. + * @returns The width and height of the page after being scaled. + */ + PDFEmbeddedPage.prototype.scale = function (factor) { + assertIs(factor, 'factor', ['number']); + return { width: this.width * factor, height: this.height * factor }; + }; + /** + * Get the width and height of this page. For example: + * ```js + * const { width, height } = embeddedPage.size() + * ``` + * @returns The width and height of the page. + */ + PDFEmbeddedPage.prototype.size = function () { + return this.scale(1); + }; + /** + * > **NOTE:** You probably don't need to call this method directly. The + * > [[PDFDocument.save]] and [[PDFDocument.saveAsBase64]] methods will + * > automatically ensure all embeddable pages get embedded. + * + * Embed this embeddable page in its document. + * + * @returns Resolves when the embedding is complete. + */ + PDFEmbeddedPage.prototype.embed = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!!this.alreadyEmbedded) return [3 /*break*/, 2]; + return [4 /*yield*/, this.embedder.embedIntoContext(this.doc.context, this.ref)]; + case 1: + _a.sent(); + this.alreadyEmbedded = true; + _a.label = 2; + case 2: return [2 /*return*/]; + } + }); + }); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.embedPdf]] and + * > [[PDFDocument.embedPage]] methods, which will create instances of + * > [[PDFEmbeddedPage]] for you. + * + * Create an instance of [[PDFEmbeddedPage]] from an existing ref and embedder + * + * @param ref The unique reference for this embedded page. + * @param doc The document to which the embedded page will belong. + * @param embedder The embedder that will be used to embed the page. + */ + PDFEmbeddedPage.of = function (ref, doc, embedder) { + return new PDFEmbeddedPage(ref, doc, embedder); + }; + return PDFEmbeddedPage; + }()); + + /** + * Represents a font that has been embedded in a [[PDFDocument]]. + */ + var PDFFont = /** @class */ (function () { + function PDFFont(ref, doc, embedder) { + this.modified = true; + assertIs(ref, 'ref', [[PDFRef, 'PDFRef']]); + assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]); + assertIs(embedder, 'embedder', [ + [CustomFontEmbedder, 'CustomFontEmbedder'], + [StandardFontEmbedder, 'StandardFontEmbedder'], + ]); + this.ref = ref; + this.doc = doc; + this.name = embedder.fontName; + this.embedder = embedder; + } + /** + * > **NOTE:** You probably don't need to call this method directly. The + * > [[PDFPage.drawText]] method will automatically encode the text it is + * > given. + * + * Encodes a string of text in this font. + * + * @param text The text to be encoded. + * @returns The encoded text as a hex string. + */ + PDFFont.prototype.encodeText = function (text) { + assertIs(text, 'text', ['string']); + this.modified = true; + return this.embedder.encodeText(text); + }; + /** + * Measure the width of a string of text drawn in this font at a given size. + * For example: + * ```js + * const width = font.widthOfTextAtSize('Foo Bar Qux Baz', 36) + * ``` + * @param text The string of text to be measured. + * @param size The font size to be used for this measurement. + * @returns The width of the string of text when drawn in this font at the + * given size. + */ + PDFFont.prototype.widthOfTextAtSize = function (text, size) { + assertIs(text, 'text', ['string']); + assertIs(size, 'size', ['number']); + return this.embedder.widthOfTextAtSize(text, size); + }; + /** + * Measure the height of this font at a given size. For example: + * ```js + * const height = font.heightAtSize(24) + * ``` + * + * The `options.descender` value controls whether or not the font's + * descender is included in the height calculation. + * + * @param size The font size to be used for this measurement. + * @param options The options to be used when computing this measurement. + * @returns The height of this font at the given size. + */ + PDFFont.prototype.heightAtSize = function (size, options) { + var _a; + assertIs(size, 'size', ['number']); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.descender, 'options.descender', ['boolean']); + return this.embedder.heightOfFontAtSize(size, { + descender: (_a = options === null || options === void 0 ? void 0 : options.descender) !== null && _a !== void 0 ? _a : true, + }); + }; + /** + * Compute the font size at which this font is a given height. For example: + * ```js + * const fontSize = font.sizeAtHeight(12) + * ``` + * @param height The height to be used for this calculation. + * @returns The font size at which this font is the given height. + */ + PDFFont.prototype.sizeAtHeight = function (height) { + assertIs(height, 'height', ['number']); + return this.embedder.sizeOfFontAtHeight(height); + }; + /** + * Get the set of unicode code points that can be represented by this font. + * @returns The set of unicode code points supported by this font. + */ + PDFFont.prototype.getCharacterSet = function () { + if (this.embedder instanceof StandardFontEmbedder) { + return this.embedder.encoding.supportedCodePoints; + } + else { + return this.embedder.font.characterSet; + } + }; + /** + * > **NOTE:** You probably don't need to call this method directly. The + * > [[PDFDocument.save]] and [[PDFDocument.saveAsBase64]] methods will + * > automatically ensure all fonts get embedded. + * + * Embed this font in its document. + * + * @returns Resolves when the embedding is complete. + */ + PDFFont.prototype.embed = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!this.modified) return [3 /*break*/, 2]; + return [4 /*yield*/, this.embedder.embedIntoContext(this.doc.context, this.ref)]; + case 1: + _a.sent(); + this.modified = false; + _a.label = 2; + case 2: return [2 /*return*/]; + } + }); + }); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.embedFont]] and + * > [[PDFDocument.embedStandardFont]] methods, which will create instances + * > of [[PDFFont]] for you. + * + * Create an instance of [[PDFFont]] from an existing ref and embedder + * + * @param ref The unique reference for this font. + * @param doc The document to which the font will belong. + * @param embedder The embedder that will be used to embed the font. + */ + PDFFont.of = function (ref, doc, embedder) { + return new PDFFont(ref, doc, embedder); + }; + return PDFFont; + }()); + + /** + * Represents an image that has been embedded in a [[PDFDocument]]. + */ + var PDFImage = /** @class */ (function () { + function PDFImage(ref, doc, embedder) { + assertIs(ref, 'ref', [[PDFRef, 'PDFRef']]); + assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]); + assertIs(embedder, 'embedder', [ + [JpegEmbedder, 'JpegEmbedder'], + [PngEmbedder, 'PngEmbedder'], + ]); + this.ref = ref; + this.doc = doc; + this.width = embedder.width; + this.height = embedder.height; + this.embedder = embedder; + } + /** + * Compute the width and height of this image after being scaled by the + * given `factor`. For example: + * ```js + * image.width // => 500 + * image.height // => 250 + * + * const scaled = image.scale(0.5) + * scaled.width // => 250 + * scaled.height // => 125 + * ``` + * This operation is often useful before drawing an image with + * [[PDFPage.drawImage]] to compute the `width` and `height` options. + * @param factor The factor by which this image should be scaled. + * @returns The width and height of the image after being scaled. + */ + PDFImage.prototype.scale = function (factor) { + assertIs(factor, 'factor', ['number']); + return { width: this.width * factor, height: this.height * factor }; + }; + /** + * Get the width and height of this image after scaling it as large as + * possible while maintaining its aspect ratio and not exceeding the + * specified `width` and `height`. For example: + * ``` + * image.width // => 500 + * image.height // => 250 + * + * const scaled = image.scaleToFit(750, 1000) + * scaled.width // => 750 + * scaled.height // => 375 + * ``` + * The `width` and `height` parameters can also be thought of as the width + * and height of a box that the scaled image must fit within. + * @param width The bounding box's width. + * @param height The bounding box's height. + * @returns The width and height of the image after being scaled. + */ + PDFImage.prototype.scaleToFit = function (width, height) { + assertIs(width, 'width', ['number']); + assertIs(height, 'height', ['number']); + var imgWidthScale = width / this.width; + var imgHeightScale = height / this.height; + var scale = Math.min(imgWidthScale, imgHeightScale); + return this.scale(scale); + }; + /** + * Get the width and height of this image. For example: + * ```js + * const { width, height } = image.size() + * ``` + * @returns The width and height of the image. + */ + PDFImage.prototype.size = function () { + return this.scale(1); + }; + /** + * > **NOTE:** You probably don't need to call this method directly. The + * > [[PDFDocument.save]] and [[PDFDocument.saveAsBase64]] methods will + * > automatically ensure all images get embedded. + * + * Embed this image in its document. + * + * @returns Resolves when the embedding is complete. + */ + PDFImage.prototype.embed = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, doc, ref; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!this.embedder) + return [2 /*return*/]; + // The image should only be embedded once. If there's a pending embed + // operation then wait on it. Otherwise we need to start the embed. + if (!this.embedTask) { + _a = this, doc = _a.doc, ref = _a.ref; + this.embedTask = this.embedder.embedIntoContext(doc.context, ref); + } + return [4 /*yield*/, this.embedTask]; + case 1: + _b.sent(); + // We clear `this.embedder` so that the indirectly referenced image data + // can be garbage collected, thus avoiding a memory leak. + // See https://github.com/Hopding/pdf-lib/pull/1032/files. + this.embedder = undefined; + return [2 /*return*/]; + } + }); + }); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.embedPng]] and [[PDFDocument.embedJpg]] + * > methods, which will create instances of [[PDFImage]] for you. + * + * Create an instance of [[PDFImage]] from an existing ref and embedder + * + * @param ref The unique reference for this image. + * @param doc The document to which the image will belong. + * @param embedder The embedder that will be used to embed the image. + */ + PDFImage.of = function (ref, doc, embedder) { + return new PDFImage(ref, doc, embedder); + }; + return PDFImage; + }()); + + (function (ImageAlignment) { + ImageAlignment[ImageAlignment["Left"] = 0] = "Left"; + ImageAlignment[ImageAlignment["Center"] = 1] = "Center"; + ImageAlignment[ImageAlignment["Right"] = 2] = "Right"; + })(exports.ImageAlignment || (exports.ImageAlignment = {})); + + var assertFieldAppearanceOptions = function (options) { + assertOrUndefined(options === null || options === void 0 ? void 0 : options.x, 'options.x', ['number']); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.y, 'options.y', ['number']); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.width, 'options.width', ['number']); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.height, 'options.height', ['number']); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.textColor, 'options.textColor', [ + [Object, 'Color'], + ]); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.backgroundColor, 'options.backgroundColor', [ + [Object, 'Color'], + ]); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.borderColor, 'options.borderColor', [ + [Object, 'Color'], + ]); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.borderWidth, 'options.borderWidth', ['number']); + assertOrUndefined(options === null || options === void 0 ? void 0 : options.rotate, 'options.rotate', [[Object, 'Rotation']]); + }; + /** + * Represents a field of a [[PDFForm]]. + * + * This class is effectively abstract. All fields in a [[PDFForm]] will + * actually be an instance of a subclass of this class. + * + * Note that each field in a PDF is represented by a single field object. + * However, a given field object may be rendered at multiple locations within + * the document (across one or more pages). The rendering of a field is + * controlled by its widgets. Each widget causes its field to be displayed at a + * particular location in the document. + * + * Most of the time each field in a PDF has only a single widget, and thus is + * only rendered once. However, if a field is rendered multiple times, it will + * have multiple widgets - one for each location it is rendered. + * + * This abstraction of field objects and widgets is defined in the PDF + * specification and dictates how PDF files store fields and where they are + * to be rendered. + */ + var PDFField = /** @class */ (function () { + function PDFField(acroField, ref, doc) { + assertIs(acroField, 'acroField', [[PDFAcroTerminal, 'PDFAcroTerminal']]); + assertIs(ref, 'ref', [[PDFRef, 'PDFRef']]); + assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]); + this.acroField = acroField; + this.ref = ref; + this.doc = doc; + } + /** + * Get the fully qualified name of this field. For example: + * ```js + * const fields = form.getFields() + * fields.forEach(field => { + * const name = field.getName() + * console.log('Field name:', name) + * }) + * ``` + * Note that PDF fields are structured as a tree. Each field is the + * descendent of a series of ancestor nodes all the way up to the form node, + * which is always the root of the tree. Each node in the tree (except for + * the form node) has a partial name. Partial names can be composed of any + * unicode characters except a period (`.`). The fully qualified name of a + * field is composed of the partial names of all its ancestors joined + * with periods. This means that splitting the fully qualified name on + * periods and taking the last element of the resulting array will give you + * the partial name of a specific field. + * @returns The fully qualified name of this field. + */ + PDFField.prototype.getName = function () { + var _a; + return (_a = this.acroField.getFullyQualifiedName()) !== null && _a !== void 0 ? _a : ''; + }; + /** + * Returns `true` if this field is read only. This means that PDF readers + * will not allow users to interact with the field or change its value. See + * [[PDFField.enableReadOnly]] and [[PDFField.disableReadOnly]]. + * For example: + * ```js + * const field = form.getField('some.field') + * if (field.isReadOnly()) console.log('Read only is enabled') + * ``` + * @returns Whether or not this is a read only field. + */ + PDFField.prototype.isReadOnly = function () { + return this.acroField.hasFlag(exports.AcroFieldFlags.ReadOnly); + }; + /** + * Prevent PDF readers from allowing users to interact with this field or + * change its value. The field will not respond to mouse or keyboard input. + * For example: + * ```js + * const field = form.getField('some.field') + * field.enableReadOnly() + * ``` + * Useful for fields whose values are computed, imported from a database, or + * prefilled by software before being displayed to the user. + */ + PDFField.prototype.enableReadOnly = function () { + this.acroField.setFlagTo(exports.AcroFieldFlags.ReadOnly, true); + }; + /** + * Allow users to interact with this field and change its value in PDF + * readers via mouse and keyboard input. For example: + * ```js + * const field = form.getField('some.field') + * field.disableReadOnly() + * ``` + */ + PDFField.prototype.disableReadOnly = function () { + this.acroField.setFlagTo(exports.AcroFieldFlags.ReadOnly, false); + }; + /** + * Returns `true` if this field must have a value when the form is submitted. + * See [[PDFField.enableRequired]] and [[PDFField.disableRequired]]. + * For example: + * ```js + * const field = form.getField('some.field') + * if (field.isRequired()) console.log('Field is required') + * ``` + * @returns Whether or not this field is required. + */ + PDFField.prototype.isRequired = function () { + return this.acroField.hasFlag(exports.AcroFieldFlags.Required); + }; + /** + * Require this field to have a value when the form is submitted. + * For example: + * ```js + * const field = form.getField('some.field') + * field.enableRequired() + * ``` + */ + PDFField.prototype.enableRequired = function () { + this.acroField.setFlagTo(exports.AcroFieldFlags.Required, true); + }; + /** + * Do not require this field to have a value when the form is submitted. + * For example: + * ```js + * const field = form.getField('some.field') + * field.disableRequired() + * ``` + */ + PDFField.prototype.disableRequired = function () { + this.acroField.setFlagTo(exports.AcroFieldFlags.Required, false); + }; + /** + * Returns `true` if this field's value should be exported when the form is + * submitted. See [[PDFField.enableExporting]] and + * [[PDFField.disableExporting]]. + * For example: + * ```js + * const field = form.getField('some.field') + * if (field.isExported()) console.log('Exporting is enabled') + * ``` + * @returns Whether or not this field's value should be exported. + */ + PDFField.prototype.isExported = function () { + return !this.acroField.hasFlag(exports.AcroFieldFlags.NoExport); + }; + /** + * Indicate that this field's value should be exported when the form is + * submitted in a PDF reader. For example: + * ```js + * const field = form.getField('some.field') + * field.enableExporting() + * ``` + */ + PDFField.prototype.enableExporting = function () { + this.acroField.setFlagTo(exports.AcroFieldFlags.NoExport, false); + }; + /** + * Indicate that this field's value should **not** be exported when the form + * is submitted in a PDF reader. For example: + * ```js + * const field = form.getField('some.field') + * field.disableExporting() + * ``` + */ + PDFField.prototype.disableExporting = function () { + this.acroField.setFlagTo(exports.AcroFieldFlags.NoExport, true); + }; + /** @ignore */ + PDFField.prototype.needsAppearancesUpdate = function () { + throw new MethodNotImplementedError(this.constructor.name, 'needsAppearancesUpdate'); + }; + /** @ignore */ + PDFField.prototype.defaultUpdateAppearances = function (_font) { + throw new MethodNotImplementedError(this.constructor.name, 'defaultUpdateAppearances'); + }; + PDFField.prototype.markAsDirty = function () { + this.doc.getForm().markFieldAsDirty(this.ref); + }; + PDFField.prototype.markAsClean = function () { + this.doc.getForm().markFieldAsClean(this.ref); + }; + PDFField.prototype.isDirty = function () { + return this.doc.getForm().fieldIsDirty(this.ref); + }; + PDFField.prototype.createWidget = function (options) { + var _a; + var textColor = options.textColor; + var backgroundColor = options.backgroundColor; + var borderColor = options.borderColor; + var borderWidth = options.borderWidth; + var degreesAngle = toDegrees(options.rotate); + var caption = options.caption; + var x = options.x; + var y = options.y; + var width = options.width + borderWidth; + var height = options.height + borderWidth; + var hidden = Boolean(options.hidden); + var pageRef = options.page; + assertMultiple(degreesAngle, 'degreesAngle', 90); + // Create a widget for this field + var widget = PDFWidgetAnnotation.create(this.doc.context, this.ref); + // Set widget properties + var rect = rotateRectangle({ x: x, y: y, width: width, height: height }, borderWidth, degreesAngle); + widget.setRectangle(rect); + if (pageRef) + widget.setP(pageRef); + var ac = widget.getOrCreateAppearanceCharacteristics(); + if (backgroundColor) { + ac.setBackgroundColor(colorToComponents(backgroundColor)); + } + ac.setRotation(degreesAngle); + if (caption) + ac.setCaptions({ normal: caption }); + if (borderColor) + ac.setBorderColor(colorToComponents(borderColor)); + var bs = widget.getOrCreateBorderStyle(); + if (borderWidth !== undefined) + bs.setWidth(borderWidth); + widget.setFlagTo(exports.AnnotationFlags.Print, true); + widget.setFlagTo(exports.AnnotationFlags.Hidden, hidden); + widget.setFlagTo(exports.AnnotationFlags.Invisible, false); + // Set acrofield properties + if (textColor) { + var da = (_a = this.acroField.getDefaultAppearance()) !== null && _a !== void 0 ? _a : ''; + var newDa = da + '\n' + setFillingColor(textColor).toString(); + this.acroField.setDefaultAppearance(newDa); + } + return widget; + }; + PDFField.prototype.updateWidgetAppearanceWithFont = function (widget, font, _a) { + var normal = _a.normal, rollover = _a.rollover, down = _a.down; + this.updateWidgetAppearances(widget, { + normal: this.createAppearanceStream(widget, normal, font), + rollover: rollover && this.createAppearanceStream(widget, rollover, font), + down: down && this.createAppearanceStream(widget, down, font), + }); + }; + PDFField.prototype.updateOnOffWidgetAppearance = function (widget, onValue, _a) { + var normal = _a.normal, rollover = _a.rollover, down = _a.down; + this.updateWidgetAppearances(widget, { + normal: this.createAppearanceDict(widget, normal, onValue), + rollover: rollover && this.createAppearanceDict(widget, rollover, onValue), + down: down && this.createAppearanceDict(widget, down, onValue), + }); + }; + PDFField.prototype.updateWidgetAppearances = function (widget, _a) { + var normal = _a.normal, rollover = _a.rollover, down = _a.down; + widget.setNormalAppearance(normal); + if (rollover) { + widget.setRolloverAppearance(rollover); + } + else { + widget.removeRolloverAppearance(); + } + if (down) { + widget.setDownAppearance(down); + } + else { + widget.removeDownAppearance(); + } + }; + // // TODO: Do we need to do this...? + // private foo(font: PDFFont, dict: PDFDict) { + // if (!dict.lookup(PDFName.of('DR'))) { + // dict.set(PDFName.of('DR'), dict.context.obj({})); + // } + // const DR = dict.lookup(PDFName.of('DR'), PDFDict); + // if (!DR.lookup(PDFName.of('Font'))) { + // DR.set(PDFName.of('Font'), dict.context.obj({})); + // } + // const Font = DR.lookup(PDFName.of('Font'), PDFDict); + // Font.set(PDFName.of(font.name), font.ref); + // } + PDFField.prototype.createAppearanceStream = function (widget, appearance, font) { + var _a; + var context = this.acroField.dict.context; + var _b = widget.getRectangle(), width = _b.width, height = _b.height; + // TODO: Do we need to do this...? + // if (font) { + // this.foo(font, widget.dict); + // this.foo(font, this.doc.getForm().acroForm.dict); + // } + // END TODO + var Resources = font && { Font: (_a = {}, _a[font.name] = font.ref, _a) }; + var stream = context.formXObject(appearance, { + Resources: Resources, + BBox: context.obj([0, 0, width, height]), + Matrix: context.obj([1, 0, 0, 1, 0, 0]), + }); + var streamRef = context.register(stream); + return streamRef; + }; + /** + * Create a FormXObject of the supplied image and add it to context. + * The FormXObject size is calculated based on the widget (including + * the alignment). + * @param widget The widget that should display the image. + * @param alignment The alignment of the image. + * @param image The image that should be displayed. + * @returns The ref for the FormXObject that was added to the context. + */ + PDFField.prototype.createImageAppearanceStream = function (widget, image, alignment) { + // NOTE: This implementation doesn't handle image borders. + // NOTE: Acrobat seems to resize the image (maybe even skewing its aspect + // ratio) to fit perfectly within the widget's rectangle. This method + // does not currently do that. Should there be an option for that? + var _a; + var _b; + var context = this.acroField.dict.context; + var rectangle = widget.getRectangle(); + var ap = widget.getAppearanceCharacteristics(); + var bs = widget.getBorderStyle(); + var borderWidth = (_b = bs === null || bs === void 0 ? void 0 : bs.getWidth()) !== null && _b !== void 0 ? _b : 0; + var rotation = reduceRotation(ap === null || ap === void 0 ? void 0 : ap.getRotation()); + var rotate = rotateInPlace(__assign(__assign({}, rectangle), { rotation: rotation })); + var adj = adjustDimsForRotation(rectangle, rotation); + var imageDims = image.scaleToFit(adj.width - borderWidth * 2, adj.height - borderWidth * 2); + // Support borders on images and maybe other properties + var options = { + x: borderWidth, + y: borderWidth, + width: imageDims.width, + height: imageDims.height, + // + rotate: degrees(0), + xSkew: degrees(0), + ySkew: degrees(0), + }; + if (alignment === exports.ImageAlignment.Center) { + options.x += (adj.width - borderWidth * 2) / 2 - imageDims.width / 2; + options.y += (adj.height - borderWidth * 2) / 2 - imageDims.height / 2; + } + else if (alignment === exports.ImageAlignment.Right) { + options.x = adj.width - borderWidth - imageDims.width; + options.y = adj.height - borderWidth - imageDims.height; + } + var imageName = this.doc.context.addRandomSuffix('Image', 10); + var appearance = __spreadArrays(rotate, drawImage(imageName, options)); + //////////// + var Resources = { XObject: (_a = {}, _a[imageName] = image.ref, _a) }; + var stream = context.formXObject(appearance, { + Resources: Resources, + BBox: context.obj([0, 0, rectangle.width, rectangle.height]), + Matrix: context.obj([1, 0, 0, 1, 0, 0]), + }); + return context.register(stream); + }; + PDFField.prototype.createAppearanceDict = function (widget, appearance, onValue) { + var context = this.acroField.dict.context; + var onStreamRef = this.createAppearanceStream(widget, appearance.on); + var offStreamRef = this.createAppearanceStream(widget, appearance.off); + var appearanceDict = context.obj({}); + appearanceDict.set(onValue, onStreamRef); + appearanceDict.set(PDFName.of('Off'), offStreamRef); + return appearanceDict; + }; + return PDFField; + }()); + + /** + * Represents a check box field of a [[PDFForm]]. + * + * [[PDFCheckBox]] fields are interactive boxes that users can click with their + * mouse. This type of [[PDFField]] has two states: `on` and `off`. The purpose + * of a check box is to enable users to select from one or more options, where + * each option is represented by a single check box. Check boxes are typically + * square in shape and display a check mark when they are in the `on` state. + */ + var PDFCheckBox = /** @class */ (function (_super) { + __extends(PDFCheckBox, _super); + function PDFCheckBox(acroCheckBox, ref, doc) { + var _this = _super.call(this, acroCheckBox, ref, doc) || this; + assertIs(acroCheckBox, 'acroCheckBox', [ + [PDFAcroCheckBox, 'PDFAcroCheckBox'], + ]); + _this.acroField = acroCheckBox; + return _this; + } + /** + * Mark this check box. This operation is analogous to a human user clicking + * a check box to fill it in a PDF reader. This method will update the + * underlying state of the check box field to indicate it has been selected. + * PDF libraries and readers will be able to extract this value from the + * saved document and determine that it was selected. + * + * For example: + * ```js + * const checkBox = form.getCheckBox('some.checkBox.field') + * checkBox.check() + * ``` + * + * This method will mark this check box as dirty, causing its appearance + * streams to be updated when either [[PDFDocument.save]] or + * [[PDFForm.updateFieldAppearances]] is called. The updated appearance + * streams will display a check mark inside the widgets of this check box + * field. + */ + PDFCheckBox.prototype.check = function () { + var _a; + var onValue = (_a = this.acroField.getOnValue()) !== null && _a !== void 0 ? _a : PDFName.of('Yes'); + this.markAsDirty(); + this.acroField.setValue(onValue); + }; + /** + * Clears this check box. This operation is analogous to a human user clicking + * a check box to unmark it in a PDF reader. This method will update the + * underlying state of the check box field to indicate it has been deselected. + * PDF libraries and readers will be able to extract this value from the + * saved document and determine that it was not selected. + * + * For example: + * ```js + * const checkBox = form.getCheckBox('some.checkBox.field') + * checkBox.uncheck() + * ``` + * + * This method will mark this check box as dirty. See [[PDFCheckBox.check]] + * for more details about what this means. + */ + PDFCheckBox.prototype.uncheck = function () { + this.markAsDirty(); + this.acroField.setValue(PDFName.of('Off')); + }; + /** + * Returns `true` if this check box is selected (either by a human user via + * a PDF reader, or else programmatically via software). For example: + * ```js + * const checkBox = form.getCheckBox('some.checkBox.field') + * if (checkBox.isChecked()) console.log('check box is selected') + * ``` + * @returns Whether or not this check box is selected. + */ + PDFCheckBox.prototype.isChecked = function () { + var onValue = this.acroField.getOnValue(); + return !!onValue && onValue === this.acroField.getValue(); + }; + /** + * Show this check box on the specified page. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const checkBox = form.createCheckBox('some.checkBox.field') + * + * checkBox.addToPage(page, { + * x: 50, + * y: 75, + * width: 25, + * height: 25, + * textColor: rgb(1, 0, 0), + * backgroundColor: rgb(0, 1, 0), + * borderColor: rgb(0, 0, 1), + * borderWidth: 2, + * rotate: degrees(90), + * }) + * ``` + * This will create a new widget for this check box field. + * @param page The page to which this check box widget should be added. + * @param options The options to be used when adding this check box widget. + */ + PDFCheckBox.prototype.addToPage = function (page, options) { + var _a, _b, _c, _d, _e, _f; + assertIs(page, 'page', [[PDFPage, 'PDFPage']]); + assertFieldAppearanceOptions(options); + if (!options) + options = {}; + if (!('textColor' in options)) + options.textColor = rgb(0, 0, 0); + if (!('backgroundColor' in options)) + options.backgroundColor = rgb(1, 1, 1); + if (!('borderColor' in options)) + options.borderColor = rgb(0, 0, 0); + if (!('borderWidth' in options)) + options.borderWidth = 1; + // Create a widget for this check box + var widget = this.createWidget({ + x: (_a = options.x) !== null && _a !== void 0 ? _a : 0, + y: (_b = options.y) !== null && _b !== void 0 ? _b : 0, + width: (_c = options.width) !== null && _c !== void 0 ? _c : 50, + height: (_d = options.height) !== null && _d !== void 0 ? _d : 50, + textColor: options.textColor, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: (_e = options.borderWidth) !== null && _e !== void 0 ? _e : 0, + rotate: (_f = options.rotate) !== null && _f !== void 0 ? _f : degrees(0), + hidden: options.hidden, + page: page.ref, + }); + var widgetRef = this.doc.context.register(widget.dict); + // Add widget to this field + this.acroField.addWidget(widgetRef); + // Set appearance streams for widget + widget.setAppearanceState(PDFName.of('Off')); + this.updateWidgetAppearance(widget, PDFName.of('Yes')); + // Add widget to the given page + page.node.addAnnot(widgetRef); + }; + /** + * Returns `true` if any of this check box's widgets do not have an + * appearance stream for its current state. For example: + * ```js + * const checkBox = form.getCheckBox('some.checkBox.field') + * if (checkBox.needsAppearancesUpdate()) console.log('Needs update') + * ``` + * @returns Whether or not this check box needs an appearance update. + */ + PDFCheckBox.prototype.needsAppearancesUpdate = function () { + var _a; + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var state = widget.getAppearanceState(); + var normal = (_a = widget.getAppearances()) === null || _a === void 0 ? void 0 : _a.normal; + if (!(normal instanceof PDFDict)) + return true; + if (state && !normal.has(state)) + return true; + } + return false; + }; + /** + * Update the appearance streams for each of this check box's widgets using + * the default appearance provider for check boxes. For example: + * ```js + * const checkBox = form.getCheckBox('some.checkBox.field') + * checkBox.defaultUpdateAppearances() + * ``` + */ + PDFCheckBox.prototype.defaultUpdateAppearances = function () { + this.updateAppearances(); + }; + /** + * Update the appearance streams for each of this check box's widgets using + * the given appearance provider. If no `provider` is passed, the default + * appearance provider for check boxs will be used. For example: + * ```js + * const checkBox = form.getCheckBox('some.checkBox.field') + * checkBox.updateAppearances((field, widget) => { + * ... + * return { + * normal: { on: drawCheckBox(...), off: drawCheckBox(...) }, + * down: { on: drawCheckBox(...), off: drawCheckBox(...) }, + * } + * }) + * ``` + * @param provider Optionally, the appearance provider to be used for + * generating the contents of the appearance streams. + */ + PDFCheckBox.prototype.updateAppearances = function (provider) { + var _a; + assertOrUndefined(provider, 'provider', [Function]); + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var onValue = (_a = widget.getOnValue()) !== null && _a !== void 0 ? _a : PDFName.of('Yes'); + if (!onValue) + continue; + this.updateWidgetAppearance(widget, onValue, provider); + } + this.markAsClean(); + }; + PDFCheckBox.prototype.updateWidgetAppearance = function (widget, onValue, provider) { + var apProvider = provider !== null && provider !== void 0 ? provider : defaultCheckBoxAppearanceProvider; + var appearances = normalizeAppearance(apProvider(this, widget)); + this.updateOnOffWidgetAppearance(widget, onValue, appearances); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFForm.getCheckBox]] method, which will create an + * > instance of [[PDFCheckBox]] for you. + * + * Create an instance of [[PDFCheckBox]] from an existing acroCheckBox and ref + * + * @param acroCheckBox The underlying `PDFAcroCheckBox` for this check box. + * @param ref The unique reference for this check box. + * @param doc The document to which this check box will belong. + */ + PDFCheckBox.of = function (acroCheckBox, ref, doc) { + return new PDFCheckBox(acroCheckBox, ref, doc); + }; + return PDFCheckBox; + }(PDFField)); + + /** + * Represents a dropdown field of a [[PDFForm]]. + * + * [[PDFDropdown]] fields are interactive text boxes that display a single + * element (the currently selected value). The purpose of a dropdown is to + * enable users to select a single option from a set of possible options. Users + * can click on a dropdown to view the full list of options it provides. + * Clicking on an option in the list will cause it to be selected and displayed + * in the dropdown's text box. Some dropdowns allow users to enter text + * directly into the box from their keyboard, rather than only being allowed to + * choose an option from the list (see [[PDFDropdown.isEditable]]). + */ + var PDFDropdown = /** @class */ (function (_super) { + __extends(PDFDropdown, _super); + function PDFDropdown(acroComboBox, ref, doc) { + var _this = _super.call(this, acroComboBox, ref, doc) || this; + assertIs(acroComboBox, 'acroComboBox', [ + [PDFAcroComboBox, 'PDFAcroComboBox'], + ]); + _this.acroField = acroComboBox; + return _this; + } + /** + * Get the list of available options for this dropdown. These options will be + * displayed to users who click on this dropdown in a PDF reader. + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * const options = dropdown.getOptions() + * console.log('Dropdown options:', options) + * ``` + * @returns The options for this dropdown. + */ + PDFDropdown.prototype.getOptions = function () { + var rawOptions = this.acroField.getOptions(); + var options = new Array(rawOptions.length); + for (var idx = 0, len = options.length; idx < len; idx++) { + var _a = rawOptions[idx], display = _a.display, value = _a.value; + options[idx] = (display !== null && display !== void 0 ? display : value).decodeText(); + } + return options; + }; + /** + * Get the selected options for this dropdown. These are the values that were + * selected by a human user via a PDF reader, or programatically via + * software. + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * const selections = dropdown.getSelected() + * console.log('Dropdown selections:', selections) + * ``` + * > **NOTE:** Note that PDF readers only display one selected option when + * > rendering dropdowns. However, the PDF specification does allow for + * > multiple values to be selected in a dropdown. As such, the `pdf-lib` + * > API supports this. However, in most cases the array returned by this + * > method will contain only a single element (or no elements). + * @returns The selected options in this dropdown. + */ + PDFDropdown.prototype.getSelected = function () { + var values = this.acroField.getValues(); + var selected = new Array(values.length); + for (var idx = 0, len = values.length; idx < len; idx++) { + selected[idx] = values[idx].decodeText(); + } + return selected; + }; + /** + * Set the list of options that are available for this dropdown. These are + * the values that will be available for users to select when they view this + * dropdown in a PDF reader. Note that preexisting options for this dropdown + * will be removed. Only the values passed as `options` will be available to + * select. + * For example: + * ```js + * const dropdown = form.getDropdown('planets.dropdown') + * dropdown.setOptions(['Earth', 'Mars', 'Pluto', 'Venus']) + * ``` + * @param options The options that should be available in this dropdown. + */ + PDFDropdown.prototype.setOptions = function (options) { + assertIs(options, 'options', [Array]); + var optionObjects = new Array(options.length); + for (var idx = 0, len = options.length; idx < len; idx++) { + optionObjects[idx] = { value: PDFHexString.fromText(options[idx]) }; + } + this.acroField.setOptions(optionObjects); + }; + /** + * Add to the list of options that are available for this dropdown. Users + * will be able to select these values in a PDF reader. In addition to the + * values passed as `options`, any preexisting options for this dropdown will + * still be available for users to select. + * For example: + * ```js + * const dropdown = form.getDropdown('rockets.dropdown') + * dropdown.addOptions(['Saturn IV', 'Falcon Heavy']) + * ``` + * @param options New options that should be available in this dropdown. + */ + PDFDropdown.prototype.addOptions = function (options) { + assertIs(options, 'options', ['string', Array]); + var optionsArr = Array.isArray(options) ? options : [options]; + var existingOptions = this.acroField.getOptions(); + var newOptions = new Array(optionsArr.length); + for (var idx = 0, len = optionsArr.length; idx < len; idx++) { + newOptions[idx] = { value: PDFHexString.fromText(optionsArr[idx]) }; + } + this.acroField.setOptions(existingOptions.concat(newOptions)); + }; + /** + * Select one or more values for this dropdown. This operation is analogous + * to a human user opening the dropdown in a PDF reader and clicking on a + * value to select it. This method will update the underlying state of the + * dropdown to indicate which values have been selected. PDF libraries and + * readers will be able to extract these values from the saved document and + * determine which values were selected. + * + * For example: + * ```js + * const dropdown = form.getDropdown('best.superhero.dropdown') + * dropdown.select('One Punch Man') + * ``` + * + * This method will mark this dropdown as dirty, causing its appearance + * streams to be updated when either [[PDFDocument.save]] or + * [[PDFForm.updateFieldAppearances]] is called. The updated streams will + * display the selected option inside the widgets of this dropdown. + * + * **IMPORTANT:** The default font used to update appearance streams is + * [[StandardFonts.Helvetica]]. Note that this is a WinAnsi font. This means + * that encoding errors will be thrown if the selected option for this field + * contains characters outside the WinAnsi character set (the latin alphabet). + * + * Embedding a custom font and passing it to + * [[PDFForm.updateFieldAppearances]] or [[PDFDropdown.updateAppearances]] + * allows you to generate appearance streams with characters outside the + * latin alphabet (assuming the custom font supports them). + * + * Selecting an option that does not exist in this dropdown's option list + * (see [[PDFDropdown.getOptions]]) will enable editing on this dropdown + * (see [[PDFDropdown.enableEditing]]). + * + * > **NOTE:** PDF readers only display one selected option when rendering + * > dropdowns. However, the PDF specification does allow for multiple values + * > to be selected in a dropdown. As such, the `pdf-lib` API supports this. + * > However, it is not recommended to select more than one value with this + * > method, as only one will be visible. [[PDFOptionList]] fields are better + * > suited for displaying multiple selected values. + * + * @param options The options to be selected. + * @param merge Whether or not existing selections should be preserved. + */ + PDFDropdown.prototype.select = function (options, merge) { + if (merge === void 0) { merge = false; } + assertIs(options, 'options', ['string', Array]); + assertIs(merge, 'merge', ['boolean']); + var optionsArr = Array.isArray(options) ? options : [options]; + var validOptions = this.getOptions(); + var hasCustomOption = optionsArr.find(function (option) { return !validOptions.includes(option); }); + if (hasCustomOption) + this.enableEditing(); + this.markAsDirty(); + if (optionsArr.length > 1 || (optionsArr.length === 1 && merge)) { + this.enableMultiselect(); + } + var values = new Array(optionsArr.length); + for (var idx = 0, len = optionsArr.length; idx < len; idx++) { + values[idx] = PDFHexString.fromText(optionsArr[idx]); + } + if (merge) { + var existingValues = this.acroField.getValues(); + this.acroField.setValues(existingValues.concat(values)); + } + else { + this.acroField.setValues(values); + } + }; + /** + * Clear all selected values for this dropdown. This operation is equivalent + * to selecting an empty list. This method will update the underlying state + * of the dropdown to indicate that no values have been selected. + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.clear() + * ``` + * This method will mark this text field as dirty. See [[PDFDropdown.select]] + * for more details about what this means. + */ + PDFDropdown.prototype.clear = function () { + this.markAsDirty(); + this.acroField.setValues([]); + }; + /** + * Set the font size for this field. Larger font sizes will result in larger + * text being displayed when PDF readers render this dropdown. Font sizes may + * be integer or floating point numbers. Supplying a negative font size will + * cause this method to throw an error. + * + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.setFontSize(4) + * dropdown.setFontSize(15.7) + * ``` + * + * > This method depends upon the existence of a default appearance + * > (`/DA`) string. If this field does not have a default appearance string, + * > or that string does not contain a font size (via the `Tf` operator), + * > then this method will throw an error. + * + * @param fontSize The font size to be used when rendering text in this field. + */ + PDFDropdown.prototype.setFontSize = function (fontSize) { + assertPositive(fontSize, 'fontSize'); + this.acroField.setFontSize(fontSize); + this.markAsDirty(); + }; + /** + * Returns `true` if users are allowed to edit the selected value of this + * dropdown directly and are not constrained by the list of available + * options. See [[PDFDropdown.enableEditing]] and + * [[PDFDropdown.disableEditing]]. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * if (dropdown.isEditable()) console.log('Editing is enabled') + * ``` + * @returns Whether or not this dropdown is editable. + */ + PDFDropdown.prototype.isEditable = function () { + return this.acroField.hasFlag(exports.AcroChoiceFlags.Edit); + }; + /** + * Allow users to edit the selected value of this dropdown in PDF readers + * with their keyboard. This means that the selected value of this dropdown + * will not be constrained by the list of available options. However, if this + * dropdown has any available options, users will still be allowed to select + * from that list. + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.enableEditing() + * ``` + */ + PDFDropdown.prototype.enableEditing = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.Edit, true); + }; + /** + * Do not allow users to edit the selected value of this dropdown in PDF + * readers with their keyboard. This will constrain the selected value of + * this dropdown to the list of available options. Users will only be able + * to select an option from that list. + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.disableEditing() + * ``` + */ + PDFDropdown.prototype.disableEditing = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.Edit, false); + }; + /** + * Returns `true` if the option list of this dropdown is always displayed + * in alphabetical order, irrespective of the order in which the options + * were added to the dropdown. See [[PDFDropdown.enableSorting]] and + * [[PDFDropdown.disableSorting]]. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * if (dropdown.isSorted()) console.log('Sorting is enabled') + * ``` + * @returns Whether or not this dropdown's options are sorted. + */ + PDFDropdown.prototype.isSorted = function () { + return this.acroField.hasFlag(exports.AcroChoiceFlags.Sort); + }; + /** + * Always display the option list of this dropdown in alphabetical order, + * irrespective of the order in which the options were added to this dropdown. + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.enableSorting() + * ``` + */ + PDFDropdown.prototype.enableSorting = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.Sort, true); + }; + /** + * Do not always display the option list of this dropdown in alphabetical + * order. Instead, display the options in whichever order they were added + * to the list. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.disableSorting() + * ``` + */ + PDFDropdown.prototype.disableSorting = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.Sort, false); + }; + /** + * Returns `true` if multiple options can be selected from this dropdown's + * option list. See [[PDFDropdown.enableMultiselect]] and + * [[PDFDropdown.disableMultiselect]]. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * if (dropdown.isMultiselect()) console.log('Multiselect is enabled') + * ``` + * @returns Whether or not multiple options can be selected. + */ + PDFDropdown.prototype.isMultiselect = function () { + return this.acroField.hasFlag(exports.AcroChoiceFlags.MultiSelect); + }; + /** + * Allow users to select more than one option from this dropdown's option + * list. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.enableMultiselect() + * ``` + */ + PDFDropdown.prototype.enableMultiselect = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.MultiSelect, true); + }; + /** + * Do not allow users to select more than one option from this dropdown's + * option list. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.disableMultiselect() + * ``` + */ + PDFDropdown.prototype.disableMultiselect = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.MultiSelect, false); + }; + /** + * Returns `true` if the selected option should be spell checked by PDF + * readers. Spell checking will only be performed if this dropdown allows + * editing (see [[PDFDropdown.isEditable]]). See + * [[PDFDropdown.enableSpellChecking]] and + * [[PDFDropdown.disableSpellChecking]]. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * if (dropdown.isSpellChecked()) console.log('Spell checking is enabled') + * ``` + * @returns Whether or not this dropdown can be spell checked. + */ + PDFDropdown.prototype.isSpellChecked = function () { + return !this.acroField.hasFlag(exports.AcroChoiceFlags.DoNotSpellCheck); + }; + /** + * Allow PDF readers to spell check the selected option of this dropdown. + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.enableSpellChecking() + * ``` + */ + PDFDropdown.prototype.enableSpellChecking = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.DoNotSpellCheck, false); + }; + /** + * Do not allow PDF readers to spell check the selected option of this + * dropdown. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.disableSpellChecking() + * ``` + */ + PDFDropdown.prototype.disableSpellChecking = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.DoNotSpellCheck, true); + }; + /** + * Returns `true` if the option selected by a user is stored, or "committed", + * when the user clicks the option. The alternative is that the user's + * selection is stored when the user leaves this dropdown field (by clicking + * outside of it - on another field, for example). See + * [[PDFDropdown.enableSelectOnClick]] and + * [[PDFDropdown.disableSelectOnClick]]. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * if (dropdown.isSelectOnClick()) console.log('Select on click is enabled') + * ``` + * @returns Whether or not options are selected immediately after they are + * clicked. + */ + PDFDropdown.prototype.isSelectOnClick = function () { + return this.acroField.hasFlag(exports.AcroChoiceFlags.CommitOnSelChange); + }; + /** + * Store the option selected by a user immediately after the user clicks the + * option. Do not wait for the user to leave this dropdown field (by clicking + * outside of it - on another field, for example). For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.enableSelectOnClick() + * ``` + */ + PDFDropdown.prototype.enableSelectOnClick = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.CommitOnSelChange, true); + }; + /** + * Wait to store the option selected by a user until they leave this dropdown + * field (by clicking outside of it - on another field, for example). + * For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.disableSelectOnClick() + * ``` + */ + PDFDropdown.prototype.disableSelectOnClick = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.CommitOnSelChange, false); + }; + /** + * Show this dropdown on the specified page. For example: + * ```js + * const ubuntuFont = await pdfDoc.embedFont(ubuntuFontBytes) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const dropdown = form.createDropdown('best.gundam') + * dropdown.setOptions(['Exia', 'Dynames']) + * dropdown.select('Exia') + * + * dropdown.addToPage(page, { + * x: 50, + * y: 75, + * width: 200, + * height: 100, + * textColor: rgb(1, 0, 0), + * backgroundColor: rgb(0, 1, 0), + * borderColor: rgb(0, 0, 1), + * borderWidth: 2, + * rotate: degrees(90), + * font: ubuntuFont, + * }) + * ``` + * This will create a new widget for this dropdown field. + * @param page The page to which this dropdown widget should be added. + * @param options The options to be used when adding this dropdown widget. + */ + PDFDropdown.prototype.addToPage = function (page, options) { + var _a, _b, _c, _d, _e, _f, _g; + assertIs(page, 'page', [[PDFPage, 'PDFPage']]); + assertFieldAppearanceOptions(options); + if (!options) + options = {}; + if (!('textColor' in options)) + options.textColor = rgb(0, 0, 0); + if (!('backgroundColor' in options)) + options.backgroundColor = rgb(1, 1, 1); + if (!('borderColor' in options)) + options.borderColor = rgb(0, 0, 0); + if (!('borderWidth' in options)) + options.borderWidth = 1; + // Create a widget for this dropdown + var widget = this.createWidget({ + x: (_a = options.x) !== null && _a !== void 0 ? _a : 0, + y: (_b = options.y) !== null && _b !== void 0 ? _b : 0, + width: (_c = options.width) !== null && _c !== void 0 ? _c : 200, + height: (_d = options.height) !== null && _d !== void 0 ? _d : 50, + textColor: options.textColor, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: (_e = options.borderWidth) !== null && _e !== void 0 ? _e : 0, + rotate: (_f = options.rotate) !== null && _f !== void 0 ? _f : degrees(0), + hidden: options.hidden, + page: page.ref, + }); + var widgetRef = this.doc.context.register(widget.dict); + // Add widget to this field + this.acroField.addWidget(widgetRef); + // Set appearance streams for widget + var font = (_g = options.font) !== null && _g !== void 0 ? _g : this.doc.getForm().getDefaultFont(); + this.updateWidgetAppearance(widget, font); + // Add widget to the given page + page.node.addAnnot(widgetRef); + }; + /** + * Returns `true` if this dropdown has been marked as dirty, or if any of + * this dropdown's widgets do not have an appearance stream. For example: + * ```js + * const dropdown = form.getDropdown('some.dropdown.field') + * if (dropdown.needsAppearancesUpdate()) console.log('Needs update') + * ``` + * @returns Whether or not this dropdown needs an appearance update. + */ + PDFDropdown.prototype.needsAppearancesUpdate = function () { + var _a; + if (this.isDirty()) + return true; + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var hasAppearances = ((_a = widget.getAppearances()) === null || _a === void 0 ? void 0 : _a.normal) instanceof PDFStream; + if (!hasAppearances) + return true; + } + return false; + }; + /** + * Update the appearance streams for each of this dropdown's widgets using + * the default appearance provider for dropdowns. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.defaultUpdateAppearances(helvetica) + * ``` + * @param font The font to be used for creating the appearance streams. + */ + PDFDropdown.prototype.defaultUpdateAppearances = function (font) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + this.updateAppearances(font); + }; + /** + * Update the appearance streams for each of this dropdown's widgets using + * the given appearance provider. If no `provider` is passed, the default + * appearance provider for dropdowns will be used. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const dropdown = form.getDropdown('some.dropdown.field') + * dropdown.updateAppearances(helvetica, (field, widget, font) => { + * ... + * return drawTextField(...) + * }) + * ``` + * @param font The font to be used for creating the appearance streams. + * @param provider Optionally, the appearance provider to be used for + * generating the contents of the appearance streams. + */ + PDFDropdown.prototype.updateAppearances = function (font, provider) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + assertOrUndefined(provider, 'provider', [Function]); + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + this.updateWidgetAppearance(widget, font, provider); + } + this.markAsClean(); + }; + // getOption(index: number): string {} + // getSelectedIndices(): number[] {} + // removeOptions(option: string | string[]) {} + // removeIndices(option: number[]) {} + // deselect(options: string | string[]) {} + // deselectIndices(optionIndices: number[]) {} + PDFDropdown.prototype.updateWidgetAppearance = function (widget, font, provider) { + var apProvider = provider !== null && provider !== void 0 ? provider : defaultDropdownAppearanceProvider; + var appearances = normalizeAppearance(apProvider(this, widget, font)); + this.updateWidgetAppearanceWithFont(widget, font, appearances); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFForm.getDropdown]] method, which will create an + * > instance of [[PDFDropdown]] for you. + * + * Create an instance of [[PDFDropdown]] from an existing acroComboBox and ref + * + * @param acroComboBox The underlying `PDFAcroComboBox` for this dropdown. + * @param ref The unique reference for this dropdown. + * @param doc The document to which this dropdown will belong. + */ + PDFDropdown.of = function (acroComboBox, ref, doc) { + return new PDFDropdown(acroComboBox, ref, doc); + }; + return PDFDropdown; + }(PDFField)); + + /** + * Represents an option list field of a [[PDFForm]]. + * + * [[PDFOptionList]] fields are interactive lists of options. The purpose of an + * option list is to enable users to select one or more options from a set of + * possible options. Users are able to see the full set of options without + * first having to click on the field (though scrolling may be necessary). + * Clicking an option in the list will cause it to be selected and displayed + * with a highlighted background. Some option lists allow users to select + * more than one option (see [[PDFOptionList.isMultiselect]]). + */ + var PDFOptionList = /** @class */ (function (_super) { + __extends(PDFOptionList, _super); + function PDFOptionList(acroListBox, ref, doc) { + var _this = _super.call(this, acroListBox, ref, doc) || this; + assertIs(acroListBox, 'acroListBox', [[PDFAcroListBox, 'PDFAcroListBox']]); + _this.acroField = acroListBox; + return _this; + } + /** + * Get the list of available options for this option list. These options will + * be displayed to users who view this option list in a PDF reader. + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * const options = optionList.getOptions() + * console.log('Option List options:', options) + * ``` + * @returns The options for this option list. + */ + PDFOptionList.prototype.getOptions = function () { + var rawOptions = this.acroField.getOptions(); + var options = new Array(rawOptions.length); + for (var idx = 0, len = options.length; idx < len; idx++) { + var _a = rawOptions[idx], display = _a.display, value = _a.value; + options[idx] = (display !== null && display !== void 0 ? display : value).decodeText(); + } + return options; + }; + /** + * Get the selected options for this option list. These are the values that + * were selected by a human user via a PDF reader, or programatically via + * software. + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * const selections = optionList.getSelected() + * console.log('Option List selections:', selections) + * ``` + * @returns The selected options for this option list. + */ + PDFOptionList.prototype.getSelected = function () { + var values = this.acroField.getValues(); + var selected = new Array(values.length); + for (var idx = 0, len = values.length; idx < len; idx++) { + selected[idx] = values[idx].decodeText(); + } + return selected; + }; + /** + * Set the list of options that are available for this option list. These are + * the values that will be available for users to select when they view this + * option list in a PDF reader. Note that preexisting options for this + * option list will be removed. Only the values passed as `options` will be + * available to select. + * + * For example: + * ```js + * const optionList = form.getOptionList('planets.optionList') + * optionList.setOptions(['Earth', 'Mars', 'Pluto', 'Venus']) + * ``` + * + * This method will mark this option list as dirty, causing its appearance + * streams to be updated when either [[PDFDocument.save]] or + * [[PDFForm.updateFieldAppearances]] is called. The updated streams will + * display the options this field contains inside the widgets of this text + * field (with selected options highlighted). + * + * **IMPORTANT:** The default font used to update appearance streams is + * [[StandardFonts.Helvetica]]. Note that this is a WinAnsi font. This means + * that encoding errors will be thrown if this field contains any options + * with characters outside the WinAnsi character set (the latin alphabet). + * + * Embedding a custom font and passing it to + * [[PDFForm.updateFieldAppearances]] or [[PDFOptionList.updateAppearances]] + * allows you to generate appearance streams with characters outside the + * latin alphabet (assuming the custom font supports them). + * + * @param options The options that should be available in this option list. + */ + PDFOptionList.prototype.setOptions = function (options) { + assertIs(options, 'options', [Array]); + this.markAsDirty(); + var optionObjects = new Array(options.length); + for (var idx = 0, len = options.length; idx < len; idx++) { + optionObjects[idx] = { value: PDFHexString.fromText(options[idx]) }; + } + this.acroField.setOptions(optionObjects); + }; + /** + * Add to the list of options that are available for this option list. Users + * will be able to select these values in a PDF reader. In addition to the + * values passed as `options`, any preexisting options for this option list + * will still be available for users to select. + * For example: + * ```js + * const optionList = form.getOptionList('rockets.optionList') + * optionList.addOptions(['Saturn IV', 'Falcon Heavy']) + * ``` + * This method will mark this option list as dirty. See + * [[PDFOptionList.setOptions]] for more details about what this means. + * @param options New options that should be available in this option list. + */ + PDFOptionList.prototype.addOptions = function (options) { + assertIs(options, 'options', ['string', Array]); + this.markAsDirty(); + var optionsArr = Array.isArray(options) ? options : [options]; + var existingOptions = this.acroField.getOptions(); + var newOptions = new Array(optionsArr.length); + for (var idx = 0, len = optionsArr.length; idx < len; idx++) { + newOptions[idx] = { value: PDFHexString.fromText(optionsArr[idx]) }; + } + this.acroField.setOptions(existingOptions.concat(newOptions)); + }; + /** + * Select one or more values for this option list. This operation is analogous + * to a human user opening the option list in a PDF reader and clicking on one + * or more values to select them. This method will update the underlying state + * of the option list to indicate which values have been selected. PDF + * libraries and readers will be able to extract these values from the saved + * document and determine which values were selected. + * For example: + * ```js + * const optionList = form.getOptionList('best.superheroes.optionList') + * optionList.select(['One Punch Man', 'Iron Man']) + * ``` + * This method will mark this option list as dirty. See + * [[PDFOptionList.setOptions]] for more details about what this means. + * @param options The options to be selected. + * @param merge Whether or not existing selections should be preserved. + */ + PDFOptionList.prototype.select = function (options, merge) { + if (merge === void 0) { merge = false; } + assertIs(options, 'options', ['string', Array]); + assertIs(merge, 'merge', ['boolean']); + var optionsArr = Array.isArray(options) ? options : [options]; + var validOptions = this.getOptions(); + assertIsSubset(optionsArr, 'option', validOptions); + this.markAsDirty(); + if (optionsArr.length > 1 || (optionsArr.length === 1 && merge)) { + this.enableMultiselect(); + } + var values = new Array(optionsArr.length); + for (var idx = 0, len = optionsArr.length; idx < len; idx++) { + values[idx] = PDFHexString.fromText(optionsArr[idx]); + } + if (merge) { + var existingValues = this.acroField.getValues(); + this.acroField.setValues(existingValues.concat(values)); + } + else { + this.acroField.setValues(values); + } + }; + /** + * Clear all selected values for this option list. This operation is + * equivalent to selecting an empty list. This method will update the + * underlying state of the option list to indicate that no values have been + * selected. + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.clear() + * ``` + * This method will mark this option list as dirty. See + * [[PDFOptionList.setOptions]] for more details about what this means. + */ + PDFOptionList.prototype.clear = function () { + this.markAsDirty(); + this.acroField.setValues([]); + }; + /** + * Set the font size for the text in this field. There needs to be a + * default appearance string (DA) set with a font value specified + * for this to work. For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.setFontSize(4); + * ``` + * @param fontSize The font size to set the font to. + */ + /** + * Set the font size for this field. Larger font sizes will result in larger + * text being displayed when PDF readers render this option list. Font sizes + * may be integer or floating point numbers. Supplying a negative font size + * will cause this method to throw an error. + * + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.setFontSize(4) + * optionList.setFontSize(15.7) + * ``` + * + * > This method depends upon the existence of a default appearance + * > (`/DA`) string. If this field does not have a default appearance string, + * > or that string does not contain a font size (via the `Tf` operator), + * > then this method will throw an error. + * + * @param fontSize The font size to be used when rendering text in this field. + */ + PDFOptionList.prototype.setFontSize = function (fontSize) { + assertPositive(fontSize, 'fontSize'); + this.acroField.setFontSize(fontSize); + this.markAsDirty(); + }; + /** + * Returns `true` if the options of this option list are always displayed + * in alphabetical order, irrespective of the order in which the options + * were added to the option list. See [[PDFOptionList.enableSorting]] and + * [[PDFOptionList.disableSorting]]. For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * if (optionList.isSorted()) console.log('Sorting is enabled') + * ``` + * @returns Whether or not this option list is sorted. + */ + PDFOptionList.prototype.isSorted = function () { + return this.acroField.hasFlag(exports.AcroChoiceFlags.Sort); + }; + /** + * Always display the options of this option list in alphabetical order, + * irrespective of the order in which the options were added to this option + * list. + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.enableSorting() + * ``` + */ + PDFOptionList.prototype.enableSorting = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.Sort, true); + }; + /** + * Do not always display the options of this option list in alphabetical + * order. Instead, display the options in whichever order they were added + * to this option list. For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.disableSorting() + * ``` + */ + PDFOptionList.prototype.disableSorting = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.Sort, false); + }; + /** + * Returns `true` if multiple options can be selected from this option list. + * See [[PDFOptionList.enableMultiselect]] and + * [[PDFOptionList.disableMultiselect]]. For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * if (optionList.isMultiselect()) console.log('Multiselect is enabled') + * ``` + * @returns Whether or not multiple options can be selected. + */ + PDFOptionList.prototype.isMultiselect = function () { + return this.acroField.hasFlag(exports.AcroChoiceFlags.MultiSelect); + }; + /** + * Allow users to select more than one option from this option list. + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.enableMultiselect() + * ``` + */ + PDFOptionList.prototype.enableMultiselect = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.MultiSelect, true); + }; + /** + * Do not allow users to select more than one option from this option list. + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.disableMultiselect() + * ``` + */ + PDFOptionList.prototype.disableMultiselect = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.MultiSelect, false); + }; + /** + * Returns `true` if the option selected by a user is stored, or "committed", + * when the user clicks the option. The alternative is that the user's + * selection is stored when the user leaves this option list field (by + * clicking outside of it - on another field, for example). See + * [[PDFOptionList.enableSelectOnClick]] and + * [[PDFOptionList.disableSelectOnClick]]. For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * if (optionList.isSelectOnClick()) console.log('Select on click is enabled') + * ``` + * @returns Whether or not options are selected immediately after they are + * clicked. + */ + PDFOptionList.prototype.isSelectOnClick = function () { + return this.acroField.hasFlag(exports.AcroChoiceFlags.CommitOnSelChange); + }; + /** + * Store the option selected by a user immediately after the user clicks the + * option. Do not wait for the user to leave this option list field (by + * clicking outside of it - on another field, for example). For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.enableSelectOnClick() + * ``` + */ + PDFOptionList.prototype.enableSelectOnClick = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.CommitOnSelChange, true); + }; + /** + * Wait to store the option selected by a user until they leave this option + * list field (by clicking outside of it - on another field, for example). + * For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * optionList.disableSelectOnClick() + * ``` + */ + PDFOptionList.prototype.disableSelectOnClick = function () { + this.acroField.setFlagTo(exports.AcroChoiceFlags.CommitOnSelChange, false); + }; + /** + * Show this option list on the specified page. For example: + * ```js + * const ubuntuFont = await pdfDoc.embedFont(ubuntuFontBytes) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const optionList = form.createOptionList('best.gundams') + * optionList.setOptions(['Exia', 'Dynames', 'Kyrios', 'Virtue']) + * optionList.select(['Exia', 'Virtue']) + * + * optionList.addToPage(page, { + * x: 50, + * y: 75, + * width: 200, + * height: 100, + * textColor: rgb(1, 0, 0), + * backgroundColor: rgb(0, 1, 0), + * borderColor: rgb(0, 0, 1), + * borderWidth: 2, + * rotate: degrees(90), + * font: ubuntuFont, + * }) + * ``` + * This will create a new widget for this option list field. + * @param page The page to which this option list widget should be added. + * @param options The options to be used when adding this option list widget. + */ + PDFOptionList.prototype.addToPage = function (page, options) { + var _a, _b, _c, _d, _e, _f, _g; + assertIs(page, 'page', [[PDFPage, 'PDFPage']]); + assertFieldAppearanceOptions(options); + if (!options) + options = {}; + if (!('textColor' in options)) + options.textColor = rgb(0, 0, 0); + if (!('backgroundColor' in options)) + options.backgroundColor = rgb(1, 1, 1); + if (!('borderColor' in options)) + options.borderColor = rgb(0, 0, 0); + if (!('borderWidth' in options)) + options.borderWidth = 1; + // Create a widget for this option list + var widget = this.createWidget({ + x: (_a = options.x) !== null && _a !== void 0 ? _a : 0, + y: (_b = options.y) !== null && _b !== void 0 ? _b : 0, + width: (_c = options.width) !== null && _c !== void 0 ? _c : 200, + height: (_d = options.height) !== null && _d !== void 0 ? _d : 100, + textColor: options.textColor, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: (_e = options.borderWidth) !== null && _e !== void 0 ? _e : 0, + rotate: (_f = options.rotate) !== null && _f !== void 0 ? _f : degrees(0), + hidden: options.hidden, + page: page.ref, + }); + var widgetRef = this.doc.context.register(widget.dict); + // Add widget to this field + this.acroField.addWidget(widgetRef); + // Set appearance streams for widget + var font = (_g = options.font) !== null && _g !== void 0 ? _g : this.doc.getForm().getDefaultFont(); + this.updateWidgetAppearance(widget, font); + // Add widget to the given page + page.node.addAnnot(widgetRef); + }; + /** + * Returns `true` if this option list has been marked as dirty, or if any of + * this option list's widgets do not have an appearance stream. For example: + * ```js + * const optionList = form.getOptionList('some.optionList.field') + * if (optionList.needsAppearancesUpdate()) console.log('Needs update') + * ``` + * @returns Whether or not this option list needs an appearance update. + */ + PDFOptionList.prototype.needsAppearancesUpdate = function () { + var _a; + if (this.isDirty()) + return true; + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var hasAppearances = ((_a = widget.getAppearances()) === null || _a === void 0 ? void 0 : _a.normal) instanceof PDFStream; + if (!hasAppearances) + return true; + } + return false; + }; + /** + * Update the appearance streams for each of this option list's widgets using + * the default appearance provider for option lists. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const optionList = form.getOptionList('some.optionList.field') + * optionList.defaultUpdateAppearances(helvetica) + * ``` + * @param font The font to be used for creating the appearance streams. + */ + PDFOptionList.prototype.defaultUpdateAppearances = function (font) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + this.updateAppearances(font); + }; + /** + * Update the appearance streams for each of this option list's widgets using + * the given appearance provider. If no `provider` is passed, the default + * appearance provider for option lists will be used. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const optionList = form.getOptionList('some.optionList.field') + * optionList.updateAppearances(helvetica, (field, widget, font) => { + * ... + * return drawOptionList(...) + * }) + * ``` + * @param font The font to be used for creating the appearance streams. + * @param provider Optionally, the appearance provider to be used for + * generating the contents of the appearance streams. + */ + PDFOptionList.prototype.updateAppearances = function (font, provider) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + assertOrUndefined(provider, 'provider', [Function]); + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + this.updateWidgetAppearance(widget, font, provider); + } + this.markAsClean(); + }; + // getOption(index: number): string {} + // getSelectedIndices(): number[] {} + // removeOptions(option: string | string[]) {} + // removeIndices(option: number[]) {} + // deselect(options: string | string[]) {} + // deselectIndices(optionIndices: number[]) {} + PDFOptionList.prototype.updateWidgetAppearance = function (widget, font, provider) { + var apProvider = provider !== null && provider !== void 0 ? provider : defaultOptionListAppearanceProvider; + var appearances = normalizeAppearance(apProvider(this, widget, font)); + this.updateWidgetAppearanceWithFont(widget, font, appearances); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFForm.getOptionList]] method, which will create + * > an instance of [[PDFOptionList]] for you. + * + * Create an instance of [[PDFOptionList]] from an existing acroListBox and + * ref + * + * @param acroComboBox The underlying `PDFAcroListBox` for this option list. + * @param ref The unique reference for this option list. + * @param doc The document to which this option list will belong. + */ + PDFOptionList.of = function (acroListBox, ref, doc) { + return new PDFOptionList(acroListBox, ref, doc); + }; + return PDFOptionList; + }(PDFField)); + + /** + * Represents a radio group field of a [[PDFForm]]. + * + * [[PDFRadioGroup]] fields are collections of radio buttons. The purpose of a + * radio group is to enable users to select one option from a set of mutually + * exclusive choices. Each choice in a radio group is represented by a radio + * button. Radio buttons each have two states: `on` and `off`. At most one + * radio button in a group may be in the `on` state at any time. Users can + * click on a radio button to select it (and thereby automatically deselect any + * other radio button that might have already been selected). Some radio + * groups allow users to toggle a selected radio button `off` by clicking on + * it (see [[PDFRadioGroup.isOffToggleable]]). + * + * Note that some radio groups allow multiple radio buttons to be in the `on` + * state at the same type **if** they represent the same underlying value (see + * [[PDFRadioGroup.isMutuallyExclusive]]). + */ + var PDFRadioGroup = /** @class */ (function (_super) { + __extends(PDFRadioGroup, _super); + function PDFRadioGroup(acroRadioButton, ref, doc) { + var _this = _super.call(this, acroRadioButton, ref, doc) || this; + assertIs(acroRadioButton, 'acroRadioButton', [ + [PDFAcroRadioButton, 'PDFAcroRadioButton'], + ]); + _this.acroField = acroRadioButton; + return _this; + } + /** + * Get the list of available options for this radio group. Each option is + * represented by a radio button. These radio buttons are displayed at + * various locations in the document, potentially on different pages (though + * typically they are stacked horizontally or vertically on the same page). + * For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * const options = radioGroup.getOptions() + * console.log('Radio Group options:', options) + * ``` + * @returns The options for this radio group. + */ + PDFRadioGroup.prototype.getOptions = function () { + var exportValues = this.acroField.getExportValues(); + if (exportValues) { + var exportOptions = new Array(exportValues.length); + for (var idx = 0, len = exportValues.length; idx < len; idx++) { + exportOptions[idx] = exportValues[idx].decodeText(); + } + return exportOptions; + } + var onValues = this.acroField.getOnValues(); + var onOptions = new Array(onValues.length); + for (var idx = 0, len = onOptions.length; idx < len; idx++) { + onOptions[idx] = onValues[idx].decodeText(); + } + return onOptions; + }; + /** + * Get the selected option for this radio group. The selected option is + * represented by the radio button in this group that is turned on. At most + * one radio button in a group can be selected. If no buttons in this group + * are selected, `undefined` is returned. + * For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * const selected = radioGroup.getSelected() + * console.log('Selected radio button:', selected) + * ``` + * @returns The selected option for this radio group. + */ + PDFRadioGroup.prototype.getSelected = function () { + var value = this.acroField.getValue(); + if (value === PDFName.of('Off')) + return undefined; + var exportValues = this.acroField.getExportValues(); + if (exportValues) { + var onValues = this.acroField.getOnValues(); + for (var idx = 0, len = onValues.length; idx < len; idx++) { + if (onValues[idx] === value) + return exportValues[idx].decodeText(); + } + } + return value.decodeText(); + }; + // // TODO: Figure out why this seems to crash Acrobat. Maybe it's because we + // // aren't removing the widget reference from the page's Annots? + // removeOption(option: string) { + // assertIs(option, 'option', ['string']); + // // TODO: Assert is valid `option`! + // const onValues = this.acroField.getOnValues(); + // const exportValues = this.acroField.getExportValues(); + // if (exportValues) { + // for (let idx = 0, len = exportValues.length; idx < len; idx++) { + // if (exportValues[idx].decodeText() === option) { + // this.acroField.removeWidget(idx); + // this.acroField.removeExportValue(idx); + // } + // } + // } else { + // for (let idx = 0, len = onValues.length; idx < len; idx++) { + // const value = onValues[idx]; + // if (value.decodeText() === option) { + // this.acroField.removeWidget(idx); + // this.acroField.removeExportValue(idx); + // } + // } + // } + // } + /** + * Select an option for this radio group. This operation is analogous to a + * human user clicking one of the radio buttons in this group via a PDF + * reader to toggle it on. This method will update the underlying state of + * the radio group to indicate which option has been selected. PDF libraries + * and readers will be able to extract this value from the saved document and + * determine which option was selected. + * + * For example: + * ```js + * const radioGroup = form.getRadioGroup('best.superhero.radioGroup') + * radioGroup.select('One Punch Man') + * ``` + * + * This method will mark this radio group as dirty, causing its appearance + * streams to be updated when either [[PDFDocument.save]] or + * [[PDFForm.updateFieldAppearances]] is called. The updated appearance + * streams will display a dot inside the widget of this check box field + * that represents the selected option. + * + * @param option The option to be selected. + */ + PDFRadioGroup.prototype.select = function (option) { + assertIs(option, 'option', ['string']); + var validOptions = this.getOptions(); + assertIsOneOf(option, 'option', validOptions); + this.markAsDirty(); + var onValues = this.acroField.getOnValues(); + var exportValues = this.acroField.getExportValues(); + if (exportValues) { + for (var idx = 0, len = exportValues.length; idx < len; idx++) { + if (exportValues[idx].decodeText() === option) { + this.acroField.setValue(onValues[idx]); + } + } + } + else { + for (var idx = 0, len = onValues.length; idx < len; idx++) { + var value = onValues[idx]; + if (value.decodeText() === option) + this.acroField.setValue(value); + } + } + }; + /** + * Clear any selected option for this dropdown. This will result in all + * radio buttons in this group being toggled off. This method will update + * the underlying state of the dropdown to indicate that no radio buttons + * have been selected. + * For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * radioGroup.clear() + * ``` + * This method will mark this radio group as dirty. See + * [[PDFRadioGroup.select]] for more details about what this means. + */ + PDFRadioGroup.prototype.clear = function () { + this.markAsDirty(); + this.acroField.setValue(PDFName.of('Off')); + }; + /** + * Returns `true` if users can click on radio buttons in this group to toggle + * them off. The alternative is that once a user clicks on a radio button + * to select it, the only way to deselect it is by selecting on another radio + * button in the group. See [[PDFRadioGroup.enableOffToggling]] and + * [[PDFRadioGroup.disableOffToggling]]. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * if (radioGroup.isOffToggleable()) console.log('Off toggling is enabled') + * ``` + */ + PDFRadioGroup.prototype.isOffToggleable = function () { + return !this.acroField.hasFlag(exports.AcroButtonFlags.NoToggleToOff); + }; + /** + * Allow users to click on selected radio buttons in this group to toggle + * them off. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * radioGroup.enableOffToggling() + * ``` + * > **NOTE:** This feature is documented in the PDF specification + * > (Table 226). However, most PDF readers do not respect this option and + * > prevent users from toggling radio buttons off even when it is enabled. + * > At the time of this writing (9/6/2020) Mac's Preview software did + * > respect the option. Adobe Acrobat, Foxit Reader, and Google Chrome did + * > not. + */ + PDFRadioGroup.prototype.enableOffToggling = function () { + this.acroField.setFlagTo(exports.AcroButtonFlags.NoToggleToOff, false); + }; + /** + * Prevent users from clicking on selected radio buttons in this group to + * toggle them off. Clicking on a selected radio button will have no effect. + * The only way to deselect a selected radio button is to click on a + * different radio button in the group. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * radioGroup.disableOffToggling() + * ``` + */ + PDFRadioGroup.prototype.disableOffToggling = function () { + this.acroField.setFlagTo(exports.AcroButtonFlags.NoToggleToOff, true); + }; + /** + * Returns `true` if the radio buttons in this group are mutually exclusive. + * This means that when the user selects a radio button, only that specific + * button will be turned on. Even if other radio buttons in the group + * represent the same value, they will not be enabled. The alternative to + * this is that clicking a radio button will select that button along with + * any other radio buttons in the group that share the same value. See + * [[PDFRadioGroup.enableMutualExclusion]] and + * [[PDFRadioGroup.disableMutualExclusion]]. + * For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * if (radioGroup.isMutuallyExclusive()) console.log('Mutual exclusion is enabled') + * ``` + */ + PDFRadioGroup.prototype.isMutuallyExclusive = function () { + return !this.acroField.hasFlag(exports.AcroButtonFlags.RadiosInUnison); + }; + /** + * When the user clicks a radio button in this group it will be selected. In + * addition, any other radio buttons in this group that share the same + * underlying value will also be selected. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * radioGroup.enableMutualExclusion() + * ``` + * Note that this option must be enabled prior to adding options to the + * radio group. It does not currently apply retroactively to existing + * radio buttons in the group. + */ + PDFRadioGroup.prototype.enableMutualExclusion = function () { + this.acroField.setFlagTo(exports.AcroButtonFlags.RadiosInUnison, false); + }; + /** + * When the user clicks a radio button in this group only it will be selected. + * No other radio buttons in the group will be selected, even if they share + * the same underlying value. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * radioGroup.disableMutualExclusion() + * ``` + * Note that this option must be disabled prior to adding options to the + * radio group. It does not currently apply retroactively to existing + * radio buttons in the group. + */ + PDFRadioGroup.prototype.disableMutualExclusion = function () { + this.acroField.setFlagTo(exports.AcroButtonFlags.RadiosInUnison, true); + }; + /** + * Add a new radio button to this group on the specified page. For example: + * ```js + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const radioGroup = form.createRadioGroup('best.gundam') + * + * const options = { + * x: 50, + * width: 25, + * height: 25, + * textColor: rgb(1, 0, 0), + * backgroundColor: rgb(0, 1, 0), + * borderColor: rgb(0, 0, 1), + * borderWidth: 2, + * rotate: degrees(90), + * } + * + * radioGroup.addOptionToPage('Exia', page, { ...options, y: 50 }) + * radioGroup.addOptionToPage('Dynames', page, { ...options, y: 110 }) + * ``` + * This will create a new radio button widget for this radio group field. + * @param option The option that the radio button widget represents. + * @param page The page to which the radio button widget should be added. + * @param options The options to be used when adding the radio button widget. + */ + PDFRadioGroup.prototype.addOptionToPage = function (option, page, options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + assertIs(option, 'option', ['string']); + assertIs(page, 'page', [[PDFPage, 'PDFPage']]); + assertFieldAppearanceOptions(options); + // Create a widget for this radio button + var widget = this.createWidget({ + x: (_a = options === null || options === void 0 ? void 0 : options.x) !== null && _a !== void 0 ? _a : 0, + y: (_b = options === null || options === void 0 ? void 0 : options.y) !== null && _b !== void 0 ? _b : 0, + width: (_c = options === null || options === void 0 ? void 0 : options.width) !== null && _c !== void 0 ? _c : 50, + height: (_d = options === null || options === void 0 ? void 0 : options.height) !== null && _d !== void 0 ? _d : 50, + textColor: (_e = options === null || options === void 0 ? void 0 : options.textColor) !== null && _e !== void 0 ? _e : rgb(0, 0, 0), + backgroundColor: (_f = options === null || options === void 0 ? void 0 : options.backgroundColor) !== null && _f !== void 0 ? _f : rgb(1, 1, 1), + borderColor: (_g = options === null || options === void 0 ? void 0 : options.borderColor) !== null && _g !== void 0 ? _g : rgb(0, 0, 0), + borderWidth: (_h = options === null || options === void 0 ? void 0 : options.borderWidth) !== null && _h !== void 0 ? _h : 1, + rotate: (_j = options === null || options === void 0 ? void 0 : options.rotate) !== null && _j !== void 0 ? _j : degrees(0), + hidden: options === null || options === void 0 ? void 0 : options.hidden, + page: page.ref, + }); + var widgetRef = this.doc.context.register(widget.dict); + // Add widget to this field + var apStateValue = this.acroField.addWidgetWithOpt(widgetRef, PDFHexString.fromText(option), !this.isMutuallyExclusive()); + // Set appearance streams for widget + widget.setAppearanceState(PDFName.of('Off')); + this.updateWidgetAppearance(widget, apStateValue); + // Add widget to the given page + page.node.addAnnot(widgetRef); + }; + /** + * Returns `true` if any of this group's radio button widgets do not have an + * appearance stream for their current state. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * if (radioGroup.needsAppearancesUpdate()) console.log('Needs update') + * ``` + * @returns Whether or not this radio group needs an appearance update. + */ + PDFRadioGroup.prototype.needsAppearancesUpdate = function () { + var _a; + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var state = widget.getAppearanceState(); + var normal = (_a = widget.getAppearances()) === null || _a === void 0 ? void 0 : _a.normal; + if (!(normal instanceof PDFDict)) + return true; + if (state && !normal.has(state)) + return true; + } + return false; + }; + /** + * Update the appearance streams for each of this group's radio button widgets + * using the default appearance provider for radio groups. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * radioGroup.defaultUpdateAppearances() + * ``` + */ + PDFRadioGroup.prototype.defaultUpdateAppearances = function () { + this.updateAppearances(); + }; + // rg.updateAppearances((field: any, widget: any) => { + // assert(field === rg); + // assert(widget instanceof PDFWidgetAnnotation); + // return { on: [...rectangle, ...circle], off: [...rectangle, ...circle] }; + // }); + /** + * Update the appearance streams for each of this group's radio button widgets + * using the given appearance provider. If no `provider` is passed, the + * default appearance provider for radio groups will be used. For example: + * ```js + * const radioGroup = form.getRadioGroup('some.radioGroup.field') + * radioGroup.updateAppearances((field, widget) => { + * ... + * return { + * normal: { on: drawRadioButton(...), off: drawRadioButton(...) }, + * down: { on: drawRadioButton(...), off: drawRadioButton(...) }, + * } + * }) + * ``` + * @param provider Optionally, the appearance provider to be used for + * generating the contents of the appearance streams. + */ + PDFRadioGroup.prototype.updateAppearances = function (provider) { + assertOrUndefined(provider, 'provider', [Function]); + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var onValue = widget.getOnValue(); + if (!onValue) + continue; + this.updateWidgetAppearance(widget, onValue, provider); + } + }; + PDFRadioGroup.prototype.updateWidgetAppearance = function (widget, onValue, provider) { + var apProvider = provider !== null && provider !== void 0 ? provider : defaultRadioGroupAppearanceProvider; + var appearances = normalizeAppearance(apProvider(this, widget)); + this.updateOnOffWidgetAppearance(widget, onValue, appearances); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFForm.getOptionList]] method, which will create an + * > instance of [[PDFOptionList]] for you. + * + * Create an instance of [[PDFOptionList]] from an existing acroRadioButton + * and ref + * + * @param acroRadioButton The underlying `PDFAcroRadioButton` for this + * radio group. + * @param ref The unique reference for this radio group. + * @param doc The document to which this radio group will belong. + */ + PDFRadioGroup.of = function (acroRadioButton, ref, doc) { return new PDFRadioGroup(acroRadioButton, ref, doc); }; + return PDFRadioGroup; + }(PDFField)); + + /** + * Represents a signature field of a [[PDFForm]]. + * + * [[PDFSignature]] fields are digital signatures. `pdf-lib` does not + * currently provide any specialized APIs for creating digital signatures or + * reading the contents of existing digital signatures. + */ + var PDFSignature = /** @class */ (function (_super) { + __extends(PDFSignature, _super); + function PDFSignature(acroSignature, ref, doc) { + var _this = _super.call(this, acroSignature, ref, doc) || this; + assertIs(acroSignature, 'acroSignature', [ + [PDFAcroSignature, 'PDFAcroSignature'], + ]); + _this.acroField = acroSignature; + return _this; + } + PDFSignature.prototype.needsAppearancesUpdate = function () { + return false; + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFForm.getSignature]] method, which will create an + * > instance of [[PDFSignature]] for you. + * + * Create an instance of [[PDFSignature]] from an existing acroSignature and + * ref + * + * @param acroSignature The underlying `PDFAcroSignature` for this signature. + * @param ref The unique reference for this signature. + * @param doc The document to which this signature will belong. + */ + PDFSignature.of = function (acroSignature, ref, doc) { return new PDFSignature(acroSignature, ref, doc); }; + return PDFSignature; + }(PDFField)); + + /** + * Represents a text field of a [[PDFForm]]. + * + * [[PDFTextField]] fields are boxes that display text entered by the user. The + * purpose of a text field is to enable users to enter text or view text values + * in the document prefilled by software. Users can click on a text field and + * input text via their keyboard. Some text fields allow multiple lines of text + * to be entered (see [[PDFTextField.isMultiline]]). + */ + var PDFTextField = /** @class */ (function (_super) { + __extends(PDFTextField, _super); + function PDFTextField(acroText, ref, doc) { + var _this = _super.call(this, acroText, ref, doc) || this; + assertIs(acroText, 'acroText', [[PDFAcroText, 'PDFAcroText']]); + _this.acroField = acroText; + return _this; + } + /** + * Get the text that this field contains. This text is visible to users who + * view this field in a PDF reader. + * + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * const text = textField.getText() + * console.log('Text field contents:', text) + * ``` + * + * Note that if this text field contains no underlying value, `undefined` + * will be returned. Text fields may also contain an underlying value that + * is simply an empty string (`''`). This detail is largely irrelevant for + * most applications. In general, you'll want to treat both cases the same + * way and simply consider the text field to be empty. In either case, the + * text field will appear empty to users when viewed in a PDF reader. + * + * An error will be thrown if this is a rich text field. `pdf-lib` does not + * support reading rich text fields. Nor do most PDF readers and writers. + * Rich text fields are based on XFA (XML Forms Architecture). Relatively few + * PDFs use rich text fields or XFA. Unlike PDF itself, XFA is not an ISO + * standard. XFA has been deprecated in PDF 2.0: + * * https://en.wikipedia.org/wiki/XFA + * * http://blog.pdfshareforms.com/pdf-2-0-release-bid-farewell-xfa-forms/ + * + * @returns The text contained in this text field. + */ + PDFTextField.prototype.getText = function () { + var value = this.acroField.getValue(); + if (!value && this.isRichFormatted()) { + throw new RichTextFieldReadError(this.getName()); + } + return value === null || value === void 0 ? void 0 : value.decodeText(); + }; + /** + * Set the text for this field. This operation is analogous to a human user + * clicking on the text field in a PDF reader and typing in text via their + * keyboard. This method will update the underlying state of the text field + * to indicate what text has been set. PDF libraries and readers will be able + * to extract these values from the saved document and determine what text + * was set. + * + * For example: + * ```js + * const textField = form.getTextField('best.superhero.text.field') + * textField.setText('One Punch Man') + * ``` + * + * This method will mark this text field as dirty, causing its appearance + * streams to be updated when either [[PDFDocument.save]] or + * [[PDFForm.updateFieldAppearances]] is called. The updated streams will + * display the text this field contains inside the widgets of this text + * field. + * + * **IMPORTANT:** The default font used to update appearance streams is + * [[StandardFonts.Helvetica]]. Note that this is a WinAnsi font. This means + * that encoding errors will be thrown if this field contains text outside + * the WinAnsi character set (the latin alphabet). + * + * Embedding a custom font and passing it to + * [[PDFForm.updateFieldAppearances]] or [[PDFTextField.updateAppearances]] + * allows you to generate appearance streams with characters outside the + * latin alphabet (assuming the custom font supports them). + * + * If this is a rich text field, it will be converted to a standard text + * field in order to set the text. `pdf-lib` does not support writing rich + * text strings. Nor do most PDF readers and writers. See + * [[PDFTextField.getText]] for more information about rich text fields and + * their deprecation in PDF 2.0. + * + * @param text The text this field should contain. + */ + PDFTextField.prototype.setText = function (text) { + assertOrUndefined(text, 'text', ['string']); + var maxLength = this.getMaxLength(); + if (maxLength !== undefined && text && text.length > maxLength) { + throw new ExceededMaxLengthError(text.length, maxLength, this.getName()); + } + this.markAsDirty(); + this.disableRichFormatting(); + if (text) { + this.acroField.setValue(PDFHexString.fromText(text)); + } + else { + this.acroField.removeValue(); + } + }; + /** + * Get the alignment for this text field. This value represents the + * justification of the text when it is displayed to the user in PDF readers. + * There are three possible alignments: left, center, and right. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * const alignment = textField.getAlignment() + * if (alignment === TextAlignment.Left) console.log('Text is left justified') + * if (alignment === TextAlignment.Center) console.log('Text is centered') + * if (alignment === TextAlignment.Right) console.log('Text is right justified') + * ``` + * @returns The alignment of this text field. + */ + PDFTextField.prototype.getAlignment = function () { + var quadding = this.acroField.getQuadding(); + // prettier-ignore + return (quadding === 0 ? exports.TextAlignment.Left + : quadding === 1 ? exports.TextAlignment.Center + : quadding === 2 ? exports.TextAlignment.Right + : exports.TextAlignment.Left); + }; + /** + * Set the alignment for this text field. This will determine the + * justification of the text when it is displayed to the user in PDF readers. + * There are three possible alignments: left, center, and right. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * + * // Text will be left justified when displayed + * textField.setAlignment(TextAlignment.Left) + * + * // Text will be centered when displayed + * textField.setAlignment(TextAlignment.Center) + * + * // Text will be right justified when displayed + * textField.setAlignment(TextAlignment.Right) + * ``` + * This method will mark this text field as dirty. See + * [[PDFTextField.setText]] for more details about what this means. + * @param alignment The alignment for this text field. + */ + PDFTextField.prototype.setAlignment = function (alignment) { + assertIsOneOf(alignment, 'alignment', exports.TextAlignment); + this.markAsDirty(); + this.acroField.setQuadding(alignment); + }; + /** + * Get the maximum length of this field. This value represents the maximum + * number of characters that can be typed into this field by the user. If + * this field does not have a maximum length, `undefined` is returned. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * const maxLength = textField.getMaxLength() + * if (maxLength === undefined) console.log('No max length') + * else console.log(`Max length is ${maxLength}`) + * ``` + * @returns The maximum number of characters allowed in this field, or + * `undefined` if no limit exists. + */ + PDFTextField.prototype.getMaxLength = function () { + return this.acroField.getMaxLength(); + }; + /** + * Set the maximum length of this field. This limits the number of characters + * that can be typed into this field by the user. This also limits the length + * of the string that can be passed to [[PDFTextField.setText]]. This limit + * can be removed by passing `undefined` as `maxLength`. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * + * // Allow between 0 and 5 characters to be entered + * textField.setMaxLength(5) + * + * // Allow any number of characters to be entered + * textField.setMaxLength(undefined) + * ``` + * This method will mark this text field as dirty. See + * [[PDFTextField.setText]] for more details about what this means. + * @param maxLength The maximum number of characters allowed in this field, or + * `undefined` to remove the limit. + */ + PDFTextField.prototype.setMaxLength = function (maxLength) { + assertRangeOrUndefined(maxLength, 'maxLength', 0, Number.MAX_SAFE_INTEGER); + this.markAsDirty(); + if (maxLength === undefined) { + this.acroField.removeMaxLength(); + } + else { + var text = this.getText(); + if (text && text.length > maxLength) { + throw new InvalidMaxLengthError(text.length, maxLength, this.getName()); + } + this.acroField.setMaxLength(maxLength); + } + }; + /** + * Remove the maximum length for this text field. This allows any number of + * characters to be typed into this field by the user. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.removeMaxLength() + * ``` + * Calling this method is equivalent to passing `undefined` to + * [[PDFTextField.setMaxLength]]. + */ + PDFTextField.prototype.removeMaxLength = function () { + this.markAsDirty(); + this.acroField.removeMaxLength(); + }; + /** + * Display an image inside the bounds of this text field's widgets. For example: + * ```js + * const pngImage = await pdfDoc.embedPng(...) + * const textField = form.getTextField('some.text.field') + * textField.setImage(pngImage) + * ``` + * This will update the appearances streams for each of this text field's widgets. + * @param image The image that should be displayed. + */ + PDFTextField.prototype.setImage = function (image) { + var fieldAlignment = this.getAlignment(); + // prettier-ignore + var alignment = fieldAlignment === exports.TextAlignment.Center ? exports.ImageAlignment.Center + : fieldAlignment === exports.TextAlignment.Right ? exports.ImageAlignment.Right + : exports.ImageAlignment.Left; + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var streamRef = this.createImageAppearanceStream(widget, image, alignment); + this.updateWidgetAppearances(widget, { normal: streamRef }); + } + this.markAsClean(); + }; + /** + * Set the font size for this field. Larger font sizes will result in larger + * text being displayed when PDF readers render this text field. Font sizes + * may be integer or floating point numbers. Supplying a negative font size + * will cause this method to throw an error. + * + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.setFontSize(4) + * textField.setFontSize(15.7) + * ``` + * + * > This method depends upon the existence of a default appearance + * > (`/DA`) string. If this field does not have a default appearance string, + * > or that string does not contain a font size (via the `Tf` operator), + * > then this method will throw an error. + * + * @param fontSize The font size to be used when rendering text in this field. + */ + PDFTextField.prototype.setFontSize = function (fontSize) { + assertPositive(fontSize, 'fontSize'); + this.acroField.setFontSize(fontSize); + this.markAsDirty(); + }; + /** + * Returns `true` if each line of text is shown on a new line when this + * field is displayed in a PDF reader. The alternative is that all lines of + * text are merged onto a single line when displayed. See + * [[PDFTextField.enableMultiline]] and [[PDFTextField.disableMultiline]]. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.isMultiline()) console.log('Multiline is enabled') + * ``` + * @returns Whether or not this is a multiline text field. + */ + PDFTextField.prototype.isMultiline = function () { + return this.acroField.hasFlag(exports.AcroTextFlags.Multiline); + }; + /** + * Display each line of text on a new line when this field is displayed in a + * PDF reader. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.enableMultiline() + * ``` + * This method will mark this text field as dirty. See + * [[PDFTextField.setText]] for more details about what this means. + */ + PDFTextField.prototype.enableMultiline = function () { + this.markAsDirty(); + this.acroField.setFlagTo(exports.AcroTextFlags.Multiline, true); + }; + /** + * Display each line of text on the same line when this field is displayed + * in a PDF reader. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.disableMultiline() + * ``` + * This method will mark this text field as dirty. See + * [[PDFTextField.setText]] for more details about what this means. + */ + PDFTextField.prototype.disableMultiline = function () { + this.markAsDirty(); + this.acroField.setFlagTo(exports.AcroTextFlags.Multiline, false); + }; + /** + * Returns `true` if this is a password text field. This means that the field + * is intended for storing a secure password. See + * [[PDFTextField.enablePassword]] and [[PDFTextField.disablePassword]]. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.isPassword()) console.log('Password is enabled') + * ``` + * @returns Whether or not this is a password text field. + */ + PDFTextField.prototype.isPassword = function () { + return this.acroField.hasFlag(exports.AcroTextFlags.Password); + }; + /** + * Indicate that this text field is intended for storing a secure password. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.enablePassword() + * ``` + * Values entered into password text fields should not be displayed on the + * screen by PDF readers. Most PDF readers will display the value as + * asterisks or bullets. PDF readers should never store values entered by the + * user into password text fields. Similarly, applications should not + * write data to a password text field. + * + * **Please note that this method does not cause entered values to be + * encrypted or secured in any way! It simply sets a flag that PDF software + * and readers can access to determine the _purpose_ of this field.** + */ + PDFTextField.prototype.enablePassword = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.Password, true); + }; + /** + * Indicate that this text field is **not** intended for storing a secure + * password. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.disablePassword() + * ``` + */ + PDFTextField.prototype.disablePassword = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.Password, false); + }; + /** + * Returns `true` if the contents of this text field represent a file path. + * See [[PDFTextField.enableFileSelection]] and + * [[PDFTextField.disableFileSelection]]. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.isFileSelector()) console.log('Is a file selector') + * ``` + * @returns Whether or not this field should contain file paths. + */ + PDFTextField.prototype.isFileSelector = function () { + return this.acroField.hasFlag(exports.AcroTextFlags.FileSelect); + }; + /** + * Indicate that this text field is intended to store a file path. The + * contents of the file stored at that path should be submitted as the value + * of the field. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.enableFileSelection() + * ``` + */ + PDFTextField.prototype.enableFileSelection = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.FileSelect, true); + }; + /** + * Indicate that this text field is **not** intended to store a file path. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.disableFileSelection() + * ``` + */ + PDFTextField.prototype.disableFileSelection = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.FileSelect, false); + }; + /** + * Returns `true` if the text entered in this field should be spell checked + * by PDF readers. See [[PDFTextField.enableSpellChecking]] and + * [[PDFTextField.disableSpellChecking]]. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.isSpellChecked()) console.log('Spell checking is enabled') + * ``` + * @returns Whether or not this field should be spell checked. + */ + PDFTextField.prototype.isSpellChecked = function () { + return !this.acroField.hasFlag(exports.AcroTextFlags.DoNotSpellCheck); + }; + /** + * Allow PDF readers to spell check the text entered in this field. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.enableSpellChecking() + * ``` + */ + PDFTextField.prototype.enableSpellChecking = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.DoNotSpellCheck, false); + }; + /** + * Do not allow PDF readers to spell check the text entered in this field. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.disableSpellChecking() + * ``` + */ + PDFTextField.prototype.disableSpellChecking = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.DoNotSpellCheck, true); + }; + /** + * Returns `true` if PDF readers should allow the user to scroll the text + * field when its contents do not fit within the field's view bounds. See + * [[PDFTextField.enableScrolling]] and [[PDFTextField.disableScrolling]]. + * For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.isScrollable()) console.log('Scrolling is enabled') + * ``` + * @returns Whether or not the field is scrollable in PDF readers. + */ + PDFTextField.prototype.isScrollable = function () { + return !this.acroField.hasFlag(exports.AcroTextFlags.DoNotScroll); + }; + /** + * Allow PDF readers to present a scroll bar to the user when the contents + * of this text field do not fit within its view bounds. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.enableScrolling() + * ``` + * A horizontal scroll bar should be shown for singleline fields. A vertical + * scroll bar should be shown for multiline fields. + */ + PDFTextField.prototype.enableScrolling = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.DoNotScroll, false); + }; + /** + * Do not allow PDF readers to present a scroll bar to the user when the + * contents of this text field do not fit within its view bounds. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.disableScrolling() + * ``` + */ + PDFTextField.prototype.disableScrolling = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.DoNotScroll, true); + }; + /** + * Returns `true` if this is a combed text field. This means that the field + * is split into `n` equal size cells with one character in each (where `n` + * is equal to the max length of the text field). The result is that all + * characters in this field are displayed an equal distance apart from one + * another. See [[PDFTextField.enableCombing]] and + * [[PDFTextField.disableCombing]]. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.isCombed()) console.log('Combing is enabled') + * ``` + * Note that in order for a text field to be combed, the following must be + * true (in addition to enabling combing): + * * It must not be a multiline field (see [[PDFTextField.isMultiline]]) + * * It must not be a password field (see [[PDFTextField.isPassword]]) + * * It must not be a file selector field (see [[PDFTextField.isFileSelector]]) + * * It must have a max length defined (see [[PDFTextField.setMaxLength]]) + * @returns Whether or not this field is combed. + */ + PDFTextField.prototype.isCombed = function () { + return (this.acroField.hasFlag(exports.AcroTextFlags.Comb) && + !this.isMultiline() && + !this.isPassword() && + !this.isFileSelector() && + this.getMaxLength() !== undefined); + }; + /** + * Split this field into `n` equal size cells with one character in each + * (where `n` is equal to the max length of the text field). This will cause + * all characters in the field to be displayed an equal distance apart from + * one another. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.enableCombing() + * ``` + * + * In addition to calling this method, text fields must have a max length + * defined in order to be combed (see [[PDFTextField.setMaxLength]]). + * + * This method will also call the following three methods internally: + * * [[PDFTextField.disableMultiline]] + * * [[PDFTextField.disablePassword]] + * * [[PDFTextField.disableFileSelection]] + * + * This method will mark this text field as dirty. See + * [[PDFTextField.setText]] for more details about what this means. + */ + PDFTextField.prototype.enableCombing = function () { + if (this.getMaxLength() === undefined) { + var msg = "PDFTextFields must have a max length in order to be combed"; + console.warn(msg); + } + this.markAsDirty(); + this.disableMultiline(); + this.disablePassword(); + this.disableFileSelection(); + this.acroField.setFlagTo(exports.AcroTextFlags.Comb, true); + }; + /** + * Turn off combing for this text field. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.disableCombing() + * ``` + * See [[PDFTextField.isCombed]] and [[PDFTextField.enableCombing]] for more + * information about what combing is. + * + * This method will mark this text field as dirty. See + * [[PDFTextField.setText]] for more details about what this means. + */ + PDFTextField.prototype.disableCombing = function () { + this.markAsDirty(); + this.acroField.setFlagTo(exports.AcroTextFlags.Comb, false); + }; + /** + * Returns `true` if this text field contains rich text. See + * [[PDFTextField.enableRichFormatting]] and + * [[PDFTextField.disableRichFormatting]]. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.isRichFormatted()) console.log('Rich formatting enabled') + * ``` + * @returns Whether or not this field contains rich text. + */ + PDFTextField.prototype.isRichFormatted = function () { + return this.acroField.hasFlag(exports.AcroTextFlags.RichText); + }; + /** + * Indicate that this field contains XFA data - or rich text. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.enableRichFormatting() + * ``` + * Note that `pdf-lib` does not support reading or writing rich text fields. + * Nor do most PDF readers and writers. Rich text fields are based on XFA + * (XML Forms Architecture). Relatively few PDFs use rich text fields or XFA. + * Unlike PDF itself, XFA is not an ISO standard. XFA has been deprecated in + * PDF 2.0: + * * https://en.wikipedia.org/wiki/XFA + * * http://blog.pdfshareforms.com/pdf-2-0-release-bid-farewell-xfa-forms/ + */ + PDFTextField.prototype.enableRichFormatting = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.RichText, true); + }; + /** + * Indicate that this is a standard text field that does not XFA data (rich + * text). For example: + * ```js + * const textField = form.getTextField('some.text.field') + * textField.disableRichFormatting() + * ``` + */ + PDFTextField.prototype.disableRichFormatting = function () { + this.acroField.setFlagTo(exports.AcroTextFlags.RichText, false); + }; + /** + * Show this text field on the specified page. For example: + * ```js + * const ubuntuFont = await pdfDoc.embedFont(ubuntuFontBytes) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const textField = form.createTextField('best.gundam') + * textField.setText('Exia') + * + * textField.addToPage(page, { + * x: 50, + * y: 75, + * width: 200, + * height: 100, + * textColor: rgb(1, 0, 0), + * backgroundColor: rgb(0, 1, 0), + * borderColor: rgb(0, 0, 1), + * borderWidth: 2, + * rotate: degrees(90), + * font: ubuntuFont, + * }) + * ``` + * This will create a new widget for this text field. + * @param page The page to which this text field widget should be added. + * @param options The options to be used when adding this text field widget. + */ + PDFTextField.prototype.addToPage = function (page, options) { + var _a, _b, _c, _d, _e, _f, _g; + assertIs(page, 'page', [[PDFPage, 'PDFPage']]); + assertFieldAppearanceOptions(options); + if (!options) + options = {}; + if (!('textColor' in options)) + options.textColor = rgb(0, 0, 0); + if (!('backgroundColor' in options)) + options.backgroundColor = rgb(1, 1, 1); + if (!('borderColor' in options)) + options.borderColor = rgb(0, 0, 0); + if (!('borderWidth' in options)) + options.borderWidth = 1; + // Create a widget for this text field + var widget = this.createWidget({ + x: (_a = options.x) !== null && _a !== void 0 ? _a : 0, + y: (_b = options.y) !== null && _b !== void 0 ? _b : 0, + width: (_c = options.width) !== null && _c !== void 0 ? _c : 200, + height: (_d = options.height) !== null && _d !== void 0 ? _d : 50, + textColor: options.textColor, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: (_e = options.borderWidth) !== null && _e !== void 0 ? _e : 0, + rotate: (_f = options.rotate) !== null && _f !== void 0 ? _f : degrees(0), + hidden: options.hidden, + page: page.ref, + }); + var widgetRef = this.doc.context.register(widget.dict); + // Add widget to this field + this.acroField.addWidget(widgetRef); + // Set appearance streams for widget + var font = (_g = options.font) !== null && _g !== void 0 ? _g : this.doc.getForm().getDefaultFont(); + this.updateWidgetAppearance(widget, font); + // Add widget to the given page + page.node.addAnnot(widgetRef); + }; + /** + * Returns `true` if this text field has been marked as dirty, or if any of + * this text field's widgets do not have an appearance stream. For example: + * ```js + * const textField = form.getTextField('some.text.field') + * if (textField.needsAppearancesUpdate()) console.log('Needs update') + * ``` + * @returns Whether or not this text field needs an appearance update. + */ + PDFTextField.prototype.needsAppearancesUpdate = function () { + var _a; + if (this.isDirty()) + return true; + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var hasAppearances = ((_a = widget.getAppearances()) === null || _a === void 0 ? void 0 : _a.normal) instanceof PDFStream; + if (!hasAppearances) + return true; + } + return false; + }; + /** + * Update the appearance streams for each of this text field's widgets using + * the default appearance provider for text fields. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const textField = form.getTextField('some.text.field') + * textField.defaultUpdateAppearances(helvetica) + * ``` + * @param font The font to be used for creating the appearance streams. + */ + PDFTextField.prototype.defaultUpdateAppearances = function (font) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + this.updateAppearances(font); + }; + /** + * Update the appearance streams for each of this text field's widgets using + * the given appearance provider. If no `provider` is passed, the default + * appearance provider for text fields will be used. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const textField = form.getTextField('some.text.field') + * textField.updateAppearances(helvetica, (field, widget, font) => { + * ... + * return drawTextField(...) + * }) + * ``` + * @param font The font to be used for creating the appearance streams. + * @param provider Optionally, the appearance provider to be used for + * generating the contents of the appearance streams. + */ + PDFTextField.prototype.updateAppearances = function (font, provider) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + assertOrUndefined(provider, 'provider', [Function]); + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + this.updateWidgetAppearance(widget, font, provider); + } + this.markAsClean(); + }; + PDFTextField.prototype.updateWidgetAppearance = function (widget, font, provider) { + var apProvider = provider !== null && provider !== void 0 ? provider : defaultTextFieldAppearanceProvider; + var appearances = normalizeAppearance(apProvider(this, widget, font)); + this.updateWidgetAppearanceWithFont(widget, font, appearances); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFForm.getTextField]] method, which will create an + * > instance of [[PDFTextField]] for you. + * + * Create an instance of [[PDFTextField]] from an existing acroText and ref + * + * @param acroText The underlying `PDFAcroText` for this text field. + * @param ref The unique reference for this text field. + * @param doc The document to which this text field will belong. + */ + PDFTextField.of = function (acroText, ref, doc) { + return new PDFTextField(acroText, ref, doc); + }; + return PDFTextField; + }(PDFField)); + + (function (StandardFonts) { + StandardFonts["Courier"] = "Courier"; + StandardFonts["CourierBold"] = "Courier-Bold"; + StandardFonts["CourierOblique"] = "Courier-Oblique"; + StandardFonts["CourierBoldOblique"] = "Courier-BoldOblique"; + StandardFonts["Helvetica"] = "Helvetica"; + StandardFonts["HelveticaBold"] = "Helvetica-Bold"; + StandardFonts["HelveticaOblique"] = "Helvetica-Oblique"; + StandardFonts["HelveticaBoldOblique"] = "Helvetica-BoldOblique"; + StandardFonts["TimesRoman"] = "Times-Roman"; + StandardFonts["TimesRomanBold"] = "Times-Bold"; + StandardFonts["TimesRomanItalic"] = "Times-Italic"; + StandardFonts["TimesRomanBoldItalic"] = "Times-BoldItalic"; + StandardFonts["Symbol"] = "Symbol"; + StandardFonts["ZapfDingbats"] = "ZapfDingbats"; + })(exports.StandardFonts || (exports.StandardFonts = {})); + + /** + * Represents the interactive form of a [[PDFDocument]]. + * + * Interactive forms (sometimes called _AcroForms_) are collections of fields + * designed to gather information from a user. A PDF document may contains any + * number of fields that appear on various pages, all of which make up a single, + * global interactive form spanning the entire document. This means that + * instances of [[PDFDocument]] shall contain at most one [[PDFForm]]. + * + * The fields of an interactive form are represented by [[PDFField]] instances. + */ + var PDFForm = /** @class */ (function () { + function PDFForm(acroForm, doc) { + var _this = this; + this.embedDefaultFont = function () { + return _this.doc.embedStandardFont(exports.StandardFonts.Helvetica); + }; + assertIs(acroForm, 'acroForm', [[PDFAcroForm, 'PDFAcroForm']]); + assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]); + this.acroForm = acroForm; + this.doc = doc; + this.dirtyFields = new Set(); + this.defaultFontCache = Cache.populatedBy(this.embedDefaultFont); + } + /** + * Returns `true` if this [[PDFForm]] has XFA data. Most PDFs with form + * fields do not use XFA as it is not widely supported by PDF readers. + * + * > `pdf-lib` does not support creation, modification, or reading of XFA + * > fields. + * + * For example: + * ```js + * const form = pdfDoc.getForm() + * if (form.hasXFA()) console.log('PDF has XFA data') + * ``` + * @returns Whether or not this form has XFA data. + */ + PDFForm.prototype.hasXFA = function () { + return this.acroForm.dict.has(PDFName.of('XFA')); + }; + /** + * Disconnect the XFA data from this [[PDFForm]] (if any exists). This will + * force readers to fallback to standard fields if the [[PDFDocument]] + * contains any. For example: + * + * For example: + * ```js + * const form = pdfDoc.getForm() + * form.deleteXFA() + * ``` + */ + PDFForm.prototype.deleteXFA = function () { + this.acroForm.dict.delete(PDFName.of('XFA')); + }; + /** + * Get all fields contained in this [[PDFForm]]. For example: + * ```js + * const form = pdfDoc.getForm() + * const fields = form.getFields() + * fields.forEach(field => { + * const type = field.constructor.name + * const name = field.getName() + * console.log(`${type}: ${name}`) + * }) + * ``` + * @returns An array of all fields in this form. + */ + PDFForm.prototype.getFields = function () { + var allFields = this.acroForm.getAllFields(); + var fields = []; + for (var idx = 0, len = allFields.length; idx < len; idx++) { + var _a = allFields[idx], acroField = _a[0], ref = _a[1]; + var field = convertToPDFField(acroField, ref, this.doc); + if (field) + fields.push(field); + } + return fields; + }; + /** + * Get the field in this [[PDFForm]] with the given name. For example: + * ```js + * const form = pdfDoc.getForm() + * const field = form.getFieldMaybe('Page1.Foo.Bar[0]') + * if (field) console.log('Field exists!') + * ``` + * @param name A fully qualified field name. + * @returns The field with the specified name, if one exists. + */ + PDFForm.prototype.getFieldMaybe = function (name) { + assertIs(name, 'name', ['string']); + var fields = this.getFields(); + for (var idx = 0, len = fields.length; idx < len; idx++) { + var field = fields[idx]; + if (field.getName() === name) + return field; + } + return undefined; + }; + /** + * Get the field in this [[PDFForm]] with the given name. For example: + * ```js + * const form = pdfDoc.getForm() + * const field = form.getField('Page1.Foo.Bar[0]') + * ``` + * If no field exists with the provided name, an error will be thrown. + * @param name A fully qualified field name. + * @returns The field with the specified name. + */ + PDFForm.prototype.getField = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getFieldMaybe(name); + if (field) + return field; + throw new NoSuchFieldError(name); + }; + /** + * Get the button field in this [[PDFForm]] with the given name. For example: + * ```js + * const form = pdfDoc.getForm() + * const button = form.getButton('Page1.Foo.Button[0]') + * ``` + * An error will be thrown if no field exists with the provided name, or if + * the field exists but is not a button. + * @param name A fully qualified button name. + * @returns The button with the specified name. + */ + PDFForm.prototype.getButton = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getField(name); + if (field instanceof PDFButton) + return field; + throw new UnexpectedFieldTypeError(name, PDFButton, field); + }; + /** + * Get the check box field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const form = pdfDoc.getForm() + * const checkBox = form.getCheckBox('Page1.Foo.CheckBox[0]') + * checkBox.check() + * ``` + * An error will be thrown if no field exists with the provided name, or if + * the field exists but is not a check box. + * @param name A fully qualified check box name. + * @returns The check box with the specified name. + */ + PDFForm.prototype.getCheckBox = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getField(name); + if (field instanceof PDFCheckBox) + return field; + throw new UnexpectedFieldTypeError(name, PDFCheckBox, field); + }; + /** + * Get the dropdown field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const form = pdfDoc.getForm() + * const dropdown = form.getDropdown('Page1.Foo.Dropdown[0]') + * const options = dropdown.getOptions() + * dropdown.select(options[0]) + * ``` + * An error will be thrown if no field exists with the provided name, or if + * the field exists but is not a dropdown. + * @param name A fully qualified dropdown name. + * @returns The dropdown with the specified name. + */ + PDFForm.prototype.getDropdown = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getField(name); + if (field instanceof PDFDropdown) + return field; + throw new UnexpectedFieldTypeError(name, PDFDropdown, field); + }; + /** + * Get the option list field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const form = pdfDoc.getForm() + * const optionList = form.getOptionList('Page1.Foo.OptionList[0]') + * const options = optionList.getOptions() + * optionList.select(options[0]) + * ``` + * An error will be thrown if no field exists with the provided name, or if + * the field exists but is not an option list. + * @param name A fully qualified option list name. + * @returns The option list with the specified name. + */ + PDFForm.prototype.getOptionList = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getField(name); + if (field instanceof PDFOptionList) + return field; + throw new UnexpectedFieldTypeError(name, PDFOptionList, field); + }; + /** + * Get the radio group field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const form = pdfDoc.getForm() + * const radioGroup = form.getRadioGroup('Page1.Foo.RadioGroup[0]') + * const options = radioGroup.getOptions() + * radioGroup.select(options[0]) + * ``` + * An error will be thrown if no field exists with the provided name, or if + * the field exists but is not a radio group. + * @param name A fully qualified radio group name. + * @returns The radio group with the specified name. + */ + PDFForm.prototype.getRadioGroup = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getField(name); + if (field instanceof PDFRadioGroup) + return field; + throw new UnexpectedFieldTypeError(name, PDFRadioGroup, field); + }; + /** + * Get the signature field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const form = pdfDoc.getForm() + * const signature = form.getSignature('Page1.Foo.Signature[0]') + * ``` + * An error will be thrown if no field exists with the provided name, or if + * the field exists but is not a signature. + * @param name A fully qualified signature name. + * @returns The signature with the specified name. + */ + PDFForm.prototype.getSignature = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getField(name); + if (field instanceof PDFSignature) + return field; + throw new UnexpectedFieldTypeError(name, PDFSignature, field); + }; + /** + * Get the text field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const form = pdfDoc.getForm() + * const textField = form.getTextField('Page1.Foo.TextField[0]') + * textField.setText('Are you designed to act or to be acted upon?') + * ``` + * An error will be thrown if no field exists with the provided name, or if + * the field exists but is not a text field. + * @param name A fully qualified text field name. + * @returns The text field with the specified name. + */ + PDFForm.prototype.getTextField = function (name) { + assertIs(name, 'name', ['string']); + var field = this.getField(name); + if (field instanceof PDFTextField) + return field; + throw new UnexpectedFieldTypeError(name, PDFTextField, field); + }; + /** + * Create a new button field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const font = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const button = form.createButton('cool.new.button') + * + * button.addToPage('Do Stuff', font, page) + * ``` + * An error will be thrown if a field already exists with the provided name. + * @param name The fully qualified name for the new button. + * @returns The new button field. + */ + PDFForm.prototype.createButton = function (name) { + assertIs(name, 'name', ['string']); + var nameParts = splitFieldName(name); + var parent = this.findOrCreateNonTerminals(nameParts.nonTerminal); + var button = PDFAcroPushButton.create(this.doc.context); + button.setPartialName(nameParts.terminal); + addFieldToParent(parent, [button, button.ref], nameParts.terminal); + return PDFButton.of(button, button.ref, this.doc); + }; + /** + * Create a new check box field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const font = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const checkBox = form.createCheckBox('cool.new.checkBox') + * + * checkBox.addToPage(page) + * ``` + * An error will be thrown if a field already exists with the provided name. + * @param name The fully qualified name for the new check box. + * @returns The new check box field. + */ + PDFForm.prototype.createCheckBox = function (name) { + assertIs(name, 'name', ['string']); + var nameParts = splitFieldName(name); + var parent = this.findOrCreateNonTerminals(nameParts.nonTerminal); + var checkBox = PDFAcroCheckBox.create(this.doc.context); + checkBox.setPartialName(nameParts.terminal); + addFieldToParent(parent, [checkBox, checkBox.ref], nameParts.terminal); + return PDFCheckBox.of(checkBox, checkBox.ref, this.doc); + }; + /** + * Create a new dropdown field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const font = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const dropdown = form.createDropdown('cool.new.dropdown') + * + * dropdown.addToPage(font, page) + * ``` + * An error will be thrown if a field already exists with the provided name. + * @param name The fully qualified name for the new dropdown. + * @returns The new dropdown field. + */ + PDFForm.prototype.createDropdown = function (name) { + assertIs(name, 'name', ['string']); + var nameParts = splitFieldName(name); + var parent = this.findOrCreateNonTerminals(nameParts.nonTerminal); + var comboBox = PDFAcroComboBox.create(this.doc.context); + comboBox.setPartialName(nameParts.terminal); + addFieldToParent(parent, [comboBox, comboBox.ref], nameParts.terminal); + return PDFDropdown.of(comboBox, comboBox.ref, this.doc); + }; + /** + * Create a new option list field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const font = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const optionList = form.createOptionList('cool.new.optionList') + * + * optionList.addToPage(font, page) + * ``` + * An error will be thrown if a field already exists with the provided name. + * @param name The fully qualified name for the new option list. + * @returns The new option list field. + */ + PDFForm.prototype.createOptionList = function (name) { + assertIs(name, 'name', ['string']); + var nameParts = splitFieldName(name); + var parent = this.findOrCreateNonTerminals(nameParts.nonTerminal); + var listBox = PDFAcroListBox.create(this.doc.context); + listBox.setPartialName(nameParts.terminal); + addFieldToParent(parent, [listBox, listBox.ref], nameParts.terminal); + return PDFOptionList.of(listBox, listBox.ref, this.doc); + }; + /** + * Create a new radio group field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const font = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const radioGroup = form.createRadioGroup('cool.new.radioGroup') + * + * radioGroup.addOptionToPage('is-dog', page, { y: 0 }) + * radioGroup.addOptionToPage('is-cat', page, { y: 75 }) + * ``` + * An error will be thrown if a field already exists with the provided name. + * @param name The fully qualified name for the new radio group. + * @returns The new radio group field. + */ + PDFForm.prototype.createRadioGroup = function (name) { + assertIs(name, 'name', ['string']); + var nameParts = splitFieldName(name); + var parent = this.findOrCreateNonTerminals(nameParts.nonTerminal); + var radioButton = PDFAcroRadioButton.create(this.doc.context); + radioButton.setPartialName(nameParts.terminal); + addFieldToParent(parent, [radioButton, radioButton.ref], nameParts.terminal); + return PDFRadioGroup.of(radioButton, radioButton.ref, this.doc); + }; + /** + * Create a new text field in this [[PDFForm]] with the given name. + * For example: + * ```js + * const font = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const textField = form.createTextField('cool.new.textField') + * + * textField.addToPage(font, page) + * ``` + * An error will be thrown if a field already exists with the provided name. + * @param name The fully qualified name for the new radio group. + * @returns The new radio group field. + */ + PDFForm.prototype.createTextField = function (name) { + assertIs(name, 'name', ['string']); + var nameParts = splitFieldName(name); + var parent = this.findOrCreateNonTerminals(nameParts.nonTerminal); + var text = PDFAcroText.create(this.doc.context); + text.setPartialName(nameParts.terminal); + addFieldToParent(parent, [text, text.ref], nameParts.terminal); + return PDFTextField.of(text, text.ref, this.doc); + }; + /** + * Flatten all fields in this [[PDFForm]]. + * + * Flattening a form field will take the current appearance for each of that + * field's widgets and make them part of their page's content stream. All form + * fields and annotations associated are then removed. Note that once a form + * has been flattened its fields can no longer be accessed or edited. + * + * This operation is often used after filling form fields to ensure a + * consistent appearance across different PDF readers and/or printers. + * Another common use case is to copy a template document with form fields + * into another document. In this scenario you would load the template + * document, fill its fields, flatten it, and then copy its pages into the + * recipient document - the filled fields will be copied over. + * + * For example: + * ```js + * const form = pdfDoc.getForm(); + * form.flatten(); + * ``` + */ + PDFForm.prototype.flatten = function (options) { + if (options === void 0) { options = { updateFieldAppearances: true }; } + if (options.updateFieldAppearances) { + this.updateFieldAppearances(); + } + var fields = this.getFields(); + for (var i = 0, lenFields = fields.length; i < lenFields; i++) { + var field = fields[i]; + var widgets = field.acroField.getWidgets(); + for (var j = 0, lenWidgets = widgets.length; j < lenWidgets; j++) { + var widget = widgets[j]; + var page = this.findWidgetPage(widget); + var widgetRef = this.findWidgetAppearanceRef(field, widget); + var xObjectKey = page.node.newXObject('FlatWidget', widgetRef); + var rectangle = widget.getRectangle(); + var operators = __spreadArrays([ + pushGraphicsState(), + translate(rectangle.x, rectangle.y) + ], rotateInPlace(__assign(__assign({}, rectangle), { rotation: 0 })), [ + drawObject(xObjectKey), + popGraphicsState(), + ]).filter(Boolean); + page.pushOperators.apply(page, operators); + } + this.removeField(field); + } + }; + /** + * Remove a field from this [[PDFForm]]. + * + * For example: + * ```js + * const form = pdfDoc.getForm(); + * const ageField = form.getFields().find(x => x.getName() === 'Age'); + * form.removeField(ageField); + * ``` + */ + PDFForm.prototype.removeField = function (field) { + var widgets = field.acroField.getWidgets(); + var pages = new Set(); + for (var i = 0, len = widgets.length; i < len; i++) { + var widget = widgets[i]; + var widgetRef = this.findWidgetAppearanceRef(field, widget); + var page = this.findWidgetPage(widget); + pages.add(page); + page.node.removeAnnot(widgetRef); + } + pages.forEach(function (page) { return page.node.removeAnnot(field.ref); }); + this.acroForm.removeField(field.acroField); + var fieldKids = field.acroField.normalizedEntries().Kids; + var kidsCount = fieldKids.size(); + for (var childIndex = 0; childIndex < kidsCount; childIndex++) { + var child = fieldKids.get(childIndex); + if (child instanceof PDFRef) { + this.doc.context.delete(child); + } + } + this.doc.context.delete(field.ref); + }; + /** + * Update the appearance streams for all widgets of all fields in this + * [[PDFForm]]. Appearance streams will only be created for a widget if it + * does not have any existing appearance streams, or the field's value has + * changed (e.g. by calling [[PDFTextField.setText]] or + * [[PDFDropdown.select]]). + * + * For example: + * ```js + * const courier = await pdfDoc.embedFont(StandardFonts.Courier) + * const form = pdfDoc.getForm() + * form.updateFieldAppearances(courier) + * ``` + * + * **IMPORTANT:** The default value for the `font` parameter is + * [[StandardFonts.Helvetica]]. Note that this is a WinAnsi font. This means + * that encoding errors will be thrown if any fields contain text with + * characters outside the WinAnsi character set (the latin alphabet). + * + * Embedding a custom font and passing that as the `font` + * parameter allows you to generate appearance streams with non WinAnsi + * characters (assuming your custom font supports them). + * + * > **NOTE:** The [[PDFDocument.save]] method will call this method to + * > update appearances automatically if a form was accessed via the + * > [[PDFDocument.getForm]] method prior to saving. + * + * @param font Optionally, the font to use when creating new appearances. + */ + PDFForm.prototype.updateFieldAppearances = function (font) { + assertOrUndefined(font, 'font', [[PDFFont, 'PDFFont']]); + font = font !== null && font !== void 0 ? font : this.getDefaultFont(); + var fields = this.getFields(); + for (var idx = 0, len = fields.length; idx < len; idx++) { + var field = fields[idx]; + if (field.needsAppearancesUpdate()) { + field.defaultUpdateAppearances(font); + } + } + }; + /** + * Mark a field as dirty. This will cause its appearance streams to be + * updated by [[PDFForm.updateFieldAppearances]]. + * ```js + * const form = pdfDoc.getForm() + * const field = form.getField('foo.bar') + * form.markFieldAsDirty(field.ref) + * ``` + * @param fieldRef The reference to the field that should be marked. + */ + PDFForm.prototype.markFieldAsDirty = function (fieldRef) { + assertOrUndefined(fieldRef, 'fieldRef', [[PDFRef, 'PDFRef']]); + this.dirtyFields.add(fieldRef); + }; + /** + * Mark a field as dirty. This will cause its appearance streams to not be + * updated by [[PDFForm.updateFieldAppearances]]. + * ```js + * const form = pdfDoc.getForm() + * const field = form.getField('foo.bar') + * form.markFieldAsClean(field.ref) + * ``` + * @param fieldRef The reference to the field that should be marked. + */ + PDFForm.prototype.markFieldAsClean = function (fieldRef) { + assertOrUndefined(fieldRef, 'fieldRef', [[PDFRef, 'PDFRef']]); + this.dirtyFields.delete(fieldRef); + }; + /** + * Returns `true` is the specified field has been marked as dirty. + * ```js + * const form = pdfDoc.getForm() + * const field = form.getField('foo.bar') + * if (form.fieldIsDirty(field.ref)) console.log('Field is dirty') + * ``` + * @param fieldRef The reference to the field that should be checked. + * @returns Whether or not the specified field is dirty. + */ + PDFForm.prototype.fieldIsDirty = function (fieldRef) { + assertOrUndefined(fieldRef, 'fieldRef', [[PDFRef, 'PDFRef']]); + return this.dirtyFields.has(fieldRef); + }; + PDFForm.prototype.getDefaultFont = function () { + return this.defaultFontCache.access(); + }; + PDFForm.prototype.findWidgetPage = function (widget) { + var pageRef = widget.P(); + var page = this.doc.getPages().find(function (x) { return x.ref === pageRef; }); + if (page === undefined) { + var widgetRef = this.doc.context.getObjectRef(widget.dict); + if (widgetRef === undefined) { + throw new Error('Could not find PDFRef for PDFObject'); + } + page = this.doc.findPageForAnnotationRef(widgetRef); + if (page === undefined) { + throw new Error("Could not find page for PDFRef " + widgetRef); + } + } + return page; + }; + PDFForm.prototype.findWidgetAppearanceRef = function (field, widget) { + var _a; + var refOrDict = widget.getNormalAppearance(); + if (refOrDict instanceof PDFDict && + (field instanceof PDFCheckBox || field instanceof PDFRadioGroup)) { + var value = field.acroField.getValue(); + var ref = (_a = refOrDict.get(value)) !== null && _a !== void 0 ? _a : refOrDict.get(PDFName.of('Off')); + if (ref instanceof PDFRef) { + refOrDict = ref; + } + } + if (!(refOrDict instanceof PDFRef)) { + var name_1 = field.getName(); + throw new Error("Failed to extract appearance ref for: " + name_1); + } + return refOrDict; + }; + PDFForm.prototype.findOrCreateNonTerminals = function (partialNames) { + var nonTerminal = [ + this.acroForm, + ]; + for (var idx = 0, len = partialNames.length; idx < len; idx++) { + var namePart = partialNames[idx]; + if (!namePart) + throw new InvalidFieldNamePartError(namePart); + var parent_1 = nonTerminal[0], parentRef = nonTerminal[1]; + var res = this.findNonTerminal(namePart, parent_1); + if (res) { + nonTerminal = res; + } + else { + var node = PDFAcroNonTerminal.create(this.doc.context); + node.setPartialName(namePart); + node.setParent(parentRef); + var nodeRef = this.doc.context.register(node.dict); + parent_1.addField(nodeRef); + nonTerminal = [node, nodeRef]; + } + } + return nonTerminal; + }; + PDFForm.prototype.findNonTerminal = function (partialName, parent) { + var fields = parent instanceof PDFAcroForm + ? this.acroForm.getFields() + : createPDFAcroFields(parent.Kids()); + for (var idx = 0, len = fields.length; idx < len; idx++) { + var _a = fields[idx], field = _a[0], ref = _a[1]; + if (field.getPartialName() === partialName) { + if (field instanceof PDFAcroNonTerminal) + return [field, ref]; + throw new FieldAlreadyExistsError(partialName); + } + } + return undefined; + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.getForm]] method, which will create an + * > instance of [[PDFForm]] for you. + * + * Create an instance of [[PDFForm]] from an existing acroForm and embedder + * + * @param acroForm The underlying `PDFAcroForm` for this form. + * @param doc The document to which the form will belong. + */ + PDFForm.of = function (acroForm, doc) { + return new PDFForm(acroForm, doc); + }; + return PDFForm; + }()); + var convertToPDFField = function (field, ref, doc) { + if (field instanceof PDFAcroPushButton) + return PDFButton.of(field, ref, doc); + if (field instanceof PDFAcroCheckBox) + return PDFCheckBox.of(field, ref, doc); + if (field instanceof PDFAcroComboBox) + return PDFDropdown.of(field, ref, doc); + if (field instanceof PDFAcroListBox) + return PDFOptionList.of(field, ref, doc); + if (field instanceof PDFAcroText) + return PDFTextField.of(field, ref, doc); + if (field instanceof PDFAcroRadioButton) { + return PDFRadioGroup.of(field, ref, doc); + } + if (field instanceof PDFAcroSignature) { + return PDFSignature.of(field, ref, doc); + } + return undefined; + }; + var splitFieldName = function (fullyQualifiedName) { + if (fullyQualifiedName.length === 0) { + throw new Error('PDF field names must not be empty strings'); + } + var parts = fullyQualifiedName.split('.'); + for (var idx = 0, len = parts.length; idx < len; idx++) { + if (parts[idx] === '') { + throw new Error("Periods in PDF field names must be separated by at least one character: \"" + fullyQualifiedName + "\""); + } + } + if (parts.length === 1) + return { nonTerminal: [], terminal: parts[0] }; + return { + nonTerminal: parts.slice(0, parts.length - 1), + terminal: parts[parts.length - 1], + }; + }; + var addFieldToParent = function (_a, _b, partialName) { + var parent = _a[0], parentRef = _a[1]; + var field = _b[0], fieldRef = _b[1]; + var entries = parent.normalizedEntries(); + var fields = createPDFAcroFields('Kids' in entries ? entries.Kids : entries.Fields); + for (var idx = 0, len = fields.length; idx < len; idx++) { + if (fields[idx][0].getPartialName() === partialName) { + throw new FieldAlreadyExistsError(partialName); + } + } + parent.addField(fieldRef); + field.setParent(parentRef); + }; + + var PageSizes = { + '4A0': [4767.87, 6740.79], + '2A0': [3370.39, 4767.87], + A0: [2383.94, 3370.39], + A1: [1683.78, 2383.94], + A2: [1190.55, 1683.78], + A3: [841.89, 1190.55], + A4: [595.28, 841.89], + A5: [419.53, 595.28], + A6: [297.64, 419.53], + A7: [209.76, 297.64], + A8: [147.4, 209.76], + A9: [104.88, 147.4], + A10: [73.7, 104.88], + B0: [2834.65, 4008.19], + B1: [2004.09, 2834.65], + B2: [1417.32, 2004.09], + B3: [1000.63, 1417.32], + B4: [708.66, 1000.63], + B5: [498.9, 708.66], + B6: [354.33, 498.9], + B7: [249.45, 354.33], + B8: [175.75, 249.45], + B9: [124.72, 175.75], + B10: [87.87, 124.72], + C0: [2599.37, 3676.54], + C1: [1836.85, 2599.37], + C2: [1298.27, 1836.85], + C3: [918.43, 1298.27], + C4: [649.13, 918.43], + C5: [459.21, 649.13], + C6: [323.15, 459.21], + C7: [229.61, 323.15], + C8: [161.57, 229.61], + C9: [113.39, 161.57], + C10: [79.37, 113.39], + RA0: [2437.8, 3458.27], + RA1: [1729.13, 2437.8], + RA2: [1218.9, 1729.13], + RA3: [864.57, 1218.9], + RA4: [609.45, 864.57], + SRA0: [2551.18, 3628.35], + SRA1: [1814.17, 2551.18], + SRA2: [1275.59, 1814.17], + SRA3: [907.09, 1275.59], + SRA4: [637.8, 907.09], + Executive: [521.86, 756.0], + Folio: [612.0, 936.0], + Legal: [612.0, 1008.0], + Letter: [612.0, 792.0], + Tabloid: [792.0, 1224.0], + }; + + (function (ParseSpeeds) { + ParseSpeeds[ParseSpeeds["Fastest"] = Infinity] = "Fastest"; + ParseSpeeds[ParseSpeeds["Fast"] = 1500] = "Fast"; + ParseSpeeds[ParseSpeeds["Medium"] = 500] = "Medium"; + ParseSpeeds[ParseSpeeds["Slow"] = 100] = "Slow"; + })(exports.ParseSpeeds || (exports.ParseSpeeds = {})); + + /** + * Represents a file that has been embedded in a [[PDFDocument]]. + */ + var PDFEmbeddedFile = /** @class */ (function () { + function PDFEmbeddedFile(ref, doc, embedder) { + this.alreadyEmbedded = false; + this.ref = ref; + this.doc = doc; + this.embedder = embedder; + } + /** + * > **NOTE:** You probably don't need to call this method directly. The + * > [[PDFDocument.save]] and [[PDFDocument.saveAsBase64]] methods will + * > automatically ensure all embeddable files get embedded. + * + * Embed this embeddable file in its document. + * + * @returns Resolves when the embedding is complete. + */ + PDFEmbeddedFile.prototype.embed = function () { + return __awaiter(this, void 0, void 0, function () { + var ref, Names, EmbeddedFiles, EFNames, AF; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!!this.alreadyEmbedded) return [3 /*break*/, 2]; + return [4 /*yield*/, this.embedder.embedIntoContext(this.doc.context, this.ref)]; + case 1: + ref = _a.sent(); + if (!this.doc.catalog.has(PDFName.of('Names'))) { + this.doc.catalog.set(PDFName.of('Names'), this.doc.context.obj({})); + } + Names = this.doc.catalog.lookup(PDFName.of('Names'), PDFDict); + if (!Names.has(PDFName.of('EmbeddedFiles'))) { + Names.set(PDFName.of('EmbeddedFiles'), this.doc.context.obj({})); + } + EmbeddedFiles = Names.lookup(PDFName.of('EmbeddedFiles'), PDFDict); + if (!EmbeddedFiles.has(PDFName.of('Names'))) { + EmbeddedFiles.set(PDFName.of('Names'), this.doc.context.obj([])); + } + EFNames = EmbeddedFiles.lookup(PDFName.of('Names'), PDFArray); + EFNames.push(PDFHexString.fromText(this.embedder.fileName)); + EFNames.push(ref); + /** + * The AF-Tag is needed to achieve PDF-A3 compliance for embedded files + * + * The following document outlines the uses cases of the associated files (AF) tag. + * See: + * https://www.pdfa.org/wp-content/uploads/2018/10/PDF20_AN002-AF.pdf + */ + if (!this.doc.catalog.has(PDFName.of('AF'))) { + this.doc.catalog.set(PDFName.of('AF'), this.doc.context.obj([])); + } + AF = this.doc.catalog.lookup(PDFName.of('AF'), PDFArray); + AF.push(ref); + this.alreadyEmbedded = true; + _a.label = 2; + case 2: return [2 /*return*/]; + } + }); + }); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.attach]] method, which will create + * instances of [[PDFEmbeddedFile]] for you. + * + * Create an instance of [[PDFEmbeddedFile]] from an existing ref and embedder + * + * @param ref The unique reference for this file. + * @param doc The document to which the file will belong. + * @param embedder The embedder that will be used to embed the file. + */ + PDFEmbeddedFile.of = function (ref, doc, embedder) { + return new PDFEmbeddedFile(ref, doc, embedder); + }; + return PDFEmbeddedFile; + }()); + + /** + * Represents JavaScript that has been embedded in a [[PDFDocument]]. + */ + var PDFJavaScript = /** @class */ (function () { + function PDFJavaScript(ref, doc, embedder) { + this.alreadyEmbedded = false; + this.ref = ref; + this.doc = doc; + this.embedder = embedder; + } + /** + * > **NOTE:** You probably don't need to call this method directly. The + * > [[PDFDocument.save]] and [[PDFDocument.saveAsBase64]] methods will + * > automatically ensure all JavaScripts get embedded. + * + * Embed this JavaScript in its document. + * + * @returns Resolves when the embedding is complete. + */ + PDFJavaScript.prototype.embed = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, catalog, context, ref, Names, Javascript, JSNames; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!!this.alreadyEmbedded) return [3 /*break*/, 2]; + _a = this.doc, catalog = _a.catalog, context = _a.context; + return [4 /*yield*/, this.embedder.embedIntoContext(this.doc.context, this.ref)]; + case 1: + ref = _b.sent(); + if (!catalog.has(PDFName.of('Names'))) { + catalog.set(PDFName.of('Names'), context.obj({})); + } + Names = catalog.lookup(PDFName.of('Names'), PDFDict); + if (!Names.has(PDFName.of('JavaScript'))) { + Names.set(PDFName.of('JavaScript'), context.obj({})); + } + Javascript = Names.lookup(PDFName.of('JavaScript'), PDFDict); + if (!Javascript.has(PDFName.of('Names'))) { + Javascript.set(PDFName.of('Names'), context.obj([])); + } + JSNames = Javascript.lookup(PDFName.of('Names'), PDFArray); + JSNames.push(PDFHexString.fromText(this.embedder.scriptName)); + JSNames.push(ref); + this.alreadyEmbedded = true; + _b.label = 2; + case 2: return [2 /*return*/]; + } + }); + }); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.addJavaScript]] method, which will + * create instances of [[PDFJavaScript]] for you. + * + * Create an instance of [[PDFJavaScript]] from an existing ref and script + * + * @param ref The unique reference for this script. + * @param doc The document to which the script will belong. + * @param embedder The embedder that will be used to embed the script. + */ + PDFJavaScript.of = function (ref, doc, embedder) { + return new PDFJavaScript(ref, doc, embedder); + }; + return PDFJavaScript; + }()); + + var JavaScriptEmbedder = /** @class */ (function () { + function JavaScriptEmbedder(script, scriptName) { + this.script = script; + this.scriptName = scriptName; + } + JavaScriptEmbedder.for = function (script, scriptName) { + return new JavaScriptEmbedder(script, scriptName); + }; + JavaScriptEmbedder.prototype.embedIntoContext = function (context, ref) { + return __awaiter(this, void 0, void 0, function () { + var jsActionDict; + return __generator(this, function (_a) { + jsActionDict = context.obj({ + Type: 'Action', + S: 'JavaScript', + JS: PDFHexString.fromText(this.script), + }); + if (ref) { + context.assign(ref, jsActionDict); + return [2 /*return*/, ref]; + } + else { + return [2 /*return*/, context.register(jsActionDict)]; + } + }); + }); + }; + return JavaScriptEmbedder; + }()); + + /** + * Represents a PDF document. + */ + var PDFDocument = /** @class */ (function () { + function PDFDocument(context, ignoreEncryption, updateMetadata) { + var _this = this; + /** The default word breaks used in PDFPage.drawText */ + this.defaultWordBreaks = [' ']; + this.computePages = function () { + var pages = []; + _this.catalog.Pages().traverse(function (node, ref) { + if (node instanceof PDFPageLeaf) { + var page = _this.pageMap.get(node); + if (!page) { + page = PDFPage.of(node, ref, _this); + _this.pageMap.set(node, page); + } + pages.push(page); + } + }); + return pages; + }; + this.getOrCreateForm = function () { + var acroForm = _this.catalog.getOrCreateAcroForm(); + return PDFForm.of(acroForm, _this); + }; + assertIs(context, 'context', [[PDFContext, 'PDFContext']]); + assertIs(ignoreEncryption, 'ignoreEncryption', ['boolean']); + this.context = context; + this.catalog = context.lookup(context.trailerInfo.Root); + this.isEncrypted = !!context.lookup(context.trailerInfo.Encrypt); + this.pageCache = Cache.populatedBy(this.computePages); + this.pageMap = new Map(); + this.formCache = Cache.populatedBy(this.getOrCreateForm); + this.fonts = []; + this.images = []; + this.embeddedPages = []; + this.embeddedFiles = []; + this.javaScripts = []; + if (!ignoreEncryption && this.isEncrypted) + throw new EncryptedPDFError(); + if (updateMetadata) + this.updateInfoDict(); + } + /** + * Load an existing [[PDFDocument]]. The input data can be provided in + * multiple formats: + * + * | Type | Contents | + * | ------------- | ------------------------------------------------------ | + * | `string` | A base64 encoded string (or data URI) containing a PDF | + * | `Uint8Array` | The raw bytes of a PDF | + * | `ArrayBuffer` | The raw bytes of a PDF | + * + * For example: + * ```js + * import { PDFDocument } from 'pdf-lib' + * + * // pdf=string + * const base64 = + * 'JVBERi0xLjcKJYGBgYEKCjUgMCBvYmoKPDwKL0ZpbHRlciAvRmxhdGVEZWNvZGUKL0xlbm' + + * 'd0aCAxMDQKPj4Kc3RyZWFtCniccwrhMlAAwaJ0Ln2P1Jyy1JLM5ERdc0MjCwUjE4WQNC4Q' + + * '6cNlCFZkqGCqYGSqEJLLZWNuYGZiZmbkYuZsZmlmZGRgZmluDCQNzc3NTM2NzdzMXMxMjQ' + + * 'ztFEKyuEK0uFxDuAAOERdVCmVuZHN0cmVhbQplbmRvYmoKCjYgMCBvYmoKPDwKL0ZpbHRl' + + * 'ciAvRmxhdGVEZWNvZGUKL1R5cGUgL09ialN0bQovTiA0Ci9GaXJzdCAyMAovTGVuZ3RoID' + + * 'IxNQo+PgpzdHJlYW0KeJxVj9GqwjAMhu/zFHkBzTo3nCCCiiKIHPEICuJF3cKoSCu2E8/b' + + * '20wPIr1p8v9/8kVhgilmGfawX2CGaVrgcAi0/bsy0lrX7IGWpvJ4iJYEN3gEmrrGBlQwGs' + + * 'HHO9VBX1wNrxAqMX87RBD5xpJuddqwd82tjAHxzV1U5LPgy52DKXWnr1Lheg+j/c/pzGVr' + + * 'iqV0VlwZPXGPCJjElw/ybkwUmeoWgxesDXGhHJC/D/iikp1Av80ptKU0FdBEe25pPihAM1' + + * 'u6ytgaaWfs2Hrz35CJT1+EWmAKZW5kc3RyZWFtCmVuZG9iagoKNyAwIG9iago8PAovU2l6' + + * 'ZSA4Ci9Sb290IDIgMCBSCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9UeXBlIC9YUmVmCi9MZW' + + * '5ndGggMzgKL1cgWyAxIDIgMiBdCi9JbmRleCBbIDAgOCBdCj4+CnN0cmVhbQp4nBXEwREA' + + * 'EBAEsCwz3vrvRmOOyyOoGhZdutHN2MT55fIAVocD+AplbmRzdHJlYW0KZW5kb2JqCgpzdG' + + * 'FydHhyZWYKNTEwCiUlRU9G' + * + * const dataUri = 'data:application/pdf;base64,' + base64 + * + * const pdfDoc1 = await PDFDocument.load(base64) + * const pdfDoc2 = await PDFDocument.load(dataUri) + * + * // pdf=Uint8Array + * import fs from 'fs' + * const uint8Array = fs.readFileSync('with_update_sections.pdf') + * const pdfDoc3 = await PDFDocument.load(uint8Array) + * + * // pdf=ArrayBuffer + * const url = 'https://pdf-lib.js.org/assets/with_update_sections.pdf' + * const arrayBuffer = await fetch(url).then(res => res.arrayBuffer()) + * const pdfDoc4 = await PDFDocument.load(arrayBuffer) + * + * ``` + * + * @param pdf The input data containing a PDF document. + * @param options The options to be used when loading the document. + * @returns Resolves with a document loaded from the input. + */ + PDFDocument.load = function (pdf, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var _a, ignoreEncryption, _b, parseSpeed, _c, throwOnInvalidObject, _d, updateMetadata, _e, capNumbers, bytes, context; + return __generator(this, function (_f) { + switch (_f.label) { + case 0: + _a = options.ignoreEncryption, ignoreEncryption = _a === void 0 ? false : _a, _b = options.parseSpeed, parseSpeed = _b === void 0 ? exports.ParseSpeeds.Slow : _b, _c = options.throwOnInvalidObject, throwOnInvalidObject = _c === void 0 ? false : _c, _d = options.updateMetadata, updateMetadata = _d === void 0 ? true : _d, _e = options.capNumbers, capNumbers = _e === void 0 ? false : _e; + assertIs(pdf, 'pdf', ['string', Uint8Array, ArrayBuffer]); + assertIs(ignoreEncryption, 'ignoreEncryption', ['boolean']); + assertIs(parseSpeed, 'parseSpeed', ['number']); + assertIs(throwOnInvalidObject, 'throwOnInvalidObject', ['boolean']); + bytes = toUint8Array(pdf); + return [4 /*yield*/, PDFParser.forBytesWithOptions(bytes, parseSpeed, throwOnInvalidObject, capNumbers).parseDocument()]; + case 1: + context = _f.sent(); + return [2 /*return*/, new PDFDocument(context, ignoreEncryption, updateMetadata)]; + } + }); + }); + }; + /** + * Create a new [[PDFDocument]]. + * @returns Resolves with the newly created document. + */ + PDFDocument.create = function (options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var _a, updateMetadata, context, pageTree, pageTreeRef, catalog; + return __generator(this, function (_b) { + _a = options.updateMetadata, updateMetadata = _a === void 0 ? true : _a; + context = PDFContext.create(); + pageTree = PDFPageTree.withContext(context); + pageTreeRef = context.register(pageTree); + catalog = PDFCatalog.withContextAndPages(context, pageTreeRef); + context.trailerInfo.Root = context.register(catalog); + return [2 /*return*/, new PDFDocument(context, false, updateMetadata)]; + }); + }); + }; + /** + * Register a fontkit instance. This must be done before custom fonts can + * be embedded. See [here](https://github.com/Hopding/pdf-lib/tree/master#fontkit-installation) + * for instructions on how to install and register a fontkit instance. + * + * > You do **not** need to call this method to embed standard fonts. + * + * For example: + * ```js + * import { PDFDocument } from 'pdf-lib' + * import fontkit from '@pdf-lib/fontkit' + * + * const pdfDoc = await PDFDocument.create() + * pdfDoc.registerFontkit(fontkit) + * ``` + * + * @param fontkit The fontkit instance to be registered. + */ + PDFDocument.prototype.registerFontkit = function (fontkit) { + this.fontkit = fontkit; + }; + /** + * Get the [[PDFForm]] containing all interactive fields for this document. + * For example: + * ```js + * const form = pdfDoc.getForm() + * const fields = form.getFields() + * fields.forEach(field => { + * const type = field.constructor.name + * const name = field.getName() + * console.log(`${type}: ${name}`) + * }) + * ``` + * @returns The form for this document. + */ + PDFDocument.prototype.getForm = function () { + var form = this.formCache.access(); + if (form.hasXFA()) { + console.warn('Removing XFA form data as pdf-lib does not support reading or writing XFA'); + form.deleteXFA(); + } + return form; + }; + /** + * Get this document's title metadata. The title appears in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * const title = pdfDoc.getTitle() + * ``` + * @returns A string containing the title of this document, if it has one. + */ + PDFDocument.prototype.getTitle = function () { + var title = this.getInfoDict().lookup(PDFName.Title); + if (!title) + return undefined; + assertIsLiteralOrHexString(title); + return title.decodeText(); + }; + /** + * Get this document's author metadata. The author appears in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * const author = pdfDoc.getAuthor() + * ``` + * @returns A string containing the author of this document, if it has one. + */ + PDFDocument.prototype.getAuthor = function () { + var author = this.getInfoDict().lookup(PDFName.Author); + if (!author) + return undefined; + assertIsLiteralOrHexString(author); + return author.decodeText(); + }; + /** + * Get this document's subject metadata. The subject appears in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * const subject = pdfDoc.getSubject() + * ``` + * @returns A string containing the subject of this document, if it has one. + */ + PDFDocument.prototype.getSubject = function () { + var subject = this.getInfoDict().lookup(PDFName.Subject); + if (!subject) + return undefined; + assertIsLiteralOrHexString(subject); + return subject.decodeText(); + }; + /** + * Get this document's keywords metadata. The keywords appear in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * const keywords = pdfDoc.getKeywords() + * ``` + * @returns A string containing the keywords of this document, if it has any. + */ + PDFDocument.prototype.getKeywords = function () { + var keywords = this.getInfoDict().lookup(PDFName.Keywords); + if (!keywords) + return undefined; + assertIsLiteralOrHexString(keywords); + return keywords.decodeText(); + }; + /** + * Get this document's creator metadata. The creator appears in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * const creator = pdfDoc.getCreator() + * ``` + * @returns A string containing the creator of this document, if it has one. + */ + PDFDocument.prototype.getCreator = function () { + var creator = this.getInfoDict().lookup(PDFName.Creator); + if (!creator) + return undefined; + assertIsLiteralOrHexString(creator); + return creator.decodeText(); + }; + /** + * Get this document's producer metadata. The producer appears in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * const producer = pdfDoc.getProducer() + * ``` + * @returns A string containing the producer of this document, if it has one. + */ + PDFDocument.prototype.getProducer = function () { + var producer = this.getInfoDict().lookup(PDFName.Producer); + if (!producer) + return undefined; + assertIsLiteralOrHexString(producer); + return producer.decodeText(); + }; + /** + * Get this document's creation date metadata. The creation date appears in + * the "Document Properties" section of most PDF readers. For example: + * ```js + * const creationDate = pdfDoc.getCreationDate() + * ``` + * @returns A Date containing the creation date of this document, + * if it has one. + */ + PDFDocument.prototype.getCreationDate = function () { + var creationDate = this.getInfoDict().lookup(PDFName.CreationDate); + if (!creationDate) + return undefined; + assertIsLiteralOrHexString(creationDate); + return creationDate.decodeDate(); + }; + /** + * Get this document's modification date metadata. The modification date + * appears in the "Document Properties" section of most PDF readers. + * For example: + * ```js + * const modification = pdfDoc.getModificationDate() + * ``` + * @returns A Date containing the modification date of this document, + * if it has one. + */ + PDFDocument.prototype.getModificationDate = function () { + var modificationDate = this.getInfoDict().lookup(PDFName.ModDate); + if (!modificationDate) + return undefined; + assertIsLiteralOrHexString(modificationDate); + return modificationDate.decodeDate(); + }; + /** + * Set this document's title metadata. The title will appear in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * pdfDoc.setTitle('🥚 The Life of an Egg 🍳') + * ``` + * + * To display the title in the window's title bar, set the + * `showInWindowTitleBar` option to `true` (works for _most_ PDF readers). + * For example: + * ```js + * pdfDoc.setTitle('🥚 The Life of an Egg 🍳', { showInWindowTitleBar: true }) + * ``` + * + * @param title The title of this document. + * @param options The options to be used when setting the title. + */ + PDFDocument.prototype.setTitle = function (title, options) { + assertIs(title, 'title', ['string']); + var key = PDFName.of('Title'); + this.getInfoDict().set(key, PDFHexString.fromText(title)); + // Indicate that readers should display the title rather than the filename + if (options === null || options === void 0 ? void 0 : options.showInWindowTitleBar) { + var prefs = this.catalog.getOrCreateViewerPreferences(); + prefs.setDisplayDocTitle(true); + } + }; + /** + * Set this document's author metadata. The author will appear in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * pdfDoc.setAuthor('Humpty Dumpty') + * ``` + * @param author The author of this document. + */ + PDFDocument.prototype.setAuthor = function (author) { + assertIs(author, 'author', ['string']); + var key = PDFName.of('Author'); + this.getInfoDict().set(key, PDFHexString.fromText(author)); + }; + /** + * Set this document's subject metadata. The subject will appear in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * pdfDoc.setSubject('📘 An Epic Tale of Woe 📖') + * ``` + * @param subject The subject of this document. + */ + PDFDocument.prototype.setSubject = function (subject) { + assertIs(subject, 'author', ['string']); + var key = PDFName.of('Subject'); + this.getInfoDict().set(key, PDFHexString.fromText(subject)); + }; + /** + * Set this document's keyword metadata. These keywords will appear in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * pdfDoc.setKeywords(['eggs', 'wall', 'fall', 'king', 'horses', 'men']) + * ``` + * @param keywords An array of keywords associated with this document. + */ + PDFDocument.prototype.setKeywords = function (keywords) { + assertIs(keywords, 'keywords', [Array]); + var key = PDFName.of('Keywords'); + this.getInfoDict().set(key, PDFHexString.fromText(keywords.join(' '))); + }; + /** + * Set this document's creator metadata. The creator will appear in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * pdfDoc.setCreator('PDF App 9000 🤖') + * ``` + * @param creator The creator of this document. + */ + PDFDocument.prototype.setCreator = function (creator) { + assertIs(creator, 'creator', ['string']); + var key = PDFName.of('Creator'); + this.getInfoDict().set(key, PDFHexString.fromText(creator)); + }; + /** + * Set this document's producer metadata. The producer will appear in the + * "Document Properties" section of most PDF readers. For example: + * ```js + * pdfDoc.setProducer('PDF App 9000 🤖') + * ``` + * @param producer The producer of this document. + */ + PDFDocument.prototype.setProducer = function (producer) { + assertIs(producer, 'creator', ['string']); + var key = PDFName.of('Producer'); + this.getInfoDict().set(key, PDFHexString.fromText(producer)); + }; + /** + * Set this document's language metadata. The language will appear in the + * "Document Properties" section of some PDF readers. For example: + * ```js + * pdfDoc.setLanguage('en-us') + * ``` + * + * @param language An RFC 3066 _Language-Tag_ denoting the language of this + * document, or an empty string if the language is unknown. + */ + PDFDocument.prototype.setLanguage = function (language) { + assertIs(language, 'language', ['string']); + var key = PDFName.of('Lang'); + this.catalog.set(key, PDFString.of(language)); + }; + /** + * Set this document's creation date metadata. The creation date will appear + * in the "Document Properties" section of most PDF readers. For example: + * ```js + * pdfDoc.setCreationDate(new Date()) + * ``` + * @param creationDate The date this document was created. + */ + PDFDocument.prototype.setCreationDate = function (creationDate) { + assertIs(creationDate, 'creationDate', [[Date, 'Date']]); + var key = PDFName.of('CreationDate'); + this.getInfoDict().set(key, PDFString.fromDate(creationDate)); + }; + /** + * Set this document's modification date metadata. The modification date will + * appear in the "Document Properties" section of most PDF readers. For + * example: + * ```js + * pdfDoc.setModificationDate(new Date()) + * ``` + * @param modificationDate The date this document was last modified. + */ + PDFDocument.prototype.setModificationDate = function (modificationDate) { + assertIs(modificationDate, 'modificationDate', [[Date, 'Date']]); + var key = PDFName.of('ModDate'); + this.getInfoDict().set(key, PDFString.fromDate(modificationDate)); + }; + /** + * Get the number of pages contained in this document. For example: + * ```js + * const totalPages = pdfDoc.getPageCount() + * ``` + * @returns The number of pages in this document. + */ + PDFDocument.prototype.getPageCount = function () { + if (this.pageCount === undefined) + this.pageCount = this.getPages().length; + return this.pageCount; + }; + /** + * Get an array of all the pages contained in this document. The pages are + * stored in the array in the same order that they are rendered in the + * document. For example: + * ```js + * const pages = pdfDoc.getPages() + * pages[0] // The first page of the document + * pages[2] // The third page of the document + * pages[197] // The 198th page of the document + * ``` + * @returns An array of all the pages contained in this document. + */ + PDFDocument.prototype.getPages = function () { + return this.pageCache.access(); + }; + /** + * Get the page rendered at a particular `index` of the document. For example: + * ```js + * pdfDoc.getPage(0) // The first page of the document + * pdfDoc.getPage(2) // The third page of the document + * pdfDoc.getPage(197) // The 198th page of the document + * ``` + * @returns The [[PDFPage]] rendered at the given `index` of the document. + */ + PDFDocument.prototype.getPage = function (index) { + var pages = this.getPages(); + assertRange(index, 'index', 0, pages.length - 1); + return pages[index]; + }; + /** + * Get an array of indices for all the pages contained in this document. The + * array will contain a range of integers from + * `0..pdfDoc.getPageCount() - 1`. For example: + * ```js + * const pdfDoc = await PDFDocument.create() + * pdfDoc.addPage() + * pdfDoc.addPage() + * pdfDoc.addPage() + * + * const indices = pdfDoc.getPageIndices() + * indices // => [0, 1, 2] + * ``` + * @returns An array of indices for all pages contained in this document. + */ + PDFDocument.prototype.getPageIndices = function () { + return range(0, this.getPageCount()); + }; + /** + * Remove the page at a given index from this document. For example: + * ```js + * pdfDoc.removePage(0) // Remove the first page of the document + * pdfDoc.removePage(2) // Remove the third page of the document + * pdfDoc.removePage(197) // Remove the 198th page of the document + * ``` + * Once a page has been removed, it will no longer be rendered at that index + * in the document. + * @param index The index of the page to be removed. + */ + PDFDocument.prototype.removePage = function (index) { + var pageCount = this.getPageCount(); + if (this.pageCount === 0) + throw new RemovePageFromEmptyDocumentError(); + assertRange(index, 'index', 0, pageCount - 1); + this.catalog.removeLeafNode(index); + this.pageCount = pageCount - 1; + }; + /** + * Add a page to the end of this document. This method accepts three + * different value types for the `page` parameter: + * + * | Type | Behavior | + * | ------------------ | ----------------------------------------------------------------------------------- | + * | `undefined` | Create a new page and add it to the end of this document | + * | `[number, number]` | Create a new page with the given dimensions and add it to the end of this document | + * | `PDFPage` | Add the existing page to the end of this document | + * + * For example: + * ```js + * // page=undefined + * const newPage = pdfDoc.addPage() + * + * // page=[number, number] + * import { PageSizes } from 'pdf-lib' + * const newPage1 = pdfDoc.addPage(PageSizes.A7) + * const newPage2 = pdfDoc.addPage(PageSizes.Letter) + * const newPage3 = pdfDoc.addPage([500, 750]) + * + * // page=PDFPage + * const pdfDoc1 = await PDFDocument.create() + * const pdfDoc2 = await PDFDocument.load(...) + * const [existingPage] = await pdfDoc1.copyPages(pdfDoc2, [0]) + * pdfDoc1.addPage(existingPage) + * ``` + * + * @param page Optionally, the desired dimensions or existing page. + * @returns The newly created (or existing) page. + */ + PDFDocument.prototype.addPage = function (page) { + assertIs(page, 'page', ['undefined', [PDFPage, 'PDFPage'], Array]); + return this.insertPage(this.getPageCount(), page); + }; + /** + * Insert a page at a given index within this document. This method accepts + * three different value types for the `page` parameter: + * + * | Type | Behavior | + * | ------------------ | ------------------------------------------------------------------------------ | + * | `undefined` | Create a new page and insert it into this document | + * | `[number, number]` | Create a new page with the given dimensions and insert it into this document | + * | `PDFPage` | Insert the existing page into this document | + * + * For example: + * ```js + * // page=undefined + * const newPage = pdfDoc.insertPage(2) + * + * // page=[number, number] + * import { PageSizes } from 'pdf-lib' + * const newPage1 = pdfDoc.insertPage(2, PageSizes.A7) + * const newPage2 = pdfDoc.insertPage(0, PageSizes.Letter) + * const newPage3 = pdfDoc.insertPage(198, [500, 750]) + * + * // page=PDFPage + * const pdfDoc1 = await PDFDocument.create() + * const pdfDoc2 = await PDFDocument.load(...) + * const [existingPage] = await pdfDoc1.copyPages(pdfDoc2, [0]) + * pdfDoc1.insertPage(0, existingPage) + * ``` + * + * @param index The index at which the page should be inserted (zero-based). + * @param page Optionally, the desired dimensions or existing page. + * @returns The newly created (or existing) page. + */ + PDFDocument.prototype.insertPage = function (index, page) { + var pageCount = this.getPageCount(); + assertRange(index, 'index', 0, pageCount); + assertIs(page, 'page', ['undefined', [PDFPage, 'PDFPage'], Array]); + if (!page || Array.isArray(page)) { + var dims = Array.isArray(page) ? page : PageSizes.A4; + page = PDFPage.create(this); + page.setSize.apply(page, dims); + } + else if (page.doc !== this) { + throw new ForeignPageError(); + } + var parentRef = this.catalog.insertLeafNode(page.ref, index); + page.node.setParent(parentRef); + this.pageMap.set(page.node, page); + this.pageCache.invalidate(); + this.pageCount = pageCount + 1; + return page; + }; + /** + * Copy pages from a source document into this document. Allows pages to be + * copied between different [[PDFDocument]] instances. For example: + * ```js + * const pdfDoc = await PDFDocument.create() + * const srcDoc = await PDFDocument.load(...) + * + * const copiedPages = await pdfDoc.copyPages(srcDoc, [0, 3, 89]) + * const [firstPage, fourthPage, ninetiethPage] = copiedPages; + * + * pdfDoc.addPage(fourthPage) + * pdfDoc.insertPage(0, ninetiethPage) + * pdfDoc.addPage(firstPage) + * ``` + * @param srcDoc The document from which pages should be copied. + * @param indices The indices of the pages that should be copied. + * @returns Resolves with an array of pages copied into this document. + */ + PDFDocument.prototype.copyPages = function (srcDoc, indices) { + return __awaiter(this, void 0, void 0, function () { + var copier, srcPages, copiedPages, idx, len, srcPage, copiedPage, ref; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + assertIs(srcDoc, 'srcDoc', [[PDFDocument, 'PDFDocument']]); + assertIs(indices, 'indices', [Array]); + return [4 /*yield*/, srcDoc.flush()]; + case 1: + _a.sent(); + copier = PDFObjectCopier.for(srcDoc.context, this.context); + srcPages = srcDoc.getPages(); + copiedPages = new Array(indices.length); + for (idx = 0, len = indices.length; idx < len; idx++) { + srcPage = srcPages[indices[idx]]; + copiedPage = copier.copy(srcPage.node); + ref = this.context.register(copiedPage); + copiedPages[idx] = PDFPage.of(copiedPage, ref, this); + } + return [2 /*return*/, copiedPages]; + } + }); + }); + }; + /** + * Get a copy of this document. + * + * For example: + * ```js + * const srcDoc = await PDFDocument.load(...) + * const pdfDoc = await srcDoc.copy() + * ``` + * + * > **NOTE:** This method won't copy all information over to the new + * > document (acroforms, outlines, etc...). + * + * @returns Resolves with a copy this document. + */ + PDFDocument.prototype.copy = function () { + return __awaiter(this, void 0, void 0, function () { + var pdfCopy, contentPages, idx, len; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, PDFDocument.create()]; + case 1: + pdfCopy = _a.sent(); + return [4 /*yield*/, pdfCopy.copyPages(this, this.getPageIndices())]; + case 2: + contentPages = _a.sent(); + for (idx = 0, len = contentPages.length; idx < len; idx++) { + pdfCopy.addPage(contentPages[idx]); + } + if (this.getAuthor() !== undefined) { + pdfCopy.setAuthor(this.getAuthor()); + } + if (this.getCreationDate() !== undefined) { + pdfCopy.setCreationDate(this.getCreationDate()); + } + if (this.getCreator() !== undefined) { + pdfCopy.setCreator(this.getCreator()); + } + if (this.getModificationDate() !== undefined) { + pdfCopy.setModificationDate(this.getModificationDate()); + } + if (this.getProducer() !== undefined) { + pdfCopy.setProducer(this.getProducer()); + } + if (this.getSubject() !== undefined) { + pdfCopy.setSubject(this.getSubject()); + } + if (this.getTitle() !== undefined) { + pdfCopy.setTitle(this.getTitle()); + } + pdfCopy.defaultWordBreaks = this.defaultWordBreaks; + return [2 /*return*/, pdfCopy]; + } + }); + }); + }; + /** + * Add JavaScript to this document. The supplied `script` is executed when the + * document is opened. The `script` can be used to perform some operation + * when the document is opened (e.g. logging to the console), or it can be + * used to define a function that can be referenced later in a JavaScript + * action. For example: + * ```js + * // Show "Hello World!" in the console when the PDF is opened + * pdfDoc.addJavaScript( + * 'main', + * 'console.show(); console.println("Hello World!");' + * ); + * + * // Define a function named "foo" that can be called in JavaScript Actions + * pdfDoc.addJavaScript( + * 'foo', + * 'function foo() { return "foo"; }' + * ); + * ``` + * See the [JavaScript for Acrobat API Reference](https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/js_api_reference.pdf) + * for details. + * @param name The name of the script. Must be unique per document. + * @param script The JavaScript to execute. + */ + PDFDocument.prototype.addJavaScript = function (name, script) { + assertIs(name, 'name', ['string']); + assertIs(script, 'script', ['string']); + var embedder = JavaScriptEmbedder.for(script, name); + var ref = this.context.nextRef(); + var javaScript = PDFJavaScript.of(ref, this, embedder); + this.javaScripts.push(javaScript); + }; + /** + * Add an attachment to this document. Attachments are visible in the + * "Attachments" panel of Adobe Acrobat and some other PDF readers. Any + * type of file can be added as an attachment. This includes, but is not + * limited to, `.png`, `.jpg`, `.pdf`, `.csv`, `.docx`, and `.xlsx` files. + * + * The input data can be provided in multiple formats: + * + * | Type | Contents | + * | ------------- | -------------------------------------------------------------- | + * | `string` | A base64 encoded string (or data URI) containing an attachment | + * | `Uint8Array` | The raw bytes of an attachment | + * | `ArrayBuffer` | The raw bytes of an attachment | + * + * For example: + * ```js + * // attachment=string + * await pdfDoc.attach('/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD...', 'cat_riding_unicorn.jpg', { + * mimeType: 'image/jpeg', + * description: 'Cool cat riding a unicorn! 🦄🐈🕶️', + * creationDate: new Date('2019/12/01'), + * modificationDate: new Date('2020/04/19'), + * }) + * await pdfDoc.attach('data:image/jpeg;base64,/9j/4AAQ...', 'cat_riding_unicorn.jpg', { + * mimeType: 'image/jpeg', + * description: 'Cool cat riding a unicorn! 🦄🐈🕶️', + * creationDate: new Date('2019/12/01'), + * modificationDate: new Date('2020/04/19'), + * }) + * + * // attachment=Uint8Array + * import fs from 'fs' + * const uint8Array = fs.readFileSync('cat_riding_unicorn.jpg') + * await pdfDoc.attach(uint8Array, 'cat_riding_unicorn.jpg', { + * mimeType: 'image/jpeg', + * description: 'Cool cat riding a unicorn! 🦄🐈🕶️', + * creationDate: new Date('2019/12/01'), + * modificationDate: new Date('2020/04/19'), + * }) + * + * // attachment=ArrayBuffer + * const url = 'https://pdf-lib.js.org/assets/cat_riding_unicorn.jpg' + * const arrayBuffer = await fetch(url).then(res => res.arrayBuffer()) + * await pdfDoc.attach(arrayBuffer, 'cat_riding_unicorn.jpg', { + * mimeType: 'image/jpeg', + * description: 'Cool cat riding a unicorn! 🦄🐈🕶️', + * creationDate: new Date('2019/12/01'), + * modificationDate: new Date('2020/04/19'), + * }) + * ``` + * + * @param attachment The input data containing the file to be attached. + * @param name The name of the file to be attached. + * @returns Resolves when the attachment is complete. + */ + PDFDocument.prototype.attach = function (attachment, name, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var bytes, embedder, ref, embeddedFile; + return __generator(this, function (_a) { + assertIs(attachment, 'attachment', ['string', Uint8Array, ArrayBuffer]); + assertIs(name, 'name', ['string']); + assertOrUndefined(options.mimeType, 'mimeType', ['string']); + assertOrUndefined(options.description, 'description', ['string']); + assertOrUndefined(options.creationDate, 'options.creationDate', [Date]); + assertOrUndefined(options.modificationDate, 'options.modificationDate', [ + Date, + ]); + assertIsOneOfOrUndefined(options.afRelationship, 'options.afRelationship', exports.AFRelationship); + bytes = toUint8Array(attachment); + embedder = FileEmbedder.for(bytes, name, options); + ref = this.context.nextRef(); + embeddedFile = PDFEmbeddedFile.of(ref, this, embedder); + this.embeddedFiles.push(embeddedFile); + return [2 /*return*/]; + }); + }); + }; + /** + * Embed a font into this document. The input data can be provided in multiple + * formats: + * + * | Type | Contents | + * | --------------- | ------------------------------------------------------- | + * | `StandardFonts` | One of the standard 14 fonts | + * | `string` | A base64 encoded string (or data URI) containing a font | + * | `Uint8Array` | The raw bytes of a font | + * | `ArrayBuffer` | The raw bytes of a font | + * + * For example: + * ```js + * // font=StandardFonts + * import { StandardFonts } from 'pdf-lib' + * const font1 = await pdfDoc.embedFont(StandardFonts.Helvetica) + * + * // font=string + * const font2 = await pdfDoc.embedFont('AAEAAAAVAQAABABQRFNJRx/upe...') + * const font3 = await pdfDoc.embedFont('data:font/opentype;base64,AAEAAA...') + * + * // font=Uint8Array + * import fs from 'fs' + * const font4 = await pdfDoc.embedFont(fs.readFileSync('Ubuntu-R.ttf')) + * + * // font=ArrayBuffer + * const url = 'https://pdf-lib.js.org/assets/ubuntu/Ubuntu-R.ttf' + * const ubuntuBytes = await fetch(url).then(res => res.arrayBuffer()) + * const font5 = await pdfDoc.embedFont(ubuntuBytes) + * ``` + * See also: [[registerFontkit]] + * @param font The input data for a font. + * @param options The options to be used when embedding the font. + * @returns Resolves with the embedded font. + */ + PDFDocument.prototype.embedFont = function (font, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var _a, subset, customName, features, embedder, bytes, fontkit, _b, ref, pdfFont; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _a = options.subset, subset = _a === void 0 ? false : _a, customName = options.customName, features = options.features; + assertIs(font, 'font', ['string', Uint8Array, ArrayBuffer]); + assertIs(subset, 'subset', ['boolean']); + if (!isStandardFont(font)) return [3 /*break*/, 1]; + embedder = StandardFontEmbedder.for(font, customName); + return [3 /*break*/, 7]; + case 1: + if (!canBeConvertedToUint8Array(font)) return [3 /*break*/, 6]; + bytes = toUint8Array(font); + fontkit = this.assertFontkit(); + if (!subset) return [3 /*break*/, 3]; + return [4 /*yield*/, CustomFontSubsetEmbedder.for(fontkit, bytes, customName, features)]; + case 2: + _b = _c.sent(); + return [3 /*break*/, 5]; + case 3: return [4 /*yield*/, CustomFontEmbedder.for(fontkit, bytes, customName, features)]; + case 4: + _b = _c.sent(); + _c.label = 5; + case 5: + embedder = _b; + return [3 /*break*/, 7]; + case 6: throw new TypeError('`font` must be one of `StandardFonts | string | Uint8Array | ArrayBuffer`'); + case 7: + ref = this.context.nextRef(); + pdfFont = PDFFont.of(ref, this, embedder); + this.fonts.push(pdfFont); + return [2 /*return*/, pdfFont]; + } + }); + }); + }; + /** + * Embed a standard font into this document. + * For example: + * ```js + * import { StandardFonts } from 'pdf-lib' + * const helveticaFont = pdfDoc.embedFont(StandardFonts.Helvetica) + * ``` + * @param font The standard font to be embedded. + * @param customName The name to be used when embedding the font. + * @returns The embedded font. + */ + PDFDocument.prototype.embedStandardFont = function (font, customName) { + assertIs(font, 'font', ['string']); + if (!isStandardFont(font)) { + throw new TypeError('`font` must be one of type `StandardFonts`'); + } + var embedder = StandardFontEmbedder.for(font, customName); + var ref = this.context.nextRef(); + var pdfFont = PDFFont.of(ref, this, embedder); + this.fonts.push(pdfFont); + return pdfFont; + }; + /** + * Embed a JPEG image into this document. The input data can be provided in + * multiple formats: + * + * | Type | Contents | + * | ------------- | ------------------------------------------------------------- | + * | `string` | A base64 encoded string (or data URI) containing a JPEG image | + * | `Uint8Array` | The raw bytes of a JPEG image | + * | `ArrayBuffer` | The raw bytes of a JPEG image | + * + * For example: + * ```js + * // jpg=string + * const image1 = await pdfDoc.embedJpg('/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD...') + * const image2 = await pdfDoc.embedJpg('data:image/jpeg;base64,/9j/4AAQ...') + * + * // jpg=Uint8Array + * import fs from 'fs' + * const uint8Array = fs.readFileSync('cat_riding_unicorn.jpg') + * const image3 = await pdfDoc.embedJpg(uint8Array) + * + * // jpg=ArrayBuffer + * const url = 'https://pdf-lib.js.org/assets/cat_riding_unicorn.jpg' + * const arrayBuffer = await fetch(url).then(res => res.arrayBuffer()) + * const image4 = await pdfDoc.embedJpg(arrayBuffer) + * ``` + * + * @param jpg The input data for a JPEG image. + * @returns Resolves with the embedded image. + */ + PDFDocument.prototype.embedJpg = function (jpg) { + return __awaiter(this, void 0, void 0, function () { + var bytes, embedder, ref, pdfImage; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + assertIs(jpg, 'jpg', ['string', Uint8Array, ArrayBuffer]); + bytes = toUint8Array(jpg); + return [4 /*yield*/, JpegEmbedder.for(bytes)]; + case 1: + embedder = _a.sent(); + ref = this.context.nextRef(); + pdfImage = PDFImage.of(ref, this, embedder); + this.images.push(pdfImage); + return [2 /*return*/, pdfImage]; + } + }); + }); + }; + /** + * Embed a PNG image into this document. The input data can be provided in + * multiple formats: + * + * | Type | Contents | + * | ------------- | ------------------------------------------------------------ | + * | `string` | A base64 encoded string (or data URI) containing a PNG image | + * | `Uint8Array` | The raw bytes of a PNG image | + * | `ArrayBuffer` | The raw bytes of a PNG image | + * + * For example: + * ```js + * // png=string + * const image1 = await pdfDoc.embedPng('iVBORw0KGgoAAAANSUhEUgAAAlgAAAF3...') + * const image2 = await pdfDoc.embedPng('data:image/png;base64,iVBORw0KGg...') + * + * // png=Uint8Array + * import fs from 'fs' + * const uint8Array = fs.readFileSync('small_mario.png') + * const image3 = await pdfDoc.embedPng(uint8Array) + * + * // png=ArrayBuffer + * const url = 'https://pdf-lib.js.org/assets/small_mario.png' + * const arrayBuffer = await fetch(url).then(res => res.arrayBuffer()) + * const image4 = await pdfDoc.embedPng(arrayBuffer) + * ``` + * + * @param png The input data for a PNG image. + * @returns Resolves with the embedded image. + */ + PDFDocument.prototype.embedPng = function (png) { + return __awaiter(this, void 0, void 0, function () { + var bytes, embedder, ref, pdfImage; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + assertIs(png, 'png', ['string', Uint8Array, ArrayBuffer]); + bytes = toUint8Array(png); + return [4 /*yield*/, PngEmbedder.for(bytes)]; + case 1: + embedder = _a.sent(); + ref = this.context.nextRef(); + pdfImage = PDFImage.of(ref, this, embedder); + this.images.push(pdfImage); + return [2 /*return*/, pdfImage]; + } + }); + }); + }; + /** + * Embed one or more PDF pages into this document. + * + * For example: + * ```js + * const pdfDoc = await PDFDocument.create() + * + * const sourcePdfUrl = 'https://pdf-lib.js.org/assets/with_large_page_count.pdf' + * const sourcePdf = await fetch(sourcePdfUrl).then((res) => res.arrayBuffer()) + * + * // Embed page 74 of `sourcePdf` into `pdfDoc` + * const [embeddedPage] = await pdfDoc.embedPdf(sourcePdf, [73]) + * ``` + * + * See [[PDFDocument.load]] for examples of the allowed input data formats. + * + * @param pdf The input data containing a PDF document. + * @param indices The indices of the pages that should be embedded. + * @returns Resolves with an array of the embedded pages. + */ + PDFDocument.prototype.embedPdf = function (pdf, indices) { + if (indices === void 0) { indices = [0]; } + return __awaiter(this, void 0, void 0, function () { + var srcDoc, _a, srcPages; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + assertIs(pdf, 'pdf', [ + 'string', + Uint8Array, + ArrayBuffer, + [PDFDocument, 'PDFDocument'], + ]); + assertIs(indices, 'indices', [Array]); + if (!(pdf instanceof PDFDocument)) return [3 /*break*/, 1]; + _a = pdf; + return [3 /*break*/, 3]; + case 1: return [4 /*yield*/, PDFDocument.load(pdf)]; + case 2: + _a = _b.sent(); + _b.label = 3; + case 3: + srcDoc = _a; + srcPages = pluckIndices(srcDoc.getPages(), indices); + return [2 /*return*/, this.embedPages(srcPages)]; + } + }); + }); + }; + /** + * Embed a single PDF page into this document. + * + * For example: + * ```js + * const pdfDoc = await PDFDocument.create() + * + * const sourcePdfUrl = 'https://pdf-lib.js.org/assets/with_large_page_count.pdf' + * const sourceBuffer = await fetch(sourcePdfUrl).then((res) => res.arrayBuffer()) + * const sourcePdfDoc = await PDFDocument.load(sourceBuffer) + * const sourcePdfPage = sourcePdfDoc.getPages()[73] + * + * const embeddedPage = await pdfDoc.embedPage( + * sourcePdfPage, + * + * // Clip a section of the source page so that we only embed part of it + * { left: 100, right: 450, bottom: 330, top: 570 }, + * + * // Translate all drawings of the embedded page by (10, 200) units + * [1, 0, 0, 1, 10, 200], + * ) + * ``` + * + * @param page The page to be embedded. + * @param boundingBox + * Optionally, an area of the source page that should be embedded + * (defaults to entire page). + * @param transformationMatrix + * Optionally, a transformation matrix that is always applied to the embedded + * page anywhere it is drawn. + * @returns Resolves with the embedded pdf page. + */ + PDFDocument.prototype.embedPage = function (page, boundingBox, transformationMatrix) { + return __awaiter(this, void 0, void 0, function () { + var embeddedPage; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + assertIs(page, 'page', [[PDFPage, 'PDFPage']]); + return [4 /*yield*/, this.embedPages([page], [boundingBox], [transformationMatrix])]; + case 1: + embeddedPage = (_a.sent())[0]; + return [2 /*return*/, embeddedPage]; + } + }); + }); + }; + /** + * Embed one or more PDF pages into this document. + * + * For example: + * ```js + * const pdfDoc = await PDFDocument.create() + * + * const sourcePdfUrl = 'https://pdf-lib.js.org/assets/with_large_page_count.pdf' + * const sourceBuffer = await fetch(sourcePdfUrl).then((res) => res.arrayBuffer()) + * const sourcePdfDoc = await PDFDocument.load(sourceBuffer) + * + * const page1 = sourcePdfDoc.getPages()[0] + * const page2 = sourcePdfDoc.getPages()[52] + * const page3 = sourcePdfDoc.getPages()[73] + * + * const embeddedPages = await pdfDoc.embedPages([page1, page2, page3]) + * ``` + * + * @param page + * The pages to be embedded (they must all share the same context). + * @param boundingBoxes + * Optionally, an array of clipping boundaries - one for each page + * (defaults to entirety of each page). + * @param transformationMatrices + * Optionally, an array of transformation matrices - one for each page + * (each page's transformation will apply anywhere it is drawn). + * @returns Resolves with an array of the embedded pdf pages. + */ + PDFDocument.prototype.embedPages = function (pages, boundingBoxes, transformationMatrices) { + if (boundingBoxes === void 0) { boundingBoxes = []; } + if (transformationMatrices === void 0) { transformationMatrices = []; } + return __awaiter(this, void 0, void 0, function () { + var idx, len, currPage, nextPage, context, maybeCopyPage, embeddedPages, idx, len, page, box, matrix, embedder, ref; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (pages.length === 0) + return [2 /*return*/, []]; + // Assert all pages have the same context + for (idx = 0, len = pages.length - 1; idx < len; idx++) { + currPage = pages[idx]; + nextPage = pages[idx + 1]; + if (currPage.node.context !== nextPage.node.context) { + throw new PageEmbeddingMismatchedContextError(); + } + } + context = pages[0].node.context; + maybeCopyPage = context === this.context + ? function (p) { return p; } + : PDFObjectCopier.for(context, this.context).copy; + embeddedPages = new Array(pages.length); + idx = 0, len = pages.length; + _b.label = 1; + case 1: + if (!(idx < len)) return [3 /*break*/, 4]; + page = maybeCopyPage(pages[idx].node); + box = boundingBoxes[idx]; + matrix = transformationMatrices[idx]; + return [4 /*yield*/, PDFPageEmbedder.for(page, box, matrix)]; + case 2: + embedder = _b.sent(); + ref = this.context.nextRef(); + embeddedPages[idx] = PDFEmbeddedPage.of(ref, this, embedder); + _b.label = 3; + case 3: + idx++; + return [3 /*break*/, 1]; + case 4: + (_a = this.embeddedPages).push.apply(_a, embeddedPages); + return [2 /*return*/, embeddedPages]; + } + }); + }); + }; + /** + * > **NOTE:** You shouldn't need to call this method directly. The [[save]] + * > and [[saveAsBase64]] methods will automatically ensure that all embedded + * > assets are flushed before serializing the document. + * + * Flush all embedded fonts, PDF pages, and images to this document's + * [[context]]. + * + * @returns Resolves when the flush is complete. + */ + PDFDocument.prototype.flush = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.embedAll(this.fonts)]; + case 1: + _a.sent(); + return [4 /*yield*/, this.embedAll(this.images)]; + case 2: + _a.sent(); + return [4 /*yield*/, this.embedAll(this.embeddedPages)]; + case 3: + _a.sent(); + return [4 /*yield*/, this.embedAll(this.embeddedFiles)]; + case 4: + _a.sent(); + return [4 /*yield*/, this.embedAll(this.javaScripts)]; + case 5: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + /** + * Serialize this document to an array of bytes making up a PDF file. + * For example: + * ```js + * const pdfBytes = await pdfDoc.save() + * ``` + * + * There are a number of things you can do with the serialized document, + * depending on the JavaScript environment you're running in: + * * Write it to a file in Node or React Native + * * Download it as a Blob in the browser + * * Render it in an `iframe` + * + * @param options The options to be used when saving the document. + * @returns Resolves with the bytes of the serialized document. + */ + PDFDocument.prototype.save = function (options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var _a, useObjectStreams, _b, addDefaultPage, _c, objectsPerTick, _d, updateFieldAppearances, form, Writer; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + _a = options.useObjectStreams, useObjectStreams = _a === void 0 ? true : _a, _b = options.addDefaultPage, addDefaultPage = _b === void 0 ? true : _b, _c = options.objectsPerTick, objectsPerTick = _c === void 0 ? 50 : _c, _d = options.updateFieldAppearances, updateFieldAppearances = _d === void 0 ? true : _d; + assertIs(useObjectStreams, 'useObjectStreams', ['boolean']); + assertIs(addDefaultPage, 'addDefaultPage', ['boolean']); + assertIs(objectsPerTick, 'objectsPerTick', ['number']); + assertIs(updateFieldAppearances, 'updateFieldAppearances', ['boolean']); + if (addDefaultPage && this.getPageCount() === 0) + this.addPage(); + if (updateFieldAppearances) { + form = this.formCache.getValue(); + if (form) + form.updateFieldAppearances(); + } + return [4 /*yield*/, this.flush()]; + case 1: + _e.sent(); + Writer = useObjectStreams ? PDFStreamWriter : PDFWriter; + return [2 /*return*/, Writer.forContext(this.context, objectsPerTick).serializeToBuffer()]; + } + }); + }); + }; + /** + * Serialize this document to a base64 encoded string or data URI making up a + * PDF file. For example: + * ```js + * const base64String = await pdfDoc.saveAsBase64() + * base64String // => 'JVBERi0xLjcKJYGBgYEKC...' + * + * const base64DataUri = await pdfDoc.saveAsBase64({ dataUri: true }) + * base64DataUri // => 'data:application/pdf;base64,JVBERi0xLjcKJYGBgYEKC...' + * ``` + * + * @param options The options to be used when saving the document. + * @returns Resolves with a base64 encoded string or data URI of the + * serialized document. + */ + PDFDocument.prototype.saveAsBase64 = function (options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var _a, dataUri, otherOptions, bytes, base64; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + _a = options.dataUri, dataUri = _a === void 0 ? false : _a, otherOptions = __rest(options, ["dataUri"]); + assertIs(dataUri, 'dataUri', ['boolean']); + return [4 /*yield*/, this.save(otherOptions)]; + case 1: + bytes = _b.sent(); + base64 = encodeToBase64(bytes); + return [2 /*return*/, dataUri ? "data:application/pdf;base64," + base64 : base64]; + } + }); + }); + }; + PDFDocument.prototype.findPageForAnnotationRef = function (ref) { + var pages = this.getPages(); + for (var idx = 0, len = pages.length; idx < len; idx++) { + var page = pages[idx]; + var annotations = page.node.Annots(); + if ((annotations === null || annotations === void 0 ? void 0 : annotations.indexOf(ref)) !== undefined) { + return page; + } + } + return undefined; + }; + PDFDocument.prototype.embedAll = function (embeddables) { + return __awaiter(this, void 0, void 0, function () { + var idx, len; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + idx = 0, len = embeddables.length; + _a.label = 1; + case 1: + if (!(idx < len)) return [3 /*break*/, 4]; + return [4 /*yield*/, embeddables[idx].embed()]; + case 2: + _a.sent(); + _a.label = 3; + case 3: + idx++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/]; + } + }); + }); + }; + PDFDocument.prototype.updateInfoDict = function () { + var pdfLib = "pdf-lib (https://github.com/Hopding/pdf-lib)"; + var now = new Date(); + var info = this.getInfoDict(); + this.setProducer(pdfLib); + this.setModificationDate(now); + if (!info.get(PDFName.of('Creator'))) + this.setCreator(pdfLib); + if (!info.get(PDFName.of('CreationDate'))) + this.setCreationDate(now); + }; + PDFDocument.prototype.getInfoDict = function () { + var existingInfo = this.context.lookup(this.context.trailerInfo.Info); + if (existingInfo instanceof PDFDict) + return existingInfo; + var newInfo = this.context.obj({}); + this.context.trailerInfo.Info = this.context.register(newInfo); + return newInfo; + }; + PDFDocument.prototype.assertFontkit = function () { + if (!this.fontkit) + throw new FontkitNotRegisteredError(); + return this.fontkit; + }; + return PDFDocument; + }()); + /* tslint:disable-next-line only-arrow-functions */ + function assertIsLiteralOrHexString(pdfObject) { + if (!(pdfObject instanceof PDFHexString) && + !(pdfObject instanceof PDFString)) { + throw new UnexpectedObjectTypeError([PDFHexString, PDFString], pdfObject); + } + } + + (function (BlendMode) { + BlendMode["Normal"] = "Normal"; + BlendMode["Multiply"] = "Multiply"; + BlendMode["Screen"] = "Screen"; + BlendMode["Overlay"] = "Overlay"; + BlendMode["Darken"] = "Darken"; + BlendMode["Lighten"] = "Lighten"; + BlendMode["ColorDodge"] = "ColorDodge"; + BlendMode["ColorBurn"] = "ColorBurn"; + BlendMode["HardLight"] = "HardLight"; + BlendMode["SoftLight"] = "SoftLight"; + BlendMode["Difference"] = "Difference"; + BlendMode["Exclusion"] = "Exclusion"; + })(exports.BlendMode || (exports.BlendMode = {})); + + /** + * Represents a single page of a [[PDFDocument]]. + */ + var PDFPage = /** @class */ (function () { + function PDFPage(leafNode, ref, doc) { + this.fontSize = 24; + this.fontColor = rgb(0, 0, 0); + this.lineHeight = 24; + this.x = 0; + this.y = 0; + assertIs(leafNode, 'leafNode', [[PDFPageLeaf, 'PDFPageLeaf']]); + assertIs(ref, 'ref', [[PDFRef, 'PDFRef']]); + assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]); + this.node = leafNode; + this.ref = ref; + this.doc = doc; + } + /** + * Rotate this page by a multiple of 90 degrees. For example: + * ```js + * import { degrees } from 'pdf-lib' + * + * page.setRotation(degrees(-90)) + * page.setRotation(degrees(0)) + * page.setRotation(degrees(90)) + * page.setRotation(degrees(180)) + * page.setRotation(degrees(270)) + * ``` + * @param angle The angle to rotate this page. + */ + PDFPage.prototype.setRotation = function (angle) { + var degreesAngle = toDegrees(angle); + assertMultiple(degreesAngle, 'degreesAngle', 90); + this.node.set(PDFName.of('Rotate'), this.doc.context.obj(degreesAngle)); + }; + /** + * Get this page's rotation angle in degrees. For example: + * ```js + * const rotationAngle = page.getRotation().angle; + * ``` + * @returns The rotation angle of the page in degrees (always a multiple of + * 90 degrees). + */ + PDFPage.prototype.getRotation = function () { + var Rotate = this.node.Rotate(); + return degrees(Rotate ? Rotate.asNumber() : 0); + }; + /** + * Resize this page by increasing or decreasing its width and height. For + * example: + * ```js + * page.setSize(250, 500) + * page.setSize(page.getWidth() + 50, page.getHeight() + 100) + * page.setSize(page.getWidth() - 50, page.getHeight() - 100) + * ``` + * + * Note that the PDF specification does not allow for pages to have explicit + * widths and heights. Instead it defines the "size" of a page in terms of + * five rectangles: the MediaBox, CropBox, BleedBox, TrimBox, and ArtBox. As a + * result, this method cannot directly change the width and height of a page. + * Instead, it works by adjusting these five boxes. + * + * This method performs the following steps: + * 1. Set width & height of MediaBox. + * 2. Set width & height of CropBox, if it has same dimensions as MediaBox. + * 3. Set width & height of BleedBox, if it has same dimensions as MediaBox. + * 4. Set width & height of TrimBox, if it has same dimensions as MediaBox. + * 5. Set width & height of ArtBox, if it has same dimensions as MediaBox. + * + * This approach works well for most PDF documents as all PDF pages must + * have a MediaBox, but relatively few have a CropBox, BleedBox, TrimBox, or + * ArtBox. And when they do have these additional boxes, they often have the + * same dimensions as the MediaBox. However, if you find this method does not + * work for your document, consider setting the boxes directly: + * * [[PDFPage.setMediaBox]] + * * [[PDFPage.setCropBox]] + * * [[PDFPage.setBleedBox]] + * * [[PDFPage.setTrimBox]] + * * [[PDFPage.setArtBox]] + * + * @param width The new width of the page. + * @param height The new height of the page. + */ + PDFPage.prototype.setSize = function (width, height) { + assertIs(width, 'width', ['number']); + assertIs(height, 'height', ['number']); + var mediaBox = this.getMediaBox(); + this.setMediaBox(mediaBox.x, mediaBox.y, width, height); + var cropBox = this.getCropBox(); + var bleedBox = this.getBleedBox(); + var trimBox = this.getTrimBox(); + var artBox = this.getArtBox(); + var hasCropBox = this.node.CropBox(); + var hasBleedBox = this.node.BleedBox(); + var hasTrimBox = this.node.TrimBox(); + var hasArtBox = this.node.ArtBox(); + if (hasCropBox && rectanglesAreEqual(cropBox, mediaBox)) { + this.setCropBox(mediaBox.x, mediaBox.y, width, height); + } + if (hasBleedBox && rectanglesAreEqual(bleedBox, mediaBox)) { + this.setBleedBox(mediaBox.x, mediaBox.y, width, height); + } + if (hasTrimBox && rectanglesAreEqual(trimBox, mediaBox)) { + this.setTrimBox(mediaBox.x, mediaBox.y, width, height); + } + if (hasArtBox && rectanglesAreEqual(artBox, mediaBox)) { + this.setArtBox(mediaBox.x, mediaBox.y, width, height); + } + }; + /** + * Resize this page by increasing or decreasing its width. For example: + * ```js + * page.setWidth(250) + * page.setWidth(page.getWidth() + 50) + * page.setWidth(page.getWidth() - 50) + * ``` + * + * This method uses [[PDFPage.setSize]] to set the page's width. + * + * @param width The new width of the page. + */ + PDFPage.prototype.setWidth = function (width) { + assertIs(width, 'width', ['number']); + this.setSize(width, this.getSize().height); + }; + /** + * Resize this page by increasing or decreasing its height. For example: + * ```js + * page.setHeight(500) + * page.setHeight(page.getWidth() + 100) + * page.setHeight(page.getWidth() - 100) + * ``` + * + * This method uses [[PDFPage.setSize]] to set the page's height. + * + * @param height The new height of the page. + */ + PDFPage.prototype.setHeight = function (height) { + assertIs(height, 'height', ['number']); + this.setSize(this.getSize().width, height); + }; + /** + * Set the MediaBox of this page. For example: + * ```js + * const mediaBox = page.getMediaBox() + * + * page.setMediaBox(0, 0, 250, 500) + * page.setMediaBox(mediaBox.x, mediaBox.y, 50, 100) + * page.setMediaBox(15, 5, mediaBox.width - 50, mediaBox.height - 100) + * ``` + * + * See [[PDFPage.getMediaBox]] for details about what the MediaBox represents. + * + * @param x The x coordinate of the lower left corner of the new MediaBox. + * @param y The y coordinate of the lower left corner of the new MediaBox. + * @param width The width of the new MediaBox. + * @param height The height of the new MediaBox. + */ + PDFPage.prototype.setMediaBox = function (x, y, width, height) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + assertIs(width, 'width', ['number']); + assertIs(height, 'height', ['number']); + var mediaBox = this.doc.context.obj([x, y, x + width, y + height]); + this.node.set(PDFName.MediaBox, mediaBox); + }; + /** + * Set the CropBox of this page. For example: + * ```js + * const cropBox = page.getCropBox() + * + * page.setCropBox(0, 0, 250, 500) + * page.setCropBox(cropBox.x, cropBox.y, 50, 100) + * page.setCropBox(15, 5, cropBox.width - 50, cropBox.height - 100) + * ``` + * + * See [[PDFPage.getCropBox]] for details about what the CropBox represents. + * + * @param x The x coordinate of the lower left corner of the new CropBox. + * @param y The y coordinate of the lower left corner of the new CropBox. + * @param width The width of the new CropBox. + * @param height The height of the new CropBox. + */ + PDFPage.prototype.setCropBox = function (x, y, width, height) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + assertIs(width, 'width', ['number']); + assertIs(height, 'height', ['number']); + var cropBox = this.doc.context.obj([x, y, x + width, y + height]); + this.node.set(PDFName.CropBox, cropBox); + }; + /** + * Set the BleedBox of this page. For example: + * ```js + * const bleedBox = page.getBleedBox() + * + * page.setBleedBox(0, 0, 250, 500) + * page.setBleedBox(bleedBox.x, bleedBox.y, 50, 100) + * page.setBleedBox(15, 5, bleedBox.width - 50, bleedBox.height - 100) + * ``` + * + * See [[PDFPage.getBleedBox]] for details about what the BleedBox represents. + * + * @param x The x coordinate of the lower left corner of the new BleedBox. + * @param y The y coordinate of the lower left corner of the new BleedBox. + * @param width The width of the new BleedBox. + * @param height The height of the new BleedBox. + */ + PDFPage.prototype.setBleedBox = function (x, y, width, height) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + assertIs(width, 'width', ['number']); + assertIs(height, 'height', ['number']); + var bleedBox = this.doc.context.obj([x, y, x + width, y + height]); + this.node.set(PDFName.BleedBox, bleedBox); + }; + /** + * Set the TrimBox of this page. For example: + * ```js + * const trimBox = page.getTrimBox() + * + * page.setTrimBox(0, 0, 250, 500) + * page.setTrimBox(trimBox.x, trimBox.y, 50, 100) + * page.setTrimBox(15, 5, trimBox.width - 50, trimBox.height - 100) + * ``` + * + * See [[PDFPage.getTrimBox]] for details about what the TrimBox represents. + * + * @param x The x coordinate of the lower left corner of the new TrimBox. + * @param y The y coordinate of the lower left corner of the new TrimBox. + * @param width The width of the new TrimBox. + * @param height The height of the new TrimBox. + */ + PDFPage.prototype.setTrimBox = function (x, y, width, height) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + assertIs(width, 'width', ['number']); + assertIs(height, 'height', ['number']); + var trimBox = this.doc.context.obj([x, y, x + width, y + height]); + this.node.set(PDFName.TrimBox, trimBox); + }; + /** + * Set the ArtBox of this page. For example: + * ```js + * const artBox = page.getArtBox() + * + * page.setArtBox(0, 0, 250, 500) + * page.setArtBox(artBox.x, artBox.y, 50, 100) + * page.setArtBox(15, 5, artBox.width - 50, artBox.height - 100) + * ``` + * + * See [[PDFPage.getArtBox]] for details about what the ArtBox represents. + * + * @param x The x coordinate of the lower left corner of the new ArtBox. + * @param y The y coordinate of the lower left corner of the new ArtBox. + * @param width The width of the new ArtBox. + * @param height The height of the new ArtBox. + */ + PDFPage.prototype.setArtBox = function (x, y, width, height) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + assertIs(width, 'width', ['number']); + assertIs(height, 'height', ['number']); + var artBox = this.doc.context.obj([x, y, x + width, y + height]); + this.node.set(PDFName.ArtBox, artBox); + }; + /** + * Get this page's width and height. For example: + * ```js + * const { width, height } = page.getSize() + * ``` + * + * This method uses [[PDFPage.getMediaBox]] to obtain the page's + * width and height. + * + * @returns The width and height of the page. + */ + PDFPage.prototype.getSize = function () { + var _a = this.getMediaBox(), width = _a.width, height = _a.height; + return { width: width, height: height }; + }; + /** + * Get this page's width. For example: + * ```js + * const width = page.getWidth() + * ``` + * + * This method uses [[PDFPage.getSize]] to obtain the page's size. + * + * @returns The width of the page. + */ + PDFPage.prototype.getWidth = function () { + return this.getSize().width; + }; + /** + * Get this page's height. For example: + * ```js + * const height = page.getHeight() + * ``` + * + * This method uses [[PDFPage.getSize]] to obtain the page's size. + * + * @returns The height of the page. + */ + PDFPage.prototype.getHeight = function () { + return this.getSize().height; + }; + /** + * Get the rectangle defining this page's MediaBox. For example: + * ```js + * const { x, y, width, height } = page.getMediaBox() + * ``` + * + * The MediaBox of a page defines the boundaries of the physical medium on + * which the page is to be displayed/printed. It may include extended area + * surrounding the page content for bleed marks, printing marks, etc... + * It may also include areas close to the edges of the medium that cannot be + * marked because of physical limitations of the output device. Content + * falling outside this boundary may safely be discarded without affecting + * the meaning of the PDF file. + * + * @returns An object defining the lower left corner of the MediaBox and its + * width & height. + */ + PDFPage.prototype.getMediaBox = function () { + var mediaBox = this.node.MediaBox(); + return mediaBox.asRectangle(); + }; + /** + * Get the rectangle defining this page's CropBox. For example: + * ```js + * const { x, y, width, height } = page.getCropBox() + * ``` + * + * The CropBox of a page defines the region to which the contents of the page + * shall be clipped when displayed or printed. Unlike the other boxes, the + * CropBox does not necessarily represent the physical page geometry. It + * merely imposes clipping on the page contents. + * + * The CropBox's default value is the page's MediaBox. + * + * @returns An object defining the lower left corner of the CropBox and its + * width & height. + */ + PDFPage.prototype.getCropBox = function () { + var _a; + var cropBox = this.node.CropBox(); + return (_a = cropBox === null || cropBox === void 0 ? void 0 : cropBox.asRectangle()) !== null && _a !== void 0 ? _a : this.getMediaBox(); + }; + /** + * Get the rectangle defining this page's BleedBox. For example: + * ```js + * const { x, y, width, height } = page.getBleedBox() + * ``` + * + * The BleedBox of a page defines the region to which the contents of the + * page shall be clipped when output in a production environment. This may + * include any extra bleed area needed to accommodate the physical + * limitations of cutting, folding, and trimming equipment. The actual + * printed page may include printing marks that fall outside the BleedBox. + * + * The BleedBox's default value is the page's CropBox. + * + * @returns An object defining the lower left corner of the BleedBox and its + * width & height. + */ + PDFPage.prototype.getBleedBox = function () { + var _a; + var bleedBox = this.node.BleedBox(); + return (_a = bleedBox === null || bleedBox === void 0 ? void 0 : bleedBox.asRectangle()) !== null && _a !== void 0 ? _a : this.getCropBox(); + }; + /** + * Get the rectangle defining this page's TrimBox. For example: + * ```js + * const { x, y, width, height } = page.getTrimBox() + * ``` + * + * The TrimBox of a page defines the intended dimensions of the finished + * page after trimming. It may be smaller than the MediaBox to allow for + * production-related content, such as printing instructions, cut marks, or + * color bars. + * + * The TrimBox's default value is the page's CropBox. + * + * @returns An object defining the lower left corner of the TrimBox and its + * width & height. + */ + PDFPage.prototype.getTrimBox = function () { + var _a; + var trimBox = this.node.TrimBox(); + return (_a = trimBox === null || trimBox === void 0 ? void 0 : trimBox.asRectangle()) !== null && _a !== void 0 ? _a : this.getCropBox(); + }; + /** + * Get the rectangle defining this page's ArtBox. For example: + * ```js + * const { x, y, width, height } = page.getArtBox() + * ``` + * + * The ArtBox of a page defines the extent of the page's meaningful content + * (including potential white space). + * + * The ArtBox's default value is the page's CropBox. + * + * @returns An object defining the lower left corner of the ArtBox and its + * width & height. + */ + PDFPage.prototype.getArtBox = function () { + var _a; + var artBox = this.node.ArtBox(); + return (_a = artBox === null || artBox === void 0 ? void 0 : artBox.asRectangle()) !== null && _a !== void 0 ? _a : this.getCropBox(); + }; + /** + * Translate this page's content to a new location on the page. This operation + * is often useful after resizing the page with [[setSize]]. For example: + * ```js + * // Add 50 units of whitespace to the top and right of the page + * page.setSize(page.getWidth() + 50, page.getHeight() + 50) + * + * // Move the page's content from the lower-left corner of the page + * // to the top-right corner. + * page.translateContent(50, 50) + * + * // Now there are 50 units of whitespace to the left and bottom of the page + * ``` + * See also: [[resetPosition]] + * @param x The new position on the x-axis for this page's content. + * @param y The new position on the y-axis for this page's content. + */ + PDFPage.prototype.translateContent = function (x, y) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + this.node.normalize(); + this.getContentStream(); + var start = this.createContentStream(pushGraphicsState(), translate(x, y)); + var startRef = this.doc.context.register(start); + var end = this.createContentStream(popGraphicsState()); + var endRef = this.doc.context.register(end); + this.node.wrapContentStreams(startRef, endRef); + }; + /** + * Scale the size, content, and annotations of a page. + * + * For example: + * ```js + * page.scale(0.5, 0.5); + * ``` + * + * @param x The factor by which the width for the page should be scaled + * (e.g. `0.5` is 50%). + * @param y The factor by which the height for the page should be scaled + * (e.g. `2.0` is 200%). + */ + PDFPage.prototype.scale = function (x, y) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + this.setSize(this.getWidth() * x, this.getHeight() * y); + this.scaleContent(x, y); + this.scaleAnnotations(x, y); + }; + /** + * Scale the content of a page. This is useful after resizing an existing + * page. This scales only the content, not the annotations. + * + * For example: + * ```js + * // Bisect the size of the page + * page.setSize(page.getWidth() / 2, page.getHeight() / 2); + * + * // Scale the content of the page down by 50% in x and y + * page.scaleContent(0.5, 0.5); + * ``` + * See also: [[scaleAnnotations]] + * @param x The factor by which the x-axis for the content should be scaled + * (e.g. `0.5` is 50%). + * @param y The factor by which the y-axis for the content should be scaled + * (e.g. `2.0` is 200%). + */ + PDFPage.prototype.scaleContent = function (x, y) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + this.node.normalize(); + this.getContentStream(); + var start = this.createContentStream(pushGraphicsState(), scale(x, y)); + var startRef = this.doc.context.register(start); + var end = this.createContentStream(popGraphicsState()); + var endRef = this.doc.context.register(end); + this.node.wrapContentStreams(startRef, endRef); + }; + /** + * Scale the annotations of a page. This is useful if you want to scale a + * page with comments or other annotations. + * ```js + * // Scale the content of the page down by 50% in x and y + * page.scaleContent(0.5, 0.5); + * + * // Scale the content of the page down by 50% in x and y + * page.scaleAnnotations(0.5, 0.5); + * ``` + * See also: [[scaleContent]] + * @param x The factor by which the x-axis for the annotations should be + * scaled (e.g. `0.5` is 50%). + * @param y The factor by which the y-axis for the annotations should be + * scaled (e.g. `2.0` is 200%). + */ + PDFPage.prototype.scaleAnnotations = function (x, y) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + var annots = this.node.Annots(); + if (!annots) + return; + for (var idx = 0; idx < annots.size(); idx++) { + var annot = annots.lookup(idx); + if (annot instanceof PDFDict) + this.scaleAnnot(annot, x, y); + } + }; + /** + * Reset the x and y coordinates of this page to `(0, 0)`. This operation is + * often useful after calling [[translateContent]]. For example: + * ```js + * // Shift the page's contents up and to the right by 50 units + * page.translateContent(50, 50) + * + * // This text will shifted - it will be drawn at (50, 50) + * page.drawText('I am shifted') + * + * // Move back to (0, 0) + * page.resetPosition() + * + * // This text will not be shifted - it will be drawn at (0, 0) + * page.drawText('I am not shifted') + * ``` + */ + PDFPage.prototype.resetPosition = function () { + this.getContentStream(false); + this.x = 0; + this.y = 0; + }; + /** + * Choose a default font for this page. The default font will be used whenever + * text is drawn on this page and no font is specified. For example: + * ```js + * import { StandardFonts } from 'pdf-lib' + * + * const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman) + * const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const courierFont = await pdfDoc.embedFont(StandardFonts.Courier) + * + * const page = pdfDoc.addPage() + * + * page.setFont(helveticaFont) + * page.drawText('I will be drawn in Helvetica') + * + * page.setFont(timesRomanFont) + * page.drawText('I will be drawn in Courier', { font: courierFont }) + * ``` + * @param font The default font to be used when drawing text on this page. + */ + PDFPage.prototype.setFont = function (font) { + // TODO: Reuse image Font name if we've already added this image to Resources.Fonts + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + this.font = font; + this.fontKey = this.node.newFontDictionary(this.font.name, this.font.ref); + }; + /** + * Choose a default font size for this page. The default font size will be + * used whenever text is drawn on this page and no font size is specified. + * For example: + * ```js + * page.setFontSize(12) + * page.drawText('I will be drawn in size 12') + * + * page.setFontSize(36) + * page.drawText('I will be drawn in size 24', { fontSize: 24 }) + * ``` + * @param fontSize The default font size to be used when drawing text on this + * page. + */ + PDFPage.prototype.setFontSize = function (fontSize) { + assertIs(fontSize, 'fontSize', ['number']); + this.fontSize = fontSize; + }; + /** + * Choose a default font color for this page. The default font color will be + * used whenever text is drawn on this page and no font color is specified. + * For example: + * ```js + * import { rgb, cmyk, grayscale } from 'pdf-lib' + * + * page.setFontColor(rgb(0.97, 0.02, 0.97)) + * page.drawText('I will be drawn in pink') + * + * page.setFontColor(cmyk(0.4, 0.7, 0.39, 0.15)) + * page.drawText('I will be drawn in gray', { color: grayscale(0.5) }) + * ``` + * @param fontColor The default font color to be used when drawing text on + * this page. + */ + PDFPage.prototype.setFontColor = function (fontColor) { + assertIs(fontColor, 'fontColor', [[Object, 'Color']]); + this.fontColor = fontColor; + }; + /** + * Choose a default line height for this page. The default line height will be + * used whenever text is drawn on this page and no line height is specified. + * For example: + * ```js + * page.setLineHeight(12); + * page.drawText('These lines will be vertically \n separated by 12 units') + * + * page.setLineHeight(36); + * page.drawText('These lines will be vertically \n separated by 24 units', { + * lineHeight: 24 + * }) + * ``` + * @param lineHeight The default line height to be used when drawing text on + * this page. + */ + PDFPage.prototype.setLineHeight = function (lineHeight) { + assertIs(lineHeight, 'lineHeight', ['number']); + this.lineHeight = lineHeight; + }; + /** + * Get the default position of this page. For example: + * ```js + * const { x, y } = page.getPosition() + * ``` + * @returns The default position of the page. + */ + PDFPage.prototype.getPosition = function () { + return { x: this.x, y: this.y }; + }; + /** + * Get the default x coordinate of this page. For example: + * ```js + * const x = page.getX() + * ``` + * @returns The default x coordinate of the page. + */ + PDFPage.prototype.getX = function () { + return this.x; + }; + /** + * Get the default y coordinate of this page. For example: + * ```js + * const y = page.getY() + * ``` + * @returns The default y coordinate of the page. + */ + PDFPage.prototype.getY = function () { + return this.y; + }; + /** + * Change the default position of this page. For example: + * ```js + * page.moveTo(0, 0) + * page.drawText('I will be drawn at the origin') + * + * page.moveTo(0, 25) + * page.drawText('I will be drawn 25 units up') + * + * page.moveTo(25, 25) + * page.drawText('I will be drawn 25 units up and 25 units to the right') + * ``` + * @param x The new default position on the x-axis for this page. + * @param y The new default position on the y-axis for this page. + */ + PDFPage.prototype.moveTo = function (x, y) { + assertIs(x, 'x', ['number']); + assertIs(y, 'y', ['number']); + this.x = x; + this.y = y; + }; + /** + * Change the default position of this page to be further down the y-axis. + * For example: + * ```js + * page.moveTo(50, 50) + * page.drawText('I will be drawn at (50, 50)') + * + * page.moveDown(10) + * page.drawText('I will be drawn at (50, 40)') + * ``` + * @param yDecrease The amount by which the page's default position along the + * y-axis should be decreased. + */ + PDFPage.prototype.moveDown = function (yDecrease) { + assertIs(yDecrease, 'yDecrease', ['number']); + this.y -= yDecrease; + }; + /** + * Change the default position of this page to be further up the y-axis. + * For example: + * ```js + * page.moveTo(50, 50) + * page.drawText('I will be drawn at (50, 50)') + * + * page.moveUp(10) + * page.drawText('I will be drawn at (50, 60)') + * ``` + * @param yIncrease The amount by which the page's default position along the + * y-axis should be increased. + */ + PDFPage.prototype.moveUp = function (yIncrease) { + assertIs(yIncrease, 'yIncrease', ['number']); + this.y += yIncrease; + }; + /** + * Change the default position of this page to be further left on the x-axis. + * For example: + * ```js + * page.moveTo(50, 50) + * page.drawText('I will be drawn at (50, 50)') + * + * page.moveLeft(10) + * page.drawText('I will be drawn at (40, 50)') + * ``` + * @param xDecrease The amount by which the page's default position along the + * x-axis should be decreased. + */ + PDFPage.prototype.moveLeft = function (xDecrease) { + assertIs(xDecrease, 'xDecrease', ['number']); + this.x -= xDecrease; + }; + /** + * Change the default position of this page to be further right on the y-axis. + * For example: + * ```js + * page.moveTo(50, 50) + * page.drawText('I will be drawn at (50, 50)') + * + * page.moveRight(10) + * page.drawText('I will be drawn at (60, 50)') + * ``` + * @param xIncrease The amount by which the page's default position along the + * x-axis should be increased. + */ + PDFPage.prototype.moveRight = function (xIncrease) { + assertIs(xIncrease, 'xIncrease', ['number']); + this.x += xIncrease; + }; + /** + * Push one or more operators to the end of this page's current content + * stream. For example: + * ```js + * import { + * pushGraphicsState, + * moveTo, + * lineTo, + * closePath, + * setFillingColor, + * rgb, + * fill, + * popGraphicsState, + * } from 'pdf-lib' + * + * // Draw a green triangle in the lower-left corner of the page + * page.pushOperators( + * pushGraphicsState(), + * moveTo(0, 0), + * lineTo(100, 0), + * lineTo(50, 100), + * closePath(), + * setFillingColor(rgb(0.0, 1.0, 0.0)), + * fill(), + * popGraphicsState(), + * ) + * ``` + * @param operator The operators to be pushed. + */ + PDFPage.prototype.pushOperators = function () { + var operator = []; + for (var _i = 0; _i < arguments.length; _i++) { + operator[_i] = arguments[_i]; + } + assertEachIs(operator, 'operator', [[PDFOperator, 'PDFOperator']]); + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, operator); + }; + /** + * Draw one or more lines of text on this page. For example: + * ```js + * import { StandardFonts, rgb } from 'pdf-lib' + * + * const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman) + * + * const page = pdfDoc.addPage() + * + * page.setFont(helveticaFont) + * + * page.moveTo(5, 200) + * page.drawText('The Life of an Egg', { size: 36 }) + * + * page.moveDown(36) + * page.drawText('An Epic Tale of Woe', { size: 30 }) + * + * page.drawText( + * `Humpty Dumpty sat on a wall \n` + + * `Humpty Dumpty had a great fall; \n` + + * `All the king's horses and all the king's men \n` + + * `Couldn't put Humpty together again. \n`, + * { + * x: 25, + * y: 100, + * font: timesRomanFont, + * size: 24, + * color: rgb(1, 0, 0), + * lineHeight: 24, + * opacity: 0.75, + * }, + * ) + * ``` + * @param text The text to be drawn. + * @param options The options to be used when drawing the text. + */ + PDFPage.prototype.drawText = function (text, options) { + var _a, _b, _c, _d, _e, _f, _g; + if (options === void 0) { options = {}; } + assertIs(text, 'text', ['string']); + assertOrUndefined(options.color, 'options.color', [[Object, 'Color']]); + assertRangeOrUndefined(options.opacity, 'opacity.opacity', 0, 1); + assertOrUndefined(options.font, 'options.font', [[PDFFont, 'PDFFont']]); + assertOrUndefined(options.size, 'options.size', ['number']); + assertOrUndefined(options.rotate, 'options.rotate', [[Object, 'Rotation']]); + assertOrUndefined(options.xSkew, 'options.xSkew', [[Object, 'Rotation']]); + assertOrUndefined(options.ySkew, 'options.ySkew', [[Object, 'Rotation']]); + assertOrUndefined(options.x, 'options.x', ['number']); + assertOrUndefined(options.y, 'options.y', ['number']); + assertOrUndefined(options.lineHeight, 'options.lineHeight', ['number']); + assertOrUndefined(options.maxWidth, 'options.maxWidth', ['number']); + assertOrUndefined(options.wordBreaks, 'options.wordBreaks', [Array]); + assertIsOneOfOrUndefined(options.blendMode, 'options.blendMode', exports.BlendMode); + var _h = this.setOrEmbedFont(options.font), oldFont = _h.oldFont, newFont = _h.newFont, newFontKey = _h.newFontKey; + var fontSize = options.size || this.fontSize; + var wordBreaks = options.wordBreaks || this.doc.defaultWordBreaks; + var textWidth = function (t) { return newFont.widthOfTextAtSize(t, fontSize); }; + var lines = options.maxWidth === undefined + ? lineSplit(cleanText(text)) + : breakTextIntoLines(text, wordBreaks, options.maxWidth, textWidth); + var encodedLines = new Array(lines.length); + for (var idx = 0, len = lines.length; idx < len; idx++) { + encodedLines[idx] = newFont.encodeText(lines[idx]); + } + var graphicsStateKey = this.maybeEmbedGraphicsState({ + opacity: options.opacity, + blendMode: options.blendMode, + }); + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, drawLinesOfText(encodedLines, { + color: (_a = options.color) !== null && _a !== void 0 ? _a : this.fontColor, + font: newFontKey, + size: fontSize, + rotate: (_b = options.rotate) !== null && _b !== void 0 ? _b : degrees(0), + xSkew: (_c = options.xSkew) !== null && _c !== void 0 ? _c : degrees(0), + ySkew: (_d = options.ySkew) !== null && _d !== void 0 ? _d : degrees(0), + x: (_e = options.x) !== null && _e !== void 0 ? _e : this.x, + y: (_f = options.y) !== null && _f !== void 0 ? _f : this.y, + lineHeight: (_g = options.lineHeight) !== null && _g !== void 0 ? _g : this.lineHeight, + graphicsState: graphicsStateKey, + })); + if (options.font) { + if (oldFont) + this.setFont(oldFont); + else + this.resetFont(); + } + }; + /** + * Draw an image on this page. For example: + * ```js + * import { degrees } from 'pdf-lib' + * + * const jpgUrl = 'https://pdf-lib.js.org/assets/cat_riding_unicorn.jpg' + * const jpgImageBytes = await fetch(jpgUrl).then((res) => res.arrayBuffer()) + * + * const jpgImage = await pdfDoc.embedJpg(jpgImageBytes) + * const jpgDims = jpgImage.scale(0.5) + * + * const page = pdfDoc.addPage() + * + * page.drawImage(jpgImage, { + * x: 25, + * y: 25, + * width: jpgDims.width, + * height: jpgDims.height, + * rotate: degrees(30), + * opacity: 0.75, + * }) + * ``` + * @param image The image to be drawn. + * @param options The options to be used when drawing the image. + */ + PDFPage.prototype.drawImage = function (image, options) { + var _a, _b, _c, _d, _e, _f, _g; + if (options === void 0) { options = {}; } + // TODO: Reuse image XObject name if we've already added this image to Resources.XObjects + assertIs(image, 'image', [[PDFImage, 'PDFImage']]); + assertOrUndefined(options.x, 'options.x', ['number']); + assertOrUndefined(options.y, 'options.y', ['number']); + assertOrUndefined(options.width, 'options.width', ['number']); + assertOrUndefined(options.height, 'options.height', ['number']); + assertOrUndefined(options.rotate, 'options.rotate', [[Object, 'Rotation']]); + assertOrUndefined(options.xSkew, 'options.xSkew', [[Object, 'Rotation']]); + assertOrUndefined(options.ySkew, 'options.ySkew', [[Object, 'Rotation']]); + assertRangeOrUndefined(options.opacity, 'opacity.opacity', 0, 1); + assertIsOneOfOrUndefined(options.blendMode, 'options.blendMode', exports.BlendMode); + var xObjectKey = this.node.newXObject('Image', image.ref); + var graphicsStateKey = this.maybeEmbedGraphicsState({ + opacity: options.opacity, + blendMode: options.blendMode, + }); + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, drawImage(xObjectKey, { + x: (_a = options.x) !== null && _a !== void 0 ? _a : this.x, + y: (_b = options.y) !== null && _b !== void 0 ? _b : this.y, + width: (_c = options.width) !== null && _c !== void 0 ? _c : image.size().width, + height: (_d = options.height) !== null && _d !== void 0 ? _d : image.size().height, + rotate: (_e = options.rotate) !== null && _e !== void 0 ? _e : degrees(0), + xSkew: (_f = options.xSkew) !== null && _f !== void 0 ? _f : degrees(0), + ySkew: (_g = options.ySkew) !== null && _g !== void 0 ? _g : degrees(0), + graphicsState: graphicsStateKey, + })); + }; + /** + * Draw an embedded PDF page on this page. For example: + * ```js + * import { degrees } from 'pdf-lib' + * + * const pdfDoc = await PDFDocument.create() + * const page = pdfDoc.addPage() + * + * const sourcePdfUrl = 'https://pdf-lib.js.org/assets/with_large_page_count.pdf' + * const sourcePdf = await fetch(sourcePdfUrl).then((res) => res.arrayBuffer()) + * + * // Embed page 74 from the PDF + * const [embeddedPage] = await pdfDoc.embedPdf(sourcePdf, 73) + * + * page.drawPage(embeddedPage, { + * x: 250, + * y: 200, + * xScale: 0.5, + * yScale: 0.5, + * rotate: degrees(30), + * opacity: 0.75, + * }) + * ``` + * + * The `options` argument accepts both `width`/`height` and `xScale`/`yScale` + * as options. Since each of these options defines the size of the drawn page, + * if both options are given, `width` and `height` take precedence and the + * corresponding scale variants are ignored. + * + * @param embeddedPage The embedded page to be drawn. + * @param options The options to be used when drawing the embedded page. + */ + PDFPage.prototype.drawPage = function (embeddedPage, options) { + var _a, _b, _c, _d, _e; + if (options === void 0) { options = {}; } + // TODO: Reuse embeddedPage XObject name if we've already added this embeddedPage to Resources.XObjects + assertIs(embeddedPage, 'embeddedPage', [ + [PDFEmbeddedPage, 'PDFEmbeddedPage'], + ]); + assertOrUndefined(options.x, 'options.x', ['number']); + assertOrUndefined(options.y, 'options.y', ['number']); + assertOrUndefined(options.xScale, 'options.xScale', ['number']); + assertOrUndefined(options.yScale, 'options.yScale', ['number']); + assertOrUndefined(options.width, 'options.width', ['number']); + assertOrUndefined(options.height, 'options.height', ['number']); + assertOrUndefined(options.rotate, 'options.rotate', [[Object, 'Rotation']]); + assertOrUndefined(options.xSkew, 'options.xSkew', [[Object, 'Rotation']]); + assertOrUndefined(options.ySkew, 'options.ySkew', [[Object, 'Rotation']]); + assertRangeOrUndefined(options.opacity, 'opacity.opacity', 0, 1); + assertIsOneOfOrUndefined(options.blendMode, 'options.blendMode', exports.BlendMode); + var xObjectKey = this.node.newXObject('EmbeddedPdfPage', embeddedPage.ref); + var graphicsStateKey = this.maybeEmbedGraphicsState({ + opacity: options.opacity, + blendMode: options.blendMode, + }); + // prettier-ignore + var xScale = (options.width !== undefined ? options.width / embeddedPage.width + : options.xScale !== undefined ? options.xScale + : 1); + // prettier-ignore + var yScale = (options.height !== undefined ? options.height / embeddedPage.height + : options.yScale !== undefined ? options.yScale + : 1); + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, drawPage(xObjectKey, { + x: (_a = options.x) !== null && _a !== void 0 ? _a : this.x, + y: (_b = options.y) !== null && _b !== void 0 ? _b : this.y, + xScale: xScale, + yScale: yScale, + rotate: (_c = options.rotate) !== null && _c !== void 0 ? _c : degrees(0), + xSkew: (_d = options.xSkew) !== null && _d !== void 0 ? _d : degrees(0), + ySkew: (_e = options.ySkew) !== null && _e !== void 0 ? _e : degrees(0), + graphicsState: graphicsStateKey, + })); + }; + /** + * Draw an SVG path on this page. For example: + * ```js + * import { rgb } from 'pdf-lib' + * + * const svgPath = 'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90' + * + * // Draw path as black line + * page.drawSvgPath(svgPath, { x: 25, y: 75 }) + * + * // Change border style and opacity + * page.drawSvgPath(svgPath, { + * x: 25, + * y: 275, + * borderColor: rgb(0.5, 0.5, 0.5), + * borderWidth: 2, + * borderOpacity: 0.75, + * }) + * + * // Set fill color and opacity + * page.drawSvgPath(svgPath, { + * x: 25, + * y: 475, + * color: rgb(1.0, 0, 0), + * opacity: 0.75, + * }) + * + * // Draw 50% of original size + * page.drawSvgPath(svgPath, { + * x: 25, + * y: 675, + * scale: 0.5, + * }) + * ``` + * @param path The SVG path to be drawn. + * @param options The options to be used when drawing the SVG path. + */ + PDFPage.prototype.drawSvgPath = function (path, options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + if (options === void 0) { options = {}; } + assertIs(path, 'path', ['string']); + assertOrUndefined(options.x, 'options.x', ['number']); + assertOrUndefined(options.y, 'options.y', ['number']); + assertOrUndefined(options.scale, 'options.scale', ['number']); + assertOrUndefined(options.rotate, 'options.rotate', [[Object, 'Rotation']]); + assertOrUndefined(options.borderWidth, 'options.borderWidth', ['number']); + assertOrUndefined(options.color, 'options.color', [[Object, 'Color']]); + assertRangeOrUndefined(options.opacity, 'opacity.opacity', 0, 1); + assertOrUndefined(options.borderColor, 'options.borderColor', [ + [Object, 'Color'], + ]); + assertOrUndefined(options.borderDashArray, 'options.borderDashArray', [ + Array, + ]); + assertOrUndefined(options.borderDashPhase, 'options.borderDashPhase', [ + 'number', + ]); + assertIsOneOfOrUndefined(options.borderLineCap, 'options.borderLineCap', exports.LineCapStyle); + assertRangeOrUndefined(options.borderOpacity, 'options.borderOpacity', 0, 1); + assertIsOneOfOrUndefined(options.blendMode, 'options.blendMode', exports.BlendMode); + var graphicsStateKey = this.maybeEmbedGraphicsState({ + opacity: options.opacity, + borderOpacity: options.borderOpacity, + blendMode: options.blendMode, + }); + if (!('color' in options) && !('borderColor' in options)) { + options.borderColor = rgb(0, 0, 0); + } + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, drawSvgPath(path, { + x: (_a = options.x) !== null && _a !== void 0 ? _a : this.x, + y: (_b = options.y) !== null && _b !== void 0 ? _b : this.y, + scale: options.scale, + rotate: (_c = options.rotate) !== null && _c !== void 0 ? _c : degrees(0), + color: (_d = options.color) !== null && _d !== void 0 ? _d : undefined, + borderColor: (_e = options.borderColor) !== null && _e !== void 0 ? _e : undefined, + borderWidth: (_f = options.borderWidth) !== null && _f !== void 0 ? _f : 0, + borderDashArray: (_g = options.borderDashArray) !== null && _g !== void 0 ? _g : undefined, + borderDashPhase: (_h = options.borderDashPhase) !== null && _h !== void 0 ? _h : undefined, + borderLineCap: (_j = options.borderLineCap) !== null && _j !== void 0 ? _j : undefined, + graphicsState: graphicsStateKey, + })); + }; + /** + * Draw a line on this page. For example: + * ```js + * import { rgb } from 'pdf-lib' + * + * page.drawLine({ + * start: { x: 25, y: 75 }, + * end: { x: 125, y: 175 }, + * thickness: 2, + * color: rgb(0.75, 0.2, 0.2), + * opacity: 0.75, + * }) + * ``` + * @param options The options to be used when drawing the line. + */ + PDFPage.prototype.drawLine = function (options) { + var _a, _b, _c, _d, _e; + assertIs(options.start, 'options.start', [ + [Object, '{ x: number, y: number }'], + ]); + assertIs(options.end, 'options.end', [ + [Object, '{ x: number, y: number }'], + ]); + assertIs(options.start.x, 'options.start.x', ['number']); + assertIs(options.start.y, 'options.start.y', ['number']); + assertIs(options.end.x, 'options.end.x', ['number']); + assertIs(options.end.y, 'options.end.y', ['number']); + assertOrUndefined(options.thickness, 'options.thickness', ['number']); + assertOrUndefined(options.color, 'options.color', [[Object, 'Color']]); + assertOrUndefined(options.dashArray, 'options.dashArray', [Array]); + assertOrUndefined(options.dashPhase, 'options.dashPhase', ['number']); + assertIsOneOfOrUndefined(options.lineCap, 'options.lineCap', exports.LineCapStyle); + assertRangeOrUndefined(options.opacity, 'opacity.opacity', 0, 1); + assertIsOneOfOrUndefined(options.blendMode, 'options.blendMode', exports.BlendMode); + var graphicsStateKey = this.maybeEmbedGraphicsState({ + borderOpacity: options.opacity, + blendMode: options.blendMode, + }); + if (!('color' in options)) { + options.color = rgb(0, 0, 0); + } + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, drawLine({ + start: options.start, + end: options.end, + thickness: (_a = options.thickness) !== null && _a !== void 0 ? _a : 1, + color: (_b = options.color) !== null && _b !== void 0 ? _b : undefined, + dashArray: (_c = options.dashArray) !== null && _c !== void 0 ? _c : undefined, + dashPhase: (_d = options.dashPhase) !== null && _d !== void 0 ? _d : undefined, + lineCap: (_e = options.lineCap) !== null && _e !== void 0 ? _e : undefined, + graphicsState: graphicsStateKey, + })); + }; + /** + * Draw a rectangle on this page. For example: + * ```js + * import { degrees, grayscale, rgb } from 'pdf-lib' + * + * page.drawRectangle({ + * x: 25, + * y: 75, + * width: 250, + * height: 75, + * rotate: degrees(-15), + * borderWidth: 5, + * borderColor: grayscale(0.5), + * color: rgb(0.75, 0.2, 0.2), + * opacity: 0.5, + * borderOpacity: 0.75, + * }) + * ``` + * @param options The options to be used when drawing the rectangle. + */ + PDFPage.prototype.drawRectangle = function (options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; + if (options === void 0) { options = {}; } + assertOrUndefined(options.x, 'options.x', ['number']); + assertOrUndefined(options.y, 'options.y', ['number']); + assertOrUndefined(options.width, 'options.width', ['number']); + assertOrUndefined(options.height, 'options.height', ['number']); + assertOrUndefined(options.rotate, 'options.rotate', [[Object, 'Rotation']]); + assertOrUndefined(options.xSkew, 'options.xSkew', [[Object, 'Rotation']]); + assertOrUndefined(options.ySkew, 'options.ySkew', [[Object, 'Rotation']]); + assertOrUndefined(options.borderWidth, 'options.borderWidth', ['number']); + assertOrUndefined(options.color, 'options.color', [[Object, 'Color']]); + assertRangeOrUndefined(options.opacity, 'opacity.opacity', 0, 1); + assertOrUndefined(options.borderColor, 'options.borderColor', [ + [Object, 'Color'], + ]); + assertOrUndefined(options.borderDashArray, 'options.borderDashArray', [ + Array, + ]); + assertOrUndefined(options.borderDashPhase, 'options.borderDashPhase', [ + 'number', + ]); + assertIsOneOfOrUndefined(options.borderLineCap, 'options.borderLineCap', exports.LineCapStyle); + assertRangeOrUndefined(options.borderOpacity, 'options.borderOpacity', 0, 1); + assertIsOneOfOrUndefined(options.blendMode, 'options.blendMode', exports.BlendMode); + var graphicsStateKey = this.maybeEmbedGraphicsState({ + opacity: options.opacity, + borderOpacity: options.borderOpacity, + blendMode: options.blendMode, + }); + if (!('color' in options) && !('borderColor' in options)) { + options.color = rgb(0, 0, 0); + } + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, drawRectangle({ + x: (_a = options.x) !== null && _a !== void 0 ? _a : this.x, + y: (_b = options.y) !== null && _b !== void 0 ? _b : this.y, + width: (_c = options.width) !== null && _c !== void 0 ? _c : 150, + height: (_d = options.height) !== null && _d !== void 0 ? _d : 100, + rotate: (_e = options.rotate) !== null && _e !== void 0 ? _e : degrees(0), + xSkew: (_f = options.xSkew) !== null && _f !== void 0 ? _f : degrees(0), + ySkew: (_g = options.ySkew) !== null && _g !== void 0 ? _g : degrees(0), + borderWidth: (_h = options.borderWidth) !== null && _h !== void 0 ? _h : 0, + color: (_j = options.color) !== null && _j !== void 0 ? _j : undefined, + borderColor: (_k = options.borderColor) !== null && _k !== void 0 ? _k : undefined, + borderDashArray: (_l = options.borderDashArray) !== null && _l !== void 0 ? _l : undefined, + borderDashPhase: (_m = options.borderDashPhase) !== null && _m !== void 0 ? _m : undefined, + graphicsState: graphicsStateKey, + borderLineCap: (_o = options.borderLineCap) !== null && _o !== void 0 ? _o : undefined, + })); + }; + /** + * Draw a square on this page. For example: + * ```js + * import { degrees, grayscale, rgb } from 'pdf-lib' + * + * page.drawSquare({ + * x: 25, + * y: 75, + * size: 100, + * rotate: degrees(-15), + * borderWidth: 5, + * borderColor: grayscale(0.5), + * color: rgb(0.75, 0.2, 0.2), + * opacity: 0.5, + * borderOpacity: 0.75, + * }) + * ``` + * @param options The options to be used when drawing the square. + */ + PDFPage.prototype.drawSquare = function (options) { + if (options === void 0) { options = {}; } + var size = options.size; + assertOrUndefined(size, 'size', ['number']); + this.drawRectangle(__assign(__assign({}, options), { width: size, height: size })); + }; + /** + * Draw an ellipse on this page. For example: + * ```js + * import { grayscale, rgb } from 'pdf-lib' + * + * page.drawEllipse({ + * x: 200, + * y: 75, + * xScale: 100, + * yScale: 50, + * borderWidth: 5, + * borderColor: grayscale(0.5), + * color: rgb(0.75, 0.2, 0.2), + * opacity: 0.5, + * borderOpacity: 0.75, + * }) + * ``` + * @param options The options to be used when drawing the ellipse. + */ + PDFPage.prototype.drawEllipse = function (options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; + if (options === void 0) { options = {}; } + assertOrUndefined(options.x, 'options.x', ['number']); + assertOrUndefined(options.y, 'options.y', ['number']); + assertOrUndefined(options.xScale, 'options.xScale', ['number']); + assertOrUndefined(options.yScale, 'options.yScale', ['number']); + assertOrUndefined(options.rotate, 'options.rotate', [[Object, 'Rotation']]); + assertOrUndefined(options.color, 'options.color', [[Object, 'Color']]); + assertRangeOrUndefined(options.opacity, 'opacity.opacity', 0, 1); + assertOrUndefined(options.borderColor, 'options.borderColor', [ + [Object, 'Color'], + ]); + assertRangeOrUndefined(options.borderOpacity, 'options.borderOpacity', 0, 1); + assertOrUndefined(options.borderWidth, 'options.borderWidth', ['number']); + assertOrUndefined(options.borderDashArray, 'options.borderDashArray', [ + Array, + ]); + assertOrUndefined(options.borderDashPhase, 'options.borderDashPhase', [ + 'number', + ]); + assertIsOneOfOrUndefined(options.borderLineCap, 'options.borderLineCap', exports.LineCapStyle); + assertIsOneOfOrUndefined(options.blendMode, 'options.blendMode', exports.BlendMode); + var graphicsStateKey = this.maybeEmbedGraphicsState({ + opacity: options.opacity, + borderOpacity: options.borderOpacity, + blendMode: options.blendMode, + }); + if (!('color' in options) && !('borderColor' in options)) { + options.color = rgb(0, 0, 0); + } + var contentStream = this.getContentStream(); + contentStream.push.apply(contentStream, drawEllipse({ + x: (_a = options.x) !== null && _a !== void 0 ? _a : this.x, + y: (_b = options.y) !== null && _b !== void 0 ? _b : this.y, + xScale: (_c = options.xScale) !== null && _c !== void 0 ? _c : 100, + yScale: (_d = options.yScale) !== null && _d !== void 0 ? _d : 100, + rotate: (_e = options.rotate) !== null && _e !== void 0 ? _e : undefined, + color: (_f = options.color) !== null && _f !== void 0 ? _f : undefined, + borderColor: (_g = options.borderColor) !== null && _g !== void 0 ? _g : undefined, + borderWidth: (_h = options.borderWidth) !== null && _h !== void 0 ? _h : 0, + borderDashArray: (_j = options.borderDashArray) !== null && _j !== void 0 ? _j : undefined, + borderDashPhase: (_k = options.borderDashPhase) !== null && _k !== void 0 ? _k : undefined, + borderLineCap: (_l = options.borderLineCap) !== null && _l !== void 0 ? _l : undefined, + graphicsState: graphicsStateKey, + })); + }; + /** + * Draw a circle on this page. For example: + * ```js + * import { grayscale, rgb } from 'pdf-lib' + * + * page.drawCircle({ + * x: 200, + * y: 150, + * size: 100, + * borderWidth: 5, + * borderColor: grayscale(0.5), + * color: rgb(0.75, 0.2, 0.2), + * opacity: 0.5, + * borderOpacity: 0.75, + * }) + * ``` + * @param options The options to be used when drawing the ellipse. + */ + PDFPage.prototype.drawCircle = function (options) { + if (options === void 0) { options = {}; } + var _a = options.size, size = _a === void 0 ? 100 : _a; + assertOrUndefined(size, 'size', ['number']); + this.drawEllipse(__assign(__assign({}, options), { xScale: size, yScale: size })); + }; + PDFPage.prototype.setOrEmbedFont = function (font) { + var oldFont = this.font; + var oldFontKey = this.fontKey; + if (font) + this.setFont(font); + else + this.getFont(); + var newFont = this.font; + var newFontKey = this.fontKey; + return { oldFont: oldFont, oldFontKey: oldFontKey, newFont: newFont, newFontKey: newFontKey }; + }; + PDFPage.prototype.getFont = function () { + if (!this.font || !this.fontKey) { + var font = this.doc.embedStandardFont(exports.StandardFonts.Helvetica); + this.setFont(font); + } + return [this.font, this.fontKey]; + }; + PDFPage.prototype.resetFont = function () { + this.font = undefined; + this.fontKey = undefined; + }; + PDFPage.prototype.getContentStream = function (useExisting) { + if (useExisting === void 0) { useExisting = true; } + if (useExisting && this.contentStream) + return this.contentStream; + this.contentStream = this.createContentStream(); + this.contentStreamRef = this.doc.context.register(this.contentStream); + this.node.addContentStream(this.contentStreamRef); + return this.contentStream; + }; + PDFPage.prototype.createContentStream = function () { + var operators = []; + for (var _i = 0; _i < arguments.length; _i++) { + operators[_i] = arguments[_i]; + } + var dict = this.doc.context.obj({}); + var contentStream = PDFContentStream.of(dict, operators); + return contentStream; + }; + PDFPage.prototype.maybeEmbedGraphicsState = function (options) { + var opacity = options.opacity, borderOpacity = options.borderOpacity, blendMode = options.blendMode; + if (opacity === undefined && + borderOpacity === undefined && + blendMode === undefined) { + return undefined; + } + var graphicsState = this.doc.context.obj({ + Type: 'ExtGState', + ca: opacity, + CA: borderOpacity, + BM: blendMode, + }); + var key = this.node.newExtGState('GS', graphicsState); + return key; + }; + PDFPage.prototype.scaleAnnot = function (annot, x, y) { + var selectors = ['RD', 'CL', 'Vertices', 'QuadPoints', 'L', 'Rect']; + for (var idx = 0, len = selectors.length; idx < len; idx++) { + var list = annot.lookup(PDFName.of(selectors[idx])); + if (list instanceof PDFArray) + list.scalePDFNumbers(x, y); + } + var inkLists = annot.lookup(PDFName.of('InkList')); + if (inkLists instanceof PDFArray) { + for (var idx = 0, len = inkLists.size(); idx < len; idx++) { + var arr = inkLists.lookup(idx); + if (arr instanceof PDFArray) + arr.scalePDFNumbers(x, y); + } + } + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.addPage]] and [[PDFDocument.insertPage]] + * > methods, which can create instances of [[PDFPage]] for you. + * + * Create an instance of [[PDFPage]] from an existing leaf node. + * + * @param leafNode The leaf node to be wrapped. + * @param ref The unique reference for the page. + * @param doc The document to which the page will belong. + */ + PDFPage.of = function (leafNode, ref, doc) { + return new PDFPage(leafNode, ref, doc); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFDocument.addPage]] and [[PDFDocument.insertPage]] + * > methods, which can create instances of [[PDFPage]] for you. + * + * Create an instance of [[PDFPage]]. + * + * @param doc The document to which the page will belong. + */ + PDFPage.create = function (doc) { + assertIs(doc, 'doc', [[PDFDocument, 'PDFDocument']]); + var dummyRef = PDFRef.of(-1); + var pageLeaf = PDFPageLeaf.withContextAndParent(doc.context, dummyRef); + var pageRef = doc.context.register(pageLeaf); + return new PDFPage(pageLeaf, pageRef, doc); + }; + return PDFPage; + }()); + + /** + * Represents a button field of a [[PDFForm]]. + * + * [[PDFButton]] fields are interactive controls that users can click with their + * mouse. This type of [[PDFField]] is not stateful. The purpose of a button + * is to perform an action when the user clicks on it, such as opening a print + * modal or resetting the form. Buttons are typically rectangular in shape and + * have a text label describing the action that they perform when clicked. + */ + var PDFButton = /** @class */ (function (_super) { + __extends(PDFButton, _super); + function PDFButton(acroPushButton, ref, doc) { + var _this = _super.call(this, acroPushButton, ref, doc) || this; + assertIs(acroPushButton, 'acroButton', [ + [PDFAcroPushButton, 'PDFAcroPushButton'], + ]); + _this.acroField = acroPushButton; + return _this; + } + /** + * Display an image inside the bounds of this button's widgets. For example: + * ```js + * const pngImage = await pdfDoc.embedPng(...) + * const button = form.getButton('some.button.field') + * button.setImage(pngImage, ImageAlignment.Center) + * ``` + * This will update the appearances streams for each of this button's widgets. + * @param image The image that should be displayed. + * @param alignment The alignment of the image. + */ + PDFButton.prototype.setImage = function (image, alignment) { + if (alignment === void 0) { alignment = exports.ImageAlignment.Center; } + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var streamRef = this.createImageAppearanceStream(widget, image, alignment); + this.updateWidgetAppearances(widget, { normal: streamRef }); + } + this.markAsClean(); + }; + /** + * Set the font size for this field. Larger font sizes will result in larger + * text being displayed when PDF readers render this button. Font sizes may + * be integer or floating point numbers. Supplying a negative font size will + * cause this method to throw an error. + * + * For example: + * ```js + * const button = form.getButton('some.button.field') + * button.setFontSize(4) + * button.setFontSize(15.7) + * ``` + * + * > This method depends upon the existence of a default appearance + * > (`/DA`) string. If this field does not have a default appearance string, + * > or that string does not contain a font size (via the `Tf` operator), + * > then this method will throw an error. + * + * @param fontSize The font size to be used when rendering text in this field. + */ + PDFButton.prototype.setFontSize = function (fontSize) { + assertPositive(fontSize, 'fontSize'); + this.acroField.setFontSize(fontSize); + this.markAsDirty(); + }; + /** + * Show this button on the specified page with the given text. For example: + * ```js + * const ubuntuFont = await pdfDoc.embedFont(ubuntuFontBytes) + * const page = pdfDoc.addPage() + * + * const form = pdfDoc.getForm() + * const button = form.createButton('some.button.field') + * + * button.addToPage('Do Stuff', page, { + * x: 50, + * y: 75, + * width: 200, + * height: 100, + * textColor: rgb(1, 0, 0), + * backgroundColor: rgb(0, 1, 0), + * borderColor: rgb(0, 0, 1), + * borderWidth: 2, + * rotate: degrees(90), + * font: ubuntuFont, + * }) + * ``` + * This will create a new widget for this button field. + * @param text The text to be displayed for this button widget. + * @param page The page to which this button widget should be added. + * @param options The options to be used when adding this button widget. + */ + PDFButton.prototype.addToPage = function ( + // TODO: This needs to be optional, e.g. for image buttons + text, page, options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; + assertOrUndefined(text, 'text', ['string']); + assertOrUndefined(page, 'page', [[PDFPage, 'PDFPage']]); + assertFieldAppearanceOptions(options); + // Create a widget for this button + var widget = this.createWidget({ + x: ((_a = options === null || options === void 0 ? void 0 : options.x) !== null && _a !== void 0 ? _a : 0) - ((_b = options === null || options === void 0 ? void 0 : options.borderWidth) !== null && _b !== void 0 ? _b : 0) / 2, + y: ((_c = options === null || options === void 0 ? void 0 : options.y) !== null && _c !== void 0 ? _c : 0) - ((_d = options === null || options === void 0 ? void 0 : options.borderWidth) !== null && _d !== void 0 ? _d : 0) / 2, + width: (_e = options === null || options === void 0 ? void 0 : options.width) !== null && _e !== void 0 ? _e : 100, + height: (_f = options === null || options === void 0 ? void 0 : options.height) !== null && _f !== void 0 ? _f : 50, + textColor: (_g = options === null || options === void 0 ? void 0 : options.textColor) !== null && _g !== void 0 ? _g : rgb(0, 0, 0), + backgroundColor: (_h = options === null || options === void 0 ? void 0 : options.backgroundColor) !== null && _h !== void 0 ? _h : rgb(0.75, 0.75, 0.75), + borderColor: options === null || options === void 0 ? void 0 : options.borderColor, + borderWidth: (_j = options === null || options === void 0 ? void 0 : options.borderWidth) !== null && _j !== void 0 ? _j : 0, + rotate: (_k = options === null || options === void 0 ? void 0 : options.rotate) !== null && _k !== void 0 ? _k : degrees(0), + caption: text, + hidden: options === null || options === void 0 ? void 0 : options.hidden, + page: page.ref, + }); + var widgetRef = this.doc.context.register(widget.dict); + // Add widget to this field + this.acroField.addWidget(widgetRef); + // Set appearance streams for widget + var font = (_l = options === null || options === void 0 ? void 0 : options.font) !== null && _l !== void 0 ? _l : this.doc.getForm().getDefaultFont(); + this.updateWidgetAppearance(widget, font); + // Add widget to the given page + page.node.addAnnot(widgetRef); + }; + /** + * Returns `true` if this button has been marked as dirty, or if any of this + * button's widgets do not have an appearance stream. For example: + * ```js + * const button = form.getButton('some.button.field') + * if (button.needsAppearancesUpdate()) console.log('Needs update') + * ``` + * @returns Whether or not this button needs an appearance update. + */ + PDFButton.prototype.needsAppearancesUpdate = function () { + var _a; + if (this.isDirty()) + return true; + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + var hasAppearances = ((_a = widget.getAppearances()) === null || _a === void 0 ? void 0 : _a.normal) instanceof PDFStream; + if (!hasAppearances) + return true; + } + return false; + }; + /** + * Update the appearance streams for each of this button's widgets using + * the default appearance provider for buttons. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const button = form.getButton('some.button.field') + * button.defaultUpdateAppearances(helvetica) + * ``` + * @param font The font to be used for creating the appearance streams. + */ + PDFButton.prototype.defaultUpdateAppearances = function (font) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + this.updateAppearances(font); + }; + /** + * Update the appearance streams for each of this button's widgets using + * the given appearance provider. If no `provider` is passed, the default + * appearance provider for buttons will be used. For example: + * ```js + * const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica) + * const button = form.getButton('some.button.field') + * button.updateAppearances(helvetica, (field, widget, font) => { + * ... + * return { + * normal: drawButton(...), + * down: drawButton(...), + * } + * }) + * ``` + * @param font The font to be used for creating the appearance streams. + * @param provider Optionally, the appearance provider to be used for + * generating the contents of the appearance streams. + */ + PDFButton.prototype.updateAppearances = function (font, provider) { + assertIs(font, 'font', [[PDFFont, 'PDFFont']]); + assertOrUndefined(provider, 'provider', [Function]); + var widgets = this.acroField.getWidgets(); + for (var idx = 0, len = widgets.length; idx < len; idx++) { + var widget = widgets[idx]; + this.updateWidgetAppearance(widget, font, provider); + } + }; + PDFButton.prototype.updateWidgetAppearance = function (widget, font, provider) { + var apProvider = provider !== null && provider !== void 0 ? provider : defaultButtonAppearanceProvider; + var appearances = normalizeAppearance(apProvider(this, widget, font)); + this.updateWidgetAppearanceWithFont(widget, font, appearances); + }; + /** + * > **NOTE:** You probably don't want to call this method directly. Instead, + * > consider using the [[PDFForm.getButton]] method, which will create an + * > instance of [[PDFButton]] for you. + * + * Create an instance of [[PDFButton]] from an existing acroPushButton and ref + * + * @param acroPushButton The underlying `PDFAcroPushButton` for this button. + * @param ref The unique reference for this button. + * @param doc The document to which this button will belong. + */ + PDFButton.of = function (acroPushButton, ref, doc) { return new PDFButton(acroPushButton, ref, doc); }; + return PDFButton; + }(PDFField)); + + exports.AppearanceCharacteristics = AppearanceCharacteristics; + exports.Cache = Cache; + exports.CharCodes = CharCodes$1; + exports.CombedTextLayoutError = CombedTextLayoutError; + exports.CorruptPageTreeError = CorruptPageTreeError; + exports.CustomFontEmbedder = CustomFontEmbedder; + exports.CustomFontSubsetEmbedder = CustomFontSubsetEmbedder; + exports.EncryptedPDFError = EncryptedPDFError; + exports.ExceededMaxLengthError = ExceededMaxLengthError; + exports.FieldAlreadyExistsError = FieldAlreadyExistsError; + exports.FieldExistsAsNonTerminalError = FieldExistsAsNonTerminalError; + exports.FileEmbedder = FileEmbedder; + exports.FontkitNotRegisteredError = FontkitNotRegisteredError; + exports.ForeignPageError = ForeignPageError; + exports.IndexOutOfBoundsError = IndexOutOfBoundsError; + exports.InvalidAcroFieldValueError = InvalidAcroFieldValueError; + exports.InvalidFieldNamePartError = InvalidFieldNamePartError; + exports.InvalidMaxLengthError = InvalidMaxLengthError; + exports.InvalidPDFDateStringError = InvalidPDFDateStringError; + exports.InvalidTargetIndexError = InvalidTargetIndexError; + exports.JpegEmbedder = JpegEmbedder; + exports.MethodNotImplementedError = MethodNotImplementedError; + exports.MissingCatalogError = MissingCatalogError; + exports.MissingDAEntryError = MissingDAEntryError; + exports.MissingKeywordError = MissingKeywordError; + exports.MissingOnValueCheckError = MissingOnValueCheckError; + exports.MissingPDFHeaderError = MissingPDFHeaderError; + exports.MissingPageContentsEmbeddingError = MissingPageContentsEmbeddingError; + exports.MissingTfOperatorError = MissingTfOperatorError; + exports.MultiSelectValueError = MultiSelectValueError; + exports.NextByteAssertionError = NextByteAssertionError; + exports.NoSuchFieldError = NoSuchFieldError; + exports.NumberParsingError = NumberParsingError; + exports.PDFAcroButton = PDFAcroButton; + exports.PDFAcroCheckBox = PDFAcroCheckBox; + exports.PDFAcroChoice = PDFAcroChoice; + exports.PDFAcroComboBox = PDFAcroComboBox; + exports.PDFAcroField = PDFAcroField; + exports.PDFAcroForm = PDFAcroForm; + exports.PDFAcroListBox = PDFAcroListBox; + exports.PDFAcroNonTerminal = PDFAcroNonTerminal; + exports.PDFAcroPushButton = PDFAcroPushButton; + exports.PDFAcroRadioButton = PDFAcroRadioButton; + exports.PDFAcroSignature = PDFAcroSignature; + exports.PDFAcroTerminal = PDFAcroTerminal; + exports.PDFAcroText = PDFAcroText; + exports.PDFAnnotation = PDFAnnotation; + exports.PDFArray = PDFArray; + exports.PDFArrayIsNotRectangleError = PDFArrayIsNotRectangleError; + exports.PDFBool = PDFBool; + exports.PDFButton = PDFButton; + exports.PDFCatalog = PDFCatalog; + exports.PDFCheckBox = PDFCheckBox; + exports.PDFContentStream = PDFContentStream; + exports.PDFContext = PDFContext; + exports.PDFCrossRefSection = PDFCrossRefSection; + exports.PDFCrossRefStream = PDFCrossRefStream; + exports.PDFDict = PDFDict; + exports.PDFDocument = PDFDocument; + exports.PDFDropdown = PDFDropdown; + exports.PDFEmbeddedPage = PDFEmbeddedPage; + exports.PDFField = PDFField; + exports.PDFFlateStream = PDFFlateStream; + exports.PDFFont = PDFFont; + exports.PDFForm = PDFForm; + exports.PDFHeader = PDFHeader; + exports.PDFHexString = PDFHexString; + exports.PDFImage = PDFImage; + exports.PDFInvalidObject = PDFInvalidObject; + exports.PDFInvalidObjectParsingError = PDFInvalidObjectParsingError; + exports.PDFJavaScript = PDFJavaScript; + exports.PDFName = PDFName; + exports.PDFNull = PDFNull$1; + exports.PDFNumber = PDFNumber; + exports.PDFObject = PDFObject; + exports.PDFObjectCopier = PDFObjectCopier; + exports.PDFObjectParser = PDFObjectParser; + exports.PDFObjectParsingError = PDFObjectParsingError; + exports.PDFObjectStream = PDFObjectStream; + exports.PDFObjectStreamParser = PDFObjectStreamParser; + exports.PDFOperator = PDFOperator; + exports.PDFOperatorNames = Ops; + exports.PDFOptionList = PDFOptionList; + exports.PDFPage = PDFPage; + exports.PDFPageEmbedder = PDFPageEmbedder; + exports.PDFPageLeaf = PDFPageLeaf; + exports.PDFPageTree = PDFPageTree; + exports.PDFParser = PDFParser; + exports.PDFParsingError = PDFParsingError; + exports.PDFRadioGroup = PDFRadioGroup; + exports.PDFRawStream = PDFRawStream; + exports.PDFRef = PDFRef; + exports.PDFSignature = PDFSignature; + exports.PDFStream = PDFStream; + exports.PDFStreamParsingError = PDFStreamParsingError; + exports.PDFStreamWriter = PDFStreamWriter; + exports.PDFString = PDFString; + exports.PDFTextField = PDFTextField; + exports.PDFTrailer = PDFTrailer; + exports.PDFTrailerDict = PDFTrailerDict; + exports.PDFWidgetAnnotation = PDFWidgetAnnotation; + exports.PDFWriter = PDFWriter; + exports.PDFXRefStreamParser = PDFXRefStreamParser; + exports.PageEmbeddingMismatchedContextError = PageEmbeddingMismatchedContextError; + exports.PageSizes = PageSizes; + exports.PngEmbedder = PngEmbedder; + exports.PrivateConstructorError = PrivateConstructorError; + exports.RemovePageFromEmptyDocumentError = RemovePageFromEmptyDocumentError; + exports.ReparseError = ReparseError; + exports.RichTextFieldReadError = RichTextFieldReadError; + exports.StalledParserError = StalledParserError; + exports.StandardFontEmbedder = StandardFontEmbedder; + exports.StandardFontValues = StandardFontValues; + exports.UnbalancedParenthesisError = UnbalancedParenthesisError; + exports.UnexpectedFieldTypeError = UnexpectedFieldTypeError; + exports.UnexpectedObjectTypeError = UnexpectedObjectTypeError; + exports.UnrecognizedStreamTypeError = UnrecognizedStreamTypeError; + exports.UnsupportedEncodingError = UnsupportedEncodingError; + exports.ViewerPreferences = ViewerPreferences; + exports.addRandomSuffix = addRandomSuffix; + exports.adjustDimsForRotation = adjustDimsForRotation; + exports.appendBezierCurve = appendBezierCurve; + exports.appendQuadraticCurve = appendQuadraticCurve; + exports.arrayAsString = arrayAsString; + exports.asNumber = asNumber; + exports.asPDFName = asPDFName; + exports.asPDFNumber = asPDFNumber; + exports.assertEachIs = assertEachIs; + exports.assertInteger = assertInteger; + exports.assertIs = assertIs; + exports.assertIsOneOf = assertIsOneOf; + exports.assertIsOneOfOrUndefined = assertIsOneOfOrUndefined; + exports.assertIsSubset = assertIsSubset; + exports.assertMultiple = assertMultiple; + exports.assertOrUndefined = assertOrUndefined; + exports.assertPositive = assertPositive; + exports.assertRange = assertRange; + exports.assertRangeOrUndefined = assertRangeOrUndefined; + exports.backtick = backtick; + exports.beginMarkedContent = beginMarkedContent; + exports.beginText = beginText; + exports.breakTextIntoLines = breakTextIntoLines; + exports.byAscendingId = byAscendingId; + exports.bytesFor = bytesFor; + exports.canBeConvertedToUint8Array = canBeConvertedToUint8Array; + exports.charAtIndex = charAtIndex; + exports.charFromCode = charFromCode; + exports.charFromHexCode = charFromHexCode; + exports.charSplit = charSplit; + exports.cleanText = cleanText; + exports.clip = clip; + exports.clipEvenOdd = clipEvenOdd; + exports.closePath = closePath; + exports.cmyk = cmyk; + exports.colorToComponents = colorToComponents; + exports.componentsToColor = componentsToColor; + exports.concatTransformationMatrix = concatTransformationMatrix; + exports.copyStringIntoBuffer = copyStringIntoBuffer; + exports.createPDFAcroField = createPDFAcroField; + exports.createPDFAcroFields = createPDFAcroFields; + exports.createTypeErrorMsg = createTypeErrorMsg; + exports.createValueErrorMsg = createValueErrorMsg; + exports.decodeFromBase64 = decodeFromBase64; + exports.decodeFromBase64DataUri = decodeFromBase64DataUri; + exports.decodePDFRawStream = decodePDFRawStream; + exports.defaultButtonAppearanceProvider = defaultButtonAppearanceProvider; + exports.defaultCheckBoxAppearanceProvider = defaultCheckBoxAppearanceProvider; + exports.defaultDropdownAppearanceProvider = defaultDropdownAppearanceProvider; + exports.defaultOptionListAppearanceProvider = defaultOptionListAppearanceProvider; + exports.defaultRadioGroupAppearanceProvider = defaultRadioGroupAppearanceProvider; + exports.defaultTextFieldAppearanceProvider = defaultTextFieldAppearanceProvider; + exports.degrees = degrees; + exports.degreesToRadians = degreesToRadians; + exports.drawButton = drawButton; + exports.drawCheckBox = drawCheckBox; + exports.drawCheckMark = drawCheckMark; + exports.drawEllipse = drawEllipse; + exports.drawEllipsePath = drawEllipsePath; + exports.drawImage = drawImage; + exports.drawLine = drawLine; + exports.drawLinesOfText = drawLinesOfText; + exports.drawObject = drawObject; + exports.drawOptionList = drawOptionList; + exports.drawPage = drawPage; + exports.drawRadioButton = drawRadioButton; + exports.drawRectangle = drawRectangle; + exports.drawSvgPath = drawSvgPath; + exports.drawText = drawText; + exports.drawTextField = drawTextField; + exports.drawTextLines = drawTextLines; + exports.encodeToBase64 = encodeToBase64; + exports.endMarkedContent = endMarkedContent; + exports.endPath = endPath; + exports.endText = endText; + exports.error = error; + exports.escapeRegExp = escapeRegExp; + exports.escapedNewlineChars = escapedNewlineChars; + exports.fill = fill; + exports.fillAndStroke = fillAndStroke; + exports.findLastMatch = findLastMatch; + exports.getType = getType; + exports.grayscale = grayscale; + exports.hasSurrogates = hasSurrogates; + exports.hasUtf16BOM = hasUtf16BOM; + exports.highSurrogate = highSurrogate; + exports.isNewlineChar = isNewlineChar; + exports.isStandardFont = isStandardFont; + exports.isType = isType; + exports.isWithinBMP = isWithinBMP; + exports.last = last; + exports.layoutCombedText = layoutCombedText; + exports.layoutMultilineText = layoutMultilineText; + exports.layoutSinglelineText = layoutSinglelineText; + exports.lineSplit = lineSplit; + exports.lineTo = lineTo; + exports.lowSurrogate = lowSurrogate; + exports.mergeIntoTypedArray = mergeIntoTypedArray; + exports.mergeLines = mergeLines; + exports.mergeUint8Arrays = mergeUint8Arrays; + exports.moveText = moveText; + exports.moveTo = moveTo; + exports.newlineChars = newlineChars; + exports.nextLine = nextLine; + exports.normalizeAppearance = normalizeAppearance; + exports.numberToString = numberToString; + exports.padStart = padStart; + exports.parseDate = parseDate; + exports.pdfDocEncodingDecode = pdfDocEncodingDecode; + exports.pluckIndices = pluckIndices; + exports.popGraphicsState = popGraphicsState; + exports.pushGraphicsState = pushGraphicsState; + exports.radians = radians; + exports.radiansToDegrees = radiansToDegrees; + exports.range = range; + exports.rectangle = rectangle; + exports.rectanglesAreEqual = rectanglesAreEqual; + exports.reduceRotation = reduceRotation; + exports.restoreDashPattern = restoreDashPattern; + exports.reverseArray = reverseArray; + exports.rgb = rgb; + exports.rotateAndSkewTextDegreesAndTranslate = rotateAndSkewTextDegreesAndTranslate; + exports.rotateAndSkewTextRadiansAndTranslate = rotateAndSkewTextRadiansAndTranslate; + exports.rotateDegrees = rotateDegrees; + exports.rotateInPlace = rotateInPlace; + exports.rotateRadians = rotateRadians; + exports.rotateRectangle = rotateRectangle; + exports.scale = scale; + exports.setCharacterSpacing = setCharacterSpacing; + exports.setCharacterSqueeze = setCharacterSqueeze; + exports.setDashPattern = setDashPattern; + exports.setFillingCmykColor = setFillingCmykColor; + exports.setFillingColor = setFillingColor; + exports.setFillingGrayscaleColor = setFillingGrayscaleColor; + exports.setFillingRgbColor = setFillingRgbColor; + exports.setFontAndSize = setFontAndSize; + exports.setGraphicsState = setGraphicsState; + exports.setLineCap = setLineCap; + exports.setLineHeight = setLineHeight; + exports.setLineJoin = setLineJoin; + exports.setLineWidth = setLineWidth; + exports.setStrokingCmykColor = setStrokingCmykColor; + exports.setStrokingColor = setStrokingColor; + exports.setStrokingGrayscaleColor = setStrokingGrayscaleColor; + exports.setStrokingRgbColor = setStrokingRgbColor; + exports.setTextMatrix = setTextMatrix; + exports.setTextRenderingMode = setTextRenderingMode; + exports.setTextRise = setTextRise; + exports.setWordSpacing = setWordSpacing; + exports.showText = showText; + exports.singleQuote = singleQuote; + exports.sizeInBytes = sizeInBytes; + exports.skewDegrees = skewDegrees; + exports.skewRadians = skewRadians; + exports.sortedUniq = sortedUniq; + exports.square = square; + exports.stroke = stroke; + exports.sum = sum; + exports.toCharCode = toCharCode; + exports.toCodePoint = toCodePoint; + exports.toDegrees = toDegrees; + exports.toHexString = toHexString; + exports.toHexStringOfMinLength = toHexStringOfMinLength; + exports.toRadians = toRadians; + exports.toUint8Array = toUint8Array; + exports.translate = translate; + exports.typedArrayFor = typedArrayFor; + exports.utf16Decode = utf16Decode; + exports.utf16Encode = utf16Encode; + exports.utf8Encode = utf8Encode; + exports.values = values; + exports.waitForTick = waitForTick; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=pdf-lib.js.map diff --git a/src/assets/pdf-annotation/web/cmaps/78-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/78-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..2655fc70ae706c7ba52a5d647cbfdfad6072c697 GIT binary patch literal 2404 zcmW+#SyWV47TvdAJ*r+6RRxF)G8F|XpkSd0DozL*KyfC)0pS@-L>YX5;1pdiNgJS` zL=Y%uFUFQ8f-Z~Eh|{myy!p1b$i=bHX> zys+`=ji%a~OD*o~?c2SXo4wxc?t%-A=Y8%IH=0{~_08^*hPNA=t~NHQExrp`wt~7k z_y6}dyPJH?zNXf1lP7#Wch;suC58JBpV$uq9mEuPwC72IzEbHXNYZPniTj*hqlSv? zy9b^WRK9;h_c*@u*1JTx7ix*U7ZnnF&#SLHey>!|EdL-u&xrn@*&5w$*NfflDK2+= zkrwuXqTL7MnA~22Pf9KA4fr?~%bt+->oAUIcL2r-sbdR_la`KcFv>|sf##T_){a6L zZz>&SFy1nCRKTb(b)1E9TI#5Vab|sosCYJ_)2Z3#X-H=>j7lt*z&MxFxdBF1Os5K? znsnZRp`!DS7QR5yc^Ag{L_fj2D*Kc1G--`L4aVDMe-VreA^uVrKH@))*=&=)9L7b- ze@e40Qn$YnMh&K$tX+cWC8^7XMR$0Y3r1~Bmq(SCsM3`${#?eYt^)$EU{}`}E&L@# zcPxy$knT7b^=rCQu(H|Gy$41^e0MR7M!EYUjH_~YJq!)qEijtU-Ks^sqNeUP7|r3` zf_Y15zzO4;B@hpz)f89@qm2a8VO%!{HsZCz64(smhCPrE<7P-e6ul({j>5RD%CBie zpj>cy2lha%z&qF(Xw_WHRJkwOeAjk=HyD)rrC=oHemQ0;UH2QoOmYvvB&o*&W;XYP zs+JX+-4iZyG9r441ct!gQz6g-rN^f!29ReQNEi0ZYj2)4&qthisov>87Kbo+0Qh$=>`~j8wQ^3-&*x>3Hw9>=- zcY6s*N`t`uwl zJ1hsAweX+N_@Hq1h-oMq>}c3f9AU@ILs^8KkcPH`l}kfA2z!$Z?FFl_4HaUk-ZFGV zbNrNAhJ^G}&Y^0s)A2)B!Ol2`g^y>kAUv%!4GW9Tg$<`_j-OG}u&7jJ9o`OBjbTAg z^$ZKU&W8@yg1sF++y-{RI%3npeois6iZGvTBnqqsQ~4MXj$I-nYr$%j5iuHDe6<}sNk|Fmn#UW714D_*&efd>yQ_i2~OPOauHUkuj&1aB|`CO7Re_m7mPE89T7)~S$Ht^iY1qXPZcOeCQn{%ODQ~p827A}Bq zPhV(7m(#MC48Fs;m;s(|S=^zLZ$3wVhU)l+Zdlw$)+{y>Wyvm9l2ziFj!tF)!oDx|dspKQGU!)^ENB-zje1rJn-dodCW^Ovqk+2Y7)PjD4}- zg_`Z3H071Z9I(Br0)NB&>I!&q+$#-%Z1586YnMv?MJr#&XtsY-`|DQlQpd7*1_xcs k5om7%Ka{$hiq3Rpxm1<^LpLp-6zwQO#)>TPFtC#SKLc+9MgRZ+ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/78-EUC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/78-EUC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..f1ed8538287499647d923d7d8f517a00cdac4e3a GIT binary patch literal 173 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVQ!)88tSa;k;uAm5#wHeUdFwF voJ@OznOOFQu?X&sb`)LsaBps_Jp&^YN;1fUS!@iAMpy(B8JB)#+{Xj}Q4TH^ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/78-H.bcmap b/src/assets/pdf-annotation/web/cmaps/78-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..39e89d3339c74cbe06e7e4f76d60bf3556b0d4b6 GIT binary patch literal 2379 zcmW+#`CAjo7Cn_tlXOB7KxC0E6;J^M1G0!Hh@b)rDv093(r8qa#RddiM!%k!=Kz6- zAR+9oPaY$vEGl%>eDkNgKjqcDAL=`OZ&%$q=bl@p|JIdvKX}yBe&=qVJEy3~o0aSJ z7P-rAb+`H4^^bb{e4V}Ss;-;eJrBBj)IQ&>Y+G4Jhx`Bgd)+<0USCiDKgoKZ&z*hf zTvhq0+WJ$3P^#}Vsdh@6et)EU9RIrVD^XsATjF2DgvGz`>igTdVHlSz!$)8= zkl`}TkwdM+YY0@hN4GKOM$Rv%dnytuTKz3?K2= zVJ*kxZ-8-I@?X_#dDQK1f^i2cJ=Re{^sY2&!=^iO)CHqGZq%d7`BWJ#7Ju$x*XU`1 z_i=pmx)xbLF%}P_BWx@IM(3WfRP5wh#!6vyC5~0X=$6NB!+0Q%b;8gv)(4{pWBpo8 zAvKK+!03$}6U_U<15OwZErCQB{ieWP7y~4b0b|e{IEbGPOCT4ULyiuS9%D7Kcim5y<&RNNLKbV5?M_@Ml_!BUD z#Vf07Jx2Gvsu8;#zczp_tCci!d=JC81TT_)OJ7H<^R4ifpq^T6mSw`ilRIqex zcDbemt&GU2V_=zN>O9y1=TsfoLF-f-SXT5@hvqs-6M_UR+Zjv-JLCvvgL&oPaj+a) zumUXC9K1l-VL5mOEFZyU%~ek2U<+6Qg0~4PB*AvViX6dCu;QHHQ?O&w^dYe0@^l_p z37Ia|Top87TGT65rmumWz_bsnj7$saCoz2wtX!Jzz~5)(X$|l5J=23)!YPVS0$7C< zN&-72hdf}X!$KKgXDp!{uu4nlC|DHr(K(@ZSbg@~C1!Y-O;vI(n~X7a%rq?x0HT_!Upz#45c<=E=9 z%$(O8XQ*XHNWbcwX$8BMIP(DPx^q_ecmo^4(Qq!!c)MA}20&B&r zpr?9fgEM}u|Q=Y?I}N%O+r2j=-|&3Tq$UKp&&^B2K--1CiK zy-D+rv2)nG5D(TDwvd9q4&u!r^Fq4jI!6yIWPv@jEeKEg%?r1|2FOAO*x>GkZmbI# zkFaO~dyGY)@`+}zp%IIAu&0TO!joT2i^X8i%!{Si$#X0UiO-`KFR8X#nz7hUvX-Jv zrlkr!)wxtjq@_kemYPWXQmbB*xAYiT*pK~hyec_gfVBZtu00EmY{H4Y7hH0In=Rn7 zrd*^6ZyLeFtZyEITTE}BgIn=d0$03mWtG&?rnd!}Qcs=lqQPy}cWK~u&%11Jhy7h0 zxHIZqi%PBz!oOeLb%}c3^^oNEF~IZy;@=nOo`m-oNZR{OvggAt-GdL=2)xNT171=RQ}dVa*r7lYVOePdNhaj=@g8o(E3NgnKlljVh}#;AzFH6fe85 z+KkXeX|)x6uXEL>T5i(x)jojlgLN%g;C_MWfd3Lw)^auF7L8pKT~4>J-N(|6#5K`| z4C@zBFVpqKt(w|Bc=fOlez!{6v#}_vi9QS%Fz7{Bl|Mq@8>Ux`|+@q$AFw7>C4I6kt^o9ex(7TZee#E)apegrh#KtY~qKu7xj5;lw z6#S@jGZVbnvUyY`9W|KBR2?1kz~)J^XS16qTXwNxbkD&pH%Z*8CD`g9t}QVumaS(b z>br%+eNQ0!zUK>nzTZ%-9qr)9#LdU`tKcO`;H6?hPUuI$%fw)uj0Z2*Y!7Ja50N=- z`_Te^#{A|N;KN^GfuPhQ2Wn*@M_1lcm`)(+ff)A06&+uoraMN ZWxHCHd+DL=OQIb$$lQ?y)&e^@{{yR6zuEu* literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/78-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/78-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..e4167cb51f66c60ef7d9500b450303b5da175574 GIT binary patch literal 2398 zcmW+%X4)d#tmFZT%e3CqAV65xJ4VEnS`dH zL7+EQ*O3^3$f82sn)^Iqy?t_}J*`zImsoz3p0` zy|l8@v3sw>QE9Ke(tX)&Z@Sal=kDya*LQu@-E*_MN9}W8DKXb}blCqN-)rx2_qu!f z|99EscH2w#d|vN5biC;h2nIpOpu(y_p41TXQQ54v6J!szwG#WK!8X-8s5t+0hZO($ zz+kTYO|+EuO)`HR#>Q_Njyu22B+1`iFr|FkYf2fiwA+XBVr)ZoByOlliyd0PkQ@3b zai|SHHAq8U_%RKexlu#6p*NO#0li7^mO(!)c@IE8L%g+`#jBXSF6d`v?=k4-4Blqw z%?9rU=wAxnR_Nz5yl&0v^_YhZ&@ZG7+n`^>W;%}}aVdOB!8^{_tuf_R1*&}zMcSMb* zL+{)+nuo2u(r69zu8h$m(7VOatI%(Xqn*$-jP^nA!Dzo0Golzq2cY-HjdK2d(SAPN zEy6>+>9)I`SnL1m2J0X193?}1vjKQ^h7-*f13i6Q!NKQT@i z4cQYGmprkH$P*Q$V4_wf{=Z?hP!;`u1-05hZ6cvDouF}M(0DCw%ww6jPH2KKahuR2 z+r$IVl;}wwmujBO08LArECAhRn&dO23zJ7cGtwrHsp7a|nr!35GqHP8!FR4O&Y=ocE^)T?cgup$`0XR19f&UY;AettCt<2&aSA3E@o8Lt;1=^l((T z5cD%CTnc(b3LgZmCt(+8gE4%V(4#{57?xV3aHEzs=@G)b&oNWD1&b$za64XC2;nZ! zkbJ_T@7*F;%=6J7L<~gogzj5v==m44HJ8?T{t{badoI9A8K<{Fn z4|z|MLrUzt1@wN#Joo2o!#p?lfpNYDTlFq9BR4uc6XU`7c{)Z~bg{-hZ! z%Jk$Gm}GeJ5X^+90+<~4R8-0I&j<~u@e$AcrztMmvqWNgmQQk@l@L5@B<5#Lr2JV6 z$$Fkl(w-{9}^>Jc)-K&c8SHRMYVB2!Q(s{>>N0nfit^7y#=&)+~s5oEWCwbpjk^SGdlB73j zM0(?J$!`u2;f>3%`%S${KK=(=<*M=H3$W}1VD=8M93x@5n*4W9!J7fF{HmoKjCEn@ z62hm1rB<-*wk5YJ{j3x$^#N=LOv_mucXBKMe5Zlsy_)>9r((GbtiZB-0}B^2mT!X< znpTp*iegsms^uR_%8G+$?E+TnITk}+Im&T2QdiCr*Ge}(mtg-7`&`Z+IyCD)J;K{v zV0(nO4lsxGwj8W9>#Y-PulV*7SlRx!Zm@mwYL+VfqF|Ntczg@y)goYCMA2#m=Vga+ z^|B`a;>lTU!*mu|GlNwmu5lyxJJz_R2W)F+RPk3OcI^u9U5UcAeqh7~vYw+^e)Wj! zJm#Qny$GzTZ2cetMcdZ9!K&pA3)m;}MzSjWrW9}3d9D+&8^<-vZyw7=3s?;{xTZ?V zMi*FZ{5!t9pQgS`2XpOsSFV!Z73aGPn)!Fnr|K!Rk#P zVpQ^n;{1@Rng8$8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TX>Oq#ygOX=*YO&pO=jMENuV) literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/78-V.bcmap b/src/assets/pdf-annotation/web/cmaps/78-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..d7af99b5e2ae9a21d534f1965c35a2b572143322 GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVs4@9k;tm3#JJa=mvL_(C)3_w qCYHTnEP{KZ9Yqxr_vW_RGcZD-B!fJd#m3NRgheosQMHtD9}@un{3-|l literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/78ms-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/78ms-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..37077d01e26f9ee2427592f6deebb145d628e731 GIT binary patch literal 2651 zcmW+&>su379)3?IlVlPI_nQO=7v(Aj5fH&R7(l=(3boRT!dN4sTpU0UwHkd20)c>B zl5n?bS84?+7Zv6VTibnh{|&dhz3ubte%bx9{j_KMVV?IlGv{}E-`~tRn)fx1_UpYJ z%}rOjtT}~+w!QmpwnA&krS^+XYi)05m$S9gTG{q#d&l+m4yns|Dce}m(qjF6eW$g< z+3D=){{O>Tr_-9f?}JK5*~!{65ZnhL_eHfB%z{z!J&v^D)zC+!d8NaVwML)61g zL)3t&**cIMWF9CbAp^Cit)DM$7idCtX2BdE5^wI&L^3mynek^WK^AjaN>oayL>`K9 z3MU6XY#>S^b}mCn!Oj&Zd$4nrC~4SfAxb88t`Q|0JMB6phk4w^J5ClJx;W(^c6yA; zVf5WXUoZNJPN_gYh*B*F4=iH93FS0D(1dTR^aE|!iNRKqZr~=Anw&vEspST9p?s(x zJP73s87z@agQ8*30p%lM@C1~zn!!3Kb(+C?D4%eHjZn^62Ay)?pvyRI+UAQPZr(=a-RKi;INDH zN1UAB{Ym1ze#9>dHgPDRKNsV7j2xdfX0MRq=D`-Ot2nexrqu; zOU%Rxi60XU6YS%mao9T{GmHm6X_d`mF3<%1WGbjNV$ueh7(aOoG%0Da2{c)lG7*}> zPel>Bhnq@}O^-x=Dj75l8*M>TnV{(*Q^lYeWU3l8(>zrJnk9!kav7#Bg6_3VwSZ=u zz44&?0=?OwHr{&}G{@*=Z0*;2PZ65Sd(VRA!Fxd##zo%S0Gbc)WkL&xx0%qwKridN zDA9XIju>|Z`BJp~pG@2`o40 z{WWsTgp2dDJSPnP1}vT8{LOfg&-vRxPbT?0L8~>>QJ|-Sr(+2{t)0#$w3eIB13kk{ zA0qT4GA)AE8K)iCY}HR!OZrJsKYf$x$ZQE{OWyL9sj*vZ1xOZj z@z$-KzYN+#=Gjc#jF@l78Y8C{3wqF7SYS=wmIa>}ykG*oV_9JOe5P4o;@;IR9KrSh z?LwJk^0^EPRm8sVA=$eauF))(mYNqU2)9^A$l`etv)Gt*VDT0(pNiDSHi`JpV5LXW z`36Dn9f68$qLOl`To6>P9x5*j(_-x7I;c9s;~P-*n#cE`8t?@NRS5Zlm&nWy@Ug9C z+I8oPD2Mq;I59j)AxTfN37*st#WuEQrKD3nS;A z*&OyS14!bR$H~WEwmIy7sE~x2YN$p5swo+2U?5a;KGdN5F;Ii|Kn<}#4ShhMhReoz z7t{#ja|6^!|G zF)ld>mY81tE8v$-lcuFQhy5#&O-m-ENYPw-H5^6@!s#P-mO^jN#F|SNuwUS{L zgw^8=_ab`rBjQ+XXLdFUzB%Bqf72od{@umB%7nU)du4-a)4$4tniK!Z4s}2O>H^f< zf>%zc2ZXhFN&lmWHCD%?8!)bA01G@a*78|hR%q8Q%EFJX#I+{O#FKR+)co*uCS-wa zok@DoynaUFe-eY&FR|Q(NMG*;hRq-wiL&V@7r(*Q95QcYKrPDMIE1N;T^sFCi-k=S z)WgDNq{RI!W^G!TuN}dgCuP&mF4JZM)FaqroQhGKZBR=>U$fyo8vQyJs$_%p#y8C4nD)&zs1>nqWO#C*RvO+0N#s}2{x(`R{_4tjdlqU{;1-+o z<3U@Y7+@NGkg}D6p>$!ZN+SRIFZ$Xg^3M&7R!Zi7i2JsfBI*eQZu7*l9medF&~E2| zd|TfaYk!wYa^GDh$G+R;uzz=vw0xha5&mc)nw>IP_)TP{phU5F>>kQdD2Lc#h@F0t c-la;q-(1!2s=%@!^LOuZa_4*AVfvHif0(Q+AOHXW literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/78ms-RKSJ-V.bcmap b/src/assets/pdf-annotation/web/cmaps/78ms-RKSJ-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..acf23231aea22e1a95761f7eafd35f1d42ea6b84 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZElfUtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6ERIW@ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/83pv-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/83pv-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..2359bc529d160857cce4c1d1bfca1322290205c1 GIT binary patch literal 905 zcmaiy;cpXl7{{OI+O^wmYtyl`HDmR3WD>!x+fX(zk2fF27#QYSGOjrry9(r-~(pVo1{Nw?mtLYJ4UUE`k0lkkCo*kO1UE(D(}Ha zIX$MVRMvM&ErC!&C=p47ic-|WsE3L1&Ed_Vp)Ij3En2goQt2?lasb+wwgN2;Lt;6| zwA_i2WgTGY5s;UQrFk$;02m7ZCI-O-t-D+~RMwf^W)!C+rc;Y3P7~9a-6+nSV0x#B z;@u~h&i0`=n`3$}i{kw*rgPg+oO_k&gBcVbb~2ssKyiMW>7z*$A19bDw4u20BGV`1 zC_arcUEGA?Vv6arQ52ttm@dgEF74;u%JB9>6;J2#3n;#bF|D?uSWPosc^1W&VWz81 zD6Sr0`f4AFuf2cP{3zC#>6(h-+M*UPR}ZZ3Otn{i7_C0k7_RpF0@Zzp)zK+0oTa^* zw4u^B0>!txwbtKNy55iCdXee70*deZm~JFd+{iNhFpJ{HZA>?}qPRK3^iu}K&mBy+ z6co26nSPl-@oO8??Kq0t<4kv+!-v;5Y52z#{B2@hzN>;4wmsUkBG4YIH)P39qY?Al z&-;u-#D2+V?9k-9C&B0ku;<`WW7q$+Vyxj_#Xjl|yL;UscaO{N)9#?F&dc}K;$|A` ze8QXqy8u=**sp^X2K#uO6#={Gx8h?Bj%vT*Jnrmp`kY>;$4NTfPM79$M&eedr~f9j zS?YYFb5gPx0b5+mtNTAx&)Lh;5 ZujiWNPKIm#2-aGseD|Rg2PkC##Gk&38VCRY literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/90ms-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/90ms-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..af8293829c90ce63cc4c5eda0318003785ffcba1 GIT binary patch literal 721 zcmW-eTTc^l5XJwq#gw8#R@%k}Gf`{k zMMO~)MNz7F#ryrXv0C+m@CEc;pImvE1P@4ZMh0a$e!5_#hJh!c`*BVy;Neh zTkWo5mpv{y40IUiYAY)$v->KYl_e^qm8H6=e}1|X^yMOVNa&R!*CX^Qk?RA!TI52Y zyG8CW=pK;^oAnw)aZ=<>{nqqplU^rs@wxhDkvt)i10n@xy-}nD=&hzZk)D1k^M|e31e5HzTtO9tf zi|}eE@HH3Vcq#Dse!}Z*z&9L(6AOSR{De1Kfp6IfCvCu!&9pYVV^v4ixO00S@Es@N z)I#8?0O8%;!1sy>@6Q9izmxDmBk)5D;iCfJN2E$w1*a9@=~D-cn9ek)@cWNQhE@3W zR*W>Mt{DX%Gw_p*giq^$pT-HF#ekpJ629;PzX%h)3<1A#6TYqnejOxy(+&K#g7BRT z{H~MmeLL`nQo@gmfIqeoe%cG=pBD)D)}AcI{0gYeAA%j u^{--}Rd*VGj9%#5gucOu!1#H2euZlOd%88>EDV>zJ*#d2{xOGaKc#=yUE^>7 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/90ms-RKSJ-V.bcmap b/src/assets/pdf-annotation/web/cmaps/90ms-RKSJ-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..780549de19de05b6cbea4ccd4737351bc9ff6104 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZE28OtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6C)7)p literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/90msp-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/90msp-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..bfd3119c62d9976dde9b1e59c572c678cf5811a0 GIT binary patch literal 715 zcmW-eTTc^l5XJw~VoNEO2&Pqmx?BQ85Gy1Kg5&B40vb?if-xX2vLIS5w2cHZ5is;3 zUQoQDs8tjNMNzzg8>r(=1dvVfUk4O5y@0Wb4U-e!1H*~A2RJ`p_EmhUK zs|1K40Wc(gs}%5L55S7NSSf+n3@1T40ZQtSjKh6U6fCovgKDBFc+P4I2F&J=F+qf^ zjh0Zdd1J_~mn)$$R9BDTOt6QW6CGiHq9bDMk|H@Nw#a^17jYkvhNEA18d6O*i_N*t zY3nuEb+qf~Y|2Q9qDB-#>D2`>}yh(Xyh zBIC#a@D(JyS^<2upYU2Q@bw*pqou&3KEfMb;G4ySV}-zDX9#a~0^iOfypscbr;YG# zEATxh;dnam_;JGfO~4QAgcE7N6ODuq8-O3#2p?O4AJ`z>C7g2s&v^;od4S&+63!O@&vz1jXb1k7L-e=3qL;^Px1}0SA^g5iYfXXF1DY`JMrWSXGZ@Ro2m> pIdngIFSLC^+oeaK|2#XMub5T`8{&0BcPR@0tE+*R*O2w6;V*K+;HLlp literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/90msp-RKSJ-V.bcmap b/src/assets/pdf-annotation/web/cmaps/90msp-RKSJ-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..25ef14ab4af42f4b70ccac76cddac8f3b22d8813 GIT binary patch literal 291 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TV`-3ET%a4|9qgs+k;vS*f}u5; zfuS{tfw46qk*(2@aj!owG3?DvWNLI~IN-y;a3IK0v~kS= zzs90gM@9w+lw^69KH^V^*#(jJY2W1%d Q2{Ig%O=N6uVB9AH0G^~w2LJ#7 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/90pv-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/90pv-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..02f713bb838a8cd46f5b262c934d0edc8c6e8fe9 GIT binary patch literal 982 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Add-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/Add-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..a3065e441a0e1f1a65e9109ec9bc4f826fccac24 GIT binary patch literal 2413 zcmW+&Yg<#t7JgTDc9NYyAOwPxTexVs69h$s#!VxNsHort6_ss`c;R9I;draTQz>^5 zB-}yKw$@sywYJqgd*Ivo8$RvnH=n29&!;oze3<>NJu~k+Yt~xN%$Pnj1Uj$X=(^l` zsmEJVQQ<4x>ho22t1on(4|*GKboT_?yS@85zUb__*4d@?1TPfXtJ~VV|DWIO?Fx1W zyL$iE*%%CZi;55I3)Iv%)_~9tqJGt=0zKYE^g(@B;gL7U}%yTf_E$7&sr%ouPqC<9T}qydj;K6ArB9ZcM_-~V+gdA@G8C4Sv)OB{4u z_6}ynI0tu=Yq0T%_p6on<)%1`Q*oxb(wu!Jk1##LOgoVhlj5w&PRx$0HVv)}2JzSN zQ1svv=U^*%l69~TdPB(&pf}P`DflNC+7A7wb!Z3lV>DD9iXKvJLjmZ=twRUFlQDE0 z`U%re6L^Ygs2TbxX{ZJI>6D?Mm>RYZo1ix*4LhNq!Ei40vt`5i(9g-k8hEN}_!9IM zY50~V4XYTwD^@*^su2oB4~Oj|e&`o0BX!V&@<;>pi`gS5p|>g{ccEYMjM|}J-ZYx2 z$s?*VS}B-U;2zy0@G84aeD1G1$MURD}9&~}3tu@a#Q3Iv5M$O zJ6L5#P#irE@kEvn2MPoShY0M3Kl4uX$!?oshCX$ z+bzweg4M{gnP7V?v$%d<}SB-25@H^Xc=K z!7kVq?4jss6$@@+LHmM`Xr%?Qp-Z%|8SJvMAbh_PwNMInHFlvoUaZsPh-zItBz)_Fcdl88sIc}ZlZkCxiN{^3~?b$kQMRV{XI5?o@L1T7Pm%NSb#gtCY1@-Ts(Dhc*=LS`-4+SEBY}OH z0Cu;74B7)jih*Ia!jSJtFf8In(WIIGfEV5qnJel6FAgd5s&h3ShTXQB4Z{(&S_JNk zU#)@>jnxJ*9Ja4E!f=9@l&!YFhymZa`Dr3}sq3j_@0!2!dQ2P3h+07jA+PS(r|v*2atiEq1C2VUOq z1K$x+R>JuHE_lWM7lN8+}oo?e^C7|Zd2S3l@#;CAu9i& zh0+CEa& z_S2@dK8#}NwGW2R`g$9T zlFhIEFiK-z2f=swUiWFz$GsQ;aQ~)gH?)+$RR7O8l=^ckee%X)^1aC-=bK}J*f$rb z;7u>dzhu$5U-Bsats_wI)=RN(>uJl|a}@WhmDFF81O8u|ss6WQD){Ycp#1kuB>#Sd z@_s)-(eEUReHTZ?@3I5M?~au$E;rrIsR73IE0M@*l19U hBiJ~FjYe!VVdI#~IGtd0&_=Ch`g=^e-y*oZ{{`ID*(m@3 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Add-RKSJ-V.bcmap b/src/assets/pdf-annotation/web/cmaps/Add-RKSJ-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..040014cfc0880371c20a89212942727c5dc30a78 GIT binary patch literal 287 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<(QJ98{{4ArR$N%-RQ`;*Pnsm zfDaG{aWn1>~Fdm56S{nsR6Mn5Gw+)3Jb$Qmev}EgS-IcxJ}{! literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Add-V.bcmap b/src/assets/pdf-annotation/web/cmaps/Add-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..2f816d320f08b8671498299c4d00e4564d2ece6c GIT binary patch literal 282 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>X?$E>ygNGht``8&6_OUQ99OMMjtU#KJf$^YlAa{AfKF&6QHh#7?i8gWe mHX)Wa;Wmy$_VR4TgR($XYCxDx8|p%l=LmHM8lDo74dk4_$_P(g(w!-Hg>R!685l< z1014^3aY5#2*)_VDe5@GIWEvZ6D?e#jSjAGjT_wJ4)^Hd0grgXGhWccE8ft@07Hy0 T#ycjM;sc-f!Z&`z(oFmT7oB|o literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-1.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-1.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..03a501477c91d8156723f0c274a37d397ed65bad GIT binary patch literal 371 zcmW;IQAa~@7{~FmUG^&eZ(!@RyK_0)E=Ic8c?GTgwb(lAe~#GII?0+zl4K@HGLs}p zW|AaHlF3YxOp+u?l9{CMiRbhDcsy4>e>V}aa(Oi|o_55LVd#O7t{WnpvXWAmdE1d$ zTf`^FES0m=s3TLsfp8`x{{L;Eq%GC7cQmCG!NK8pBsOBkd_GNc=L=I&qQJ~z4n>qu z#sU_xgk`K?6%|ymhIMRU6I-aEj&1B<7kk*p0S?hX6Gu442~Kf_b6nsOSGYzCH)x}S qTioFu59s0%Pk6=)Uh#%^eBcvb_(l(X{NNYvjJLc7T(1JRsQm#8LY3P9 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-2.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-2.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..2aa95141f9f5802818e34b0aa626e34e7cfee805 GIT binary patch literal 376 zcmW;I(MLmJ7{~FmF8eFqf1vHu-MQP$xfto9^A}WmtyrDyJxAWRfH^ z$xM>WB$*^hCP|WHk|gPS;`uy39?#XUt34QZGdVSu8udl5WtlyFrfG>-(jAt<$$7pU z_e5f1#8nwr4f!$|?vAC?;{V?hN_tXF21iFq5svgH;`V@JheC#-XY*N`$TL%z#te#> z!#ozSh$SqegcYn}4eQvzCbqDRGIp?wJ?!HE6;yGEBh*mGF-~xbGc?e|IWBOC7OrrO s8{Fa!_h{n*k9fi}Uhs-HyrY8;eBuk=_`xr9Ay`2JI;cR?K~xuwKLRC}r~m)} literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-3.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-3.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..86d8b8c79cfa3907281aa3f25a46f178b87aedfa GIT binary patch literal 401 zcmW;IK`TU26u|K}mcGN({Q|~g_m$`K@18oH)xWONo(l2>)7#w>sV2{J8=76$Q^{=5sg+*{Bi$FO zOn+Bk@`34ybT(0+%;nVoeW;8MwHdTaUu%_UY|W(7ZGJiya~zo}4zw_eykU%>gi(xP z921yC8Pk}-Eaote1uS9-%UHoG*07EZY+?)B*ugILu#W>A;t0n$!70vgjtgAk3fH*7 zE$(oS2UPHgDr$JbGhXnDH@xEmpZLNze((z!vY#y=Hi6g%Vk3yHAU1>84nl~yl$}3x CU7_Cq literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-4.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-4.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..f50fc6c14e67a228c4ba9a61b1357c16410e8228 GIT binary patch literal 405 zcmW;IK`TU26u|K}mexMN{Q|~g_m#NRlK?k|s%# zBuSDaNs^>Vk|arzB>7);fA`estp0Vij%1K8n7*FgNHu$&+t}i|o=RkbF0K4R80r2{ zrE}eZ$p@x0(wTUDBAZqJ_n|U6)Mn5weXUizsV$vMwfm`9%yDG8IMB){@`f>jQH)_6 z6PUylN+@FnvzWs?7O;pVETe)ItYQsStYZV4*upk;u!}wH;{b;^!ZA*8iZh(!0++bL zHEwW=JJfKG2Rz~l&v?Nr-tdkOeBuk=_`xq^$bPnf*aTu5h>ak&g4hgVJBSS-C8t5k F&L0K8qip~H literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-5.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-5.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..6caf4a83146a60a2db652647b9cfed5fb71bd97c GIT binary patch literal 406 zcmW;IK`TU26u|K}mNve^{Q|~g_mN!#-X5)|zBpQ#PGx_A`luPwPmMBxy;KBx#c*Ns=T< zk|arzv`LaANs=W0qwepXI-RF~O|>;06pCSYXIE?*JkPCbbY0J+azVQ_eldz|Ph_&a z9YI(K!nWAvlC`OP-u&N3CbW?a`*rDCYm)WN*>tAG&m-sM?B#fFL=cp-tmD?eBm2E_=ODUrv*e4h&B+7AX-5*gJ=iQ5JCxG%FZ9F CgrqG1 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-UCS2.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-CNS1-UCS2.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..69d79a2c2c2b00207ab27b68ebf4404aa17c6f2c GIT binary patch literal 41193 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 R!5J=ag&W-A0Z)>CkuT=vPT>Fm literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-GB1-1.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-GB1-1.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..707bb1065c76d69551c287141cb258519132ef8e GIT binary patch literal 250 zcmW;C!HPjq0LJmd(o>ur8(emGDOo64xKA)R4P{);y(uf1rfHfqO`0Z2k|asfBuSDa zNgD6qQRYv5zs=X*d(Fh{N?jKp3$BcqrV)%9hACrtJFBEscU<-4$YeQZ>x!)(T$K;` zVx^M2_m0%cQMz_JEu~~AoJz(MX)EFJ2ytmt{X#Sw>=`e3#T(wy!UsOl#uvWPK^Hyr kF~ATbj4{C!GyLEeb1bmL3Ttez#SVKMaKs5`(G2{Fe=CDsrT_o{ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-GB1-2.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-GB1-2.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..f7648cc3ff02c44e9594ccbd71deec742e253c2f GIT binary patch literal 465 zcmW;IK`TU26u|K}mOjP(0>)!E%W0a$lq|f3HRgsI^TvBGHLGzXNs=TL-VlZ{f>DfN z921zt6s9qQS&{5KST4 dLNtbG4bdE;Jw$_u77-d=%W0a$lq7Fsi@BkOH{N@xS&bt}k|arzBx%w#BuSDa zNs=TU}~*Hl|me!dX&bah9j!F3aLjfsS7l3BmQ8m|yWwl_4H zzD_^L`$2nTv+>$wE@%GlLlfB01_QeEtTplarc5f`?4@Hd$C0&Se;cF78^SO~Fp4pZ zV*-4l~8|5gz6Tq;Wr6vm{3v&eie4&Qnn@L%5OOhl>k|arzBuSDaNs=T< zlB5Yqk|arzT(^3E?^93D>MAPKr?QAtrsV)XL*F@Qk~ zVHhJA#Tdphfk{kZ8Z(&19OkirMJ!<%D_F%E*0F(2Y+)Na*u@_9aezY{;TR`4#Tm|V zflFNB8aKE_0e5)7BcAY#7rf#P@A$wczVMA7{6c;HTtH4BH;^O9732(Z2RVdXLQWyK zkYmU-4m-=_tMvz_6R8WHFJ2IRbyaP#C_M$ZFh@BuSDaNs=TCWD$wYeo5lqC}J;_`Sr5mYp#8^R#fo5_alnIPHG zn2tKrQGGUSDk-XHYYYDGGeHz)!l>KJR2T*&r8UXQs@halK|w60mt0p5BggB<00uFH zVT@oDV;IK-CNYI+%wQICn8yMZv4mx;U=?dv#|AdBg>CF$7kk*p0S|+(wQg*OBwcedIuLAvuxUNRA{|k~7Jj ijwRQUbIHBrU~(}zncPf{rl(l7o@0OOeg}^L literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-GB1-UCS2.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-GB1-UCS2.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..7586525936cc5398b86d3752a4eb45b15825b25c GIT binary patch literal 33974 zcmbSyg#^~;Dq`SLCNL%sw+i2N{zNG!^ z$?Yk$5++TC7EIHnbl@j zL>j^%M!o;^j0oPervI<+6Q?2wVGh2R4+reFD~3GkG$FYsWlU|O`ryo7Cx}AGcZY)y zxsPa^R$VF>bccxgAnSh6i^M5Kw40o9+-AI+wOSW<^;T!D3K)+#RruRmSh72~5X)V# z-T|%ochcM4uxZZv7+gyHqKeh!_-lLDY)7n!H8Eo%`FO!4GknRxko>LUi&DGoCuy}s zfAX&z;xJptdPg7;|?<=Zs- znM9ir8jGLO2K){r-Ozd>nt4A?g zlM(Vbk|{oJLa=XV{LRK8tzHA77?akx>58?KiL!3{8tsAHL;kyru_^u}qty~6qGoG) zWXmSP3#+77PeXmua`g*Ic&)V06D^fD7WKFdv4ydxV^_L|0EtGDStAtM!rM) zw#F6Kfq-AL>LhWDj{$=xvV_GEMI6d}Gy~g$_r#&qw%QZfXF_Z2urmU;TqlcaopB}x zha?9LCiBL;rmQbUU`nrDeOKPU0jQbTA&yOk|IWQpw$vFXTp`M=VVz4RI@NGW_m#p% zSIPaRCj^8O&bWTne-wsl#y!PTPE8W;)v-Sp0~Cy;)&;z&JS>mnG1%yEKpy*i`p3d?YxKWwJqxHWdtrs5x!9#vjH{k`K)eT>ep )hMjqg! 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 U103N5XSl!>Zg7VOJW1|FzIH}ZoB#j- literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-1.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-1.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..dad42c5ad7dad57954fc9a051ee7e222e83bee45 GIT binary patch literal 226 zcmW;C(F(y(0LJk%m!9Idac9QeF4x+{N-pdPuoG%*&RJ?#Ymy{Mk|arzBuSDai8t{m zKI;43eEnmeg6?_&uT`o(&8Vu9$|{OVHQOyQY6Ze)bwSNW+2x+gi$1gExaK(Y-wVo_ zV7&D^Eyk#v&Y8NAw+u-lghV0Mh7NS02Ynd85JoVD2~1%Ib6CI`GD7x@CoEK=wI literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-2.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-2.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..090819a064533f20aa68f562275556397683ae81 GIT binary patch literal 233 zcmW;C!HPjq0LJmd(q>-alr^r|-KAuqWZ^!6;WQL3=iZc+NRl*3(xgd}BuSbiNs@RE zkK#{#zs=X*`$$FYa!u#IbFK`VrV;ow3{yt3_Lq`Y&2d%Hk?~T-)@56#U6l>`B87r{ z_m0%cQM&p%Eu~~Il!!-TNh{{@2yw4h{6aM9tce!d=%9-pe$dANLyYi?G5#>Y6f?}R Zz!EF0vB4Jq*kO+YjyU0r3$EhhCY~ULRonmo literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-3.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-3.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..087dfc155860e65d2dc828dd432ffe88239fde23 GIT binary patch literal 242 zcmW;C!Ab&A0EOW@?&>M-#%1H=ZkB`0VnAFpPf*Pzg~>bJ83I>gL_|b{h=@pth)9G) zNJNB)MCe=iDE;OXBS?d4* literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-4.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-4.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..46aa9bffe576e9a8b714646aed7f9e1a4e99dfe2 GIT binary patch literal 337 zcmW;CQAa~z0LJlmyWFREzd-BM-MQ#uW*1|2(fI_`UM;qr?LEiX)ig;aNs=U)B$;HA zWRlEGW+pQ;NhZlmk|cH4fARco9)Is(HfX1FdTBB4$|=({CZ-L;l!2H%ucVc8T$OZW zIJIEww5{h{74!Q7iG=*`9jTS0bas4NN=g4@BpeJyt&qnf#BV+`BgAr^6|jO;tf7c? zY+w^x*v1Zav4?#epoBvl;TR_<;}mD8;2amY#1*Qz#tm*!Lmds=p@|mSxJL(F^w7rx a9`S?$p7DZL3^BqR-tmD?eBoPIKjIHvDu)yR literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-5.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Japan1-5.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..5b4b65cc6292a5ba7d89e976565bf08814bb88b6 GIT binary patch literal 430 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 BxW^%pYjuN-9#jwV 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-0.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-0.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..cef1a9985191f53c4a8a35811d1caeecdd1a1820 GIT binary patch literal 241 zcmW;CK}*750LJlm9s3mT#ba}M+i{E?2I0Ydf^;t$thU~bV5eb3M1+Wlh=_;<6+}yI|M2!7c7^j|X(nMGt)pFvJLB jOfba^k9fi}Uhs-HyyF9NeBuk=Sl|as{9=Vak*&o)>2O)q literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-1.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-1.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..11ffa36df8404ab970df2a24b2d80b1dc6348436 GIT binary patch literal 386 zcmW;IVMjwz7{KwnUhY$zFR*p%-F-PT8QF{OC#ZI;vURs}uh^?~l4MqrBuSDalO#zd zNs=Ts!7SO2zVPu$BF)nH~I5FL(VM>=iW5wWz_Cxu(|1DW$h za=719c~A8QG93-avRUze?+Yb;sYcAwl~P38yOZ%m%1wkqmZhgkg)T;kH->RcU=n3i zFpU|^Vh;0Iz#^8gj1{b64eQuI6`RR!J?x`~103QA$2h?$&Tx(kT;dAXxWO&% wP)7szXyO5nc)~MUc)=^)@Qx3B;tSvS!7ucv`Ah+A5@^#vn+Tc;L%L%90TF_m@Bjb+ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-2.bcmap b/src/assets/pdf-annotation/web/cmaps/Adobe-Korea1-2.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..3172308c79d57147cdbe05930228043faa48ca54 GIT binary patch literal 391 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 f42+FTOpJ|eK+FZid_XJ }}!1;lb046pnFxKb%J literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/B5pc-H.bcmap b/src/assets/pdf-annotation/web/cmaps/B5pc-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..ce0013167f852a873b639e301088c094d468a750 GIT binary patch literal 1099 zcmW-g`%~0q6vodN6a}qhlS>5pun5Mq5J!##vdM@Bf}@NT7m;gd^fxrqTR%L%JoC!)l4};NoKa|MO+K-CAa~m;Yy` zTdjJ8G1Z)yv?e_XG;o5ZH6}Pa2(*7(bPX13xi0#9ng;QCPDf*cZvnXeZG=E4V1^R` zoRvxy;O4Ai+72k&S1{ECpkGb4=2BAudTmq=)uyA=8JOxyQ9dy;?RWuYM=I0Kr6@a# zm_A*FvdfKWmj&gsAg0|K%I*ZFJ®2-Ds;%-*{dpuU>v^DLBo-c0)(C|^V~)q7$@ z{aT1<0Hy{bN<#_Lm#HZG=P~UsLiy@7rUPy$2a=c$2B93xXF8OCa!B3vwV)jKXF9wU zz5g(KznM_BQqZ}<``gR@4u?0-WN-(%F9AX;RGaa9ga(p$@iBOaih3t7U8K5x( z!cJ~LIW>#vR6fe-K&I2xDBlrNlRvsQZG!Zs_nFSbV(6JFfF>(MH3zZYoCyKVmFUyr z4bWm#ih#tHNcL)R05n%X$XO4Rvr$av7NDFerWB1l#fLaIWt>s{7^F{x*Fn~56 z2yaUP&$bGt^X|C*e2VhQ!L5A}Q~MH>b_>(@D^V_JOc!!cE-L@xHk2RYm@d77a%lro zM+{2GM@&B|SeF&7%L>*{3f2_`>xzPPRl&NdVEwFMT~n~GS#W7*5I}bZEbB~TQ!#G>3#<@hBFz@ zM%>t20?@00cFW9kYcD~&Idml6XmW^`%Ri^t@ zD8IkS^uQbCftv9!8s(v#>5sK2k6vPWv<0=k*I`qik>BW_2Xp&XCjAQLV+HeZA^Qy^ zL(o7zrVY9Q^hLn@K~;vq0(@&o6}_Kf@lX!aP&LjSCde30VR{mP<|o+zV++AB63jGW zLK&%Kucw&+!>b_VX)%V5E(93JgQ!tr9Q_dHjClb}%IsOxnO}JO%^D zQz35L#>*$dzIW`GnjFD7QmDR{H8-t vrdKjO(@~zOJ)g&;Jm1DKe{F<0GX}&NKY$rerFbPXc+3#E&b*VWK6&oH7Gi0w literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/B5pc-V.bcmap b/src/assets/pdf-annotation/web/cmaps/B5pc-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..73b99ff2fbca40e7ca5501f61e3f2f29c1fc1af6 GIT binary patch literal 144 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=44ustm~1;v(TI2l^-9&YkfwB h*M71;l(nECj@2Kr98sav2P-`~e{wDhU7p literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/CNS-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/CNS-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..61d1d0cb001dd484630e52eb7e47eaabbdee62cd GIT binary patch literal 1780 zcmeIy+gDU&9LDkA-kV{N7%VIoIuhGKu~2XrO+`8pQjuoF2qrneFl_OF49p-n=(4rp z-2+WBSyWb*wJk$C%#4~H6s;_^QahLCDe_RpU(xgP!rQ!QtuDIxto6R@z54FG9(lO3 z)ZZEktY})^t`-&*IrCjkXOUXc=x@+ecPQAdtq!W?Ek1vs)gSP-YmEh|CC$z1)%QU) zpar!+2Vc51O)Z$dpuDtfp}UME(n(RGrfKT?Jl%&K*Oa8ISE@wWBNg?MT02tVv+_HS zPj`6q65WyCovl}Tx*ygZ^LwUBa!;r3%Pa+^P)YbG<|i>x5{)Dr6l*1sLt+_;5XII=qKm{NMXV<=Sutdab&!!vB3Cj} zBqL20Q)DAu5_uHsRE!ETsz^*zjA|13$wm#uQx(HY@w6mEqqt2mR#Lb+XpfpZOiOq% zg=;C?Ac+EN*hg`f9A2gLc2FWi?(ItI-H_5}p~M(UWGa25DKX9xNuga$)<`-DCq?XX zL{<97k|`G=D!S4IO9+lYu-d_s#&IKQ2G9BQSW&+^53h;da_#us134VMK{FDoRPGTCsFZY6z zw=(O&sT%O>9B_Ip(+BSGeC5?)Mk^<&5Nct^c?LZLa_74z$_-g%xPCUH1lfi~k>h>l%Q+0o(|0 ALjV8( literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/CNS-EUC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/CNS-EUC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..1a393a51e079d1b5e7898423463fac5e87170da2 GIT binary patch literal 1920 zcmeIy`%_eP7{~GFoWo_^SS+j^bOnx!Vxi!&+J)#M5fy1jtYA?KEX#@)WZ7K=7a5uZ z-?Pvrt3_pHS%)&T%d&RQ=w_*1?0&x)S(fcz(dXG8`k9%gnSN;Inb*wu&hyjz%sk3W zeU-mE9NgTosYfjDp%s%u@69_ddT88nTiQ(_(^a+T4!l$f6$HPPXY%xE?V2SsgiR8_{TB+8Vr z0`s0Cd3<}w5;G1NG`*6>chK}IX*`_1*CX$%pyRD{GDqIOQ<@+;Fh`nn(kY8q!}d`_ z70%%nw{U58w_XM!bD3>mWDOX-2;7;;ptL($1@2nJ+yQpE!B_=|&1d?+?gp@DCAj-M z#t-hnzj2Q*1NY8hI>3F^;Qm6eS7KVg16P6vZA=(Ev;pk97(6_W34lk|f&C@m(Q}y1 z;IZq0u>?#gj0Ze^HFzSA*$EEZ3ZA?aOkTi*z`>irp%vgM3$qnGT?3w33Z6}8yqdi@ zUO9B4!5#0!_tcFbaUnRI!L)UUWP%#P@7xMc6WB24|Xx8 zY35Ho20e9rXrB%2sdE||WmzF8D zqL^bn7bOfE!Cp|rMG$>}M-|Zz=*<^{kS$U~2(ra_!hozx5jVl=kGhX&4r>6cYhaBq zY<5~<$ojc8p`_*^SH@F|d8s=ED-Ot&L#{$uDTQ36BV7PL#+>OAKp&*tJgq9L2LW4^ z)#{?PI-Z$}x*9atYlF-!*gM8D3CBi=Z+5`1VfbCfx0cv8z)m6C^}`=msN=MzqCYvL zV~{Eot%Ox7nIcj>#7YBk&nYp8bSH6NliVd9=)`IV@vu^|Ks@Rr*4l{2`y~-#ohH#U zO~jKz$r$mpi+EN;Y%s|X@%$w5!YxS8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=Ij@2sOyo)qo~91%8!qshLNF; gfw7T^iLsFlh`E564~T_;SPY1zfLN|EgW;7w0IZHEdH?_b literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/CNS2-H.bcmap b/src/assets/pdf-annotation/web/cmaps/CNS2-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..c89b3527fe57ad3b32061f36b73c756ead3fb071 GIT binary patch literal 504 zcmW;IX)8ow0L5`6Ns=T<(sPF-F)m3)lCgy(%}A1wWv;C;ce;0)jHG-a`#Sc0-}im& z!>4eLH@_FB^Xebsx0I?buh!Gm?H1W4lbo3&%O+vAtL=)gdUdzbr;93QhpM?$twYNk~HkIwOJ&|HsTmI*hZ_tSQ;1)BX%%R z0wx6+0#nUkx&X|?6AzfJ2Xi@KKAJdzuLdlngT-*t36{#hvH`3FkruF82-XrvKUi-7 z8@XUJhPc31E!fTgI}xNC>{fui6tEvcTERgPI7}o1;HVKC=Yf-0qJh&oaApMOk)#(~ zRD#P?a1~10!F4gXNg{*bwh7$jgZnt*1`ihSD1)ac!hX-}_riXD_VcsfEBn2%-y8eA dv)>2%eX`#t`+c$BH~R(HFTj33=$HJP{s+tZ#wGv& literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/CNS2-V.bcmap b/src/assets/pdf-annotation/web/cmaps/CNS2-V.bcmap new file mode 100755 index 0000000..7588cec --- /dev/null +++ b/src/assets/pdf-annotation/web/cmaps/CNS2-V.bcmap @@ -0,0 +1,3 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSECNS2-H \ No newline at end of file diff --git a/src/assets/pdf-annotation/web/cmaps/ETHK-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/ETHK-B5-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..cb29415de4f5a669c1b47e34ab889b5fdee6e428 GIT binary patch literal 4426 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 VUn5lgC0;DLe}&hDRI?#j{~y^L&k+Cs literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/ETHK-B5-V.bcmap b/src/assets/pdf-annotation/web/cmaps/ETHK-B5-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..f09aec6318dbec88491e3e488526882eaa930f37 GIT binary patch literal 158 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^EnUt?Oi}>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q09TwZ8~^|S literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/ETen-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/ETen-B5-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..c2d77462d298cdb261f5e2eed5218fcba35cbe4e GIT binary patch literal 1125 zcmW-g`&ZOe6vfY1bQH7_;w1qNhb4%_41%&6h$BY=Az6ZfV9H5>nS>Pr!NhA>tPy-< zY6h8_Y2qsc1xeEk6EqM_%``zCBG1qU{U5sZ!~SKjv(CMDfA*a=@?LCVQAKgyrd+Fj zvB?w~5*8Y2(zCfR+oDgcD6v{Lm*^77PG;L^Yiup&zI(^f#)x{RsX2feB@wQ1F5HlUhRlx;3d+lo-O8<}>zg0drtY3Cx8oq0^3uRz(Q zW7=g#`NE%Rw}!GihG~y4${u0b8-!!;IuV3&BA1;{#sk!+LGa17D5s_~ zoytZz?ZQJ6V>x;>xdSvAl?)Ku z6v}Q*R)EGb2t4bAayE?V++37%$xO{5=u=$@o;CA8Hx&-h;tIY~kxWzXqrC8BdQpmD zFPG*!Hs=G>SV7-h3N9_4=-m>mW<4OJB>|jU%9zeO;+pdb$}0t3t1naQ0+d!W(~rwh zE@(^_HlSQo{>3dQKSeQJnul^}Ez{))l*^wm{j7LiQ9Q3Gp1&xbZHi}`;(1l^ysCKq zs(4;gJg=E?QM*4tXBsSSPi9kx2GC^!hmI(e4poxtJ}B2SnQla)+)(BDEd!%FRTk~5 zz_(Ln-D$-cUEz??rQUec1?A>yrfwsy>n;H3)i~KTFsEPjr9TJX9#9{lmtp?E2Bv{3 zoHa<0HkiQl#0L|fWCD!1g3C|<(~t>esGQxNrUMMFfWW8u7&Pn((3b^a!^AlJG0Yrs z0~p%~E+Z_$7eu=kfZbUs SS}75n>;w+>cVXen+8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^B!nr|V>@>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q0BE@{TmS$7 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/ETenms-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/ETenms-B5-H.bcmap new file mode 100755 index 0000000..a7d69db --- /dev/null +++ b/src/assets/pdf-annotation/web/cmaps/ETenms-B5-H.bcmap @@ -0,0 +1,3 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE ETen-B5-H` ^ \ No newline at end of file diff --git a/src/assets/pdf-annotation/web/cmaps/ETenms-B5-V.bcmap b/src/assets/pdf-annotation/web/cmaps/ETenms-B5-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..adc5d618d6912cb3a67e4745b63764120f93d17f GIT binary patch literal 172 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?HZDrms_msWUA}o$hOe?l^;Xn zWoOQ25yqxk#>Oidj7*6<3u74@nV1+G*?^b}i1~n62#CdiSPF>cfS5@MD9-?tKV{GO GP7na4qA}0_ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..e92ea5b3b99b1f20d31c9760481de0472e72685b GIT binary patch literal 578 zcmW;HX-^Yj6b0a!LR#wJkfLdA#QItYF__k&#-$pgwHAR0XbY(^j9ToQiYX4xOdvHz z^BOzU4fhQfs9HsF!Cm{wpW;vPT)#Xy_vC!JuD|J|F9gk~~n5M;9B5#aw zmMK{_pRicpnUjV&X_z^i=c6kU#UlH^x0uN-Zcb5|;haS`AM8t}1~Vy1mV_j`W*7F< z5~8j%Sz0d&CuDX^6mmYamwIXm{c=f!SC+Gir_7t&NfCV zHDQ96hrp{Ss5KL(!Rub|rV}hS5@X=)UhpnNoCixs!TTNHgP*X$$29n)fn}8_g3tZn n%SQ0kP2|D1ec(GIE`T4S;O9>8YYj04eh-UqLp>(Re@6cS^@+ph literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/EUC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/EUC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..7a7c183228dfdc5c236b7914ca68298520ac60a1 GIT binary patch literal 170 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>Kf{->ygO1a1rBPe_qDDft*Zx sgPB`_!~OsLz3v`wueYcFuf=+=*PWVn zy}YQTs=kB}N|oa#DU8z6zYh`Dt1F6VfA!-q5nkI&;jcpi!e4uo({-;al$3^_qm|^) zpL@-rqgJKNJsRh9j~0)l6(|pYkpM&wCn{pWa4BL&Oo~`DavB&;fOTYGM8>P9z^ftP zH8J5eBol4NarS)Pwc{KmJzCY15S0o}^}IenEh9v&mPkqq{?N;I55=e#YOQnhK90nI z(Ltzn>0^LeuOB-H^@eHeJk$mJP$LCDb2vV~tQ7$=Ge8-qeq^LcNtR z#tYpJ9(Tyr3>q*_p*G>D9BOms_!+1zVdE0iRx); zF*d@N2=$J^R}A%TfUg3om-yzjubVmrb%0DIK^-(q zoyB*%X(|Kikaa2_>eGNJUi6uMss`$F$#|XyPc?8Ze}i?Zo#P8!nCh3Exm1|uZGLH) zE&zitT>(bIrW>%+0j=dz?8@|tBm^BdQjGeX0 z!bK{~o&gIIX0yS9GiM74JE5N)Bz^W1%~=#)7bEXMfO4Hj#9n*io^z4ge}%M@=*z-Y|dQZP|`%eTe} z^H##*jq{;|oz~CC%8o*6oR0%b#6g#Hp3_PSn!f;+Oy;Y>&N$}lz|NZI+rUy>^BuDD z3XNPKV5yFU7_c<^LMoWYxNs3H-Lg;&mSI?^A?%!S;YYA6EHul`B5GV{0n5h1J;HLx zLOWr(_JvNc{PczAU>Ed@XgTE|&Hff_)#&~0*v{7byTGc9{$4rgDvk1UORIHDput@(BBZEL{d`v@8|ju+y|uE!#_}X^D%z=~!w7`zdPaG1x7~GI#Jc_PLu)x@B%o zbKr8kY%im_WnQVpyqpWxie*ku5|_DAZMNlhuscD^17LT}D;7DhoMPn!VP4Bh2-tmW zW*IJ&OSD* zR><~i6sz1?*|=H@*5h7n1nZ4neTw6AhP808KGRw(-lZAV5@qLgdS)#J?1^QKThVV= zy9YKv);hojPp)-ik82phx(Vzl*15!IvbB;1u3N#LN3C;1{-#^c2YX>yzl7sV`#RV6 z(zSj=vQ*Ke^>&i7;nL|gij_FWMj6p>G!nAWM8Y>(mCDQw{+(S*K*BqZM5?o~J0KaW zu0ca8(TH*in%)V`V1j0pg<2Ze@_&X0vS;L$g~q>!3M;H(Mlfa}d4+$#sK@n>{4veF(5PfbjR(iWvF6 zhQz<`BoV)!P(=KiN~(VK5bFmhV$%nkBI-UoBsV{F@!!Tj%82EonGY8+esn8h=*QC} z_~Rww`B*PmZt(k@${@5rE+I%MfEHX0?ZikrG}mxGw3Ak7AjJb$Y*oYmz_?WlElSvGlyuFx@OS3J_fm4+rcGOIoY+4v^Xs=` z$jR*-61QDN%-g++SiAk4SbnQkM8j`Ck(}RJ$;nUQ#PrFdh{C7yME|Kscl}ejWNNN~ z7CkINi%~M5#h!=e4#9Djk_n9(h$hNH8x?j!pvC9!P)v7Wry2fQ{Z1>iQ;r?4WV%BW zclrSBG|am(91}Pu0=^rF-OZ4NyEJr{w>{Ci`v@Diqjq^ulFXlZy=3QSw-n~3p`Shc z)EVG&ImfdQK40UQf}GDkC}RBY4n9dm&hMFuc;)vFK1qZA%U>rvFn!75m=5cg0!0k| zQo$z~Fn(#~cn&#Vyc{zj?8V4JJH=ii-aN7FC1c%a+slTQ6}49kpF3`^O%@(f-F^U; zW5~V*TDEK74lT#C9|!HcW4}Qb9?`)4yU=oz_WLp6Fda~6d5(i*X!)jtJc)EvVm?`N zbkH*gS4hM`HxUl4e1s_C*+VypI;>$oV9vai(3ljX*M8dvClG9(a6tU>*Z4&m4 zNko6%BJ*#j@=&4f@8HO9H=DLc41D)&i~6 z@a++_vdC{Trg*~2&EK68k!jQSFxk>Wt>62hRoIXCi*n6*6pYaUXxHP9;xV2i992l< z`7^xgmdMj=OqWZxUYd4vgLkeH$;U>HRlsq&Pi*=lK@nYl8cFG&5j=5!^4L}W=dw=t KcNEe6tK@(8IPMSt literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Ext-RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/Ext-RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..ea4d2d97b8bc1df2abebce0d4f8c58789f723eb1 GIT binary patch literal 2542 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 n1WGc8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>RM5v>ygN#sKmI}pMl|k4-f~j zG8_m1(*FERdxM!+_J#r3kw6>*#Nj|3#vr&i+EGF=`+zS48-q}zgLHFIt0N-=1WGc< ggIR10jYd!*Mh1jnBC~2K<36T-PyT%@0*w1a03e<=y#N3J literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GB-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GB-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..e39908b9844939a3c6d6baccced5771b8c1b1b2d GIT binary patch literal 549 zcmW;HX-^Yj6b0bvh=x@^fcgdPo2C^bbR!B*V$ecRss^bX`N|ESR}dF ziYT(U;(|CJ$SNud2>cj-3g`OeNzTp5Nv`@Y)R0Q|8Qq;-8R6G7pS#-U(?lSVit8fW zXJ+&VrU>?Qq>OaRh-LJIr!bIAivN967`mw&y?hMoy6|{!1{)fi!;OkfA;o61EZUXA zrr7tLQB^4WPDMWP#3Gg@qg3suI<?M`$=f?v}^3bnaxfB>#NYMU^7k zeoSNs$ZOA)=ecs1NV}1XlOHqWu#XgvM&(EqIpotqrVET-1<#z|xynSrSRHs#&h&%v z2$-k=lVywnrf!3m7?rPznS0=M6L@n5yv<|c;N2B4eVQ2r@7uwLi{Rr4CIdc&z>E)k zKFTD)>~-+vEU@sWv=U&h9?T1JMCOO6LVj&UT(|%hOPPn@+byu<2FpcEH(0p_R$XB2 z5EBFIm%;Z_%mCPE13zlP&*O{KFoB0odEc2XC8swyI@Z{ E08&E2d;kCd literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GB-EUC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/GB-EUC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..d5be5446aa40898742183202ce0624b8acee5234 GIT binary patch literal 179 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;qIjC8tSa;ktnio5kreT14D}) z8$(MN1LGbEAUm9ex5dqlVUJX^5<`m<8)J(L6GMwFBf}nPZpIb|AT7hl(Bdr3utyfi TmIJaQq#0U5fOIGW!yb76lc_S5 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GB-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GB-H.bcmap new file mode 100755 index 0000000..39189c5 --- /dev/null +++ b/src/assets/pdf-annotation/web/cmaps/GB-H.bcmap @@ -0,0 +1,4 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE!!]aX!!]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." `],"] +"]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "X~']W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"]A"]"]}"]["]9 \ No newline at end of file diff --git a/src/assets/pdf-annotation/web/cmaps/GB-V.bcmap b/src/assets/pdf-annotation/web/cmaps/GB-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..310834512ffe49cbb7ca903abc2dc1aaa934e6f4 GIT binary patch literal 175 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;_jsDktm|5#L!~Tz|dmH#?TVR zz_>>O$PQ=WZE>?>*dx^plyqWaY;j>?Xt8Bv*dxu&*x~@BWf&P+oTVA|$O74NKz4*Q OLrVyd4rO52BM$&=>M(}@ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBK-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GBK-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..05fff7e8254c995031783fb3b4892d58a6b176ac GIT binary patch literal 14692 zcmW-IcVJajw*Gg{?YZdJ3#$D519tTp;uiPU!t^q)QQL(gGoLoOx4y zGjDG1EshAnz!OD9L7xH&h=}O#CR@YdTSI%i4SGss{{{N?6mS0o3tg>e1 z>&mf}mHF*Eln)y?c;wi@kRTvQ!X#ey%a@R6E0`(g!&U(Ew)U1dVe0w8B)~Np>VKz5 zntx{kUImr^ZUQ)Kp!-l}o0(~xV%%&>{V){`O%gsVgtuGrhh5+=SARGNu1x8}VX)1@ zhh<9kW-A=|(ud`6Z8Cm160T`!A5MWcz1fFLV5@{*%DkEk{|H=d2~Qks{d8AbA+||% zwIh7(Rad*ho(X>$e2a0lCp?Yht0hX#nNq&t!ap|d>J&I7_0>xFl5uq*{G)Jn5qxR5x){zm9MlSDvifQj z{1c?BHSmvyf24GEIT|F*)s?WV)L&f>UnlKH8raiRAH~BzM*4^op9ueW_$%}urNUmB z@KFw2g~cDWhJBRoqw$Jiiz(?NGn|w2KH|7pp>juY)>}x&X>=%D+4D2It zZ3eupacw5Nb8*cAPfNH|(zRLebT(d_gFp-U+ETbuq-)FIUJ-w7g%Y>blzd%=e=r== zaXk(GA^Pj-a93-uH-&d}qw57q(pIbXdLQ^pYsSY*;cX(_(84`T zdqWTJ(v~-p;4$Jx54fk}Mo-w=NHKh{wSfjo% z7J(YWjY&$*b`v}cc zV+8^VZmdLLf%?WO#FnStSdT!pbTbKorMQ`*blq;n%~S+Pu}r?1hQKD=%tT;0ZZ?9u zn{=}=>{Ah|QQgc&V2SExF1$TdH=84{LVdFcL0P_840mqa&GrZ^!p#!6O4K)dp&?Jc z*&l%o@UFnk0SHRkn*$M8hrmX7%cYyc;h!qqEJt7=8VtBO5)F-1H@U^la&C@APz6U{ z+^mK-Np*9nMYqEQ-w^KZ8<1`;2Rs{rn=8qkK#!ZNl++#8lK*r-piT0B7Qk=R{%0+m z8tImVK%w@Q3W2ujTX6`qH{MEuPXk*|=~fPG%XGJzD(O2-akmQLoQ*&UZgoVU7`Hkh z&`!S98JW=F8ttu>a8Jgq4RD$@w>H8v&v07}ZPX92Cm)+w8HIl1X`+Z zXTVl0-Oh%;z2*>72m zpYXsIB!4m(!BuIWOh9m@`jdqSZcu$vjo@nSC(96Ai%-@fxDn1)hELWZBx&zx5Zt7@ z6ORzochcc&rn-{_PxFL3O%=m#lj=?}g6j--I>0kUd#426O4S_`Toaq!8KmUxw#MC= z3wI^%DDZTEy9GSWaHj@d3ad)Zon^376!y^GSp#P-{6+B2$ESdO3hX6~KIMr{Oa3$q zE;8XfeA))VQ6^lbbCylKOMsb8i3EZPJvZX79?su+lXL-lC;;P zxvNGnKJjiGg2}kcX>`HeZ20=b-_3z@f%@8JyXTYz)-Ps7L6YkDIP=}yab(i9oLsRMw(%xMKTW16{+PfR! zNP}Zp+UFWLXQq6fr5N{_Qa&fo>0n!pV0+kC!qG|dd0)5&Yd#+c&+4qthbdY6teVd` z{0e-&0KOH*&le)L1fQ>jy`%j3D!5hnd@a0s`SW#%tG$D1vQ$;TIh((%YtfUrbQa-?ldSG6TV`aBa-~vNPD@VFUKHQlK$m* z*jgdjH|a}Wqi)idygI!!U#>^6i}s$ZG~I8K?it{jrMqW@Z949y!Dg24r6brwy4MJf z4hYYX?`0uK1{^8fYXa98`Ccx9eQ>WC+=~qNn#0#wd#^2Q{pEXI;L3r!4}$%qd)<}n z{Z`dIiqrPGdwpPEC*KZzDISM9)E8noYUcJfnfK9dsER6kMMN) z-U5VY%J&u{*i(P68g@y#x4I&3|A)?vo2Tx|^>qAK#=p`dQzKLSecxQC828^+-`jw& zMfyrcxP|sBHNpkzuZ-|5!&k}hb~JvKVv*i4_4}%+lJJhT+gH=zt;qa36`m&ex-|l3 z`Rg`lkPTnAgC_y5DNVknR!dL}2TVy{kAruU@#{HoOiKBBDLhlv_hs0->+b86yaQI_ z{Uo@jCf(0LV5atdF#;Cc?+lm8c%J|yQNG_F&Kc7E0SHXT{XwuT)ZM2hk#+ZZLTTFj z;}Mu4-=79McW<2P{tP(u(*4m%~w`yT2Ol#?k}8HU{njIGVtpgaVY1C*?15SceeHcccPE{AictHu*SLaLz8EoXYP#| zH>P_kJ#(V#EYiVsss}kr=0Pibli?yi%~n0ggR?c9>l;020bBdz2fbnMg9qjC4A4Iq z0aq?;1LGb{KzLl-0}FiB+6RkapV;)lGK=bvsna(pR3zxmFy+6?t~)HWm4-;IT@Ci}Zd2rX;(-7b`FV z`$p~etrg?DCiV9n5n3UC-wnPv_4hsDsLubsFGBP2{d9N`_x%hd?_DdtUx?63{r8LD zXbJbk)bE!gv|j&E2WPXmheUL3;L=DBa}Zi=eApDOe)7ZCu$8MGa&^6=hlHi-#D|^X zrhqXav`YW56rttP!{Kn7jStI}#G@wp;UqZb?xae|@}mrdW!0m`a5s}4HGwl#`zRNVo{5hN5!PrPbwwBmEy1H+ z2(3eyJE&+M^+uQ@F2$n(2ra;)fe3BVJQ{>hwd&DugeB?GNci$~k4D3}Lj7nG+{;yu z%m{6e9$64tBR`sr&_?Z}xd^Q_JgQO>kC_aQC=h2GA4_nzi+`Mea2XyGn2yyy&VgsL z>Tv;Fl)zoIk6S6Z$E>=?9blU#Kkk9BUiG*a!aDWieh9}&j|U=bK-eff9t@{SemoSO zBsiyP9&?X66g(b{uu1)R1$wsXtDEYr6W!D)^|YX5q&gxW_g6k+&gFenN3NSN$YW$v9!v zJmG9-XFQ=8HOD`p9$wV+2~lk~)src36lFY_4jb8CuX?f^_P%(s8i7*dlQnRZNl!KK zrz%+|P0~{xJO%Po16*$)I8*&J9M%0_S4Y zQ$ml0s;5&BoDEN+>M4;;5nO7+(^+sf)jp+Qu9TiGgKv)fbOpk*R8Oh-rb|zGy#~cS z-3WhoxLYSYqh=|Vo)NVcO3%ozM(J4&94n<~P2s7+vpl6)tx5eXA1+CHM#C)yw$Zw0 zWZ@=w)&apOc-9fFv6^R{5L|%Z9O+pPc*o;e34(LwXT1=dp?cOAwo%fvQUoVU&j!Mk zj%Qp9C$~ubYzTsr5L_ZXD^s#+t?FkZ(2$5{)QMI4XJg@9t9mvKL9TMX;n_@hwDPls zaB+fF@XS>`Bhsi=J>yAo!zW44Rv|dA&$Bh~w$T67-J&^VO8BWi#noEm{WOALrVxog zRVi7gtSLXOhpV~zc_P9S;-3?__mZCH!@fj%-W=iaInN8=Yb8H7Av`hl`9QeW>z_}6 zT_-)Cf$${ta|`UfbkFC)lZEF?l#J6R`8g%lV(EDe!jq-v%i(LOdQLDhL;ZX${CVo< zo8T~OepbWT2S3LlJSF~TBRs>TpBuw9#PD;rl789>7m|K1fHztCxhs5n{M;S(xhX%B zR|cm4JPhvggrBD)U^4tnSzMv|c_qAU6MyFD9g=9!{%C(%zfh^4YotQ7_3 z&05iX%;q_w-S{_qh&GM3B6ehpoujD{L^`#>*AAJFFipt&mdgBDW82LqIZ%cl4jS@3p;t#7jzMeudQ z3tsj{@{3^zW=Jo};p-1i8~MdZ#crOQFcq{4zvp{Y$xI_+_Oey@VA1QkK*&lVsz|bjA1wlm2BsLYB0b ztr40ky`-?8rFq#Oj&X4>2O~7Y@N%?b_=8n?IR);;s+W|-X8Gkzgl4N>Qu@tFd^z8u z`J*ZA4m5pc@=@o@&E4(UF z41Y4=RZA(_0k2vi+R5;$HKJ`*ue!iCQhL>+!tkewK6&rx-DQvG+{?Px_@3dO{z)fx znkhwjp(xBM5$&OU)d%(kNv~+77vj}ei}p{}%va+$8x!z~V8x#e?W@HwZ*Qx_{n-@v zih^SaUJ>K=#j8zlQsQ>TZ`|#H#lJ}w^`EVozqJDz)X@Jn2<9Deis3IN{5AsN>Vn@! zBD_TX+cLP8Ykpge2A$!zjTZSYb>vZIvnO*1xmu-P3%7r_Efe_f~}=NSSfkuvhN~<=fRZ<`(l-_Exc5ydLbOLib4dsj!e+J%fGZI~3`UrSY0qXt46(@X zTl0mO&n`2S#Q!!Wh|LE0GbFLO5$w>4%~^=8GKkIjh!HH(L@7=Zo7*5l88cNQHuth< z{@V&~4j?x3P-7d=RBSGVd3Qf0{U0V-Y$j*r!>eWUEV!%KV>Y5CtX}}%5@j}Dd z!sg|O_JnUHb1UGUl_55-gr`(1-i)`%|EM$XX~JXNv(}>h$7VQ(iV?7tCL=m03r=k_ zIJ*#hS6lS|uu9_1G^we0GehJhi8s4Q{5Mc)EZ!U|$>Pn$QWNoJHT{ZP;+3TTF)>Yq zzW`zjN1C53wxl3Bo0T-@Q#4{r0itvDVoMuD=P{uTQ)&=f`X~wiV^xVQLl9laj>F+h zVp4`Ek7P?ZqKlHmmeFvJhN~&-XPWm;QquoL_und=*g`R$kRY}!Ky(4WvI1kR$h1m6A7+LS!|Wj&>~4})mZfZ;z4cAfO%i{(iE|^JK1OjG5&gJ z#MU?1r{HyFWQD{1Abrg`|2lypA7nCjYYC8@E;{O2r=2 zFPnbZC^om)Z8%V5(c4x^po-TVX{EXxdH>wI`SAykA=Aw2o4t}(xzt~9rE)3>gGCmSK| z`_@$mwPM9;geYNKvw{jHoyj`*`!QJ$TPLm9x&fiK5ZkEEx*5eb4MN3mc96uj6u9`6 zIkMPB7}bmvnea$jv8@q2>){!WP&*Rk!Z}V!v0K@k4`&6No59wFrB(>N9)x1KJxj$1 zb%b}ST5KbVp2Q*P+8n@ASM%F77QMs78gj0me_|UsH`E=h>C4?uWTAu`zs*!(a8!5) z@0_)(Ol+I`Yu3SmJLl}l+CN9ha!euZP`G9wL|dUVe9Jiq-Kb3v>IAn&CAO6z)Qxi) zg-~xM6>#=Is0+V77B1SE(@9QyqAQywBh(j8144b2CJrlyoeIYi*e8)=Btk!&DfWH?URcf)l5kg}S zsxXM{+^X>$qX>Q?$4nJ(9zx?dcCq=L_DV~a3GQ_)wMWRL5!*Y#Qv`bBQ%9$@VGWHp>lIsv&HuDWXoB+Cfk=%Q)Tm-Y*%1D5U(VM6rBp0Ik19^s*x@U5}vJSSzb zGeH6gN}`Xfx~n7HS&3p-C)nE|{07{u*k*z& zk4=N%<|W@n4K|#WL(GTON{ZjaEM+kdXBTn65SB*4XNG^eTI?bdwKa-eli;y%5_90| z4ew+)%itW=NbH(t(fh5O2Zf%^0-bm(mFHK@^LvXT(Ak*M@2wn|56@DJ0TU~mBD$1S zlqz~ARBWrW#anc-H%}06(f{1tDBdcw$N>uKw*NEM` zof}kQcUuIy$YOU#iyS2V?k+IDo2$f!_?g|~;204vcGD9?uHQ}5N=X&F=fG>!iruRa z7?vn@Z-mcCYO7Z4NkCwTLF}P>dMLymy8Wq6_T-_VnJo6u`kTe1$o%elB`$1A6np5{ z8iBwYO~js_u+3x#er2#m?3n;ZDhHcp(S@xfn@x?+0ZM|sZ4em6%616!Wr?2qK?rn$ z*xMC>G9@8mWwsjvy*XHS1V)pRK(;HqMI5gb-ZIuRBr#qi_6|26>#1Z$O&n!30+dsG z$HGBzx_2A`9a%XZ4Lq^EbR|sDiM>-07_Jt3xqT@lnFo)~Aok8jpnsCsTLb5E1O`fC zpRB}3xr_VM@TF?RK6(drve=h`z+}DHN3Z!fh1`DIxL6AOeO$=|CM5{;(20G0;9L_Y_Ho^>DH$}gaMUqMT+Esv_Kk%- zLoN1M;2Or-xo`~NJm$eUpQKgh<1|JZ>dYs`Skw(~BRWNg=tMCRp7wF@cDCpmO#Q^Z zr35-}ccAinyT7CpZx0c9MdIy|l0m$^LNbcCHz{!+aFh2N;muWx{qcxSOBMU6KNm}4 zKZOl9dVi7mWJe|K-#pm;g!?l!Vt;q|*0G@vqSIxuzaOHOM6tgVQ69v8diED_zzK*> zB?-~0fh3a=oy^iSCE?$%zeeY6idO8WI-=z;K_~XlMbwPw487RD1kP$w5Ccsz*Cr}y zADZID{?%}_mc={tK2Bw#hij!qykmsF5lbm(NM?!lT7Q*zhn~I05bxx|u1^r}CTQ- z2=~;91H|^d%%@u^+1Du84y;7D4=LBeJ%=RpXP2(q{o}T?# zEcJr7#$2aW3a^`3>J86mj!Z6~hCSFH{z^{T1Ur@8!9nokv5j`NnWbUykl_xN!9S0c z~^EKii&yX8&kk{+=1Q?&;O+3h`+5)&=Z;1u|g-m9{|GGptnrqQr zw=z4A3tdT#$kdm~BR;r*u9_aNGm9z`uJ7`+73U!SWPB%e@2b5k#mVL3e9uZ61L10R|-UZS=`p_ZKK55rQ*Hu z9GPaoA$o9zGD(Do>hDkroYPohFqp9XPzLNPm^6Z~F%t%dhA?690T$KAZ@E7KpQpMeR^gJ4BqX7U!3UTC=E~CTc50?P&ggt5}Ku_-&3}2-i&bH!;@= z{*ACxyBuOLBc2s}u&{!q4(2lhl*Aj1OwhnP#K0_N5(V5Lig;qaLzM3fq#F5QJ_?w@ ziXI3USn64kd}B;N-nU_IM{&BRII~Hd*(hq~iQ2j1Vl#0uUtFBAbMaQQI9o2x7N_*0cEy2i;xDblg=IU|@0lvz z8!74+SyVUHkgA*quYJ7@qc~?PD=H93V3Ep$u2O2zG_^Q10sh%c$fdnh;?PXER%^wf zIp+F&CFiDzeHOv5XTuT%7@1t85r=9JNatKu!^8Dwz%!qPHE<7#7l+m&zymp~gD(p{ zim}56xW}_19u6v|!-?>jSW1I^tVSHpP?B$QQimDz9>ydWu^c9}R;u7$4RN>tPDbUk z*sl-)8u5pzXd3Co;o?d48!ejuP=X%r3b@~(bKx+33ib_XBMuKylK*2(5{DJodc(H~ z;)n!CJZzKUC{T$bGTg-4iwj)^_?BMI4^ObDZ>^QYk=NImQK4`*p66;M{gxH>ar^+IOv}{b2;Zo* zMwrs56+HB03}satgxka4iCsIuHV1{dBvi?y%p{ydPG+XS_A3i!;VHo zH)s(Y2PRbPTwvjaA-BLp7cZa^tl~HHE zTS3Bi%_2`N-mR4M;@yQ6hEGOC*PpbUTqust6c5{}zy3z<-kESchpAhUE&4g_oeDmPw4kuyCQNFC132`(Z;dqTW z+6>_YR`S7vfM<2{LLakLlwSqRg5$wW8_;Z%;%AK^yq zWrC9s@8}?evzZXCXE7N9-z0<^a{@yV&SAw!ILH%oITA5Z5yE+JOqRk;*?*jpdB;i$ zhN>7wYQnishOHM|Q`ttVcPZyb?|42-v*4lGe3ZCJ$7DWyOX2Im+(LxMaDc_|b}?UU zr!@Z51Rv)?1Li1YbSn-}4c~e=JM!!Fq&GK+qpRQ;0&z@2kk>1NIV#rVIB`q`8{y@# zMA)0cMthKfqBcfxEXAVz)S4oW@j}MdffXGX1|n7#$9ltj$*5$0#!qf!u@78X262qG zd+!8sY$$wGgU80h(GT__coRAF1b7#-jt`cIYL88UkJinxsql2sh+}*=LX2>%vefX| zD)%VRGbR40hxh~c_YWN*{zkU`8^7|`Drrk!#qgOREo1r$$6<7I2nVl%i!Th8Wr$-- z&6gG^Nq1?A9@ip}YZS+6+;xc)$7#dlOX7Gtc!%o5@ec6!fjCZa-Gm9)6`De5Fun_JxVr0)$_WQwV!ioH)T-Ms#$7 zK3S^d6P*#>2=@qf?ShCN5pMK}o``5=ae@)UO>ieOM{~psMeNmL3O5m}K= zoM5nQJm*~o2hEHVqm)KpSP{`70z@<#abh$gy!t05Ad*m)yJ)7DO5$Lg08}HX@Cg%!Q4Ndtw112^^h4 zjvx!EU{BNE3Yu96}t+-ctVHV`K@h%kan>~&I$2*ZL+C2`V# zNM|+?Y^+lml+G>Bh=t z@FgHp#9VXpdlseTJ#HNrN6#?{Iw8`8Jz5}As1_&50wYLQ4DS>sbimahLR5RQ9bBVW zLE?c-I>S4W3F8m1KgOY2^J6^_AwQoifqfI_+8dGnBpHmzAd(D0qy_BBi1b2)nCav& zMEWWj_b60Ol7CCttqdNXWYWb{lK53F+ryW+CiU_YEaat`W`38xbn*Z2T z$^O~|H$i1>E+UgvqLyxTo;Gh!Z6SOcn6yHKShltpuJ!EG9ua!KYC9k@ok=Iyx*9}n z7kH+#tuG=oiNyNBOR@5Lazjg{udR-pQtj7kBD1kZipLoBTgB2_rc(9S>qPA^88Rd& zDPM0TF<-&tbC6MpRI)_&v2Y>WOJcyrr|7MlOKPRY4Xd{#RX zktLixxugV<*UOnFMdl;22)1etx)9Dmh|FVd5h64*YZoKd)F^7nE)-$4>ky&XtmT%j z;`}!t(p)P}kvqCb;#7i?cHhc02`+NasT4%IBf=xAmc^-5_|p(s&0Gc|)U&4=BeH^U zG+T<4B4TEaKDBJ~e@#|$A8?YV3J_Tf7cuiG>eyAJ=iX8so+5V?u(=qKbt-X+n56}~ zc1DDf>J+a!_2el!FwUveAZ%*!&kXU;bm39Gy;6z)W`QhD z8{k`@6Q>Dz$;7AA;UKVG13T^G(;0AdgFBAZjg+i!tO)WA7(=?8>FLJsjbdj$`zs@1 z9=yv))eK$+-1!n=B!a^cB!ixAj^Jn#6e33LdAcQnrA!#xTY_MP`Og_j%C{ysc`m10 zBghMXx-Ei?^pAtRv09w&07qMrcSVq({B$?i6f~qT*8{=91>!XI-M3Z*ve}KVbGXf? zX2+|d zF^JO};Gqz!qldh|TGZ*`<9XC2z(rHFj?YdBIqLY@rqCejQsAM}zK#!D2C=d!?0nNP zQ6=hf;fjMhmA#u=wEss)S=W*FW4Cn1Z`*I${JJbu-}V953o-Ax6hyT{Zjzb)s&iMg5(XgKVU^)dB`_CLQL#c2F|E z=V)hg(U6fW&d`%U*Xo&Wh?ymEhL4C-ne;(y2E-Y1eFEGYNKEg#iBybplabFbAVa=8 zQ;ra?@tF}8>3b_j8dH({{eJH-;pi;v-S$X3`U&@P;pn#6uz&r&vBHro{+1;EmMB~u zgsZ*y<3RSRGyg3?$$v=S3vm?PgM5hE0d{iw8TwNC!_}3!MTibli8D(OeS=@Ffsgjm z83q{3I4g#qHn5ThvXP|?h?c`iKVZEI?h=T44ZK9&^;$Tms6{=^ZN7E2D47qfi1MiG z(-7sW{gtw)C(38suYz5&@j9+m&!_bS-1T%3^Gep|BTDpH-yDuMtmMPD8bqn0>x;~P zTcqSYGQmra+Bmp)y7hFpje>ibM%1^4gD|GPgA^`jeOELzX2NZzXQjS7!Xw$%6X8)> zQQsGC>VbOV>(NXIdKf3E9|Ai$zkW1=lqU6K5ZlPoSS8~T1y}ue1e;1hUby;+2sUFf z33i3`eC?Xc(o_T~?dqq&Lx9^Io^D+2Y&hGoiH@_^Q=f1C`!J>XV_xoh;>#BB(Z;V| z1p7R;@oh~3+zc7dVYeml^<*92Qc#)IFNc${mU=!R8ORmV%hz5n>iJl=i7d|Q5G+!O zvvCM=3TMdy-4JZa`XmI2GtQ>MMaRb3G%46xNq$TT!O$NccC=*|3Xg?wQ+u9efO;+~ zauDPFI-3U@HN@F`1lt+J*%s#aTPkTkFc5y0Xo3&22Eak|cD6sfoc!5R*m>RyjNQoge%Kh&SH%5b4N=B*6+W}@O%vV{;q58@*;o9t zj|eW<+tZ@`VHZD2*SVuVIEgCy(C0CzaCRxo|E*E7ek41bT@5Eiz}XG3t4OjDp(L$1 zCn1ywH$!L%8gWjK5c%mGD|#f0bIAxYu5qpzLMaH*({PUQ>7{CMt_4CGc=)(GLrMRU za^M`_HP2-;z3hydr6H6og)-q*RN@>1V{sg?GeUF&p6iMbrQf-3aJFQLj=J@1>uvt; z*-FL}N=t^php|G`15$7f%MvuX{1!yRM zXE|cC5u3%a7g{t=tVVH;ft1(^q>6LvX!w`I{Et#4^C>ssd?I3N4dQ$n8uB&bd{e~c zL!2jC<6S<_d&B_c`9cKCRpNXRf`lmN+rZZ^Nt`c6tdbpiBQ}SXrSO$l^iQp6;yisq zuHh7d=O^%!d62~UDa_=)u9*h&Kl7B#XRp6I6R~`DtVFCCKR*|-<}58mtR-wEh!twZ zc?B^7%k!%dYmZoQoH$R5x(#Avg9{qOTESal6c@Bg(lc)Pg;d14BSr)ALLFvG+*CxKkHKBgR0h zUMntCDDgkNp5-LOMzGzC7!9ZkGZ3p_i910`V$ll}|J1b?Dl3dX9gcPGt{3mO67RPV z?>86kFA(p~7w=b#_m_zGi!IVmb>{z>s^mPUw7WpyM5oJzC5TO8iAT@(Fn?haVtfV6o$R0z7kMBpZT$i6n2yr7yBd1lfB3vQccr{i-X|Mz-?r&;fP9!;v&Vd3Q?IAQ{Y_^ zCob}VE8WKz=fXFTl~f8kCW{ee?CxTflJv8c#cD)p^Ihbxe+YFh@)r)(9C{g|afrrq zUVLszx9cSp9JFmNX%Qt1e8C{eB|6zhBg%knl1^NrrJ4@=Oj6_`%4Z}QtfK;G1aYYq z+}&BvzyV!>m-uUdm5Jg~JH_~dCv%C>0}W{yRLRndO9K#PZ2J;Xg-^{I6{+4TomQ}rKNBz=2R6#o3o9^ zY?a&Oo#XQAQCj)Anu&UvorTvo%La zd&%hTV)9Jwc=d`XkoSX?ea16ASWF=*g^&>Fuy9!?sP%bA;C z(Y>Tc^72G7Y!YLOm*+8~@K`U?aT4V_H*tBnlJ={KBd$}{5LE0h<>h*2BS)VnedF{;fg^AV#% z@CtvfL1}fR3Ngm;t}KDOhP{^|#;SG<=j<8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>F(sM>l*5;>yaq3a1ld`Jp)6F z9UDVS7z5)T2_QS1g}24cj$w~fvl2s#6B}cT3ll?&EhEDoX>P_A2OurO$k5^}&9Fxn U$d&`LBcvHxLV$EA1H&G90L*YQ;Q#;t literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBK2K-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GBK2K-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..46f6ba5967cdfb381f001eb1193f17b43d943962 GIT binary patch literal 19662 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 BHq8J4 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBKp-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GBKp-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..5cb0af687ee20a10ecc367892ae49d7b1e74acd1 GIT binary patch literal 14686 zcmW-IcVJajw*Gg{?YZdL`3xW@%tm$ZS8$_TWfu5t$pQtV+U0&TU)(w{(=?xor{Y* zweQlYQ*nOD+^X3X`Qz3uUr|xHJb(DoIaSrms;Vt3D&}^GD_OE6|Nql3&#$gnUQxa3 zb>+B}jfx;^7}FeZ+}Rf`0=1<@%3OVXsK|Ck079k*+79UZuUBq7-hmO4l31(J1bEHXKFr z^#b@uz@DYQ-Wrb4^7YPej)toT9KCV98~nrJ%#yBmhht^-^`3C{kH0<^_K~B*CrY7E) z0(dOxZ6e*&!aZDjQxEU5 zRyUL2G2&)VxM$#IFWB2kH;dtGXSmr1?#b|*77R!BD&A+TC|a|s+}(#_=vtbunl0t;|+B?1a= zu0mj;`sQlHR;1qCfIyXWD+z&RxRs)G+hN76R0K$|T)vftz-HXaL|_GOHG;dlbgMD! z(-5mx-O5H_sp?iPyggO7nj^4MeX9^bS-w>ScW&IR4hSs9tzx)})wg=1K2N?i0D+D0 zuEec@2uj*pgAiDcz$SRhq+284pC;WZLtqi=4Y)N5^^H`wxW&zKZjD1w1xG*Js)9F3 zb!(YLx6=gQQ10#!f(|6XC0gx>9&MG zf%divfp+TKaR_uU-cEu~16wcYb`EUIb+?-;>AOsEw+rB$gFrEEcS4{Dw>u-yUcTK0 zp3S=3-QjJ8+x-ye7=ODzY#Zg<btaGEu@H^DRCa7PVqrF*ozx|$`hTQ{Am_kWWxFQ zv@L=w>7V;)2RJg-pN_QX_L{nUI+hDG0H1N8_MT9GrsY-X2Kh6ilDgNb`z#T` zB+X};aAYTZ)&xOg)@K|kuGMFQ5lq2nOW;$a&ngkrCw|5)NYs3`3Bd#!38^`J6nbgKZ6h9bjJtM`z9F{oop+`Fs#OYqCBcu4L`EYCh-iEAjb4 z_*NP}Uxe6Fe7*|yPV(og;a1`Eb@1xt&(|ZiA^US4?-0!wS+F<57kLP#X}-vZ!)W-T z5Vj2kUv#oaZ=3pmF;Pi>+uG#I3oCv*7T9T9E)Ia`j-=6YmH#P zq%V1mx=Ua3>h#upxdFkh+6Gx^dcY(#7~q+$YcRq#0}W}gndOFb1ba#ijo|2r@JzWO z3qdmAD5;?dTw~>iTm<`~p&8tZ4GqoV>!NLF2ipL-p(|WDaQ8*9ztqq}$v$9JHBg*( z&^7dheZAZ;7;Xa^h9THlZlEk3EH_Y{rpGsof^!CZEfDOH&@c`4@d(e58x|rwOKw<# zU@v_`73`AKu%q4I#=p`d(;`#-{oY)!7!TZ0H*7@MB7G$z+(P@6 z8sV1euZ-|5$5+Ylb~1jIVv*i4_5Z4=lJJhT`&ZN9EzkTq6`m&ex(xzm`Rlf*mknRH zhbIB9sZGA7R!dL}2Te&|kB4`&@$0#8OiuZF89dX}_hs07=)b)9Q?*JE0P#)v@>sa-@vL5hI}wMkYdpt{875Um?C68 zxv2|O_bZvUfqY*fEGkp751CZ=SHMxNyT1nR#?k}8HWu!da5RBG2@hmAE2RgN!WGg3 z3SX{xECTcJKnM3a)dM{ObMPP@?riM??nGbtL3+92P_=W_hbGT_&%B#6Z_e;kc;-ge zTcktlRS$BM%tKcArocshnxlG<2WJ~NH#B2E{#? zi17Hh2Nw9Mv=5fRKB?)0<91hPo#w>zlFgu|ws`<7%Jbl&Q_JL!% zMLx0t_A*fg&q|Bx2uB>eB^jYbT7)Vs`Xi={Z%tCmZzoF9x9g=%-)<}^{J#y7>bn*a zzH22Veb-t^JZjDOt`|atX*1Q|QQM4Ce>V=k>g?|(BecBzcgx}3r2D=Z?3=XTw^5Am zn$+KSLTIJ@eRufc)Zh1lqbmRVeh4kV_cP!@-1jq;ymzhmei1^e^xrRrqZQnfQomn; z&<6cO9h}YL9um>Dg-atn%t2_0@nKWA`pXa7z*eSu$kp|h9uk(S6CZYgn*zp!&}#j| z5`#j!?DsA@`xX=8+1aHL6DjIE@Ia^PqClKud@RA;KK^k6!ligjU^-6!I0v37s>dziq6F@$ zecW2fJ#N)K?g-m-`EgH#^{U6c5!R_6_eVHRdOQeW1Hwk>@envw^5bFfB*8gN^O$?o zvE}122%FT8SHf2*KVFA$iT3eExJTdzHQe(N9@zK?jYWIH)c=QEY0M91s<7!W{Mdo% zG&K9MmlA){l=|aTxMrw-tb~ucYBqkXhI@RYA9)+{fyyrpAgk{S3Q{uM`6a38L*M<^{OW;VDE<~YY-?gK3NM#sq|C>f2xvo$|OD2 z!P8QHYJlqv1ZSzA#>2H5PgCIQo%}Qv?#`O0E#N4DtBLAq8~A%kPus({N`BfA&K&jA zE^y}IX-`B);At?S`Y)|jMy`UX52?bFc+THsuwdP?ZANcD6o zf^*sK0e72( zXVff3(lesg0_hp~)hIp7fn$~QtSLN|c$TL$t1+pc<-;XO&uF-%z&1wrj4a#)&pIMF z70)`sHBR%aGlB~doGU%+3GW0vD@Jgh{H!;EGgZ&}!8TfYR)XLZ>DeH-((#Oo;p7&p zpAAKDGJ;E`XQfJ3jaB_@Br~ICBgj=QFg%+Dk5+!R2rf>r5}tXg zXG9uRs%Jb&Zun&B*=hvm_kFe&-WK|wdRR24O$k2@ptxFxyq`uA%oHH;r%EO3v^C|Y z4RAGAKTkw>V*GO=_ukU;eAt&t&zmDWA?JBZ_*%=)O$bj)eLe{84f^L3Vb@8|XCgdV z{oDe3Z{72G@MPinQYGVzNq$a=wM2Sejqnud`3m@2sh$&z%v3*L2Y;UW`DQrGnxEBh z_QlU}2v3dw*$B^Y>F3694K@6nt)!o^!iA)tTf&e;y8Z zS;EgV5HJ~jrYtU3{k#g^c8Nc8^o~g{43@;&TJtQ?rL*WS8^ki%DAtLV<}F&$eC(FF zqWy$7dy2M=wkGJiZ7mQ*`CF$ZqHge#`_7g_N3fURG%7lrV3#|vKeM)Hf{ z2xdqx%HSISPh0uLD8+Ean)RX__OW=e7{N>g8{@?ixSQierFnY?CE=X%8f@nyPV{DVpVG9MvJ+RHWwO_N?y z*w5Cy9014oxR*l^nrV1BMlt-sD!rTv_Y&1h%3`zpauz~!)GsOh<|e*eVA1^1l=gBp z5H3LcuSTlvWytxpv10h6749U}uiao9sQ#6zWR&jLez13r`*jHHMvLaZOf7yLL)AYN z8NbpNi*|tgDo#oGFRSz_0S*a17+xhIN@&;!ud?7SGQ7%0w5#-rLbNqr6)J{5neeKW z6zzyttr6{Pc-02ccB)rhVH+jA>RE31(r zw;x_@hLaMv3x4Bn4=VaivZ()T&HSxBP_Ksmx4|&)j8hDMG2yq72v@cIZ4|;w)xRx= zYlY^wHK^Aae%oY`|59t-xj-~G?;2{+|HX>%GCk@Os6z8aYdDMAp}ut^gcqt1u8`oR zN%j|^`&}<3{hlmoe$N+q^6!OG(eG`fgx@Dfy5HwW^6!f!{JvC5`MpX>_?szBSS5Jg zkcE}Hajsfe8zW4kX*GnEdUzQhjPQK8Qej`B64s>%FK8mH)fUa)tvNy@ z5&6yINYfz;Q3Uf_vJ&^cDMg45sBbO_VM5rTPR*=I9u4f0?}UZ z&0=mP+_N*pmR0bSXvLfH7Wp5w=DkgLjCnyUyd?2vSBd`yNsYyu<0M(UxkPFr-mIcWacjJi^gkx1iSW0C*vgR> zB#W&nh|Xap&G{6K*xC}&d3v$6Eu!<8(1s~7h^>85a zb!Jq#!Dgw?dA#h&peF-=U;F!-CqteL{$;I2vMu6Rli6D7d_(MMDfX6#y{2C_|FTJJ zX|cy}u+XBnt&&2yfSW!EZ#K_!+YA;`Ac<`=nQ6s++h!?`vuz2rIFfQC{w2hYR$@n? z5FPgvi{*zX$83A}2|8Go8^pE+@ODP15TOEi@>yMNemh-hZs(?NTM17#LfrRls}X9= ziZuvP!nR=r6-+vl_3-y+vH`ZvTCr^-LhT^7Q=N4;itQSNis0-hiR~$H@hfv>v7Iog z87VU1k+foaBX~BzGXkOZB+7+zypm$KvN<2layB=Ett(5d5qdoc#c~IhiV*4q?=-d8 zP82Uroc2UFHcdgOADjk+`YKHvRt`H2j-{|qCdCZc2Ou{Y*_@5V{~-H`!*Z#XK|Vn-u{#v)X15IeY4 z6F5d8{6vnKD&9PV#&hf<^E(}sRxT6V>sji6kVzwUbcUx84h!nZf;(ujQ*%#5h+8+A zqxXWd1BdPnUp7lr#On|miO?jS*g-pK9D8sP`AkN@I}`O9=1O6Ey$-^RmWVB5#b|hY zGZ}->RF1*p+RTK?&1KCNJ0_4VXY-ouSVm2i&178Y8 z&&m)xry@F#{g)wHLP{c;))2e27L|umYL|{3vydQm8O!552VIS}RqfV~5_>aW79ASB zW3t$p`?8}&_SBjWy+Pr6xX_~YoPlSp$b+kw49^6@>alu+hh@UI)}r&AlEtnZ(M%G% za-|+(S3X7Ru1OL3!U504IZn|BD%VM_??sQgC z=4P@o8Mf7_VmEzByp+4!!dajayW1&=KCirt-IZ;$XBaJOcg39dXg4ThVS zd^a`N2v!a?A5kkQeiO5l#XOwd!~sKD8V#Qr{uyeqn@rTsD0WYV$HGa>g|831Q{XIx zb9f`Md%i{Qw{jj7dNvDm;;mGkUlq^qEs8*AV@kiba$r6(TQLSqtZa(tGFDNl=$TNl zt;rT|(Z$|8LA*u(a}T31oKgoVhEZF#9M3NFVcxU>^49n_V9LYREa(9 z5a=q4J)JCako0@H!u)Qo5+CAc_Kb&PWW3lzPY}6&4^1m2RqUAyuTd-ZtVUpXqS&(u zJ|n5ETCq0)fuRPmm+t9d5PRwNr#ji2hx%r+*h}kgHj_g0yBn0auqjdOrDJO(0&g@C zdwan)iyiotAsVrFA{?n4Y`R4kwvucPHA-VfNV@al?X6~}FF5K(n2$|WG9tWz`y|Aw zv|=Bl6XlZFmkDP+lg0@2Qi*-^x8@kdzFY(-3HG%`U^FY+BhZf}dhQ1!&>3Q1Hv~$R zgou^d?g;eZU_B5RLrMbKZtxazyb^dzSwxBhXVP_V-H7^$x{pB!sZ*T0SER2`y|#3*<=#KGIeqN_Lc7yFkH=)B#L z%J1y~l1{umROA(kw?|0^@%Bo|DBj+z#C^a`K4645S1k_2BRV}*9H9POB8dYOHr(g~ zh2~S8l(c{IU=I-P&(eqkJ>Xl_X=E%Jxt zqjx&MT(d-pzh+7o?~F!NVeh$c#cRbo^I>D$u3d_FXDRAiX~jX})m0D&br#JvYZGx$ zPmZ^c{rm6^9V~$P^av&6BNL+iS!@NrSuYN9CH)e_!7i}1)rf;^&;a-=IB65?RCb33!;{B0+Sz87hQmXKJ5&n)d{&mhFLR3Y z`Oag9@$fIuh(kO>Zp0y8uh$b`e1?0hbC z6*VGLUnYF0z+tW^*hxn86oz#7+_pK7AR)|xZ_YDxz?xo^vnK-r4 zqP=mHbD>)IFMHjI*xSDp{Pb#=Yv(G-A5$tFqM&CWon{|n_LRGa*2BGt$tKCa7UHl3 zJ2B^B89pBNVKw}#WpP+jZv1$vub-$*7k^6FI!|0}De6k&wq;0{y76Z0LWd}kol$Pe>Tz)V*3M8LpO zukz%ZV*~R3jr%%@Grh#w&Eo7PQ8QoE%oCTIiA(w7(#%~;wwcAbGI2g0k_PZKRkqLDdly|(DJyORROg)trs;b4|W%SX)P`;-??G$H1XajQMcHl zy1ABAWjuK8>ung#Ia^s#jz9v7R33DdQj4ak#o>wY&tXC??X41rXTh~bD-O>!*X1iY zw@mD_7=Aq)mLkB&DX!Vnf?S&SV}FCEpI&rK?CdfOz9lI2TxCW{lj#EGs)lSIDwbFTQi zYUijODdMjK#fg4L7Vp}yXNfq`TfEn7YvtiL4h$%Mv*>VJaiWK)E83%oKV^$^zPlvN*~B)jF*>I@coKsWo3nBW}K+SoC+c!M#+E=o&$5Af0^J$%yDiEnbdAW%6Ys`Jnd05Hl198+LMZ+2u-Ca#>g;#RN%*c= z`{YQ8>j^!g9uMx+ZA)LTU zK6sK<;uv=%-F$Jhl7E-h)v*o;r!ir?Cs8eq^@cwSVOlSl2qz(&$}t8Y+=#tQa1!Dj z8;o!^6TL$VtQZ9cd14+%A|@(CI1i2~Qn)Gmk5@A9T1mlB6~jnP zIQJ>A^@eL2+i3MJk<5+W==Lex085<_2+WH5@}Bj!OvgdSx(2#hM%^j;mlJygZ%=dsEnG z4>C~H)+mmrShSy7Q^avz$k=+Yq9emV#LD7$ADAy2mCVoh$xSTwg)7S-j?;GUlOT={ zgO6(P_yjom!(Iq)B8Q#`?-JJW!4gsJ@u~39x;Z`#o~{~kobN`65sp`s7(QF=9u0b? z#2@t#f8hT9p%cX4$ku=3SN>WlZSAKRJ`<#6Okd$RjE)ZF;FWOkg~9R+aeSHi@9;slMmu5sc7ZJ2yXoM;d4Fr7Hj5&pgqCn&C)FriznTrEx%vm@`$2~N5X zi$mZi);Tc(uJ*7OF;|KJE$$P1E0o8PXk+B)#fj18E5nqy&nf3lOh%wtzBs|PO_0Tj z^{^-LyEJ3s;cTfFCk;xY&#fwPlA<^VUb-|+W+J+dNh3tpO5$W=c)GEaEr*vQOo4ck zk=@m>zk%>7wla!M!FMtjb{_G1wze=|El`?$VPdu=!mr0EfW0zKoa8MdIyy<8ELHN! zE(mXednCJdMMRGXH~M5RM6|Lv$%x@*xRaTqIbw#RfaE4bREWqVDuIoNtWYOTGFUc& z^Dc#hX2!|UN~15Vi0BXjA{vc2IR+74{gV?B$zZohh%iJ)QFL+&B1S}#5XnY_O7Y}0 zM5qwDA(93srQ%65B9i$%mD2o6Zr(`?B8?Csa6CB&k;Y8s!A8bCxe$>Aj?N&*I8yPT zIjK?1RUz_v=9K%~?2{`HiQ^JiOOX`rH1B*{h*KIw7{Mj>I;BN~VZo-7IAuVj3!4Zw z)+-rb60V+#hqohZG7)LVcFutghEt3e5OSa5%wMuE-^{u8L1X|)h9EMSBtsEt0edncy%8a1IyD@Teo96I zg~}=NZwb4V!o$`TM-)JQ~lWlm9ykK_=-&Zzdqk)60Tcd@Yc3KUuA#X_ypLH%EO)~7X!)j6y;WZ>qtKlTyAaPUkADb%KUz^}2 zsI19FWQt1E(5=qX=IyB|fNvv{)`$?x))c|Dfqgn4Lhn~iM?_{Y=?q&pgQ)2W&kVNp zLu3|_SbumaR$fnTSc&wt)sa)8{d#R=4%SNX7^{A(NP5duqW*fls2MIph6E+$>un_F zE0}x^G8&NzmdHL9E`)nY3|KQ6ktIyXE4=CyST!>cnTg0E^B>nMIroXrYGxs_l(Q$7 z6eIF_IrF8+0z?+WR>eUV!8sU_`OGawgl1;V62zJsMGe`7BCKXTA{3i7+|t#Y|3*Zb zYsG1DM^{OlPEgYBTbU-oMeaGBf=CZUcw|+wIGqZA8X{|$%Rq#B_H<)JRuYb8OOX;p z%*@fJmTms8DN61GPV#h1MApGY%zTO_RhK zDn<&UGph3VZ_KtKBCtugrtP07{w#|>8+LCLHnsR?hWKZ?@TlHirNn=;P!?wl@GaDd zGlaZk;xp-R5ZJDTo%ZpW3^=;O9mncMO4c`41o;MxAzjY&Ok?;)vooLlm69+I-sPlf z1}_8de2Fj$!4U|OLC-Wta103w5To`y(+a^7CXDSZMX=ob=L{v~TN9i-mose;Qk8OiQtfy;tciOw^jtQ*^RGrxXov1TB5u%-;Cw_|g&&!pj|3?vWW;L8N@XxG)k2d+4^>C~;h%+1E zp%AO3hkSrq)av2mdDJGrMN_qw&rS(BYWdoxz#wW<;GxsLmJeG7v$84deA6*WC2Diw zii10qy_;LK|3^q!+lnxF3^hhA{lxY`$Pl%iVE#+FlJp(rQ|(ZATPKRzGQe=pynI&P43OhN!ZVZByCUs*G+r-j1CF2nVSKR~zn@T}mxVlLQHe)gwc7^qP z?V8KdGz2N_>ZZd(fZGF}?p*C0INP&{jL%NFp_#;;op`+TT`UJA;bBa+*~64uqmW3kNd$IqKxY%d}iUBF1*FU+e`ejpZI5A5nQ;h zmqq)-Zhn-mbH@O15|#9!&u38K+%lN|Tcc$CNOm~422P5Aa~ok-kz^A>Nm_AULMRb# zhR_l;;=CRq^3!=%^h_4#lM!TG<9suOQV^o2;XLEh%hck03xqWA@NsvBlKvy*zuULnv7aWx}nf#CZnB;y7Rzgy;r5-wh#3zw_PUY{e2CbsN~$$Nb-Ol#C~o zmJEXt{hsG9S7>ydH^D^(a-I+P7_-gdSPUA*CyDdJU~7{i&QC&&9)t4>QQs1t6^PA2 zY&OSUWYIja8pU}AQerESD$cK`;a>*xKT4F$r`&`KiHNN;hzn_`&)0|xO%YoFae-)! zcliSE5d)ML3J@$)i3^1Y5~5sa3t#^vaiIvY3U=s&*j!eYz*lV1KeeWb3-k%OMoCG5V1%wnA)>`JWq=yr0ND7r6?efQ#)A>xURM*2Rv9(aC(V6Ji74d`;0s ziuGZ)u80jJVNb*c>%_(0h*3ga9EeyMOM?&_hFB?^OA#B+-lGuXPF);>7z3?(t+-gO z#Q*eqmXi@1$#yehG@vfdM68@8?gS}`MK4nPQ`cUsC^!CeB-W*eUcBF0yx&5+-(0-E zP`tlDyk8~WUn<@&vPeJGn*V2-lJlI>?jnH`oh}!bA~u;N9zEZakL0vgAvTR)*@PIu z{Kd_P@f9$4vZG2|;(-i>xTHp`P%AERH>az`rFg^`3cZwqSPQn1i91{5=hl32sR_*g zDps<7=Ep8k*il+s8h|KI_7Z0}>+Cah1VN3b?EJh%IE&T#7YjTT6@PS1#{rTi&~Du%bOP%ZZP!c2%0bqDr_r z9Bz7~7L#Tg!i>UcITWE$62~W(5DH$UJR|PCN_mlt7_|{iy{q#PquRW>05LiQukz;_ zlvYQcC?*?T!+Jo~GwmBd$8&Up=7bV$7ixVy^YJsFPX2v;(vfuoyFyr%~P cI6^Q`{TiF8EUMp3I5!3T#Cyq7K0Vm~4>;Q@XaE2J literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBKp-EUC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/GBKp-EUC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..bca93b8efbb18a13e15025ad41d23db8267d2577 GIT binary patch literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|Tof+Gg1Hm literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBT-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GBT-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..4b4e2d32294538b5093ed3870bb9de37abf21599 GIT binary patch literal 7290 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBT-EUC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/GBT-EUC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..38f706699f395dcdad5c6ad93d1a9b6fe9f66c78 GIT binary patch literal 180 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>FyMw>l*5;>yaq3a1ld`Jp)6F z9UDVS7z5)T2_QS1g}24cj$w~fvl2s#6B}cT3ll?&EhEDoX>P_A2OurO$k5^}&9Fxn U$d&`LBcvHxLV$EA1H&G90MDZ`>Hq)$ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBT-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GBT-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..8437ac33771536813228e3f9c1cb6c35af3acc72 GIT binary patch literal 7269 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 WM;6GI1F|Ee8CpVsbSMME9(e#*4Ku$0 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/GBpc-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/GBpc-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..c9edf67cf6d640607080ad2775c14760df77dd96 GIT binary patch literal 557 zcmW;JSx*yT6b9g#5sk8Wp~4N)&xVRox)HTbV$ezus|KWvvDSQMS~>x=+B(ya0BUlu z6%kOt4Hc2GF1UglxbS2ABPP6unKL6=RYgKy|sm^&HD=; z+9wK$t)ehQepj)s%u_r}`l(`yg7UVH+^&(zQA3V2kz3v=XL`Ztad5W*jA@Jk##_Kd z9Ww~-#lii9U~)TSfvGcK8b{@WO6C%Hcmh1y4IY;=1Zf!{oti z6ubz4xoRc@UY-Q=dw_$U(n*6?$3RJtJ6^g;jq>$5#5V`P+ilD>@U9aqc)|M$rVo5* z2OmA)(*`C9J|6*Jb}~a?@jO@xfv-Cl8+_{m-~Hf66>}N8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|To({Gim?; literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/H.bcmap b/src/assets/pdf-annotation/web/cmaps/H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..7b24ea4629d0d4cc9f0cd5852edde324156ef0b1 GIT binary patch literal 553 zcmW;HTTc^F6a`>fNJ|+U1WZdKHfIVU1k*BRx(Q8g4%)hO%E=p&pZ zbEd^7Ox8PjMK`8&BW>|axS~6oW&igkGq}l(87h;Uvv6yFZ!CT`8Fx4oMHIF4enru4 z=0tE`J|(&Hyxf(akmS7OcH5<8CAK8mJa(nqZ+l&STNO*h{HDE1f!7`2 zO)W7E7S4gi5O^yQV7GO1K*p$4;PUEKTm>RjJOVd4}m{N!QVP! Q2JBoE!O~)+#IZZH2g5hHiU0rr literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/HKdla-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/HKdla-B5-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..7d30c0500520d563d0e5891c8f4781c61ddcca5e GIT binary patch literal 2654 zcmW-fc~p~E8piLJgoLoDV1iVG#EWdQB!Dska^Z@KEGiKJt6VieWR+b7OJVMpTBmj!JFV@ww9{?uR9m&JOC9YvJu_$KuQ_Vzd^3MM|2*fO=e_Uydjxkk zm-X}x_qVsU4JvaA3e;J-YIT7UxAZjWl(oYHgStHf%8Kshp8npRe(j*HB|8Flbt(V< zen8o;8_@Od`=42>(l)3 z5_3C7W8#28sxAh9N4WMd$)m11OH42hj!JPI28xLDHX45P6A}5PLQrD$ZsAaCQO6I=ddkoZXMn>rz{cbfRZ!j3W zu@jQ>ynlWKk~fPmdh0nz-r9=M+xd{Zy%(c*cv$c9u-@fi{ho()froX0hxHy0>pdRU zA9z^r^RV7;fy+Kf0^rgXkn_PNTyT*A;Bo;FUMzy-BHw@y6CnAp5u=X^A^C`J#vdDC z@g;uI4>p3um-s_o8iZk&^FYJpLX57&LUKie(Nz`PcC{OTs|;X1uE6NyDo8$w!03}U zNdA6O5 z0B)Cq)E~NF`W+bn-)ceb9faYXJ|MX(2jKoL5PO%u&s{Z6y*CGdAA5lOUOrrMuNoBH z>%q(KX8`GaEhP6laq^E9ApXZ*IRAkZfP39w-GcZ1 z*f5LIpX{hHKy!>);gx&0*sJYz)=EPI+r=(0R|)l5F2!`8f6%JZ59>$tNqY5!E~K=V zTNiLc`YkgW!xod`NL;gnjCYK`5N+346rMbn+FWm6XX(^4292RReV((`ImqQXdXJC!_bHv5U)?UWD{U!X6n!SL9x#vjlBPtFQT9el&rG6k#4*p2 zVM%hYG&OLW9L%vcu6bNb7avMKw0NTN)YxRx^79mE#^|#4E2O?df~~r zN72z%SG_l%O*s***ZJU~hG4y=V6w<5*5p4e{YT;HQ7>~yHd$itVWUh5&NyeUUgcjg zHDYY!P_WhC@4@audUp~1d7ro0v_>$!VWqRup*^ zG@Ihd^E7$(dgswfeU?6DwPBq(r-$EW#d>|WVUMBLH*9DQ=F*rwmMp76AmBzPvbd-{ z`UrM~p(|U+_DhVN?C5m+jKa9nsh~~nM}8Y+vHUq*G^_qfnlDpw%s&fU+I_IhwQob9(!YiX*+$GL+{kvchE<} z^e2(Xw3o|tByvl+PEE9o$X%aUSIvD*hb200lQ$u^I7Yvj*DvsL4eUVM?hyZ#(=BF%-SwbR>N z&sWihQu=VtVs{Pwr<{I1472&JDDSx02)CG12S|>J&OGMUP#zv#oHbA4y zGWT3_lx-`u4pUoGg+)V)G$p^3{yIv_sW>Xes3s zwsnSZw^U`GPd}`nA4dhof&%eiyF|0&m(Z^(U;j;DwQFggC@3`47%D;?LXj}sD4(ti zcNRKxWYQ>SyyJzCa;`Aet#zgz9t}6{rI#i2vO?llg%s9G57Rn6dPL&Nx9<#=imudM z=}HXZU?xq@4;0PRICnY~GtxkuE8VWU6LUuv0Pg(B4VEzHMpni?XO1z5^;Kp?5W}fz z{VJQ(u}0#kHH?}wgXMvgnRNSzYt_tfFe(@w7}BK8mOh<7UKvcDIY4EBy)$d5dc4Y~ zz92oNpc!euF>KQJvkPfwgd|KF>rA(&POqm~(*?A~FB1yG4pyG2^=~b6L?3R`GP7;W zlTM9%wu5q`u2ycqlQ)&=UrSdy)2<4y3Y-a(rH1YXM|+ge*&EKL$7^J>p(~rOFP~CR zCHb=1N`I@T(Ssv=g{EQ?@)i5CeTlZ!_8no|3O@Qx=3l!t>u2Alzg?jZo08a;+tQ7T z&ZV7>v}M}Xu;GqP&TdO8C-a2~d`(=Dc`2JD@GgoJc%#Bu#H!fkbd2trO7{*er=qDG zuOQ!B;;uI?vTkIX&3(pjM!LhBo?^ QxJF!^-VRzcnd;s4Uw8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lc?)ts_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~ljyD=Pp1 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/HKdlb-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/HKdlb-B5-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..d829a231015161e107123e211d4a78110daab6bf GIT binary patch literal 2414 zcmW;KX;hO}8VB$j_OQsJG{|PSK#(=aRsp%;$|5LKBC^T_S%M&IO_arj-Z$Gz_5=fj z1VX@Cs}=3EQ`_lc+tJ!qJ5D>*+SPSz$IhI7m~(pO%=EPL&V2ZPdCq(8z3=n;d)?bp zHZnSKsQ*BpLb#={Fgr6RJG)Sbdq%os!ukohLN+89Ru6ZN92y-t)Txm5WCh~ELE-B;W z>=~{S^;T8=(q_#RJ5FO4i>c5VZ75m`ou9Nf8*`oVGS$>tnzf9nTkfR7MP!W81!^;V zwykXOG^!MuZoU8P5p}fETA5h1wR5Hhvv7sxWE7|U9cf4}_ ze82Ocr+9vyre9N~sWy9gv+J$tb5(N_svvFbeELE5|e?s^WIqqRpM|qx_izCj;nF%}(a1GS}GZNHzEwqh1&}Ri!&HKhz|Z zSW2ntIPEd7cLmYNA-B*NV3L@MPPUkeXu4bCiB^?qTB~$2O@K_U${6xr95Dx2kGzzx z&oLd-$5U7OjoRs~)mD0`w|~v|VxCoQNpg1wdB%Oc)&4F?uvugq-leYhSMR4EAEnp* zV$=<)M!IQfi?rS1`DId7YR)Iz@*=7gD^ur4noDzY5u5$HD)gD)`w`{X+w}(%ssS~B~R?k00w8Sw; zu|1#ONT5IXFnu}+D`Gc=vwK{Tt|CN`JYGcT%;$g0I zv-OML1bO-_y^KD`|Ftpp1dHwMrbs$z$TLU+)M8r%*XS~OJ%N7Ita*02nF(hHmqD&v z77sF_W1e)nV=>2_NuxEPj8_ZOd#;fQI!`P$OZ(Zw?%LIW9-6D#peJ;YKAz~La!+Yg zH}L*Z3=$}Sdnp8fj&m6UeslsO20+3{FjB_BXk{DEOF2dXQq@DEj=)Gg3W-LHkv0Sp zZ4E|j8YFB#M$w!d{h>?K@iJ=rDV>~2Af|02hwwWdYuuWlPZi2+}6h;;W zB-UJvY~e7=RtK_X07f%nNM?pHI#~mWJqROvKP0o8F`Dy(WUd0E`9w(OyD)N;LgL`g zS|E@(V=;10LgFgKXi)&kVk1UNd5|p0F>*^GSq{T!c^Ha3nV`VafYC}YBrCfxT1|yy zwGW4%sszBZ7o?wRhU9r4jGpg;7u!0bz6|7V^*R1NCQmF?z8GroK1*>Na1_Y?r<#9XpK*|}^Sc}@Yq*)fpvQXnKR(Qe2tekADiD5Q45N#D*l@9mn;ijuFUMo_axx?@_h9t9?U1~} z!|0U`NM7aUuO5Ts_r(~!wh@xonlZXm0Li7p7`@J6y}@CQVMkyjMZ_i8R^x>|(M2N95bAjRmK7`9#;2H+YG@II`@=)+x*d=!Y$ zM}3fdoPyDHUr4T(V{`*Ta-$QYPb83hass12wLx+-2BVu3ko8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lceips_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~lkWD=Yv2 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/HKgccs-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/HKgccs-B5-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..971a4f23f791f75d4e604ad717735ee55529eda5 GIT binary patch literal 2292 zcmW+&3s{t87Cz_yhk+4LK)HmV!xluLDa-%_0}!{Q89xgv!bn_%)-tr4wyp+MR&IvNCGYw6h3((wIh9R8} zvURRQ=(1v9R}@;ik`TL!a#Z(9^u8U0 zgKvl1;C2j_+>Vvvj+y-LWSA!0DMa5MFGiq@?uo?Uo(%HoDZ!AQN{s4x5>0m_G3YKy zue*=n#Jf{S-L02?_X^PWUK!f%t)Nl&2jj&1NmAUeqQqZfG3FN~#joC^e$AB0y`wbf zUBFm47J5s3p|{iwy^8fR9ec}l=(QvCRv`8+w)<{L6UHVVnrUpxDnX;oPXnWEFqgA! z$iNXWa0H@mv<2xbg$x{_1GX?3wc}c^LkBO=xcU~zd~k+?4raE*fG>En91Vd`%pO11 z%rJ;wNnm0f+3&-r9e1A7TxRLNv)yGuPOvacFpE!oaKS*R9d})V4~E(C#VWYD!k)gX z3|%1sx+_f6ToD?&Mk2VP2wa5dvT3?&H0v=MxMDSL*EkcnlF;l**1IQ*?08$Od;h=gnkWrnKzNb7v2f4%>%n?LppLuwh(6yYa-H zw6MjdCb0mc~m!j6(Xn<%bB-I)uMQbgoP4QB+`IBnP zm11)&sm;r!_)Qk6EoLdURFe9wO^TtEwE){TNb$RQq@E3t z;@JjLzvn647D#d1@*!?JNU=Sh)b>?U{2`arbG}kMx17`;$4c?Mnbh+cQtYsi+EF3J z3u&ZY;JbDzQoACg*tM3_i>XrV4kfjFt`sjNlX|IMia!;QdO1Lfmsio4J>wx|Pq7qx z{YdSdEyXJ_q+VGj17FPq*i!`KUY$>BpGk^+6{KE^lH#=ur2Z_V*dIZb{UuPie~A>Y zPo|jHn*jDZAn|}rS`W;H$OCIA^k4|U!FWa-q#sO>!3P@v4m3ja8-qx_ktoHR0i@o{ zlj6|$R%tm@4baj6)qz}&iWKiXMC!fyQoNr+>is9A_<)=BAvfzoZq{G9Ss!t; zKH_G5%+30koAozt)+gMoPbw+)s14vm5llFmCsU6hz{yn5kMT-5#uM;qB&knJr8qvB z)N!7Szt5v-C-{RNodY9Ia3N1Lkk`p1n0Ior6rTl=`m8{TQ}ML$)GB~e{N?;SM~cs9 zllo$i6kjYO^^a&NzVssXbp8A{+& zDOYP`a{D;2wA)FwSIN=WavWXjJA!TVMa(XDWRTY-#ej2swrOMrfBR!b8ck6#XZ%bRP# zX|>~?1^R#E?G?NC>F#`99!0z$ikav0LRrAPkWpencPTH3GF}vm7!_=*)J$#%$F49% zxmO~3hDh=RGAC=`NkQ;TG=panbE=M>$;?w3yevI}&@&x1kJQk^OUIMRayIA8W;vJr zb6Cz}Uq0tOhPtPS?ekgZ_u(mJR$8d1oO2r4zm|EO)I1wd@6!!r16b%Gfwd3d0ynk%qAp{S2oUCK%2jX)&DX{IlkK6wz=N;1I)E zhyjLkG5Q$J1`0KtPqCvp7)Kk;p=dFhr*TMgmh>^2=V7wZyomCRmSFTXT9(L%jTZh7 eV6=`zFQYYve2mt3Of*_2X?{j)l{Um^UGsmAm(QgD literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/HKgccs-B5-V.bcmap b/src/assets/pdf-annotation/web/cmaps/HKgccs-B5-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..d353ca256b54236a4acefafdbc08e5b719892014 GIT binary patch literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctrCoLsEyWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxZLvn!hb literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/HKm314-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/HKm314-B5-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..576dc01112bd7f28c30804661f546ece203c53d8 GIT binary patch literal 1772 zcmW-hX;9Q>62|+_CEy8y9C8dzGJu2|ML=I^i69Frj-ce=RRZ<=ems{ZVz@n00OLs6mXL4yS)n(eWt+g{b8nYHPhBhV` zV~s&}MupK|AES5C?@aXe(gzPD%ZWYP%&}bo&G9<5Xj3W82dfrZw7-Togc}@{-JWu7 zce0!suUp)3Nabr8nU|gmbTq$cUTuyws~vn)ihy3niMSzcSCUz+KiC@68g0lk?AJ@h za;+}3ccrOb^gJ)gEm0~D%SBnvXkD!LvKuThq?$G~d6{cYDP`!Y8Qgg?O0Q~MI<&j3 zWZ6MN93R;%yHT`+! zWVu+bG87HI+*#~p^c3-5M0_JTTK@HOFq|re2r#5W94vrsV60Xttx3ODFEG|GHYRLK z8~pu{o1L9&S9w=`cTV>qTbt(U>S6aTKe?bMZ#c+M))Cgfsx`&FHMJ?dBl3j%2}P4% zr&^b;wzU?B8R-DeqQORPa#k(3mi)5ojjf$==A_QUo%OwmW#+BA!tui4Ej_lKFP~k~ zRoD%SCOlL=){%dvtdP^Y)-F62+*3ECv3=oahH-Vr^2y-Iph>0Kf3S3{cywQTWLv1N zPPuMi?Lg|lMzxLgQ|a+akRJP~oUE7TqZ-RPv>iFkRA1A!-B6--uzn%7DFk@DQ@mx% zUVwiyfO&fn*rRf@UVBo~Q{(2`AK4$&?%YB04u4aHIc`FERBhyqPL0YVTlzAMp8MUc zkEGvRM7|t;wud#O@0??=h#hC-(I^l^v6QKYT9uPLM8C)i6h@Ex9?PoU&?*KSV`VpIa z9{FTGv3EBje@`Oz-Y(?t3;+E?$UjIV_MsQ@4__ko(Hi6*RTKMzpv%XCE*}fJ{87;5 zoS@4&L6=ViT|N30u;xjL70l&-Q^Dk@B{z?qwTuC7IxhwL|Rm3b2_==?rz#@TUO(SMa zM}F0r*wrHBUjz~R(jNJjFB1C-k$KhBe@rJm`4MCrqf<8Bk$op0b1m4QS%-aqC z*TZ4aZ9%WwdvM(yf#n+n{&#i}yK@*F?=r}~yP4SczL@rXF2IxyiI-h}Qi56<9Fqia6^HFzX_;UMLNmXBpVe{_ekxKy8fx literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/HKm314-B5-V.bcmap b/src/assets/pdf-annotation/web/cmaps/HKm314-B5-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..0e96d0e228e0608f77f035655140c6a235d4ea56 GIT binary patch literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctqkY-pnEWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxb;p(_9Y literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/HKm471-B5-H.bcmap b/src/assets/pdf-annotation/web/cmaps/HKm471-B5-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..11d170c75ed8696f0705f9fb9f5afcf3b0aff4c9 GIT binary patch literal 2171 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 W3S-b|;bUNIW?^7zv1XQNu>%0E(j#{O literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSC-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/KSC-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..a45c65f008e7d6ff34edaf53af15ea471d4f6d90 GIT binary patch literal 1848 zcmW-i`CC-i8OOixy)y#?3=?IQ2uv?U1Z7bx1Vjvs#IU1aP?TlFfka8h8Nemd^tlqE zY0{)i(l!C)+;eVZ(YZ5oO(85Me?Xr;PnRG1OMmDOZIdqcZ|Ir+a6jjH&vMW5e&6?1 z{(8DH>z9aSZHI+weYU+K>S3_5VzP>wC)4?~Vd~I)yg(5dXk-&8DYE@eE zYf=pZr-eS649DE_8slzhYA6a`Kh#!yh# zPV0XC#L&G|T|0VjoXY3+>6&}a?{v>~rR2>Gq~^_q^n?C)Q}o8}cRTbW>U;rVzKBxh zi>YhAOxK3yXLRk{dwqK4`TGa-3g7)%ukS(O{pz6yO>*%4{Yktn@#6~;AJj^Gn4LsK z;wQZlA5}?woRP#eiJ!hI@v{RGKX)W?MdBAPOMFt4#H_@pgA%`dN#a+zNlZ)p`kcgP zH4>j^&Phz_TGc{3z_Q_3xC1N>!@KYf~RQ{cH^jl>Rs=Mg*TK?ST%UH z!j6I;13ON<7Q8-O_D2J(mUx50>Qvqc?gwiCKdrJ8;IF2!QxL@pYbWtNh*GdFhd2On z7_6H_rBl=>q7JNw#7Twql4u6&gYZMh^Y%mZtKu~hmmo$}c3u^;WD?j#GF2xV3^e`8 z7-FMRAVw2l3?rM%7h?xOJYUyTUI2L^IOL7wePm~eY)8?<<=f`+8EKqBmdKE8Cu)RG z*UH6N;BgJ|#9i8FW=S`gl@ed1C-H`^l{`8FtQMp2(RJWa1NN=BaP^Y>Z7;A^E5BR1wr8!54zIOIBLe5zOHI(c4R(IO z`Ij%SJ$$blJ9TqS*gW*085;rp5VqRGd4D%DqE`@&P&7om%^3}YcOZI;c$X`B8@wkq z`Xlf@SgGLsu-xG16)O#VK(jo=2O<4v)qr0P*Z#u*A0g`qcz~>9;8z^haqu9l28B<+ zl3u^2SdGN5E7mFSkjrWTdl^<6@i1BKV9hS86MR~+`oL$%dJX(0Sr@=s$QlH{1?w{S zZL)^I-v++}eizmV_$;hZ;_tw&CMy6zu*M)1`9x%0g;2qy>|TL24&iiI6XB9?4Tu!g znuJIt>js1yA{|yF>2~2EYYHOMW6eN#5mT`{p~f5#dmyruSSmygV(AdMh-Hw-qnHPx zAT8#F*ssP4APNyHf++IFiV-b!#j3-e?~K-1Er~O(*epbwl&&MLLUbUWn$%!i?%hf8 zG>ERS`=5q0o&nLT#`i*;EsEzt^p(etKC9i|IrD%mfu$sus0J}tXF3de-=fli` zT>vx3VZTUbzGC}eN^?KiCB!bf?NXRUF6kZ9M|LetjqI0TexK|HGD|&nBbjBe+hJCy zc1OVd+)&KQ4?SQb@3p|F)BP~=yf7-#U`)?|%^l||SZ2R6r$vNa)7#a4(iw_W7k&Y_C! yV!7M4%-TEI$l7s`XGdn5p&eNauv8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^gB>>l*5;>yaq1a1rCa3Py%~ zRSXOV8JL*%RRh^|EZqC*bs6?^H=8o-=V4>q&&$NHpP!LozW_JuenDx5{o+8j1Q1I~ IGw+uI04wP+sQ>@~ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/KSC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..b9b22b67879d4043c75b617a24f96b0bd47cf4ca GIT binary patch literal 1831 zcmW-i`Cn648pfaZ-Xstpq{U(4L1XORb!_ZPeu>guX1 zE>>69d7H-P?uESmXY&i8*?Diaa zWmRWeOKZ2kmB{DQ4+Ft#K3^cDYuEJ_{Yv0Ps;*spF+pX^r*zG^++uewccpli2U0!D zbNbnqZ&UP!?r%Hv3+hTfVWp5#R*I-=rBv4fD~r0;_nlv_xb^akUhaLls3t;!n0D?n(UlGl{m8S0;@K7)-O=bdYi7Lua5xhgXmqK*0npY8-Ul1P&RUd)G>*DSCG2yLGDwfC~usdX^b~YGn^!oyAR0?FX5!f6?HkU8P&VqQJuBkj9@IxPdH@A=^$=3$Lz~iJQRNYIwwRI%Q-@Hy9NX|4vWhfvy$5xdCh!q2SFl z@TMN8ww!XCtzx>pC1s{=1K1is<+e?>izwK>M9%G-x;D6dSN^sa*r}1<6J0y8Q%mP} z+N2SIedjT-JByqhshghNlYkjU#;(*<`tF<@=||)4b2+mWAHA)Y=Xl$pYyNj-l=|-1 zda)zw0Nz!iKPsI+Fb*p(Xdf!U;qZ%Y9Mvv2V*lK$ChP_Eb2w-ZdqTd9=siRu6rCg9 zW{-x!I}m+Byvq@N3f_|%{RZ3*GZnlarW5>@Vy1x)Xr_z!AfzA7YVe_O&4dqpgv<-z zK{79a-?N#Q!9y_X6+Q`5dVNYU8;DOU<~8s+huIAF8O%1~VKUpnnjB^)_<~~k!57K= z68tflx51jp90Y#?a|rw?nE~*xz@LFXhdBbi1ap-5*RZO{3_=jhF$hII5t-u^5^UTs$e|mZF+75UFH7f^b5l!;B=|E?i{JLu9(lMF=-yDvl@Bm<{3tM3xdu zg~&lH9U>R83=$rSxghe>Vs41jYAhe30I@=dLU*hP(Go|jD(t%NYmL>AxZ#K`L9|Kf z+Ttoi2jZzo4aVi(ofJ=l=n6X@`0Vivh+Z{*65?iIJQu=W7Qc*Ne&vXdgfpgmMezy5 zrnQ6vBIrt#felci7Gg|I)Io%hxC${5&YSiriAIR~lxTvOLPCbj4A||=#B~x6k&r?3 zNJ+>D3Pa2*i2)J|YGM%L2_=RV@l@*EmKcS2UXlofOJ;mFD;Fg_ux zo{SQg)j&omtacdXs?`y6&iWLi;zt+Q$al@ytkqkv>2YJTJPn%*E8SR~Xu(>;ax>N^ zgSOd+*qQvk8}G&%5KaGK5nH3d(%DbitR8Z|m(`%|eHma4Lwi3aL*yq%65|s8Y1Xxm z_q=pvuYuIPr@H3eTcXZ=naS<@cjStGwC>B4`qOE+f0juh@bhI^C=Rj+2NS^l7*Y-< zWvV!sqs&7GIS+HF{IE#wb||y=~ivf-csQK7Np5q&`=XgZdQa)Uz L{tvCv`X&E=BnB!` literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSC-Johab-H.bcmap b/src/assets/pdf-annotation/web/cmaps/KSC-Johab-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..2531ffcf41acc01338f781c845c7f50f62fcc84a GIT binary patch literal 16791 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSC-Johab-V.bcmap b/src/assets/pdf-annotation/web/cmaps/KSC-Johab-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..367ceb226ab1e33624b30512716a3b65feb5a100 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l_>y@98n565GC~(t=abE=^ z!@ep8hJy@DO#7;V>^c_ief7Ew`?(uU8TRwAG4AJOV%X2m$gp34n{~gSG{b&zAX@^6 KC3TtiO923;%QA`p literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/KSC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..6ae2f0b6b7238adc67bd9231668d9853ea3c8e1e GIT binary patch literal 160 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>K*K?>yap+sKmIhf{|fg6$8UT z1}3I`)j)O~3-`WyU55SK&87_ddDs~D^D;5)=VxTtFTl;ZUr?H1zc`RB0mPEh%=@JP DC895z literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSCms-UHC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/KSCms-UHC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..a8d4240e6adb3ac1db859085b769a0715be03c72 GIT binary patch literal 2787 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 P^z)@`@$;3W7gGNZsUm@q literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSCms-UHC-HW-V.bcmap b/src/assets/pdf-annotation/web/cmaps/KSCms-UHC-HW-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..b655dbcfb123ed06c7eeb87dfc96ecf6759363dd GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=N;^vTdW)E;jHTsuIrH~uy7IM zz6wT$eN_w$2N{@{_EiJfbu8Tb>UA0Rb2pnZ?B`))+|SFzu%DliVZQ)3>wZCLhW+9| NwgeDMN;B`50suw^GhF}x literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSCms-UHC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/KSCms-UHC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..21f97f65b4a61adfa13f55d5a096ceab45eb485b GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l#TdW)E;jHVCD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE*uriJS literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSCpc-EUC-H.bcmap b/src/assets/pdf-annotation/web/cmaps/KSCpc-EUC-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..e06f361eb6d429290806b9f9cd7a0aebce22be4d GIT binary patch literal 2024 zcmW-i*H27iO?oT*=I*WEh>y zWZwfw)x9+eYFE?kLGTF?ZkWX&sp}x1yUFzOj=XcJL{@hkG za{2n`g`xA~u00hMC53xSN-A8{=SKQ{uJ-F=KpToUWs(J`+TmV;>Nm~+UE9J5L641UahVi1pSv>ge>ZlTsm4xiL@ zUR92$HR^%xThXer_tqfgPo=AheX7Q4pK6Lqo$8EEof=W|YCeim-OV30sC(q;48pXN zqNcN`X*yR`x~C^prS0Q(weZC4ooa#W_GE(VPUh|6?mJat@RRKk+z|NoDS=PR1U^fO zU{v5ctpeXI68K(R1Q!Lqe@x&9I|Y7diJ)KLM~4M|?2KSi;3r)IKix0zvy=$N1%BQp z@QV_GU&c=f4691fOg*3_!7_6lnC(Hr%m7Pp@|W`a?N=-A$JDlSJ!h)XdoRZZ$n^{es8+ zT#}v752-uc&wFI&i*4fNMWr0`;%c*HL&}ghqK>#XVrBcrG0C>kCRsO5OSI8jo4(=o zxHoRf&X@aJ<6m}q+%E@Z=c{aWN9ik%+US0DMRvX}?TC5Z=5fF7mYr`hI^{PNkTyqa z+;0xbDQ|8R#BXldVcB%myEk*P6E^$T%kk{2-~L-2^Xa&IF=;+SFlD|Nvy-v&??TIV z&A0h8ey8u99|KE)<|b_?SSo3GR+a{>0D(M-Il&ZYyJVIPZ8umhv_fJ9(2BrzOIk5l zv83$HjCKe-OVa9z?*Pw%)@0#3 z!FNMzCSGXeB@!=()$LY1y#wucNAF2Lgu|oz`aVO-?xix?q}1f`yvwL z1pxOuQM6zY?F2FxO3A)(TvfUj&WO*p0*hthxvDB#7Rzb(Vx2HXVO_ieJa`Yui$dBh z54HlPA8`+a>|-B{h>;FdJ-8`m*5aLqmEs%^8&swJQ9eaK`j(n)3)p~1Md%1Py!6Mv zAe`p4{^@h9_S|a5)AFe*EbqEgjVE4p7gp;1sejeu0{sY#QecEwoi*SGYe3*Cu_jyK z8dyto;6t!>n9*PzFzsL`Br^uAQ!yRHx*+^$mVll0m;Fr#>m_p!n3v2_uzriV56lO% zQes0eh1V}irkmI$$vgx$VlzF^4#TV?<|nfrTD8q=1RIykcCZODPl8<`^At1>nO$I4 zVV(uMMrJqI4Y2EAH(~aIO~ULW_5s4hWO~5~<^Z@Pei51Hz-4GccJIO*1h-nuA%FJQ zI(U?94ueONc^TXe9t(3c;&$#Ja|}G*VNQT2ASh#PNDf-Sw}2-~!D#Sg1Y^Nd5R4<9 zNg$PYdy zg*u6k%b_mts}$;y_%)$(OQ;Y0W=_cG&-u4*3CF^)!HA~tJ1}D8@K%^rWW+%`L*Wz{ zTPU0cBN5>Y7|E9KHZszrunUGTw^KNqw6peb4h*MFc*k&2xD19u;r%eaLE%a=avWhd z8Mz48!zhr$4PN_OT`~$kb3p6;*aN*>t%07J0KFgv`uKD+W(I38>z?vpZpdqS`yVV0 zebS6a18xLjKb^q+K5y<@qb}S+36Dj=s(73agnOVo9uOh&g)M?}0>AR8%C;viI`G6z z@{?<-lJI1b8ka?}u`Zt$D>_iSEVBL=+mZ04NDAFw?i00aC6TZ)2rLgEYGp{Iij@(H zU$v2aHJJ)lv&3$zqOd$oLgG^kIi8A4)BRM`E39RbXU#&XYez-TTCb`^Jv&Gp&uWGB LRYsqvzytpSc&T|h literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/KSCpc-EUC-V.bcmap b/src/assets/pdf-annotation/web/cmaps/KSCpc-EUC-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..f3c9113fcf0b02e1deea8246bfd27408becc8401 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%k~kgV$(>a6RLD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE${4#z3 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/Katakana.bcmap b/src/assets/pdf-annotation/web/cmaps/Katakana.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..524303c4f0c20e6cd19aa1d35805e98c2c05cb7c GIT binary patch literal 100 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe y$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{bJea$}HdW(NS2fFFMV literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/LICENSE b/src/assets/pdf-annotation/web/cmaps/LICENSE new file mode 100755 index 0000000..b1ad168 --- /dev/null +++ b/src/assets/pdf-annotation/web/cmaps/LICENSE @@ -0,0 +1,36 @@ +%%Copyright: ----------------------------------------------------------- +%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated. +%%Copyright: All rights reserved. +%%Copyright: +%%Copyright: Redistribution and use in source and binary forms, with or +%%Copyright: without modification, are permitted provided that the +%%Copyright: following conditions are met: +%%Copyright: +%%Copyright: Redistributions of source code must retain the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer. +%%Copyright: +%%Copyright: Redistributions in binary form must reproduce the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer in the documentation and/or other materials +%%Copyright: provided with the distribution. +%%Copyright: +%%Copyright: Neither the name of Adobe Systems Incorporated nor the names +%%Copyright: of its contributors may be used to endorse or promote +%%Copyright: products derived from this software without specific prior +%%Copyright: written permission. +%%Copyright: +%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +%%Copyright: ----------------------------------------------------------- diff --git a/src/assets/pdf-annotation/web/cmaps/NWP-H.bcmap b/src/assets/pdf-annotation/web/cmaps/NWP-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..afc5e4b05ee6f4be4f17eb616742b59aee4c5ac1 GIT binary patch literal 2765 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 K#KF2yhX4S!xj~o! literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/RKSJ-H.bcmap b/src/assets/pdf-annotation/web/cmaps/RKSJ-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..fb8d298e9bb8e090139bbc5e958f11a237672825 GIT binary patch literal 534 zcmW-dVM|kS6vlV1!_6jlIAtre^(Q4FZ7qdzD5oo@Ra#hW!6IgQZI@-tuH22r;(#pN zc3YNZS(fEYv$QPBvQ!BADC=#XqScEBemwl(fk!HbNFU1>Bk}7gaWoL{A8z;i1EMFU z4{IWvNv5>Xr0BhQO*h7LLrrNh->#lSLj3oW!qAeMaqC|h)->Tea;}$x{o$YmELjUc zR{7a&frS$QWo5ftfMs7cJ_O=wHmj={)2+bMHwYicfu9^8oM{H0876!>2>i@TINJz3dxh|M1o(xUaIPMBE=2h9Jn$=- zaNYqt-$(7G(`^H#%Fe=N;MX3)#RlNTFyYb#;5Saf(o zt}4K*<3p7z@0?PlvV!j!_(PZ4@LR#PPT;jP;l~v4rw+n(Kk&Lv_&EXmrIm2wAn-<< p@M{eCTQlLN0NxxV{2m4V(MY(p8+a>1xP1xs@6@aCX9<2q{{oKurl8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7UUi5rR$N%+UUr**PoYhZy+br u-e4w{y8J;XlZGnYh++xso>knU|bjRFGekSdyBe u$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{r`}Oa}lMG#?cJ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniCNS-UCS2-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniCNS-UCS2-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..d5db27c5cf1f5b0e66e16f6314d042a4ef707222 GIT binary patch literal 48280 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 Jqc2`({U4}20Ez$r literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniCNS-UCS2-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniCNS-UCS2-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..1dc9b7a21bc59b6540d55b3d8933e5a6ba9f8947 GIT binary patch literal 156 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�ksTLal!IJ% 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniCNS-UTF8-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniCNS-UTF8-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..22a27e4ddbe26664c57f778a864b6872f6c2ba03 GIT binary patch literal 157 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 Uyk~SGTv&9{NH!N6NOao&1LeutHUIzs literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniGB-UCS2-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniGB-UCS2-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..53c534b7fecfd84e465c8943fe3adf500a4444f4 GIT binary patch literal 193 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY*)9BicPk;tzg!q5^X z$j}nrT*t6SW_C0~i#-EFiybR_iw6T^OAsT&9w{L02E+l)b2AxQoY)v!T$mVIY=JV; k+>9*_j-3Bx_sB55H!Wak%8eoOCt*p0P(FjU;qFB literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniGB-UTF16-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniGB-UTF16-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..b95045b400a77419292cab245f9f66f6298dbb5d GIT binary patch literal 44086 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniGB-UTF16-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniGB-UTF16-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..51f023e0d609798e72d46bf41309e092d72ccb07 GIT binary patch literal 178 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 M|Id0?+kYqj4{W+_`v3p{ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniGB-UTF32-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniGB-UTF32-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..ce9c30a98541e23244876fef9dc67c2639fdd746 GIT binary patch literal 182 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 W-NpY7&VvC#?^62*GzIJ*TmK)sASzq{ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniGB-UTF8-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniGB-UTF8-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..f78020dd4028d56497c44b7afa94985f0d18f8ce GIT binary patch literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY(U;%1@i;UxH|VM5Yq4M+!U_+G%+;v&G<;s5}C8#>Vd literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..7daf56afabf65a4707d7bb06d829f56b247c9e80 GIT binary patch literal 25439 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-HW-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-HW-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..ac9975c585ede6958758980ade161f687d40d58b GIT binary patch literal 119 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9BtKtsO>ygO9pkUpY R&cJYlpFy!nMUA0J8303WB^dw! literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-HW-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-HW-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..3da0a1c62f19f720590b54fc1de7b027af100945 GIT binary patch literal 680 zcmZY4T~8B16b9gTW_C-zEKrO{Xki;z^rld0f@uiR4Ix@Y5SLOB2rjVUBlNpUP=hJZ zdv1(>g-o)Woy5N}MSq0Xx}bOFeWi!YTCQwVdLmXyM5o#>UP7ff4B)v+t$V>7V@)mi{{+VJB9MW zeBMkKX3fd;b1MvOy0r&Plg#y)x zX}a?kEYdC`e%><$20DDP28u4w=~n3;YfUN!NqxPZvI05?&-otvW_;5=!}nylUyt%< zl+mDX_+Nh*P#INNtw$dr{1ChXUIIS?FN4>>tKfC;b;>uvHz-@HZAgi;yP{& zWD?FQJ`$vs2>#XphHs|;qU{Wr(w_ML#!@oBh)Y#C<^_Wo0+Cb8kt`GOtNE+q)oMTu zssZYjYJJ(5D(B#;5O*QMkP8rfkc&*df=E%h0uh2pKo%j_;C90e5xD^|3b(hWWz&#b zRBl6zLD~>8BKP4&Aj^y3Hq)$ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UCS2-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..c50b9ddfde9da7ebb2f67eba68d58fa2cdee902a GIT binary patch literal 664 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 UUp1g87AoR8lAx!|poMAw7d?}<%>V!Z literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF16-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF16-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..70bf90c0efb66da2a7aa19a820d766cfe3ef3183 GIT binary patch literal 643 zcmZXOTTc^F5XWcEIeWU@mZfZql}p1S79^z5N>bApgDXKP7qONqiI&*X4WK}=trCdA zkfrgJ7Xyht_z`$)Hfb#%WUGFXdH~!%YTOcem-5?-7jsfZ&dVHA`y+;jYbo? zQ7Gn3J-uJ9nA>GNxwBR*?G{V9idh&}jIAyGYQC(O%(7Yfcv(!FranHgker@*nx6Ti zW_C8`lIcih`Ee{BnKjtpNi`1=Fpvzl?yF}Q1*S5f*3?k}2)KY49L}4IKaqoG`Qku< zr2IqQT9x53c5B3YqmOC9#u%lIM~wufsbJV^KOvOJf`NbW4wool)bNDEc2OJ?65`;c zpP)ef6jJW+L;J(!l8eaH(1-h*q3fqC44xbu@4*4W;1a^M^}xVY#=%>S0%g^S|2rMo zWBMgv;0XDp85sT1o=4jFCtG%qf;F2tH(%3e%$v{Ku(x8K?N{7}7y(CCw>vVo9 z6cU=DzJBn720cg2BSyO~0?>^#LgnI-v}~-6~Uex?ZdBe ztS?FK`WnG{_A@qTSFu5??_F4bl~bcPvGuOHj!xVoIWwF(&yYCF9G%yUIC+ZBhD@9a nq0Syd=MzEakYUSZoypkR&at6$Y_Fabu${D4-0ek>+ADtn7bS_K literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF32-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF32-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..7a83d53ae70ca3d81cda827cc224ec8c5efa4f17 GIT binary patch literal 40539 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 TSv}^!0%Bau4|_Jjy$rZ_2%S+!ysBd@ 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF32-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF32-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..7a8713539491f51c52ba3a1525d181efd32c1f0f GIT binary patch literal 677 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 Zk@2$oe=xv)=QA%Cm7k5@(*(V9{{Wi~yy*Y{ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF8-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS-UTF8-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..808a94f0fd9c3b3cb0267e5cfe4dced2e65ecb1c GIT binary patch literal 678 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 E-=u#IHvj+t literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF16-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF16-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..3d5bf6fb4ef94b452ed1ef0df926fc2bee55e973 GIT binary patch literal 647 zcmZXOTTc^F5XWcEoITxcODS8ha%o(|f`kCAn3~2ITnS3Kh_zHn6k?$pK!IXgB@lxl zOXDjq1`>VnBk)KzX@w86RX<5RfNy5yQNzGM`wl2!b8QOsDDF*H1#8XJF_8ULea zH`gXp87XylFgy1+o*0}kdG}#u2^8RTl(-T{8I&ws6x>*3k}QSDJJNt6yp{mv6cOqJaD7jFxN7$?&gjXDK+OiIXu z7k-$4LIi1V^r7?NV#&i)GL7D@v&hv`Hii#(54K?!p?enL%G%+^WhTI1i2?D-@c*5r zg#-H1YGNPzrJET0(U?m6M(A8WojiSc`a&qGB3Nz1)JIxtN{bFn6wsRVX6RsHQthLu z(MUvUMmoD71Uj_ubDtb-J8y+H3@RNIhg%{b7{-+#YC_?<=vV!H{q~XnJ!)ofBB&Rx&Ty_M)@* zHG$Px#amrwSY7yxXA_H9WA^tJtiH+xV%M?$uCjt|!l$_7g4}1w+&O{nYtGyyLU&bV oZkdt0&C&hD(B0!$_t?iO);Dsz=L8#z$9Zg|?0Iiv29(D9Ur3XRZ2$lO literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF32-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF32-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..09eee10d4fb4b9fe1e70a1ee56825a207ae8034a GIT binary patch literal 40630 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF32-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF32-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..6c546001331cf4f2f68563229f994b55730dfdb1 GIT binary patch literal 681 zcmZXSTTc@~6vxk*GdtZbrIZD%TpAX!R6>9P2GbaWxIrlwF)r063Q^h(pg^&$5{SW& zrSX*)1BpKP5qKn`1s-L7z!8bGc&6%9b|D2f&{eEudws-UEt7}DLB$0>@j>h8& zV=|jtu?=gtP_#D-Msh2Y%WvoMZ;N(zNSoZ)Fs||oM&2&i`A>DHW!uKk@LbZIdTLGm z(NkONGf7KI-5pFVJ{}t#oHjW?&rxXw6yTtkegGp>PH_Sr zg1l$QyhVZDYtFnCLT^oFUXhWv!_oW9(A(!&^*JXhRyQ;9qx7C)ZTTdNwWO2w*XBW~ GrT+p)28xXU literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF8-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF8-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..1b1a64f50d204b03ef0c5575233687830a1b053a GIT binary patch literal 41779 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 z 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 StUu@Nr1Glp*C4U(!~X!6rxDoz literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF8-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJIS2004-UTF8-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..994aa9ef9f50495a3ac558630b0234680be23c2f GIT binary patch literal 682 zcmXwz-%b-j6voe)ncZ&xP+*Hz(8|Ubkr1F5gEq#HZUa&TftD%;Q7LTz1&VEjKn!## z=uIJ*lt3aE-gw`5MK)VT^@u_4q(qZw=&r4_igcOe^qVeVGV=x+(Iywja zzTPLn-aqxB#km20(1^O*9vbVr-`?-VAGzX?%=C|Y+hO2<0VkXF)LuTsC@?z%y0f7~ zfPe{z%;~A`#ZeG^0V(#gN*vo=5JBP^5)md8@17Nw74BHt?5T3U13;5)R)_2tZgHi*Ph2gGDy7G|gsSPOPV z=E20<%{DMJ?9j6*R6T&|J%fh^4-C8pJx)~L2t=JkqP{i=8H^jOD1KDe)4!H6Kg^l) z(**OA=?yIQZ(hd&$^9M0{6yGZP90+D?ZFIc-BwQP<*7D;L>uE#d%=hnrl`#ds3jF2 o)m9j49|&se3`?fmseq-0Fw=K)Sb3Q)N3i1Gy<)Bm0aqFS2j0}QeHI+_hb#t%0 z^sD3GC; zUAp1EhZJd*5WDP|h6FltwGN67(3xiOfz+ImO_Kb2J8i252+IbZ1!e;?0WU)R-Fv-F+$BYGcZ0(sh`VKz#}v0Q zb1)ruSMix3xkT`{1~KwyQW0&XA<3=D|8HzL{fl^1fook!;KLwddO4Djcz>% literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJISPro-UCS2-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJISPro-UCS2-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..c148f67f5e9fe4a108519eeaace89e708a51f8f5 GIT binary patch literal 689 zcmZY4-%b-j6bA5bW_FiuTM!Bnkyf_RMQ;j~CYXj0-H=905X4dtf#3ogfzW^3DnSeh zf!=dtd<`$jB)jQ6$SnF0UgLt^nUi16nQtbO9QO0=Os#(8?tR>C8Bg>1Y-S>x%^TKE zZObuAN6nT~X&S}qcFnEVT)XA$j76=31LO96({P=p<9@ygOO9iVjn5Tl3iGAHukLbn zZ?;&+XyjjiqN$83 ztkG*eBzzyd23`R_0Iz~K!0X^H_!{LK;Omrs054Hq24AB5olVSX$`2QH^9BEO^J^E4 zurMqVeq!sRNpw;`XE^jAlsqHo^j&NcZ$Z_)?eH)U;%(UEF~wEF8pFA)5# zA&lHk8shCNn9?5q|Hf9bzll#(c%^d&@c=|lF2-_9Braz!S1y+|HKJuo$7=?5odWhVG zAA_ty)*%KV8xSeTeMpze7Gx7*n8`y36Y?0o0zX0ISNL5JeMFwXk0YQ6Gz5$UVR+Bh za>oebKoAQ>LpmUov+oh&ty%hY%B!SO;r^-NB>IuS(5Vu$=ykj^N1_(Fz8@6+0LGcP AI{*Lx literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJISPro-UTF8-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJISPro-UTF8-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..1849d809a679e56414f4e18dce8ca3c41109e84e GIT binary patch literal 726 zcmXxgT~8B16b9gTW_Js1`H(_H0)?8W@dl_~pp7wxk}41c(hm@UAPXCT&=0m1f*8^Y zB{3-mlad&NSH?>dZcLhy-E{PKOwsKR;4io!X7Xgtyl3WIjPyG^kW6jr%P*HQzB_?{ zzx%G=AMo`rCRNQB*-U4&c-l9VSV-!rq&}a~7JFR%tE;|?`)Qx9r8Ry1Jd9|Xucvop zXdpBi3H_;$C63r${xUo$uOdTF-gd2JtbyKP`36C@+uU_ zP=XCs_N(z6k~^P(XMem85@^@%6ewyyb6dIiRVlB_L1OJ4p7yB@tC%G$0K)Fs9@-w* z`fZQGtyZzXo=}O_+PW_H+YUvdvZPVf^yT&uQ_6j zDNbX-K8=DHv-Xptw>b3#+p5_kV*;-Ua`R&Z|5h7va~Gupb$LG|Ip6!gm77A>WlNQ- zJKu>(6&R5Z1K^z?qA%>O7IwI&G+df2O*oWV#X-%u-drubS40S=0^S1df*1jBh8UH^ zIQVrcqTo*O4v0yJDVU8gokYxl-+Y&3?q?y^A=2ROlGp&h39$uJhUp>V4a^$wCL*?B)}caCaiAiRiXC249o79G zsMG-!x6Ng90$e^8gT$B)I?ql%8*#7K{tj<$x&zJdplw%n2kF^Kp*%udL2`ETsS^4N DWh&!c literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJISX0213-UTF32-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJISX0213-UTF32-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..a83a677c56df6f1ac395d2ba71e60a08b0985e97 GIT binary patch literal 40517 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

ry6~E0z8>XD9~7$zzTJUQY|Ybl zQEm&$r@T#>j>5#v_#DY7uZ`Stu-ZniQR|$L?<86yEHEroO%wV0q7_B&`MB_3F!*R}}ZDRaflm@~mVVH-y zT=b(vkD~5i5sDMbQJmRMdA$KcaBdk|R_`hLU1H&w^>f>F_+o~J4%9D5#OFO2jQSKY z0q4$$zSQTPL2(@KJMW5_XkgP&7%`*`E{yR8_dparSoi#VXaXs1j$mK@~Wk#K+weWi&-F@i`mnS{NiR*a&dP8uJ($nW5cNFqHFO4$}jE7;qX9Zpf|6t;j2*Q?q?il z-{7j~Am!H#7_w{T7!+Q9j9&|I#?=@+cx@c$=UOz{eQgRB(zR*Gh{msFz))~)6>7M) z8!x)HFB?TcDvDDOocMKTj@qvKVw$dpV5qN0?nW^Ur)^x12;>-ojtQWWjyN>GV;)BrJ2KJej^%ME)|gO04B;J{`54AK z_TwcThe3`V1;vq+cZOjWJ0n1Jos$K@BgPiRLRS=vI95dGYD`V%dVU<`em(_XoIzJ_ z8aepDO>fNuWdx@5<^;UvW;B?`%_);n#By(xi_nUji^V-lFuXU@w=#Zng&^gdXE5en zIvW;c*EIB}YZltymADo~3WqM#wL(J+yC8V;u0tHP!3NKW6%NJ96D|7*h zNPiR)1tYw*zzTkQ>xhPzb?Z)`5ZtNT8^hA=ix+l>S@ja{UVy5*7jckm_bNfX-Mg$f z(BZZbI}^X{i{ZXKW^ze4XBotFL%>L~RjN$ENvr(*Ck7CCLJacdnyB?j#o!FzW2oDs3 zr0<;)#Tf|jyw?}q>J3KKz2SJMHxjhc8*N>LG97f>yBsX4cMYbhH#-i+mN^XBzKd|R zcLR!}i73vXhCV4Bh4T@3HGY~wN7mDkt#o7~9oa)iAWh~-BfIFo;M}>*Iq+=!tfw}J zlO?cC7N1dkOT1Lyk{C5!OI|>2sX1^!{JfcdnPdIe$-W{Af5tKtg~P5=>(Z;svFEV!WbF6r!{jK!IXgX&?qe zj>cDB3?%yCpWq|8q)kcqH?HbmQm5dX*?e|3Gqc~Boh<+T+|2Fn=Qr0kibgzcFf zVhLj=n_IIDYrjymw+lvcCzH$X=JIcgc6Lmi+1fI$@(V`ZF4+0Krqi-*V{CjeY0f^i zX8(kjcQ)sfRysBjpB!CIJ(`>toihbM-${85BoH8(3V;!*q(B4(aA*1`3k-a~Oio#s zwGwb(Rv4iFTfI0qB5n-@ZgdMxua0nDeOOI!Zs`C60rxTEOd)#z**mhtnc!v%MF-p* z6(b=k*xbiC@Gu95F^DiAH0t~TVTGPgUG!`ssWRhQK=kw<;&tJ%rBFU_}ZEEE0s7mb`wDO?Z zs;2R9lJZL$m-Fq1t@&KTlAnp?PiF?Eh zF|DKfPGRl}GWQL!Or(jDAKk;RQ&?G&{FMyD%F1V~&8=dUIp5o{@+uRg$KS;I`|>(^ zQ!SD=D|7D|GA|{g_gXM-jia}rFt5nCR}$!bV(1+TtoxiZ1?$@x`YQcDv9WrV#YWOe L`x{R{YNY=HNrj7y literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniJISX02132004-UTF32-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniJISX02132004-UTF32-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..e1a988dc9e80be9a0803e22d021b1e81fdcc5b94 GIT binary patch literal 40608 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 WYzZKilxEs5#lWzyu91adzbpV2cs2|G literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniKS-UTF16-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniKS-UTF16-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..fd4e66e81f3507b190fb2986a26a45c1c380e302 GIT binary patch literal 26327 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniKS-UTF16-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniKS-UTF16-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..075efb7054901b1022af68e723647769cbe1d556 GIT binary patch literal 164 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;$~>3>*2_)AhxfT zk9~fwLi5~Q1}+vx1|1$o21W)s^F|h%M0N#X#(mZEa~StkuyXEaWMbS`-#oX7aX+sB L>wZCNru|X?)N3(k literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniKS-UTF32-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniKS-UTF32-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..769d2142c03b10680800b3b6ae883e27fe04c5a2 GIT binary patch literal 26451 zcmZs@S8!FyvM88YRcmd(<-HIxNC~kbzNCdUp8C48k||bWyUT1TS~aM+?WJ(sxlzbW z$@HS6{C3e7UE7w$>$v$nl zXS)RPkO1-J8vxiZzt?_kILtY-U5P1BnQuwv%3|AIbAjtLsA!UEkW`r*^d=p0daOa% zYEEHg4CF1kIF=u8FV~r`A!kfwIR{zD<=v{)iI$sMD*zW(9k3+JbFf^jG&d#LuNXF! z6Q(n_|Hu0vS=N{hK$8Z>)XQmYEI_W_syW095_a<3xDvi5Wj9|PmtVevDl)Arn2y#h zpXn$~VHu!i2@v=9G=XI>wK}1~+GsG*w9y32NPQEM)ut%m>^9BjI;B@Ay+_3+8W~L* zLKfdH0auywfa@7TmT4dIOj8EvKoISu@(fUwX8~-2_q(|%3rle)mOfpt4qQ*@}$4`UpHrOj6P=)5FFj@n_KR2 z%#wtC419H9c@3{1coW*Pp)Cg@htO3Ahq+~=u&skY26JXZN3OD|H+^{bpuNz1VBFw% zZK@kOyLi=Cw`Qs0kHM7wR)7BJGpz;Qynj8pXR2A5$Yy>w$|OuTO;NX0rXq9U6>d(p zrI$<8)qmb|4Y8mrpM42X zLnH^58|cpCGY054LiiPJ+tIT)nZ!o~vot}!2CR3n>kWjS2saob8^znp()R}V`4mo{ zmc4JFe>GY)(qawv9EQo4V16ury@-7k;BMv2(LoR7Q729plciUZUJ`&o8H92rOcVff=#fn6TfYTZ^xiF0sBhW3;3Q3 zi&ZdsRAo8EM`I=TK5&;Z-(B|U3^S*KV-L<(%Q8eZ!SF`#r9npySa0y)8=M0^p9_`? zFre1DbQog%LkraM`9f*@sOqQ95IGKG&u}mu22~Ka1|}UW++VR6Crqo+z851q&~b|J z*_SK5*RzQn7~cW@W)Z2Q-octoeAb=CJK}jyE;v)6Edkmd>I0=x_a^W?W?fm#eT7fv zbMrk2zd^?_99;unR^ik^oUg#owcy@{;W7+oqw~1vX~c;P_Wl7*HAHvsf%i;uZG!oW z>bF|d_TrU)-iuEv$vx8IZP4^NA%`X;E2KSD-2%3 zsdH@NCVF41d^fr42%E0KFA3QGlACqlY~r6zGpiQ5D$%naKWD+mTX+SBkHdH&emo9y zH{dc76VDOXh0fZ9;Rg`t3gB*K}~zgX0B8uBd)0 z5Rn>{`4n%vEca{%Q%men2?XB=(^GI|q9Y%B@5wzn*;d2fWkc^CVcLKl4|w=CEM)M{ zMZ8xln{&|-Bembw{qz*O&T`8k2t5MFBNo_;qcQBFdPb`c@lIoOPlvjqSpY67|>};V%^{ z(VnB}d;%T&q+9az4zwI#6Q^+O3XE{D<{GV;(0d=c&#}eT#`$#k>mBhg`_Z=&f)a#d znXQn0yu*fHvbHp!KHO zZ})>M2Nsi5UkkZ;8yiZ3HVxRGz-YYesK&t~qN^6$wcG`&Kr@(+iOx4{vYI*1s2uyz zc8Ys;@L#t>;3U|easM0sP7CjJYM-9FcY$pe3#Nl3O3X&X)B|vq$9})Sz8f%d3CCYz zcprA`Nl-Mb9q2UVYs3Ey>~sVrQE;VNuf zDSI-pXCw5k;qEmO9mx>^A2)!x4$Nmc{e7Pd3p(g5gTV~^UIf3b2m3zgJ)*D*{{!u8 z9{h(C{znCTSqT$QaP&Obcf$KTpb_V?!K&7Ltw;A+>`jL-NaHtI6;29O*9$Rl7d&xD zTkh=>?0?3)lcdqDxNt!Jc}Jpi7YRgfUtwrBc5rF*J`82RVjb(dA^9Il)+hLD3x-?c zMmKXmGDkeTmE>>7!~qe$$6R}$H=kMc-24JUx+LpkKKqJ&Z55wd;E%1`o1?O|YU*(` z33^`3V^7icSm$7|-5b%H$|H}}U7Mv;97<+AR9>l6^1uyL#St1$*;g z_6+`%4Ay4`M+^9p!E_nTTj5_HX#O=Cdr}~f3*knv>d+=9egmAksPE2@{JU__z!pey zK^Que+*=E6t5nV%?AI4sMJ+FzGZO9m0A$xY= zM6=Y}qH-AxV@>Rr3*5U)-4jD|VAI#IGcIcSy4sTro_lIKPr5JjfjG7u#}0{IB(@Do zXiAaa-&OlAim4p7pw-U35OdGbSt>pkF#jRuSqB~!e$0Rm2~oe?Vn5%+pRRG!UH%~r zT`|IPR{mTe^&ODfje*`W+aw?19EiWC^uCx`&A6Q5(CGvr-pm0H0=k} z6D4R{0p5J|yaAjlv3OsMG|GNGI7--JBkMBq;A!kXEPsn;wtd(ahXc3S`=j8=6&c{J z5^b+#*Hs9=B-KV^N`bak7=MKpZOq_H@ue8rZh)td(Ykl+!=894SSOtOaGpqfD~u&! z5WsqenNlQow%iU&`dI^x z-)7Civ4;(8Vm){1+z@^l=FVepGI-Ak^Ifn-5h22d=jx9SaK0H`8!_+_ZI?AY*O}ua zuR@Cs&3g>KGjb@4^)vce3^^(Y?{C>2hw;th1BO zlL{T6cHT*+?KGT$?n}aRgLx|ALsvzxkbSO9`?-Rf8*u6=bgj_*oE|q8m0-HUoV)d| z-4MCLetiZr0*zo>k3E;MeJgY{K!%>p* zBRd*k{2YErf-h&Wjg;4XuuIU@0t;GbPeR87=-7pxLKwRw*|xz*7LLT?phh-VGV>wU zM*408*iMm748eNrJPi2|AuUDpM6+P7q#1YZ=aF!ptt&zmbKD(SJ=fvpezE^DvPYwNR%T zJ&7dx4n7l}JnRxUScvlvh&Tzcd}K3*b|v@jmj_p>?Dus8Brr*|Ez!4LGjv9Z8~|GZ zv(~ZC#Eny6^bH0}48a@dxSD0-(Ds7+ZYM_`GDkY|rzX9VIO)Tt^~_O+qh%_~7K6!% zok!4j1?&}3wzYy}q0n==?GjiESY#!b4Xo!TEH=Z!5wPxIk!UvZkS%P7u|p8n!ALc; zXr3ApY$J`?gP-C}r(Q z%)C{Q7$~Euj4fti2Z?Eg5-EaH+5GKgTqsfbTEPAW`s!dhLo&zmz)ES9Br8&oqa;TY zGworX{d_DHECsyp8I0aW`+fMiUhUc}&jO3A0na7&_AvbQkTg%i!$oPKS@dneb=VsR zb9%64VdM==KV%(6+_qT`B!WqgKQ*d)4smyhSa^)zck3(?{!)y@YRz|4j$-&J7A?ux zRV%m0bK*Os-uUi=BN4nCpsNT*8<>4BgbWgCqJa~vyMc|<+BbtMnNMuT_8K;N1wN|a z<2gQ62|Z`PRVs*cxk!KAFS=@Q{3>)t%Y&<6E(x61xHnfG(cT67ar)N1Blx?Dy693+?L%+;Nu=z7pSGLq|DuUI6zlX03)uJ_;a119) z*4%!TeIJe&YrcRw7AMk}e-(7RhQSnL7ikDl7*1zXf(@7p4a~$d(z3eFv)*%Hx`lJ=;F}DNZL%#1 zXCJF(QZbj!ZU^5wu$8mF68)*zhgddVjD2^dsb^qD>8EH2#IfK@2yRjZ9`oK*<>>Xw zY~Ts^J|bI;t4TAO#z;x=Xh@TT@MR3$;`2LrUoP+2!#yZSmv-)jKQ2KV4H5&9eW~u_ zy7`TK`Z#>424ef}1bkP^CYoU&O}6X>dlLq3pl=nJwt#mn`W}Pz91N}Fzn3Y!y}gKz zCiS~gK6D<3GNJu6`<6tO8`Z}H;J6LW3oy7t8oCVQnK1Pj?P?5^N#4^UF=6Bt3+0O7 zIcAcXJCB(ULw6K^$HbTG@a>jN)al&7hHB7~0f9Ztw?FEvRLA`hfnx&a-9VyI5o z4ud;|bb98v0qf9n8LXtBXMtii+J_Sx6}@=m1eZorB{+){EIZJ>TDVT5>oxSp ziMDL1{h?-PJ4~+9yVTr&FU5XU9hXLLYb_59BP-PNcVT!n_?SGX&&9|VK6xyzt611~Nr5`ql?A`;htKQS}$zEKnf14KPwBhWFt@8JPBB zXAwB!CG%eHKM#u+&|Zdb&kH-_<#bR;&YNgSMel0p+{$_@F#Lk`zJj+WaBwegKLO6y ztZ$dHv$~?tbAkCEf+dc7E)$xiz$$1;n50a3+hk zbet-NzGx9RgBAw;tPX zH1w6gSuj0=p*0XZg){rv*a2ui#d~GweU6S@FmncGPNSt-6HI0Q0pVX;AyEt_pmjI+ zSBOXv^yEXU2-UN|b^KVWcD`Y~#hh49gk-qAV(1z6K4osL)RTx^8nD#k*UkE2&KzmX zLyR?9CF=M2MJab^XyXMrbs$&&J#B#|oH@Wu4E-taE;;6X5`0T!E)0|0SjKz zecsFLb*vIR0%msN=mQ85btXc;N&xFP7Z`PWbf&IG>2l+fuk0ryoP00VglP*Q?2M$JCBh>R;cWzkyq~Y5bS@EGfIK z?B|uz+p`#s$G#Q_trcMo9Y=&a8ap?`;(2(Dy=rtcg1NxpC2Jky)+ThPp!KF`t6{zA zcphd8Fsv3n0~yKX(JGjIAa(1x3FJ^3I7k3#5Y{r4yArze{9^n>r8=}tZz{pIW^IQ- z-E$0viwTSP%|N;{jF<7Ld#F%>QS?VMOCkm;$zTWm7OA@cf8Gf8<8;)fnHwbUAsD=_ zUP#B8J+k+#)UigM+bR8g0K=Io(o??B`B%x_pGvAH=`z}W7H1o9Hiz||RCy1|&O2z< z^TA6P$QRZo(z39(9z$DW+U~NkB5>b=(PPa2LjL%QPsg&+gYpQsN6rT4^N8u8bMWUVv~9>ReV z@E-=t5wHmul)!SGx0R?|Z$vNw9P3!*HFp&AU^awaqx~i8eFm>|=0x=Fl&r;3y+z<5 zVf8GFT*Tq$EO-$6n%KKrgnZuh7$(S&7L6D28MAMI!Iuz@k?oaHi-qvZy|kIzvhN=H zIhxl+xn4zgZf3S!;1yEfF!o#nODrr(x{wy_$-;CL#|l~3L1vZ|HuKjF@F`FA?l6uW zW2U{V{Skh=$GzD+e4N=ILhu4}ZG)aT7!+tG-jNgOMNfHL2?>BrKq# zSqiRVoj1Uy0(-P%^Em zC{BaP+we;nP>@CGa_g1&E!V=48%Y zxWLDbGEWk|y$#*PV5@-sJ1|OC2+l`j{%#GZ<&KvsdzC!+%;0>$eE$qyutG{Em9)t*J$Sw3@$ z_f>Ll?VOBNz*GOdLcy|m;t024y`;wTi6sr%OE)cv%Wxfj~4A^K{AjLYhbDc&Tj1069RS$Tn`Fv2WoMwNoz--R0jN zv);Afd68*t5?{B8zdd8^CDFDF?A(X5+ce%H9MsCcJjLl|)l8+Tr@bOjvc4aH&v(@s7}*8>%jnF+OUzX$*{kq}BwEC0ZY&^$`Tlk#K?@5*QL- z_%3TlAd`1k3uN9gt;F$MF_#S8mC#XuliQ#_OZJs%+Ad(b0f!plX9j&KV115$vQh7V z5XWwTsHoXT%$>&kZ zzg%TqbO!8@oG6^@u;U!KE7;E)z`Y&6Hp_D<273u8g;pYsa#gdyN>2VZl=F&PQjfw4h_|Sa9A|^%Uab zMfmFz`FjkSb?p1OR7<(e79%Ftv5qScS$o zwanU(^x-a_*bANA@nG#}qcY>LG_N`*3T$R2z0fgV(CF>#%_kO+=sgLjpJ3xMzz)!a$h zQzyAHz`TQ*i{X6={Dq{XEzlK%j$Aqb*vMVsy{Ml)D(uzhIIR122|}l!`!R;j#akQ6 zVZlfp^6z1mb=dV%vN1mV6sXOYgV4svSEI62g6}E3t(HC~z^9#T@HmA6bu-~?Mq3Mn z6EIvF<60-Ww~5IYY;X;G-++!2vZs*+6VbT=Y`1Wxku6k#cZH#XIrBw`cHID0SDs=mA~en0}a%vVgW+m`;Yk zJ#@z?X5LTNz+8dv*Wi4j=53v>lPM~uD^X?It(jEux9hnnNAwhfcO8aru--)WNyW{l zb#q&JTO|u`nvUV@W(+jKAo*}lK_5|; zB)*ojGT!l$*&3mP#KvtfUksu3!d3;&2Vmc-4xI%%LyLe(qWj&91Z-a+54ONyj_N}* zkYk4wl(*L*lBtQb7%bJyaTh+8aSB`+i$&8a9z4p1vSIiI^hU9FTDEvfvhFrgP)z6^ z@4usdw~CLY;n*!rn+`l>eD(;0UgAUzG_uJebkxF!ljv7L|4lHuVW+W&~^ZQ71C&>G~EiW>#TbZnu(Ok$+4#OCSnbA8PuLt6o8;It%cEK_=AM* zEcUKK?c2jf?nocAHJwc?bb`C%nDab#tJ$msrj4c)&w8A^g}=Rs8QIMT>$&e3%(upS zvtZ!``+O3|PNAJKcO}kd;#{rH@{C!Nu=gR3)nZ$z6xuF%PV&$ysrxGLjHTmO-F->= zw2w@#d^(<+o^m@1&qf3s*ucX((58Xu+nV+kidKMOt{RKS_E)6;tG`}llh3)e0J>|D zJTWuRVSEEK-(!=EkM0tV91H<;+=?GwEsZ5IXT98&fnT$@lRVWK{E5zAf|dt#&{F(K zG!e#Z8TOt6_e%;Wl1QqWJ^+1Xq7}TG$WjcQ57CjJL=-vdG;hxdhrmCII0X&9PiDPE zoP1Vo`vobJ7M0?Q?^a9pqw2_ZPRIS(8~u3j`8$T`|mYf&aWw ze0w11tn-$Doy^^jVDT_H77am;)0;>EQwP!0)pni&D+G~7dlfp?C=yTa8}?2u94ECyyRbi7 z_zT!@BYYL`wF%7Rxya}4*RpTDcC1AnuHfEUw3VU5NHRP2Jz?Ivl8sDELVCLnW^Th< zj^iigadHK1RV2^f4M-}X`IIo7Rrl_P&Rs}ug`s5p7^VKb3}z0(LG?r_Ogx6UQXJFC z*2}_Mh2F9l+XbzMW8{$P4;A=NqyG%_r*qd8jI5Q~kLzvM&`RMQP25u=lhw}~$EF&v zyH4s|2Y=bkzQr&SHOJDSgQERb;LvTH-@^wt0@;p6D)IdZn0N|-8gxI3v1EaD6LwUA zB@4%!IJudAkB6VmD;6?m9Sq07T$RQZqZ{1?zhpA^O&B__#3OYTKwASh6&YSf_hz%c zC~kX%&UiLf2Aw&IC37$nEG@EimpsJKL2FHZ>|Iy~oq3sGuJR9B9@uLb%!Pqy9%)f^ zHQ|s}vR&id7vyOJxU~=}jyc39Uh|Jy@cP_fRDoU zwxX*_P^3g4LF$Qz#W>0I97%?nZGcElDk-Q_`^1NHa`#O!P^s%qH@Hgq+kMja&G<^*Be6Fqf8a$RLXvh3wEQYJ^wkRux>k7557 z=8eUv798Hp?X_y_>lnuabTvugGF2!k-uwvPkhzhO^)6h5{vEt0jf~Rhyo&B-xmN?e zjp#aSaBe0GHV$n;uUZ;u79Tf=vHMb2x@LHb=vfJ$nqjJzxgRCEZn8>Mmlo#^vqiG0 zc;{6JTw=}(I&-C>F4=d)1~3g^}pL%DPksK0I&eOJ+&$rqlAZ?f8r(UAh|xPfHd za~p*XqI_gWEJj`sYLTvarQ)du%HF}qguHHpQSk`EO%u@^<} zF&H|)M-C!I?K;WpbAda^u9X54Cq;N88(l3d7qG)1-fh$bQ=s#>)K!#oWvwCo#o@JS%|d!^%!}I?i|^r)tZw9x#Y(;YkIb* zyH4TvZ7}ghL^7eRRu?`b+G2IR_b`;pd^e>2i)^eaweJC)taJpb0^9V~VkCpeKpOLH zgz;wn3%OR0anEKJ$kPt(Rk_!b6I%6=tDIMvznZytjO}prA1|ZFDtUjY!oj>0<7N;Y zQ8;)GhaRE5KseX4YM}Vp55;WIh}Jh~Il}uD)seP{!cs>mHYN*)Ht{dpz|CxN_v6ze$< zO|}Zwu@4rH;=5|ub_09sWcNk%oIr9n*dE|)IxKF1iD(==$oqG)nd7qMq3p_p@IC0r zle?F~TKxCOH-%=Ib(5AH%L1>Cgk)@cAtuO%AH(JiK=BGe$?_@5e`TQ!b{;;PpE zM()|b`wpob`C>8whEB6D7j?fq!e1KsVkw4eMR&RE(R0h5#QrKVaG1QFhA(xx_qQnQ zKsfH}DH7a%lD*pn?rSjf54HpeEo0xFvC*BP?+&_%=OwFM6^dYL7vxPL2O-Q?fm;tB z%3-2Ho=E|h8cha@h7l7oH>Zg<4$c(_tm_JRwu_z<(7uP;(>eKYKWs7%MdQ#O=E~dA zmJEYQva6N7-HH=?gjGv61sJ#uJ`K6yqXt`q}f$h#Wojl$GJ7sB9i>^sIR#W>iggbY#K@W*myI}0u{ykz1ig&M~z z5v3&W1}Oxm6->LKkHXWNv@;E4&jQmmw(yiqY~!I;j9g`dItrE-u2N=t4rGRpyo9eD zzmXPt0)INJxXXu55X8)N6x#MF!QFm}DXYc)J<`H8ZoUncYM9ZmsT=G8T5dqk9rVW{ zc`ySiq-zWvB$6G01u~o+RvaQ7_mr(|yCB>vad0EI9_H=m)o-KWXNh?!y7Dv*l#AXo z@M|)BzRbHGvfv}N?U{P)Oq?^Dyn1qYzi7Lt8n06IzY(3AqdL{hevMDOG5A(W<3=%g zDsgxx*ptDz3Op^)`2zZHbBMC#%M%p&bO$5J>ao*E*80fa}}Wb4k_u-u?Z$O!gLb3Cy=ZkbV-~CMVS4JQQ};Y(t_#x8X8iRT zpFPCq=uS&DZ&zub!5<|seUJr?3wtZ?e5o;l`Lfo?hPG)eXW-|<@VQL->4EqtV0crp z>9!awQ`?ex`(7T_sQVcYrUBXZEOaPrlARPyk_X`x?0d78qQ{AZM@XdK0UZ~ZkDQ=8 z6;o#KE2;e!bKSyma=2fGk6U5!nP}UlvT1?rMYh$@9*<)J{x~YpeXXf$%)SEp4&tl~ zmK=FNC%;XU+jUZZ8YlYwjCF~B2`lGYn)OM_p7S@8l2<}MnoS2e5n-86l z-(SJ+b$q^x2QTa}lNYxDhgqySgYmerR}`|rJe!eZfR0UC(i;L<&~a6ClB9c8@mBPm z5q*u)w=2-M37zY?i-PKP!dxhMO0m006)~hMico%#wl!pr=@P%T!&(#z6{BC;#Vh=Gen~^7*KYL-hvo6o0sC zn5@8_EZN)?Jy8|&Ym)FZOY^1ByFu+Gvrz;7^h)*HZPoWv`0Y9S?JG~e`o~U1wQ-_M7>l**`KtFO{9Xznk-JlQFviU+eqSB7$3i4|HmJRc};4WP& z&~#lB-StwWB)+{igB+^9YD4dK-GGL5<)?b<^iz7nr(N8%a@CiYtTO>UNo?|Dlr>r3 zw@2MxrwdV-r_o?fFc~OLttXA#jhb*G*tTOt8*AY)j$>MT3r58bo=f=m&Pnh#DES8{amu6zM&UHFA zd>?{oQqOI%a9Q77k!o%{8n?sV3gBB2E3J0SnA&G=|N~7bA)Cv7lQ=OhlsfDapb9z!M`M=j0sYLrv&q`aP zQE3+^VkxiGs+Za(2?jc~^5#nFO)X?0$x3fVtxT=bj0Nv!(;F+PZ=^n= zwfXAhG4(>}f%=uzLIp`Ql8#bkrg37qHO)|_NEygp8lB#j;}hkj-Z|Z?6tGsEq(De; zN736fHnm%ZN=vPDkh9dARw%PqpjXB>F3miS-cMVqO;hUymD1dmkrcfB=!0&D%899h zp5wH;WTRerpMkXWygW-~#3g(#!KTzMmD2^wWjGX!EkU@1SEV%mANW>!TgHO|iFOH- z%Q#J2S~U(w2`&Y`IBguPrcw3OUPXN?^Da`JMfTre(2G2RYk76zsAhR3wUk@NkCDd8 zqbI_I_RqRF%Im3Sd2N?x6Ah{VnEQ|U{lMJvoAMHL3RJ446;?)3=w><1*Z+7j8YQ8u zRa&%uX>4U(l+l&dGRgvSXdQmgUjg;;V}*XuBh70G=NuHOQs$ukJG602SXM?~hFHnv z6NP~Sixwe)VyKtjil$Z7!`da>>eXqnNieH+m)B6? zM$7G&Y2?R~lI9!pgtCwR32WLP98RfU#<2pY0@sh4WvnYyySyX*e0v#l3jbQ}Q@hl= zf~jSCOdt&YXuS-d!sC?^L3mJRuh5~w-~N76beyJ(`6pET(eAhe{v;dF3Y%A_=PfS1xIwQ{5|(4 zoJueMjOXQ@uLk2k+Ar@R<$Nb9T>AU}!!egy(-r6?eEbRd5)b*O8T^9}5S?;rt+f1e zPnE9*m`nbTuM?72tX*HB)~03X^~Tt=yjbF^$|)HguclqF{TM<@ep)8NaT6;#jj+B- zDOOm%B-2aT`=1!&SFGLtkS0vqublYv;{WiU_ERny;BDoxeM=kVpT+pQB zlFOTAS*=dXu4-0#J8sgZt)+3Y>9t()YmEHoR%M9X-AhB!DjI2a`=8S)P)7>ai%qV2 zqO?$+5RRBcQG?P;G)=E;Y1U`cvZ-^^(ir8Nfx^cBx5A>cG{ma3j1}v*Ur3{&D8Du> zUwMxvoB{cV?S<`qa`TA%hy)Vge z>E%%Xzu^Dgs$SZ?2}*5t)$`@o((>|4jPV2?U4{QO{D0&sv%h89ma=N&38g`Ftb)r2 zrm~cL<+A(t|MFiG%5wmIANjv35j6TJBf&#cT3@23|6-HVR^{(j&`*#LOt5+!K>tv+p4t;yJA+OKq3o(b?j{@4HZc>jHclBmO2gtCVU&_!32L6=rZ z>1{c4Vi~~Y>D8L3E1Fwg5fNEAeH!E6{vVTRkJ6Or<({cfK~UPNDifobE_J2ML0xUq zD@3V$!r?#vVX{Z7wF-SJC{O^ZHAO3Jx1Ut-Tb>2*Ki@Yw8)K7|`O}nXtV_#yPg(AG z88s=ZifCqO`DyD@@~9+##oFU00xpfHL{GbLdks+-QNX{$P`v%##|uBj{maJR$!too z-u3os%QegPay8Y)&*$sO;VA3!!L&Z58dBxN+B7OZH{4*p*ZsQt#jOH$dxfti(qcJ0 zRWT8@bCL}nwG{N+=xH%Ma>~wK=9N8#wqrfT7P)*4z4vwVzrSg{CC{b*SO z<||iee?VpfUbQ}^%zLySw$(>l&Y*0$rHZyRp=^Z;$?+0aIys~`SA8kRdmJA!d_*Az zk2yB#NIyP8x6e&AXuBtKvg>LrM`VqqJP}Rn5KS9QY*77=vBwdT98^mZ# z4JtIfiX^b>lBSj6lXWNTwT4rUyq#OkH*k$5DacI}OW*yVy8N~1-k68(tp?^UJ zXGJ!8vMIk>P1marqGy{HJw>VLAv}2YsnAnSw@Qvs*->h9g3?pubURCR=Q(;Bve0vl z${V%Jb6*J0L(a%EAw16odclZZfy^tHFfR!fUL&G6n$lP;dI<;KbgIjsYci{{k*=Mf zcb$rSs3*|7Cl9^*sQ$onqyT>Oo~QB#D!WSg8K3tD!s*o{tvaM}+5Vpyw+Leb=euo0Pvx?VBkj;`2SpM&BzV`tbz%^?B$| zqwA0gxFKt4sFeM8N~85>k9D26E_L zU!aI0HTNKWv_lqw{Y(TZ1qN!g7^tQ4GgMwDW1zkeDRd44*Hjp|Nk(kKa^Nogn&|lf zwP~R?Phwc$MK%i(We4Rl3`Q9-7?+2^B#Qi|0fQMT3}zQ&FuxFk1yol=bvr5D%UQ6D z%%uk?Uxh4KEs^(}@`T(VAvZ|K4PK!4FKSuvN;U=wxxq%NyF+EOfXbWzrniXoAQ zA=!u_trkN>QlV(ZL$MNu5|M?HWelZLT_)wTDW6OEHF+Ymm0_re+7=7CIZSnXsE$Z1 zbb#^)DPKkT8pheA3=;yv zaas%~QGSI?_e|)QormE(3Bzk-7G6hnTM)wqIt&*w4DXOwm=F@)OZj~z7$#~9S5p4) zISe1CcTQ5@XXu@C6&Sus{oJ7X+s`pfa|l19=Ql=-a4kku6soI17SRh9iJ~-?;z1G+ zBebm}Y4l8UiDXhfmu_3GO~c40rbHF+NP#3riX@B>Yl-aFGKwL=$PvNm))7W(Iggx* z!pM2*r=H3$$}Dn)`oBTr-KF-;)bB&;_i-vlUeNO!Ew*tZwy7x9$@IAca~#5UUQZ7(^ty^*jTjo40~!Dy$?dbJy~u|0;K6FF;7pQ&H-ia9anJnHCEXUsV(Vs=cUju;yRRG@0N zwj@}!`=-Qw@9lor-TAn+^|s!d=k5+slBg&mNhOG6WKh`O`Ox?LLwBDJ|I~fX>B~Gb zw75T$W#;hQqs7d(ECTme^ZFgH9Q*qmd%hHo`@2}z9^gK;{r+Ky`$sfSJ|KLW@R`N9 zPcwg?X8!)wT}Tx{NY!qn2CPKtpa`UL{8NXA@e2m};?!|OCh=wTDHb1U6P^W`%E3>i z+NUl7AJ{JD>otTae5o5WQa2Oc&d(nX@*2Gfsb^W?CBiYAkftKIP0X*;J-mh}kv2>t zZG;~PvLFVa>MUmK1zYG2xBmfQY4 z(hd{KN5}KjFcodA)crifQa@ zJm6qHSWI|1d8^1cwo5;p=fcC~e0SaFQki32f^T@M%;~(&aUpXNuV3@sy={bdLuOuc$wwG2 z9?U*^Z1lfU=` zewn~D+`=y-zr`=1Zu~MiZr8BCu85!S|JM+nI`)_0Q4G{a&BNcu#GSz7;3as>km&J* zvEuQN(Re&9F4B6uJwf>Y?VxiP-(&pGQU@3lXZ`P{sJr`JuIXX;^~CKH>esEN^*nyP z2>g24vVOf1gkKqVW&t|O(khEaDU0z|)*$$24UsAi>^OwrHw2a zz%1Hq6Alo0vrfy~j`&rooi4TRy z_DU-|Osj0_WcDPcsj#!@fU@TamCf)z`)kscLuapKp7n&cGVNfV-K_I4`KOrodrM}Y zWu2FZQ!lfx!=2+2DklH~at6T887+{*x^t#L=S;WkoVkRTGA)NEXC-+%ft=k^h@Z_C=$`=s%jEVCDp!0)-$RAAFP}Tb#B!4a3`J05w-%DN; zdC{aDBg}T?Q<3t2WV%ZDhVXx);C&J-@MNMbpG>pGlUWFTGMD%^h$lOspX}D^$zg>j zCoSso3In877_4O>9b=)FcqrV3qYz%mIV_~i z6;kF3w^(-J9_FXRD?9?b@VG)DmA&vHX;*;4t3nrE*Q!XvQ`8T-Xe7KvoU-U(`BTwZ%hO~Pqz_1j)70lLX}z&r7Tw(2)neuQl%W%QU;!-qoGS9 zAWNq(&kTW52A-w!EUR>(R;ARt($%hkr5i{;O!^U_OOM%B=~?2Gg;L5wX^gg>35jQP zNzeSDpY_v=o(&Rswu$%_OFr8{{$BDA5kE}+QLUbxf#=ypc%J*Yf}e9u_nhHt@>aw9oc(`(8IjMaOE0ECyqE^{B2vf~bK!fj5Z)IYn-^D@u0g-JDMXou zugqVdjGGH(Q-m&?X4z$PAj%lKlr4iU`$qVeeM^|~UAB|>9<9ovng1m5)5Oo(qU=Wt zWwaq>*P&m!w0h|$@G=O2FZ)a1%aMdBKQB2hFIQ^oz0Xcd&}iW%^)n5ksN5_l_? zD^anZ`J>3E-dCJOP{jq|dqey7hHZE=4)&XgO1+s$cs|o2;!CCdX0^hbO_ud$ixzKo zTjI@r@(z&~P2TtLzPSWZNqwjs1WzS(v~nU7ZGGi*pmGlEO4`Uu&RZpQqjD8#>oB^K zGF{1_qVkeuRbFwU3JO(H$ttBqRRB;GBv3`0UFCtU8cbR!X^i8l!Vyq424kzH6W&JJ z4$G?AZCh1bW>+00eq89PlUh|>AWqq=x(d7Mh7#2_P)+@-?uU@-VB+HlPjt!ZDOy$2 zc2v(pP&H-0dM!NFn|P&MR?{w4e^26 z61rv)yfrJx=lIkdL_p19s2cj=8jep5=e*_`P%EXX)dIEsAZml4YX?}PYq|KTe$x0CB&C$Rkv25jwT^AAJ4KvvNZk*_FKborf~e;nS3U1n-w(2WAXNPjh5Aq>>qlu>Kh{D$ z<)?l!`O}!6TOakjUp?M{A-sWUGXmW@pS{s>usbSH7+E5iS{+F zB7U5_lf+NkvhkuV8W{^T-Vpepg!RFe_&~Y%K)LuZfV82)`@sv}2X483*iQORX?@`M zemEr5hr`5AFr7x^hqDN2VvN-^A81-=SxrlXXj%c)#QQaU2i>&ZWjE0mHSL3^iMFVT zvfOkN;-i56sD%H=e(-(_5%@TRw692;EyTw~P#>4V^N}&l$DQOKAnz(BedL%nPZVgL z4$&MbW%F$5-^@NXuVA8`YF-0(^G5RNJDM41G#}Ke`2_K^wrr+PZ~jrC`5JjQpj)6- z3;jh)Fht7$pk)wbONbUNBP`KE``j`bc1r~OTNwMc&?dHU9o({<^lw=9cPzV6iIyFf zY}vyy2Uv!-w&e(U$CYlOt!-gHTVfPiZurYqDbPweZ>8L|_S34BKC;ydcPn+db(~bK z>{BcI)Ji>Wokjj);_Oo^``@~n_$J~zi0_hCE92DG!^AoMt*6L8L->+Vtv~Y0c%{t+ z-NwVu+uT4~pi8zf#%mi$`e4$BYSrc=PW#hF`D>f(C)>Eu)5bAuTL`OdNw8>JMR*N) z-?97_*lmp4+URTB4oKM+f7u?Sbh`(#eHc`G zC`9{crU-c2=@Z&1=k1H7)xONO+E){&ooT1fYTwMVoU?Yu3GI}TcE)1uXM}1$2X8xd zs)N3>W015uhWd$)ky3Sp!|oWbR7WH{9dm{1SWEs!rY+DN+qLRAz%oY=+;I%5gX7Y{ zap~kS>zz`oPB%QA{h>QY!`sPm@1&3Gr0jIAvFy%Ggm*E~4|g7byYnddv>%hUnJN-2-@KeBI4> zt();ucO(SQB7DD5zkZv_v>HLbF^>D~ zf*kzYC09TX*LyufA$q*fJ)uJMj1jVDoJ7wgrF*8?Ru64o59h0gcBzMUsfV$A&wBE< zK=$m0uV=r&XFzHX?!s8M2c@lBT*XOSZuMq0<7Uts^f8Im- ze&#zym~r>#a|rnS1AJd-qrb51m$A@a#%uLu27l=hqe*Y z+}Z&$_F$m7b;yA(IgD%Y7$aGW31JDoLN1J<)inGQ2xWNK7g2W3nBO75n6)fswzC4W z*MVr2jA0094C4V~uCYWcy|amBC}(16_f0GX&BP96zF4ZQiRB!a*ztnUH26#`!$T9x zU2qdigKlDXIu$VVF|nLO6MI4sJ?+qbaA+|OjSkDi-XtxKA%KYs)*jvOFz7nD}Aj#*g5Q;>U7e<0-2q zelfGef8%7K+cEKn99lHTApR5wF`i+$iRV0<_#Yj{RZdibAR|GuL;`~tlMrNCCSibO zn*`?`33T`-A)J{L#tMIv!1caKnC;N!Ij*3|(;WQci?p2sXXL=H;BPNjnsY!GyO>`SkWOGCr&38c9f z$y)9?YH)A9!&vGtmN}WfacJMMRrfZtRrhGr4bOEHCW%`OCdtvuBuAN&9BE2&q$$bg z(C8ct-x(*3ZrLQ!FPkI=gNEna@nn7=plleS_FzGsJ$r6DkSrJWUG+>gw%);l4wn-kTNSolGTtb=TNQX9ygPqK% z!0-b<()h^FB(G)l$=oq8$s3(o9KB3-rBcj>PN~tr)Fm~Qnot`N6b>V$~Gy{{}1@vwo?EA literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniKS-UTF32-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniKS-UTF32-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..bdab208b69d287128195eccbd084c8cf4ca658c3 GIT binary patch literal 168 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;%025>*37Jz@Q+u zua=K}ey&3E+*}4O7Dfgg9!3U6208Oa7Mo;tpu8~SzUuiojQc8BIrlR%G488xo?FDY OpI3l&zo0eKeklND@-b-u literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniKS-UTF8-H.bcmap b/src/assets/pdf-annotation/web/cmaps/UniKS-UTF8-H.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..6ff8674af772af896d7d33c7addc37c57822f8a2 GIT binary patch literal 27790 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

    UjdU>!C<8eSfmt; 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 XDie!M@tP=Qo=5R?GKGx`n-c&3T8mO+ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/UniKS-UTF8-V.bcmap b/src/assets/pdf-annotation/web/cmaps/UniKS-UTF8-V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..8dfa76a58eb720dd1992c2cc9abf1dd4b39c5a66 GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl9jqG~;%1@i;l%x@VcNc0 zKKADSxe6P;=Q41yFf!=yFfuSQG{%{?u-GKAKWdoFxUahTe-7im3Rcejj7*IC>Nk8Z RV%*Owz`9?sv6^YW6ad@#ITio_ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/V.bcmap b/src/assets/pdf-annotation/web/cmaps/V.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..fdec9906621904180f42bd5c91f377397fd6cf95 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=#j{(sKmI}pOXoN*Dkx{jjaUT-^bqy(L literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/cmaps/WP-Symbol.bcmap b/src/assets/pdf-annotation/web/cmaps/WP-Symbol.bcmap new file mode 100755 index 0000000000000000000000000000000000000000..46729bbf30f3b2f176492d907fb8ca3f6a1e3026 GIT binary patch literal 179 zcmW;C-wMG{90&04*(h8{xuKNv0%qLpa><2~3lnNLW=^QFb+%;wBoDUVIgjE|#O#wbv3o&3S`2gr-Jo93r6xVAssnXnw1B!ZT0%WQ!k{%%Po}{NAH@>d0EGtm W&}LiN6j32_>FyT<6+0XN literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/debugger.css b/src/assets/pdf-annotation/web/debugger.css new file mode 100755 index 0000000..9a7233b --- /dev/null +++ b/src/assets/pdf-annotation/web/debugger.css @@ -0,0 +1,113 @@ +/* Copyright 2014 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#PDFBug, +#PDFBug input, +#PDFBug button, +#PDFBug select { + font: message-box; +} +#PDFBug { + background-color: rgba(255, 255, 255, 1); + border: 1px solid rgba(102, 102, 102, 1); + position: fixed; + top: 32px; + right: 0; + bottom: 0; + font-size: 10px; + padding: 0; + width: 300px; +} +#PDFBug .controls { + background: rgba(238, 238, 238, 1); + border-bottom: 1px solid rgba(102, 102, 102, 1); + padding: 3px; +} +#PDFBug .panels { + bottom: 0; + left: 0; + overflow: auto; + position: absolute; + right: 0; + top: 27px; +} +#PDFBug .panels > div { + padding: 5px; +} +#PDFBug button.active { + font-weight: bold; +} +.debuggerShowText, +.debuggerHideText:hover { + background-color: rgba(255, 255, 0, 1); +} +#PDFBug .stats { + font-family: courier; + font-size: 10px; + white-space: pre; +} +#PDFBug .stats .title { + font-weight: bold; +} +#PDFBug table { + font-size: 10px; + white-space: pre; +} +#PDFBug table.showText { + border-collapse: collapse; + text-align: center; +} +#PDFBug table.showText, +#PDFBug table.showText tr, +#PDFBug table.showText td { + border: 1px solid black; + padding: 1px; +} +#PDFBug table.showText td.advance { + color: grey; +} + +#viewer.textLayer-visible .textLayer { + opacity: 1; +} + +#viewer.textLayer-visible .canvasWrapper { + background-color: rgba(128, 255, 128, 1); +} + +#viewer.textLayer-visible .canvasWrapper canvas { + mix-blend-mode: screen; +} + +#viewer.textLayer-visible .textLayer span { + background-color: rgba(255, 255, 0, 0.1); + color: rgba(0, 0, 0, 1); + border: solid 1px rgba(255, 0, 0, 0.5); + box-sizing: border-box; +} + +#viewer.textLayer-visible .textLayer span[aria-owns] { + background-color: rgba(255, 0, 0, 0.3); +} + +#viewer.textLayer-hover .textLayer span:hover { + background-color: rgba(255, 255, 255, 1); + color: rgba(0, 0, 0, 1); +} + +#viewer.textLayer-shadow .textLayer span { + background-color: rgba(255, 255, 255, 0.6); + color: rgba(0, 0, 0, 1); +} diff --git a/src/assets/pdf-annotation/web/debugger.js b/src/assets/pdf-annotation/web/debugger.js new file mode 100755 index 0000000..8eaf0d6 --- /dev/null +++ b/src/assets/pdf-annotation/web/debugger.js @@ -0,0 +1,612 @@ +/* Copyright 2012 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let opMap; + +const FontInspector = (function FontInspectorClosure() { + let fonts; + let active = false; + const fontAttribute = "data-font-name"; + function removeSelection() { + const divs = document.querySelectorAll(`span[${fontAttribute}]`); + for (const div of divs) { + div.className = ""; + } + } + function resetSelection() { + const divs = document.querySelectorAll(`span[${fontAttribute}]`); + for (const div of divs) { + div.className = "debuggerHideText"; + } + } + function selectFont(fontName, show) { + const divs = document.querySelectorAll( + `span[${fontAttribute}=${fontName}]` + ); + for (const div of divs) { + div.className = show ? "debuggerShowText" : "debuggerHideText"; + } + } + function textLayerClick(e) { + if ( + !e.target.dataset.fontName || + e.target.tagName.toUpperCase() !== "SPAN" + ) { + return; + } + const fontName = e.target.dataset.fontName; + const selects = document.getElementsByTagName("input"); + for (const select of selects) { + if (select.dataset.fontName !== fontName) { + continue; + } + select.checked = !select.checked; + selectFont(fontName, select.checked); + select.scrollIntoView(); + } + } + return { + // Properties/functions needed by PDFBug. + id: "FontInspector", + name: "Font Inspector", + panel: null, + manager: null, + init(pdfjsLib) { + const panel = this.panel; + const tmp = document.createElement("button"); + tmp.addEventListener("click", resetSelection); + tmp.textContent = "Refresh"; + panel.append(tmp); + + fonts = document.createElement("div"); + panel.append(fonts); + }, + cleanup() { + fonts.textContent = ""; + }, + enabled: false, + get active() { + return active; + }, + set active(value) { + active = value; + if (active) { + document.body.addEventListener("click", textLayerClick, true); + resetSelection(); + } else { + document.body.removeEventListener("click", textLayerClick, true); + removeSelection(); + } + }, + // FontInspector specific functions. + fontAdded(fontObj, url) { + function properties(obj, list) { + const moreInfo = document.createElement("table"); + for (const entry of list) { + const tr = document.createElement("tr"); + const td1 = document.createElement("td"); + td1.textContent = entry; + tr.append(td1); + const td2 = document.createElement("td"); + td2.textContent = obj[entry].toString(); + tr.append(td2); + moreInfo.append(tr); + } + return moreInfo; + } + const moreInfo = properties(fontObj, ["name", "type"]); + const fontName = fontObj.loadedName; + const font = document.createElement("div"); + const name = document.createElement("span"); + name.textContent = fontName; + const download = document.createElement("a"); + if (url) { + url = /url\(['"]?([^)"']+)/.exec(url); + download.href = url[1]; + } else if (fontObj.data) { + download.href = URL.createObjectURL( + new Blob([fontObj.data], { type: fontObj.mimetype }) + ); + } + download.textContent = "Download"; + const logIt = document.createElement("a"); + logIt.href = ""; + logIt.textContent = "Log"; + logIt.addEventListener("click", function (event) { + event.preventDefault(); + console.log(fontObj); + }); + const select = document.createElement("input"); + select.setAttribute("type", "checkbox"); + select.dataset.fontName = fontName; + select.addEventListener("click", function () { + selectFont(fontName, select.checked); + }); + font.append(select, name, " ", download, " ", logIt, moreInfo); + fonts.append(font); + // Somewhat of a hack, should probably add a hook for when the text layer + // is done rendering. + setTimeout(() => { + if (this.active) { + resetSelection(); + } + }, 2000); + }, + }; +})(); + +// Manages all the page steppers. +const StepperManager = (function StepperManagerClosure() { + let steppers = []; + let stepperDiv = null; + let stepperControls = null; + let stepperChooser = null; + let breakPoints = Object.create(null); + return { + // Properties/functions needed by PDFBug. + id: "Stepper", + name: "Stepper", + panel: null, + manager: null, + init(pdfjsLib) { + const self = this; + stepperControls = document.createElement("div"); + stepperChooser = document.createElement("select"); + stepperChooser.addEventListener("change", function (event) { + self.selectStepper(this.value); + }); + stepperControls.append(stepperChooser); + stepperDiv = document.createElement("div"); + this.panel.append(stepperControls, stepperDiv); + if (sessionStorage.getItem("pdfjsBreakPoints")) { + breakPoints = JSON.parse(sessionStorage.getItem("pdfjsBreakPoints")); + } + + opMap = Object.create(null); + for (const key in pdfjsLib.OPS) { + opMap[pdfjsLib.OPS[key]] = key; + } + }, + cleanup() { + stepperChooser.textContent = ""; + stepperDiv.textContent = ""; + steppers = []; + }, + enabled: false, + active: false, + // Stepper specific functions. + create(pageIndex) { + const debug = document.createElement("div"); + debug.id = "stepper" + pageIndex; + debug.hidden = true; + debug.className = "stepper"; + stepperDiv.append(debug); + const b = document.createElement("option"); + b.textContent = "Page " + (pageIndex + 1); + b.value = pageIndex; + stepperChooser.append(b); + const initBreakPoints = breakPoints[pageIndex] || []; + const stepper = new Stepper(debug, pageIndex, initBreakPoints); + steppers.push(stepper); + if (steppers.length === 1) { + this.selectStepper(pageIndex, false); + } + return stepper; + }, + selectStepper(pageIndex, selectPanel) { + pageIndex |= 0; + if (selectPanel) { + this.manager.selectPanel(this); + } + for (const stepper of steppers) { + stepper.panel.hidden = stepper.pageIndex !== pageIndex; + } + for (const option of stepperChooser.options) { + option.selected = (option.value | 0) === pageIndex; + } + }, + saveBreakPoints(pageIndex, bps) { + breakPoints[pageIndex] = bps; + sessionStorage.setItem("pdfjsBreakPoints", JSON.stringify(breakPoints)); + }, + }; +})(); + +// The stepper for each page's operatorList. +const Stepper = (function StepperClosure() { + // Shorter way to create element and optionally set textContent. + function c(tag, textContent) { + const d = document.createElement(tag); + if (textContent) { + d.textContent = textContent; + } + return d; + } + + function simplifyArgs(args) { + if (typeof args === "string") { + const MAX_STRING_LENGTH = 75; + return args.length <= MAX_STRING_LENGTH + ? args + : args.substring(0, MAX_STRING_LENGTH) + "..."; + } + if (typeof args !== "object" || args === null) { + return args; + } + if ("length" in args) { + // array + const MAX_ITEMS = 10, + simpleArgs = []; + let i, ii; + for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) { + simpleArgs.push(simplifyArgs(args[i])); + } + if (i < args.length) { + simpleArgs.push("..."); + } + return simpleArgs; + } + const simpleObj = {}; + for (const key in args) { + simpleObj[key] = simplifyArgs(args[key]); + } + return simpleObj; + } + + // eslint-disable-next-line no-shadow + class Stepper { + constructor(panel, pageIndex, initialBreakPoints) { + this.panel = panel; + this.breakPoint = 0; + this.nextBreakPoint = null; + this.pageIndex = pageIndex; + this.breakPoints = initialBreakPoints; + this.currentIdx = -1; + this.operatorListIdx = 0; + this.indentLevel = 0; + } + + init(operatorList) { + const panel = this.panel; + const content = c("div", "c=continue, s=step"); + const table = c("table"); + content.append(table); + table.cellSpacing = 0; + const headerRow = c("tr"); + table.append(headerRow); + headerRow.append( + c("th", "Break"), + c("th", "Idx"), + c("th", "fn"), + c("th", "args") + ); + panel.append(content); + this.table = table; + this.updateOperatorList(operatorList); + } + + updateOperatorList(operatorList) { + const self = this; + + function cboxOnClick() { + const x = +this.dataset.idx; + if (this.checked) { + self.breakPoints.push(x); + } else { + self.breakPoints.splice(self.breakPoints.indexOf(x), 1); + } + StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints); + } + + const MAX_OPERATORS_COUNT = 15000; + if (this.operatorListIdx > MAX_OPERATORS_COUNT) { + return; + } + + const chunk = document.createDocumentFragment(); + const operatorsToDisplay = Math.min( + MAX_OPERATORS_COUNT, + operatorList.fnArray.length + ); + for (let i = this.operatorListIdx; i < operatorsToDisplay; i++) { + const line = c("tr"); + line.className = "line"; + line.dataset.idx = i; + chunk.append(line); + const checked = this.breakPoints.includes(i); + const args = operatorList.argsArray[i] || []; + + const breakCell = c("td"); + const cbox = c("input"); + cbox.type = "checkbox"; + cbox.className = "points"; + cbox.checked = checked; + cbox.dataset.idx = i; + cbox.onclick = cboxOnClick; + + breakCell.append(cbox); + line.append(breakCell, c("td", i.toString())); + const fn = opMap[operatorList.fnArray[i]]; + let decArgs = args; + if (fn === "showText") { + const glyphs = args[0]; + const charCodeRow = c("tr"); + const fontCharRow = c("tr"); + const unicodeRow = c("tr"); + for (const glyph of glyphs) { + if (typeof glyph === "object" && glyph !== null) { + charCodeRow.append(c("td", glyph.originalCharCode)); + fontCharRow.append(c("td", glyph.fontChar)); + unicodeRow.append(c("td", glyph.unicode)); + } else { + // null or number + const advanceEl = c("td", glyph); + advanceEl.classList.add("advance"); + charCodeRow.append(advanceEl); + fontCharRow.append(c("td")); + unicodeRow.append(c("td")); + } + } + decArgs = c("td"); + const table = c("table"); + table.classList.add("showText"); + decArgs.append(table); + table.append(charCodeRow, fontCharRow, unicodeRow); + } else if (fn === "restore" && this.indentLevel > 0) { + this.indentLevel--; + } + line.append(c("td", " ".repeat(this.indentLevel * 2) + fn)); + if (fn === "save") { + this.indentLevel++; + } + + if (decArgs instanceof HTMLElement) { + line.append(decArgs); + } else { + line.append(c("td", JSON.stringify(simplifyArgs(decArgs)))); + } + } + if (operatorsToDisplay < operatorList.fnArray.length) { + const lastCell = c("td", "..."); + lastCell.colspan = 4; + chunk.append(lastCell); + } + this.operatorListIdx = operatorList.fnArray.length; + this.table.append(chunk); + } + + getNextBreakPoint() { + this.breakPoints.sort(function (a, b) { + return a - b; + }); + for (const breakPoint of this.breakPoints) { + if (breakPoint > this.currentIdx) { + return breakPoint; + } + } + return null; + } + + breakIt(idx, callback) { + StepperManager.selectStepper(this.pageIndex, true); + this.currentIdx = idx; + + const listener = evt => { + switch (evt.keyCode) { + case 83: // step + document.removeEventListener("keydown", listener); + this.nextBreakPoint = this.currentIdx + 1; + this.goTo(-1); + callback(); + break; + case 67: // continue + document.removeEventListener("keydown", listener); + this.nextBreakPoint = this.getNextBreakPoint(); + this.goTo(-1); + callback(); + break; + } + }; + document.addEventListener("keydown", listener); + this.goTo(idx); + } + + goTo(idx) { + const allRows = this.panel.getElementsByClassName("line"); + for (const row of allRows) { + if ((row.dataset.idx | 0) === idx) { + row.style.backgroundColor = "rgb(251,250,207)"; + row.scrollIntoView(); + } else { + row.style.backgroundColor = null; + } + } + } + } + return Stepper; +})(); + +const Stats = (function Stats() { + let stats = []; + function clear(node) { + node.textContent = ""; // Remove any `node` contents from the DOM. + } + function getStatIndex(pageNumber) { + for (const [i, stat] of stats.entries()) { + if (stat.pageNumber === pageNumber) { + return i; + } + } + return false; + } + return { + // Properties/functions needed by PDFBug. + id: "Stats", + name: "Stats", + panel: null, + manager: null, + init(pdfjsLib) {}, + enabled: false, + active: false, + // Stats specific functions. + add(pageNumber, stat) { + if (!stat) { + return; + } + const statsIndex = getStatIndex(pageNumber); + if (statsIndex !== false) { + stats[statsIndex].div.remove(); + stats.splice(statsIndex, 1); + } + const wrapper = document.createElement("div"); + wrapper.className = "stats"; + const title = document.createElement("div"); + title.className = "title"; + title.textContent = "Page: " + pageNumber; + const statsDiv = document.createElement("div"); + statsDiv.textContent = stat.toString(); + wrapper.append(title, statsDiv); + stats.push({ pageNumber, div: wrapper }); + stats.sort(function (a, b) { + return a.pageNumber - b.pageNumber; + }); + clear(this.panel); + for (const entry of stats) { + this.panel.append(entry.div); + } + }, + cleanup() { + stats = []; + clear(this.panel); + }, + }; +})(); + +// Manages all the debugging tools. +const PDFBug = (function PDFBugClosure() { + const panelWidth = 300; + const buttons = []; + let activePanel = null; + + return { + tools: [FontInspector, StepperManager, Stats], + enable(ids) { + const all = ids.length === 1 && ids[0] === "all"; + const tools = this.tools; + for (const tool of tools) { + if (all || ids.includes(tool.id)) { + tool.enabled = true; + } + } + if (!all) { + // Sort the tools by the order they are enabled. + tools.sort(function (a, b) { + let indexA = ids.indexOf(a.id); + indexA = indexA < 0 ? tools.length : indexA; + let indexB = ids.indexOf(b.id); + indexB = indexB < 0 ? tools.length : indexB; + return indexA - indexB; + }); + } + }, + init(pdfjsLib, container, ids) { + this.loadCSS(); + this.enable(ids); + /* + * Basic Layout: + * PDFBug + * Controls + * Panels + * Panel + * Panel + * ... + */ + const ui = document.createElement("div"); + ui.id = "PDFBug"; + + const controls = document.createElement("div"); + controls.setAttribute("class", "controls"); + ui.append(controls); + + const panels = document.createElement("div"); + panels.setAttribute("class", "panels"); + ui.append(panels); + + container.append(ui); + container.style.right = panelWidth + "px"; + + // Initialize all the debugging tools. + for (const tool of this.tools) { + const panel = document.createElement("div"); + const panelButton = document.createElement("button"); + panelButton.textContent = tool.name; + panelButton.addEventListener("click", event => { + event.preventDefault(); + this.selectPanel(tool); + }); + controls.append(panelButton); + panels.append(panel); + tool.panel = panel; + tool.manager = this; + if (tool.enabled) { + tool.init(pdfjsLib); + } else { + panel.textContent = + `${tool.name} is disabled. To enable add "${tool.id}" to ` + + "the pdfBug parameter and refresh (separate multiple by commas)."; + } + buttons.push(panelButton); + } + this.selectPanel(0); + }, + loadCSS() { + const { url } = import.meta; + + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = url.replace(/.js$/, ".css"); + + document.head.append(link); + }, + cleanup() { + for (const tool of this.tools) { + if (tool.enabled) { + tool.cleanup(); + } + } + }, + selectPanel(index) { + if (typeof index !== "number") { + index = this.tools.indexOf(index); + } + if (index === activePanel) { + return; + } + activePanel = index; + for (const [j, tool] of this.tools.entries()) { + const isActive = j === index; + buttons[j].classList.toggle("active", isActive); + tool.active = isActive; + tool.panel.hidden = !isActive; + } + }, + }; +})(); + +globalThis.FontInspector = FontInspector; +globalThis.StepperManager = StepperManager; +globalThis.Stats = Stats; + +export { PDFBug }; diff --git a/src/assets/pdf-annotation/web/images/annotation-check.svg b/src/assets/pdf-annotation/web/images/annotation-check.svg new file mode 100755 index 0000000..8fe6b58 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-check.svg @@ -0,0 +1,13 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-comment.svg b/src/assets/pdf-annotation/web/images/annotation-comment.svg new file mode 100755 index 0000000..b441d32 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-comment.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-help.svg b/src/assets/pdf-annotation/web/images/annotation-help.svg new file mode 100755 index 0000000..9ad5284 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-help.svg @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-insert.svg b/src/assets/pdf-annotation/web/images/annotation-insert.svg new file mode 100755 index 0000000..83fcc57 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-insert.svg @@ -0,0 +1,12 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-key.svg b/src/assets/pdf-annotation/web/images/annotation-key.svg new file mode 100755 index 0000000..2037cf2 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-key.svg @@ -0,0 +1,13 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-newparagraph.svg b/src/assets/pdf-annotation/web/images/annotation-newparagraph.svg new file mode 100755 index 0000000..e724859 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-newparagraph.svg @@ -0,0 +1,13 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-noicon.svg b/src/assets/pdf-annotation/web/images/annotation-noicon.svg new file mode 100755 index 0000000..328240b --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-noicon.svg @@ -0,0 +1,9 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-note.svg b/src/assets/pdf-annotation/web/images/annotation-note.svg new file mode 100755 index 0000000..2281207 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-note.svg @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-paperclip.svg b/src/assets/pdf-annotation/web/images/annotation-paperclip.svg new file mode 100755 index 0000000..cb874d0 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-paperclip.svg @@ -0,0 +1,6 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-paragraph.svg b/src/assets/pdf-annotation/web/images/annotation-paragraph.svg new file mode 100755 index 0000000..5e14850 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-paragraph.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/src/assets/pdf-annotation/web/images/annotation-pushpin.svg b/src/assets/pdf-annotation/web/images/annotation-pushpin.svg new file mode 100755 index 0000000..5d52e12 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/annotation-pushpin.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/src/assets/pdf-annotation/web/images/cursor-editorFreeText.svg b/src/assets/pdf-annotation/web/images/cursor-editorFreeText.svg new file mode 100755 index 0000000..168e5d3 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/cursor-editorFreeText.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/cursor-editorInk.svg b/src/assets/pdf-annotation/web/images/cursor-editorInk.svg new file mode 100755 index 0000000..32a4e56 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/cursor-editorInk.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/findbarButton-next.svg b/src/assets/pdf-annotation/web/images/findbarButton-next.svg new file mode 100755 index 0000000..3373e31 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/findbarButton-next.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/findbarButton-previous.svg b/src/assets/pdf-annotation/web/images/findbarButton-previous.svg new file mode 100755 index 0000000..da6b394 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/findbarButton-previous.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/loading-dark.svg b/src/assets/pdf-annotation/web/images/loading-dark.svg new file mode 100755 index 0000000..fa5269b --- /dev/null +++ b/src/assets/pdf-annotation/web/images/loading-dark.svg @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/src/assets/pdf-annotation/web/images/loading-icon.gif b/src/assets/pdf-annotation/web/images/loading-icon.gif new file mode 100755 index 0000000000000000000000000000000000000000..1c72ebb554be018511ae972c3f2361dff02dce02 GIT binary patch literal 2545 zcma*pX;2es8VB%~zPr=ibVMCx-JQ^BhLDAsK)^**h(ZDp9YGuzZ%~j!}+w%FI;|aC7){7CdVvG)P{bng1y9Te*f}~*`1kQl$jwb z$tlW~rRS!X?#xfm_&6tTdp_`cjgYwbRFLNdoJCN$S-yhg`ZnC-yvedRSmOh%;Y`Gl6bY$Z-}#C=#F4%9!I1b zWQ~f+9P?;vhCxWwlwl=lrWG|7IYo;{jjmzJ5R9?f>n%-d@>kLINUc z4wM5dAO;kq<$}Dk{2-u0$I6@2N}&cUx9nmV1dYc8jfC}%=F9WCg^OQK9C6poh#2!A z3^EU*UFZvS^)?bu3T?J;@Ahb~%I?+@4!l5!*TjC}GIslNan-RCrrd~PdHYnNLJk+m&`$Y+NV(e>CCu%R#_8GqY4cv#j`#uRWdsg9DxWy(?oOvgCU}&@jy%c!H&-Q zqXJxajAtmQRoRa9V-RFXXh-bK*;Fum{BjpkYQGX~i@OZ^Dx0n&H}kvGKqQ?w(6iGXu_g08T|_hp#ZvFzIwKF*a=oMJ~3UGAjZ?g}GOxm44td zXoyYrU*I=y*vHv89hkYH(v5R#wc)BC3dZJKb3K)f>zaM3%JP(mpecViP0eKKYf3zy z->jx_mc?mCtPEvCQ?uppk?eLJt}_IR7giW%Jr)RyI!+E-voIs*lXI*z`GQc_&D#X( z{6G};HPYj6O|$lXxBJeDaweqa{4L=tOZCjTI^&UOxXg})LRG_cr^B9Rqt(i5ORbQX zq`_xCRsH>xEYY%&*Nyi#{S_JZNlTm#K56`RI%7^amom;*h90Si&g1CfaFV3D|a!`3Y-GKKbL*KSbl z>I96`TR@CqPJl(>QqB~RvK~-U)`e`l4LIqj+IU^~yyIe*|BRVB>4Bup%j{tLdKz4j zY^<8P8m~GRGz*yv0&-RJE+-keJ+%m3wNeopzsltWd->eWmBVwUr)pX` zK~CD<;~Z*Uy3W`3+MrEYxm5qYQ!z%YI;y7DTG`UVH0;@{M{!B&id_}3DBQ?zsotuR zEGLdRx25nLm%-wjlnEi;-aN_1S7???rO~WgA67jjr&(vRa3y$u#kqJbeKnw z{!T!1li9>M+sJ6AUe+*9d}2uGjhzd z|L1Rtp8uTGYyZoQ*`DS^m2dw-X{a)l+3m?ncvn^+O>)hdd3(hMtlhkRGns{<8c0I! zDDjpmwtj?@!6kA|iu3q+Ai;@JR+ zfk+ln&YFC{4bhK6IxVgLs4W%^8Lk`qzWU*L>yq0A3;l}{!wKZ!ue)C)SKI)9dl1hl zhIRLV@8E}rwvE{gX(}$f6x*k)_`*Ijt1=EU-Ls6-(phomeQBgtUs z5Xz~Cd*nE)Ac!0i4ep}Z1AugMB(&F?)#CU{Qc{Sp^vKsdL}vRB30H+Bbzrn`M##H3 z{W8dc_mDroEE+p8_}mnJtzZ4!RNe)zhB)Ds;S57nYSJxtek>^~&(7B+N5MPf2+2xx z5Dl&4X|c@f{Kd|z1r+N|$DmsoVp*3yOdxT^J^-VAk)Z@$4^XrPrFP-Co+MXZ+KJ(W z{JNYvraLLWA;&tRhIKOvhW|HC|L-dLvAUF(MG0(Nl?4tB{RzN7I(}Cb%hwN{crFC8 zji#aJElKvDFV+&VI1V?oUMA>*kto0^;3W8FQBSZ|{ z$v~TqE=(8DZa^i$^oht&h};P1N&wMXorKh*Z68gPV&ouy>%f36Oqkwemyeas$Qbz# zV?7Jy%o7KY6^I=P@eCji%W`o5sf(5hySYo9$l4e2`(hIV_?=H-#R6}0$WVA|*(K@3 z=5?@RlcLh(meW%A4)hGzcvEpm(_w?>zhL*i&s9$2>r zAtk{8Cia|+Y+V!uX9BtpXoF%lswuRKsM!pSs!?yhlCy!269K0|b M?FSZn2B>%I-}ej|s{jB1 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/images/loading.svg b/src/assets/pdf-annotation/web/images/loading.svg new file mode 100755 index 0000000..0a15ff6 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/loading.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-documentProperties.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-documentProperties.svg new file mode 100755 index 0000000..100ce98 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-documentProperties.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-firstPage.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-firstPage.svg new file mode 100755 index 0000000..156a425 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-firstPage.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-handTool.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-handTool.svg new file mode 100755 index 0000000..b43f42b --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-handTool.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-lastPage.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-lastPage.svg new file mode 100755 index 0000000..2a1986b --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-lastPage.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCcw.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCcw.svg new file mode 100755 index 0000000..eace9e6 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCcw.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCw.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCw.svg new file mode 100755 index 0000000..2795660 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-rotateCw.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollHorizontal.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollHorizontal.svg new file mode 100755 index 0000000..8ffdd61 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollHorizontal.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollPage.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollPage.svg new file mode 100755 index 0000000..a9c18e0 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollPage.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollVertical.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollVertical.svg new file mode 100755 index 0000000..90cc4cd --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollVertical.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollWrapped.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollWrapped.svg new file mode 100755 index 0000000..1d29df9 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-scrollWrapped.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-selectTool.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-selectTool.svg new file mode 100755 index 0000000..6d694b7 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-selectTool.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadEven.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadEven.svg new file mode 100755 index 0000000..d331451 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadEven.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadNone.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadNone.svg new file mode 100755 index 0000000..91d485e --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadNone.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadOdd.svg b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadOdd.svg new file mode 100755 index 0000000..d5f9bfe --- /dev/null +++ b/src/assets/pdf-annotation/web/images/secondaryToolbarButton-spreadOdd.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/shadow.png b/src/assets/pdf-annotation/web/images/shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..a00061ac7e12e1f24f955351c732f5884ed94e6d GIT binary patch literal 269 zcmV+o0rLKdP)x zC_KTGmJz#(`(y{`706aQ=LO(|>*4a=X10w?b}71h;{m9Cm$8qS0|@D>d&U>M9!+E^ zw6OzJCT~46CFGV_vDkR*QP%3AOv>`usy8Q@(O+ZL + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-currentOutlineItem.svg b/src/assets/pdf-annotation/web/images/toolbarButton-currentOutlineItem.svg new file mode 100755 index 0000000..2f54263 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-currentOutlineItem.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-download.svg b/src/assets/pdf-annotation/web/images/toolbarButton-download.svg new file mode 100755 index 0000000..94b8249 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-editorFreeText.svg b/src/assets/pdf-annotation/web/images/toolbarButton-editorFreeText.svg new file mode 100755 index 0000000..7778451 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-editorFreeText.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-editorInk.svg b/src/assets/pdf-annotation/web/images/toolbarButton-editorInk.svg new file mode 100755 index 0000000..c7a3e51 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-editorInk.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-menuArrow.svg b/src/assets/pdf-annotation/web/images/toolbarButton-menuArrow.svg new file mode 100755 index 0000000..fb303e7 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-menuArrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-openFile.svg b/src/assets/pdf-annotation/web/images/toolbarButton-openFile.svg new file mode 100755 index 0000000..5e4195f --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-openFile.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-pageDown.svg b/src/assets/pdf-annotation/web/images/toolbarButton-pageDown.svg new file mode 100755 index 0000000..e34506c --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-pageDown.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-pageUp.svg b/src/assets/pdf-annotation/web/images/toolbarButton-pageUp.svg new file mode 100755 index 0000000..0f1a687 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-pageUp.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-presentationMode.svg b/src/assets/pdf-annotation/web/images/toolbarButton-presentationMode.svg new file mode 100755 index 0000000..e10d7af --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-presentationMode.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-print.svg b/src/assets/pdf-annotation/web/images/toolbarButton-print.svg new file mode 100755 index 0000000..97c981f --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-print.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-search.svg b/src/assets/pdf-annotation/web/images/toolbarButton-search.svg new file mode 100755 index 0000000..f23e616 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-search.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-secondaryToolbarToggle.svg b/src/assets/pdf-annotation/web/images/toolbarButton-secondaryToolbarToggle.svg new file mode 100755 index 0000000..d18355b --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-secondaryToolbarToggle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-sidebarToggle.svg b/src/assets/pdf-annotation/web/images/toolbarButton-sidebarToggle.svg new file mode 100755 index 0000000..3105ad2 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-sidebarToggle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-viewAttachments.svg b/src/assets/pdf-annotation/web/images/toolbarButton-viewAttachments.svg new file mode 100755 index 0000000..947ad53 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-viewAttachments.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-viewLayers.svg b/src/assets/pdf-annotation/web/images/toolbarButton-viewLayers.svg new file mode 100755 index 0000000..8a18a6a --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-viewLayers.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-viewOutline.svg b/src/assets/pdf-annotation/web/images/toolbarButton-viewOutline.svg new file mode 100755 index 0000000..e8348f1 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-viewOutline.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-viewThumbnail.svg b/src/assets/pdf-annotation/web/images/toolbarButton-viewThumbnail.svg new file mode 100755 index 0000000..fbe745e --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-viewThumbnail.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-zoomIn.svg b/src/assets/pdf-annotation/web/images/toolbarButton-zoomIn.svg new file mode 100755 index 0000000..f5fd05f --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-zoomIn.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/toolbarButton-zoomOut.svg b/src/assets/pdf-annotation/web/images/toolbarButton-zoomOut.svg new file mode 100755 index 0000000..113e5a9 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/toolbarButton-zoomOut.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/pdf-annotation/web/images/treeitem-collapsed.svg b/src/assets/pdf-annotation/web/images/treeitem-collapsed.svg new file mode 100755 index 0000000..8ef6538 --- /dev/null +++ b/src/assets/pdf-annotation/web/images/treeitem-collapsed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/pdf-annotation/web/images/treeitem-expanded.svg b/src/assets/pdf-annotation/web/images/treeitem-expanded.svg new file mode 100755 index 0000000..ca0a37a --- /dev/null +++ b/src/assets/pdf-annotation/web/images/treeitem-expanded.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/pdf-annotation/web/locale/ach/viewer.properties b/src/assets/pdf-annotation/web/locale/ach/viewer.properties new file mode 100755 index 0000000..2d04fd0 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ach/viewer.properties @@ -0,0 +1,200 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pot buk mukato +previous_label=Mukato +next.title=Pot buk malubo +next_label=Malubo + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pot buk +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=pi {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} me {{pagesCount}}) + +zoom_out.title=Jwik Matidi +zoom_out_label=Jwik Matidi +zoom_in.title=Kwot Madit +zoom_in_label=Kwot Madit +zoom.title=Kwoti +presentation_mode.title=Lokke i kit me tyer +presentation_mode_label=Kit me tyer +open_file.title=Yab Pwail +open_file_label=Yab +print.title=Go +print_label=Go +download.title=Gam +download_label=Gam +bookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen) +bookmark_label=Neno ma kombedi + +# Secondary toolbar and context menu +tools.title=Gintic +tools_label=Gintic +first_page.title=Cit i pot buk mukwongo +first_page_label=Cit i pot buk mukwongo +last_page.title=Cit i pot buk magiko +last_page_label=Cit i pot buk magiko +page_rotate_cw.title=Wire i tung lacuc +page_rotate_cw_label=Wire i tung lacuc +page_rotate_ccw.title=Wire i tung lacam +page_rotate_ccw_label=Wire i tung lacam + +cursor_text_select_tool.title=Cak gitic me yero coc +cursor_text_select_tool_label=Gitic me yero coc +cursor_hand_tool.title=Cak gitic me cing +cursor_hand_tool_label=Gitic cing + + + +# Document properties dialog box +document_properties.title=Jami me gin acoya… +document_properties_label=Jami me gin acoya… +document_properties_file_name=Nying pwail: +document_properties_file_size=Dit pa pwail: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Wiye: +document_properties_author=Ngat mucoyo: +document_properties_subject=Subjek: +document_properties_keywords=Lok mapire tek: +document_properties_creation_date=Nino dwe me cwec: +document_properties_modification_date=Nino dwe me yub: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Lacwec: +document_properties_producer=Layub PDF: +document_properties_version=Kit PDF: +document_properties_page_count=Kwan me pot buk: +document_properties_page_size=Dit pa potbuk: +document_properties_page_size_unit_inches=i +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=atir +document_properties_page_size_orientation_landscape=arii +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Waraga +document_properties_page_size_name_legal=Cik +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized_yes=Eyo +document_properties_linearized_no=Pe +document_properties_close=Lor + +print_progress_message=Yubo coc me agoya… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Juki + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Lok gintic ma inget +toggle_sidebar_label=Lok gintic ma inget +document_outline.title=Nyut Wiyewiye me Gin acoya (dii-kiryo me yaro/kano jami weng) +document_outline_label=Pek pa gin acoya +attachments.title=Nyut twec +attachments_label=Twec +thumbs.title=Nyut cal +thumbs_label=Cal +findbar.title=Nong iye gin acoya +findbar_label=Nong + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pot buk {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Cal me pot buk {{page}} + +# Find panel button title and messages +find_input.title=Nong +find_input.placeholder=Nong i dokumen… +find_previous.title=Nong timme pa lok mukato +find_previous_label=Mukato +find_next.title=Nong timme pa lok malubo +find_next_label=Malubo +find_highlight=Wer weng +find_match_case_label=Lok marwate +find_reached_top=Oo iwi gin acoya, omede ki i tere +find_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye +find_not_found=Lok pe ononge + +# Error panel labels +error_more_info=Ngec Mukene +error_less_info=Ngec Manok +error_close=Lor +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Kwena: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Can kikore {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Pwail: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rek: {{line}} +rendering_error=Bal otime i kare me nyuto pot buk. + +# Predefined zoom values +page_scale_width=Lac me iye pot buk +page_scale_fit=Porre me pot buk +page_scale_auto=Kwot pire kene +page_scale_actual=Dite kikome +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Bal otime kun cano PDF. +invalid_file_error=Pwail me PDF ma pe atir onyo obale woko. +missing_file_error=Pwail me PDF tye ka rem. +unexpected_response_error=Lagam mape kigeno pa lapok tic. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Lok angea manok] +password_label=Ket mung me donyo me yabo pwail me PDF man. +password_invalid=Mung me donyo pe atir. Tim ber i tem doki. +password_ok=OK +password_cancel=Juki + +printing_not_supported=Ciko: Layeny ma pe teno goyo liweng. +printing_not_ready=Ciko: PDF pe ocane weng me agoya. +web_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine. + diff --git a/src/assets/pdf-annotation/web/locale/af/viewer.properties b/src/assets/pdf-annotation/web/locale/af/viewer.properties new file mode 100755 index 0000000..7c8e485 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/af/viewer.properties @@ -0,0 +1,177 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Vorige bladsy +previous_label=Vorige +next.title=Volgende bladsy +next_label=Volgende + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Bladsy +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=van {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} van {{pagesCount}}) + +zoom_out.title=Zoem uit +zoom_out_label=Zoem uit +zoom_in.title=Zoem in +zoom_in_label=Zoem in +zoom.title=Zoem +presentation_mode.title=Wissel na voorleggingsmodus +presentation_mode_label=Voorleggingsmodus +open_file.title=Open lêer +open_file_label=Open +print.title=Druk +print_label=Druk +download.title=Laai af +download_label=Laai af +bookmark.title=Huidige aansig (kopieer of open in nuwe venster) +bookmark_label=Huidige aansig + +# Secondary toolbar and context menu +tools.title=Nutsgoed +tools_label=Nutsgoed +first_page.title=Gaan na eerste bladsy +first_page_label=Gaan na eerste bladsy +last_page.title=Gaan na laaste bladsy +last_page_label=Gaan na laaste bladsy +page_rotate_cw.title=Roteer kloksgewys +page_rotate_cw_label=Roteer kloksgewys +page_rotate_ccw.title=Roteer anti-kloksgewys +page_rotate_ccw_label=Roteer anti-kloksgewys + +cursor_text_select_tool.title=Aktiveer gereedskap om teks te merk +cursor_text_select_tool_label=Teksmerkgereedskap +cursor_hand_tool.title=Aktiveer handjie +cursor_hand_tool_label=Handjie + +# Document properties dialog box +document_properties.title=Dokumenteienskappe… +document_properties_label=Dokumenteienskappe… +document_properties_file_name=Lêernaam: +document_properties_file_size=Lêergrootte: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kG ({{size_b}} grepe) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MG ({{size_b}} grepe) +document_properties_title=Titel: +document_properties_author=Outeur: +document_properties_subject=Onderwerp: +document_properties_keywords=Sleutelwoorde: +document_properties_creation_date=Skeppingsdatum: +document_properties_modification_date=Wysigingsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Skepper: +document_properties_producer=PDF-vervaardiger: +document_properties_version=PDF-weergawe: +document_properties_page_count=Aantal bladsye: +document_properties_close=Sluit + +print_progress_message=Berei tans dokument voor om te druk… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Kanselleer + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sypaneel aan/af +toggle_sidebar_label=Sypaneel aan/af +document_outline.title=Wys dokumentskema (dubbelklik om alle items oop/toe te vou) +document_outline_label=Dokumentoorsig +attachments.title=Wys aanhegsels +attachments_label=Aanhegsels +thumbs.title=Wys duimnaels +thumbs_label=Duimnaels +findbar.title=Soek in dokument +findbar_label=Vind + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Bladsy {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Duimnael van bladsy {{page}} + +# Find panel button title and messages +find_input.title=Vind +find_input.placeholder=Soek in dokument… +find_previous.title=Vind die vorige voorkoms van die frase +find_previous_label=Vorige +find_next.title=Vind die volgende voorkoms van die frase +find_next_label=Volgende +find_highlight=Verlig almal +find_match_case_label=Kassensitief +find_reached_top=Bokant van dokument is bereik; gaan voort van onder af +find_reached_bottom=Einde van dokument is bereik; gaan voort van bo af +find_not_found=Frase nie gevind nie + +# Error panel labels +error_more_info=Meer inligting +error_less_info=Minder inligting +error_close=Sluit +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (ID: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Boodskap: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stapel: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Lêer: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lyn: {{line}} +rendering_error='n Fout het voorgekom toe die bladsy weergegee is. + +# Predefined zoom values +page_scale_width=Bladsywydte +page_scale_fit=Pas bladsy +page_scale_auto=Outomatiese zoem +page_scale_actual=Werklike grootte +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error='n Fout het voorgekom met die laai van die PDF. +invalid_file_error=Ongeldige of korrupte PDF-lêer. +missing_file_error=PDF-lêer is weg. +unexpected_response_error=Onverwagse antwoord van bediener. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-annotasie] +password_label=Gee die wagwoord om dié PDF-lêer mee te open. +password_invalid=Ongeldige wagwoord. Probeer gerus weer. +password_ok=OK +password_cancel=Kanselleer + +printing_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie. +printing_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie. +web_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie. + diff --git a/src/assets/pdf-annotation/web/locale/an/viewer.properties b/src/assets/pdf-annotation/web/locale/an/viewer.properties new file mode 100755 index 0000000..a33eb65 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/an/viewer.properties @@ -0,0 +1,243 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pachina anterior +previous_label=Anterior +next.title=Pachina siguient +next_label=Siguient + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pachina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Achiquir +zoom_out_label=Achiquir +zoom_in.title=Agrandir +zoom_in_label=Agrandir +zoom.title=Grandaria +presentation_mode.title=Cambear t'o modo de presentación +presentation_mode_label=Modo de presentación +open_file.title=Ubrir o fichero +open_file_label=Ubrir +print.title=Imprentar +print_label=Imprentar +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar u ubrir en una nueva finestra) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Ferramientas +tools_label=Ferramientas +first_page.title=Ir ta la primer pachina +first_page_label=Ir ta la primer pachina +last_page.title=Ir ta la zaguer pachina +last_page_label=Ir ta la zaguer pachina +page_rotate_cw.title=Chirar enta la dreita +page_rotate_cw_label=Chira enta la dreita +page_rotate_ccw.title=Chirar enta la zurda +page_rotate_ccw_label=Chirar enta la zurda + +cursor_text_select_tool.title=Activar la ferramienta de selección de texto +cursor_text_select_tool_label=Ferramienta de selección de texto +cursor_hand_tool.title=Activar la ferramienta man +cursor_hand_tool_label=Ferramienta man + +scroll_vertical.title=Usar lo desplazamiento vertical +scroll_vertical_label=Desplazamiento vertical +scroll_horizontal.title=Usar lo desplazamiento horizontal +scroll_horizontal_label=Desplazamiento horizontal +scroll_wrapped.title=Activaar lo desplazamiento contino +scroll_wrapped_label=Desplazamiento contino + +spread_none.title=No unir vistas de pachinas +spread_none_label=Una pachina nomás +spread_odd.title=Mostrar vista de pachinas, con as impars a la zurda +spread_odd_label=Doble pachina, impar a la zurda +spread_even.title=Amostrar vista de pachinas, con as pars a la zurda +spread_even_label=Doble pachina, para a la zurda + +# Document properties dialog box +document_properties.title=Propiedatz d'o documento... +document_properties_label=Propiedatz d'o documento... +document_properties_file_name=Nombre de fichero: +document_properties_file_size=Grandaria d'o fichero: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titol: +document_properties_author=Autor: +document_properties_subject=Afer: +document_properties_keywords=Parolas clau: +document_properties_creation_date=Calendata de creyación: +document_properties_modification_date=Calendata de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creyador: +document_properties_producer=Creyador de PDF: +document_properties_version=Versión de PDF: +document_properties_page_count=Numero de pachinas: +document_properties_page_size=Mida de pachina: +document_properties_page_size_unit_inches=pulgadas +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=horizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} x {{height}} {{unit}} {{orientation}} +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} x {{height}} {{unit}} {{name}}, {{orientation}} +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista web rapida: +document_properties_linearized_yes=Sí +document_properties_linearized_no=No +document_properties_close=Zarrar + +print_progress_message=Se ye preparando la documentación pa imprentar… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Amostrar u amagar a barra lateral +toggle_sidebar_notification2.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos/capas) +toggle_sidebar_label=Amostrar a barra lateral +document_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items) +document_outline_label=Esquema d'o documento +attachments.title=Amostrar os adchuntos +attachments_label=Adchuntos +layers.title=Amostrar capas (doble clic para reiniciar totas las capas a lo estau per defecto) +layers_label=Capas +thumbs.title=Amostrar as miniaturas +thumbs_label=Miniaturas +findbar.title=Trobar en o documento +findbar_label=Trobar + +additional_layers=Capas adicionals +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pachina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura d'a pachina {{page}} + +# Find panel button title and messages +find_input.title=Trobar +find_input.placeholder=Trobar en o documento… +find_previous.title=Trobar l'anterior coincidencia d'a frase +find_previous_label=Anterior +find_next.title=Trobar a siguient coincidencia d'a frase +find_next_label=Siguient +find_highlight=Resaltar-lo tot +find_match_case_label=Coincidencia de mayusclas/minusclas +find_entire_word_label=Parolas completas +find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo +find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} coincidencia +find_match_count[two]={{current}} de {{total}} coincidencias +find_match_count[few]={{current}} de {{total}} coincidencias +find_match_count[many]={{current}} de {{total}} coincidencias +find_match_count[other]={{current}} de {{total}} coincidencias +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mas de {{limit}} coincidencias +find_match_count_limit[one]=Mas de {{limit}} coincidencias +find_match_count_limit[two]=Mas que {{limit}} coincidencias +find_match_count_limit[few]=Mas que {{limit}} coincidencias +find_match_count_limit[many]=Mas que {{limit}} coincidencias +find_match_count_limit[other]=Mas que {{limit}} coincidencias +find_not_found=No s'ha trobau a frase + +# Error panel labels +error_more_info=Mas información +error_less_info=Menos información +error_close=Zarrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensache: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fichero: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linia: {{line}} +rendering_error=Ha ocurriu una error en renderizar a pachina. + +# Predefined zoom values +page_scale_width=Amplaria d'a pachina +page_scale_fit=Achuste d'a pachina +page_scale_auto=Grandaria automatica +page_scale_actual=Grandaria actual +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=S'ha produciu una error en cargar o PDF. +invalid_file_error=O PDF no ye valido u ye estorbau. +missing_file_error=No i ha fichero PDF. +unexpected_response_error=Respuesta a lo servicio inasperada. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotación {{type}}] +password_label=Introduzca a clau ta ubrir iste fichero PDF. +password_invalid=Clau invalida. Torna a intentar-lo. +password_ok=Acceptar +password_cancel=Cancelar + +printing_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions. +printing_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo. +web_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF. + diff --git a/src/assets/pdf-annotation/web/locale/ar/viewer.properties b/src/assets/pdf-annotation/web/locale/ar/viewer.properties new file mode 100755 index 0000000..1d389e8 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ar/viewer.properties @@ -0,0 +1,247 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=الصفحة السابقة +previous_label=السابقة +next.title=الصفحة التالية +next_label=التالية + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=صفحة +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=من {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} من {{pagesCount}}) + +zoom_out.title=بعّد +zoom_out_label=بعّد +zoom_in.title=قرّب +zoom_in_label=قرّب +zoom.title=التقريب +presentation_mode.title=انتقل لوضع العرض التقديمي +presentation_mode_label=وضع العرض التقديمي +open_file.title=افتح ملفًا +open_file_label=افتح +print.title=اطبع +print_label=اطبع +download.title=نزّل +download_label=نزّل +bookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة) +bookmark_label=المنظور الحالي + +# Secondary toolbar and context menu +tools.title=الأدوات +tools_label=الأدوات +first_page.title=انتقل إلى الصفحة الأولى +first_page_label=انتقل إلى الصفحة الأولى +last_page.title=انتقل إلى الصفحة الأخيرة +last_page_label=انتقل إلى الصفحة الأخيرة +page_rotate_cw.title=أدر باتجاه عقارب الساعة +page_rotate_cw_label=أدر باتجاه عقارب الساعة +page_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة +page_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة + +cursor_text_select_tool.title=فعّل أداة اختيار النص +cursor_text_select_tool_label=أداة اختيار النص +cursor_hand_tool.title=فعّل أداة اليد +cursor_hand_tool_label=أداة اليد + +scroll_vertical.title=استخدم التمرير الرأسي +scroll_vertical_label=التمرير الرأسي +scroll_horizontal.title=استخدم التمرير الأفقي +scroll_horizontal_label=التمرير الأفقي +scroll_wrapped.title=استخدم التمرير الملتف +scroll_wrapped_label=التمرير الملتف + +spread_none.title=لا تدمج هوامش الصفحات مع بعضها البعض +spread_none_label=بلا هوامش +spread_odd.title=ادمج هوامش الصفحات الفردية +spread_odd_label=هوامش الصفحات الفردية +spread_even.title=ادمج هوامش الصفحات الزوجية +spread_even_label=هوامش الصفحات الزوجية + +# Document properties dialog box +document_properties.title=خصائص المستند… +document_properties_label=خصائص المستند… +document_properties_file_name=اسم الملف: +document_properties_file_size=حجم الملف: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت) +document_properties_title=العنوان: +document_properties_author=المؤلف: +document_properties_subject=الموضوع: +document_properties_keywords=الكلمات الأساسية: +document_properties_creation_date=تاريخ الإنشاء: +document_properties_modification_date=تاريخ التعديل: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}، {{time}} +document_properties_creator=المنشئ: +document_properties_producer=منتج PDF: +document_properties_version=إصدارة PDF: +document_properties_page_count=عدد الصفحات: +document_properties_page_size=مقاس الورقة: +document_properties_page_size_unit_inches=بوصة +document_properties_page_size_unit_millimeters=ملم +document_properties_page_size_orientation_portrait=طوليّ +document_properties_page_size_orientation_landscape=عرضيّ +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=خطاب +document_properties_page_size_name_legal=قانونيّ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string=‏{{width}} × ‏{{height}} ‏{{unit}} (‏{{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string=‏{{width}} × ‏{{height}} ‏{{unit}} (‏{{name}}، {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=العرض السريع عبر الوِب: +document_properties_linearized_yes=نعم +document_properties_linearized_no=لا +document_properties_close=أغلق + +print_progress_message=يُحضّر المستند للطباعة… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}٪ +print_progress_close=ألغِ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=بدّل ظهور الشريط الجانبي +toggle_sidebar_notification2.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات أو طبقات) +toggle_sidebar_label=بدّل ظهور الشريط الجانبي +document_outline.title=اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر) +document_outline_label=مخطط المستند +attachments.title=اعرض المرفقات +attachments_label=المُرفقات +layers.title=اعرض الطبقات (انقر مرتين لتصفير كل الطبقات إلى الحالة المبدئية) +layers_label=‏‏الطبقات +thumbs.title=اعرض مُصغرات +thumbs_label=مُصغّرات +findbar.title=ابحث في المستند +findbar_label=ابحث + +additional_layers=الطبقات الإضافية +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=صفحة {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=صفحة {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=مصغّرة صفحة {{page}} + +# Find panel button title and messages +find_input.title=ابحث +find_input.placeholder=ابحث في المستند… +find_previous.title=ابحث عن التّواجد السّابق للعبارة +find_previous_label=السابق +find_next.title=ابحث عن التّواجد التّالي للعبارة +find_next_label=التالي +find_highlight=أبرِز الكل +find_match_case_label=طابق حالة الأحرف +find_entire_word_label=كلمات كاملة +find_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند +find_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} من أصل مطابقة واحدة +find_match_count[two]={{current}} من أصل مطابقتين +find_match_count[few]={{current}} من أصل {{total}} مطابقات +find_match_count[many]={{current}} من أصل {{total}} مطابقة +find_match_count[other]={{current}} من أصل {{total}} مطابقة +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=فقط +find_match_count_limit[one]=أكثر من مطابقة واحدة +find_match_count_limit[two]=أكثر من مطابقتين +find_match_count_limit[few]=أكثر من {{limit}} مطابقات +find_match_count_limit[many]=أكثر من {{limit}} مطابقة +find_match_count_limit[other]=أكثر من {{limit}} مطابقة +find_not_found=لا وجود للعبارة + +# Error panel labels +error_more_info=معلومات أكثر +error_less_info=معلومات أقل +error_close=أغلق +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=الرسالة: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=الرصّة: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=الملف: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=السطر: {{line}} +rendering_error=حدث خطأ أثناء عرض الصفحة. + +# Predefined zoom values +page_scale_width=عرض الصفحة +page_scale_fit=ملائمة الصفحة +page_scale_auto=تقريب تلقائي +page_scale_actual=الحجم الفعلي +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}٪ + +# Loading indicator messages +loading=يحمّل… +loading_error=حدث عطل أثناء تحميل ملف PDF. +invalid_file_error=ملف PDF تالف أو غير صحيح. +missing_file_error=ملف PDF غير موجود. +unexpected_response_error=استجابة خادوم غير متوقعة. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}، {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[تعليق {{type}}] +password_label=أدخل لكلمة السر لفتح هذا الملف. +password_invalid=كلمة سر خطأ. من فضلك أعد المحاولة. +password_ok=حسنا +password_cancel=ألغِ + +printing_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل. +printing_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة. +web_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة. + diff --git a/src/assets/pdf-annotation/web/locale/ast/viewer.properties b/src/assets/pdf-annotation/web/locale/ast/viewer.properties new file mode 100755 index 0000000..1f8bb2e --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ast/viewer.properties @@ -0,0 +1,207 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Páxina anterior +previous_label=Anterior +next.title=Páxina siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Páxina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Alloñar +zoom_out_label=Alloña +zoom_in.title=Averar +zoom_in_label=Avera +zoom.title=Zoom +presentation_mode.title=Cambiar al mou de presentación +presentation_mode_label=Mou de presentación +open_file_label=Abrir +print.title=Imprentar +print_label=Imprentar +download.title=Baxar +download_label=Baxar +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Ferramientes +tools_label=Ferramientes +first_page_label=Dir a la primer páxina +last_page_label=Dir a la última páxina +page_rotate_cw.title=Voltia a la derecha +page_rotate_cw_label=Voltiar a la derecha +page_rotate_ccw.title=Voltia a la esquierda +page_rotate_ccw_label=Voltiar a la esquierda + +cursor_text_select_tool.title=Activa la ferramienta d'esbilla de testu +cursor_text_select_tool_label=Ferramienta d'esbilla de testu +cursor_hand_tool.title=Activa la ferramienta de mano +cursor_hand_tool_label=Ferramienta de mano + +scroll_vertical.title=Usa'l desplazamientu vertical +scroll_vertical_label=Desplazamientu vertical +scroll_horizontal.title=Usa'l desplazamientu horizontal +scroll_horizontal_label=Desplazamientu horizontal +scroll_wrapped.title=Usa'l desplazamientu continuu +scroll_wrapped_label=Desplazamientu continuu + +spread_none_label=Fueyes individuales +spread_odd_label=Fueyes pares +spread_even_label=Fueyes impares + +# Document properties dialog box +document_properties.title=Propiedaes del documentu… +document_properties_label=Propiedaes del documentu… +document_properties_file_name=Nome del ficheru: +document_properties_file_size=Tamañu del ficheru: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Títulu: +document_properties_keywords=Pallabres clave: +document_properties_creation_date=Data de creación: +document_properties_modification_date=Data de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_producer=Productor del PDF: +document_properties_version=Versión del PDF: +document_properties_page_count=Númberu de páxines: +document_properties_page_size=Tamañu de páxina: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=horizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista web rápida: +document_properties_linearized_yes=Sí +document_properties_linearized_no=Non +document_properties_close=Zarrar + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Encaboxar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Alternar la barra llateral +attachments.title=Amosar los axuntos +attachments_label=Axuntos +layers_label=Capes +thumbs.title=Amosar les miniatures +thumbs_label=Miniatures +findbar_label=Atopar + +additional_layers=Capes adicionales +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Páxina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Páxina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_previous_label=Anterior +find_next_label=Siguiente +find_entire_word_label=Pallabres completes +find_reached_top=Algamóse'l comienzu de la páxina, síguese dende abaxo +find_reached_bottom=Algamóse la fin del documentu, síguese dende arriba +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count[one]={{current}} de {{total}} coincidencia +find_match_count[two]={{current}} de {{total}} coincidencies +find_match_count[few]={{current}} de {{total}} coincidencies +find_match_count[many]={{current}} de {{total}} coincidencies +find_match_count[other]={{current}} de {{total}} coincidencies +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit[zero]=Más de {{limit}} coincidencies +find_match_count_limit[one]=Más de {{limit}} coincidencia +find_match_count_limit[two]=Más de {{limit}} coincidencies +find_match_count_limit[few]=Más de {{limit}} coincidencies +find_match_count_limit[many]=Más de {{limit}} coincidencies +find_match_count_limit[other]=Más de {{limit}} coincidencies + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilación: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaxe: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ficheru: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Llinia: {{line}} + +# Predefined zoom values +page_scale_auto=Zoom automáticu +page_scale_actual=Tamañu real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Cargando… +loading_error=Asocedió un fallu mentanto se cargaba'l PDF. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_ok=Aceptar +password_cancel=Encaboxar + +# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same +# exact string as in the `chrome.properties` file. + diff --git a/src/assets/pdf-annotation/web/locale/az/viewer.properties b/src/assets/pdf-annotation/web/locale/az/viewer.properties new file mode 100755 index 0000000..3cb27ec --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/az/viewer.properties @@ -0,0 +1,243 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Əvvəlki səhifə +previous_label=Əvvəlkini tap +next.title=Növbəti səhifə +next_label=İrəli + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Səhifə +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Uzaqlaş +zoom_out_label=Uzaqlaş +zoom_in.title=Yaxınlaş +zoom_in_label=Yaxınlaş +zoom.title=Yaxınlaşdırma +presentation_mode.title=Təqdimat Rejiminə Keç +presentation_mode_label=Təqdimat Rejimi +open_file.title=Fayl Aç +open_file_label=Aç +print.title=Yazdır +print_label=Yazdır +download.title=Endir +download_label=Endir +bookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç) +bookmark_label=Hazırkı görünüş + +# Secondary toolbar and context menu +tools.title=Alətlər +tools_label=Alətlər +first_page.title=İlk Səhifəyə get +first_page_label=İlk Səhifəyə get +last_page.title=Son Səhifəyə get +last_page_label=Son Səhifəyə get +page_rotate_cw.title=Saat İstiqamətində Fırlat +page_rotate_cw_label=Saat İstiqamətində Fırlat +page_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat +page_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat + +cursor_text_select_tool.title=Yazı seçmə alətini aktivləşdir +cursor_text_select_tool_label=Yazı seçmə aləti +cursor_hand_tool.title=Əl alətini aktivləşdir +cursor_hand_tool_label=Əl aləti + +scroll_vertical.title=Şaquli sürüşdürmə işlət +scroll_vertical_label=Şaquli sürüşdürmə +scroll_horizontal.title=Üfüqi sürüşdürmə işlət +scroll_horizontal_label=Üfüqi sürüşdürmə +scroll_wrapped.title=Bükülü sürüşdürmə işlət +scroll_wrapped_label=Bükülü sürüşdürmə + +spread_none.title=Yan-yana birləşdirilmiş səhifələri işlətmə +spread_none_label=Birləşdirmə +spread_odd.title=Yan-yana birləşdirilmiş səhifələri tək nömrəli səhifələrdən başlat +spread_odd_label=Tək nömrəli +spread_even.title=Yan-yana birləşdirilmiş səhifələri cüt nömrəli səhifələrdən başlat +spread_even_label=Cüt nömrəli + +# Document properties dialog box +document_properties.title=Sənəd xüsusiyyətləri… +document_properties_label=Sənəd xüsusiyyətləri… +document_properties_file_name=Fayl adı: +document_properties_file_size=Fayl ölçüsü: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bayt) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bayt) +document_properties_title=Başlık: +document_properties_author=Müəllif: +document_properties_subject=Mövzu: +document_properties_keywords=Açar sözlər: +document_properties_creation_date=Yaradılış Tarixi : +document_properties_modification_date=Dəyişdirilmə Tarixi : +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Yaradan: +document_properties_producer=PDF yaradıcısı: +document_properties_version=PDF versiyası: +document_properties_page_count=Səhifə sayı: +document_properties_page_size=Səhifə Ölçüsü: +document_properties_page_size_unit_inches=inç +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portret +document_properties_page_size_orientation_landscape=albom +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Məktub +document_properties_page_size_name_legal=Hüquqi +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Bəli +document_properties_linearized_no=Xeyr +document_properties_close=Qapat + +print_progress_message=Sənəd çap üçün hazırlanır… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Ləğv et + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Yan Paneli Aç/Bağla +toggle_sidebar_notification2.title=Yan paneli çevir (sənəddə icmal/bağlamalar/laylar mövcuddur) +toggle_sidebar_label=Yan Paneli Aç/Bağla +document_outline.title=Sənədin eskizini göstər (bütün bəndləri açmaq/yığmaq üçün iki dəfə klikləyin) +document_outline_label=Sənəd strukturu +attachments.title=Bağlamaları göstər +attachments_label=Bağlamalar +layers.title=Layları göstər (bütün layları ilkin halına sıfırlamaq üçün iki dəfə klikləyin) +layers_label=Laylar +thumbs.title=Kiçik şəkilləri göstər +thumbs_label=Kiçik şəkillər +findbar.title=Sənəddə Tap +findbar_label=Tap + +additional_layers=Əlavə laylar +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Səhifə{{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti + +# Find panel button title and messages +find_input.title=Tap +find_input.placeholder=Sənəddə tap… +find_previous.title=Bir öncəki uyğun gələn sözü tapır +find_previous_label=Geri +find_next.title=Bir sonrakı uyğun gələn sözü tapır +find_next_label=İrəli +find_highlight=İşarələ +find_match_case_label=Böyük/kiçik hərfə həssaslıq +find_entire_word_label=Tam sözlər +find_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir +find_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} / {{total}} uyğunluq +find_match_count[two]={{current}} / {{total}} uyğunluq +find_match_count[few]={{current}} / {{total}} uyğunluq +find_match_count[many]={{current}} / {{total}} uyğunluq +find_match_count[other]={{current}} / {{total}} uyğunluq +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}}-dan çox uyğunluq +find_match_count_limit[one]={{limit}}-dən çox uyğunluq +find_match_count_limit[two]={{limit}}-dən çox uyğunluq +find_match_count_limit[few]={{limit}} uyğunluqdan daha çox +find_match_count_limit[many]={{limit}} uyğunluqdan daha çox +find_match_count_limit[other]={{limit}} uyğunluqdan daha çox +find_not_found=Uyğunlaşma tapılmadı + +# Error panel labels +error_more_info=Daha çox məlumati +error_less_info=Daha az məlumat +error_close=Qapat +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (yığma: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=İsmarıc: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stek: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fayl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Sətir: {{line}} +rendering_error=Səhifə göstərilərkən səhv yarandı. + +# Predefined zoom values +page_scale_width=Səhifə genişliyi +page_scale_fit=Səhifəni sığdır +page_scale_auto=Avtomatik yaxınlaşdır +page_scale_actual=Hazırkı Həcm +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF yüklenərkən bir səhv yarandı. +invalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl. +missing_file_error=PDF fayl yoxdur. +unexpected_response_error=Gözlənilməz server cavabı. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotasiyası] +password_label=Bu PDF faylı açmaq üçün parolu daxil edin. +password_invalid=Parol səhvdir. Bir daha yoxlayın. +password_ok=Tamam +password_cancel=Ləğv et + +printing_not_supported=Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir. +printing_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib. +web_fonts_disabled=Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil. + diff --git a/src/assets/pdf-annotation/web/locale/be/viewer.properties b/src/assets/pdf-annotation/web/locale/be/viewer.properties new file mode 100755 index 0000000..50be591 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/be/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Папярэдняя старонка +previous_label=Папярэдняя +next.title=Наступная старонка +next_label=Наступная + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Старонка +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=з {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} з {{pagesCount}}) + +zoom_out.title=Паменшыць +zoom_out_label=Паменшыць +zoom_in.title=Павялічыць +zoom_in_label=Павялічыць +zoom.title=Павялічэнне тэксту +presentation_mode.title=Пераключыцца ў рэжым паказу +presentation_mode_label=Рэжым паказу +open_file.title=Адкрыць файл +open_file_label=Адкрыць +print.title=Друкаваць +print_label=Друкаваць +download.title=Сцягнуць +download_label=Сцягнуць +save.title=Захаваць +save_label=Захаваць +bookmark.title=Цяперашняя праява (скапіяваць або адчыніць у новым акне) +bookmark_label=Цяперашняя праява + +# Secondary toolbar and context menu +tools.title=Інструменты +tools_label=Інструменты +first_page.title=Перайсці на першую старонку +first_page_label=Перайсці на першую старонку +last_page.title=Перайсці на апошнюю старонку +last_page_label=Перайсці на апошнюю старонку +page_rotate_cw.title=Павярнуць па сонцу +page_rotate_cw_label=Павярнуць па сонцу +page_rotate_ccw.title=Павярнуць супраць сонца +page_rotate_ccw_label=Павярнуць супраць сонца + +cursor_text_select_tool.title=Уключыць прыладу выбару тэксту +cursor_text_select_tool_label=Прылада выбару тэксту +cursor_hand_tool.title=Уключыць ручную прыладу +cursor_hand_tool_label=Ручная прылада + +scroll_page.title=Выкарыстоўваць пракрутку старонкi +scroll_page_label=Пракрутка старонкi +scroll_vertical.title=Ужываць вертыкальную пракрутку +scroll_vertical_label=Вертыкальная пракрутка +scroll_horizontal.title=Ужываць гарызантальную пракрутку +scroll_horizontal_label=Гарызантальная пракрутка +scroll_wrapped.title=Ужываць маштабавальную пракрутку +scroll_wrapped_label=Маштабавальная пракрутка + +spread_none.title=Не выкарыстоўваць разгорнутыя старонкі +spread_none_label=Без разгорнутых старонак +spread_odd.title=Разгорнутыя старонкі пачынаючы з няцотных нумароў +spread_odd_label=Няцотныя старонкі злева +spread_even.title=Разгорнутыя старонкі пачынаючы з цотных нумароў +spread_even_label=Цотныя старонкі злева + +# Document properties dialog box +document_properties.title=Уласцівасці дакумента… +document_properties_label=Уласцівасці дакумента… +document_properties_file_name=Назва файла: +document_properties_file_size=Памер файла: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байт) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байт) +document_properties_title=Загаловак: +document_properties_author=Аўтар: +document_properties_subject=Тэма: +document_properties_keywords=Ключавыя словы: +document_properties_creation_date=Дата стварэння: +document_properties_modification_date=Дата змянення: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Стваральнік: +document_properties_producer=Вырабнік PDF: +document_properties_version=Версія PDF: +document_properties_page_count=Колькасць старонак: +document_properties_page_size=Памер старонкі: +document_properties_page_size_unit_inches=цаляў +document_properties_page_size_unit_millimeters=мм +document_properties_page_size_orientation_portrait=кніжная +document_properties_page_size_orientation_landscape=альбомная +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Хуткі прагляд у Інтэрнэце: +document_properties_linearized_yes=Так +document_properties_linearized_no=Не +document_properties_close=Закрыць + +print_progress_message=Падрыхтоўка дакумента да друку… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Скасаваць + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Паказаць/схаваць бакавую панэль +toggle_sidebar_notification2.title=Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні/пласты) +toggle_sidebar_label=Паказаць/схаваць бакавую панэль +document_outline.title=Паказаць структуру дакумента (двайная пстрычка, каб разгарнуць /згарнуць усе элементы) +document_outline_label=Структура дакумента +attachments.title=Паказаць далучэнні +attachments_label=Далучэнні +layers.title=Паказаць пласты (націсніце двойчы, каб скінуць усе пласты да прадвызначанага стану) +layers_label=Пласты +thumbs.title=Паказ мініяцюр +thumbs_label=Мініяцюры +current_outline_item.title=Знайсці бягучы элемент структуры +current_outline_item_label=Бягучы элемент структуры +findbar.title=Пошук у дакуменце +findbar_label=Знайсці + +additional_layers=Дадатковыя пласты +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Старонка {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Старонка {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Мініяцюра старонкі {{page}} + +# Find panel button title and messages +find_input.title=Шукаць +find_input.placeholder=Шукаць у дакуменце… +find_previous.title=Знайсці папярэдні выпадак выразу +find_previous_label=Папярэдні +find_next.title=Знайсці наступны выпадак выразу +find_next_label=Наступны +find_highlight=Падфарбаваць усе +find_match_case_label=З улікам рэгістра +find_match_diacritics_label=З улікам дыякрытычных знакаў +find_entire_word_label=Словы цалкам +find_reached_top=Дасягнуты пачатак дакумента, працяг з канца +find_reached_bottom=Дасягнуты канец дакумента, працяг з пачатку +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} з {{total}} супадзення +find_match_count[two]={{current}} з {{total}} супадзенняў +find_match_count[few]={{current}} з {{total}} супадзенняў +find_match_count[many]={{current}} з {{total}} супадзенняў +find_match_count[other]={{current}} з {{total}} супадзенняў +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Больш за {{limit}} супадзенняў +find_match_count_limit[one]=Больш за {{limit}} супадзенне +find_match_count_limit[two]=Больш за {{limit}} супадзенняў +find_match_count_limit[few]=Больш за {{limit}} супадзенняў +find_match_count_limit[many]=Больш за {{limit}} супадзенняў +find_match_count_limit[other]=Больш за {{limit}} супадзенняў +find_not_found=Выраз не знойдзены + +# Error panel labels +error_more_info=Падрабязней +error_less_info=Сцісла +error_close=Закрыць +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js в{{version}} (зборка: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Паведамленне: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стос: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Радок: {{line}} + +# Predefined zoom values +page_scale_width=Шырыня старонкі +page_scale_fit=Уцісненне старонкі +page_scale_auto=Аўтаматычнае павелічэнне +page_scale_actual=Сапраўдны памер +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Чытаецца… +loading_error=Здарылася памылка ў часе загрузкі PDF. +invalid_file_error=Няспраўны або пашкоджаны файл PDF. +missing_file_error=Адсутны файл PDF. +unexpected_response_error=Нечаканы адказ сервера. + +rendering_error=Здарылася памылка падчас адлюстравання старонкі. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Увядзіце пароль, каб адкрыць гэты файл PDF. +password_invalid=Нядзейсны пароль. Паспрабуйце зноў. +password_ok=Добра +password_cancel=Скасаваць + +printing_not_supported=Папярэджанне: друк не падтрымліваецца цалкам гэтым браўзерам. +printing_not_ready=Увага: PDF не сцягнуты цалкам для друкавання. +web_fonts_disabled=Шрыфты Сеціва забаронены: немагчыма ўжываць укладзеныя шрыфты PDF. + +# Editor +editor_free_text2.title=Тэкст +editor_free_text2_label=Тэкст +editor_ink2.title=Маляваць +editor_ink2_label=Маляваць + +free_text2_default_content=Пачніце набор тэксту… + +# Editor Parameters +editor_free_text_color=Колер +editor_free_text_size=Памер +editor_ink_color=Колер +editor_ink_thickness=Таўшчыня +editor_ink_opacity=Непразрыстасць + +# Editor aria +editor_free_text2_aria_label=Тэкставы рэдактар +editor_ink2_aria_label=Графічны рэдактар +editor_ink_canvas_aria_label=Відарыс, створаны карыстальнікам diff --git a/src/assets/pdf-annotation/web/locale/bg/viewer.properties b/src/assets/pdf-annotation/web/locale/bg/viewer.properties new file mode 100755 index 0000000..8c27398 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/bg/viewer.properties @@ -0,0 +1,235 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Предишна страница +previous_label=Предишна +next.title=Следваща страница +next_label=Следваща + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Страница +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=от {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} от {{pagesCount}}) + +zoom_out.title=Намаляване +zoom_out_label=Намаляване +zoom_in.title=Увеличаване +zoom_in_label=Увеличаване +zoom.title=Мащабиране +presentation_mode.title=Превключване към режим на представяне +presentation_mode_label=Режим на представяне +open_file.title=Отваряне на файл +open_file_label=Отваряне +print.title=Отпечатване +print_label=Отпечатване +download.title=Изтегляне +download_label=Изтегляне +bookmark.title=Текущ изглед (копиране или отваряне в нов прозорец) +bookmark_label=Текущ изглед + +# Secondary toolbar and context menu +tools.title=Инструменти +tools_label=Инструменти +first_page.title=Към първата страница +first_page_label=Към първата страница +last_page.title=Към последната страница +last_page_label=Към последната страница +page_rotate_cw.title=Завъртане по час. стрелка +page_rotate_cw_label=Завъртане по часовниковата стрелка +page_rotate_ccw.title=Завъртане обратно на час. стрелка +page_rotate_ccw_label=Завъртане обратно на часовниковата стрелка + +cursor_text_select_tool.title=Включване на инструмента за избор на текст +cursor_text_select_tool_label=Инструмент за избор на текст +cursor_hand_tool.title=Включване на инструмента ръка +cursor_hand_tool_label=Инструмент ръка + +scroll_vertical.title=Използване на вертикално плъзгане +scroll_vertical_label=Вертикално плъзгане +scroll_horizontal.title=Използване на хоризонтално +scroll_horizontal_label=Хоризонтално плъзгане +scroll_wrapped.title=Използване на мащабируемо плъзгане +scroll_wrapped_label=Мащабируемо плъзгане + +spread_none.title=Режимът на сдвояване е изключен +spread_none_label=Без сдвояване +spread_odd.title=Сдвояване, започвайки от нечетните страници +spread_odd_label=Нечетните отляво +spread_even.title=Сдвояване, започвайки от четните страници +spread_even_label=Четните отляво + +# Document properties dialog box +document_properties.title=Свойства на документа… +document_properties_label=Свойства на документа… +document_properties_file_name=Име на файл: +document_properties_file_size=Големина на файл: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байта) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байта) +document_properties_title=Заглавие: +document_properties_author=Автор: +document_properties_subject=Тема: +document_properties_keywords=Ключови думи: +document_properties_creation_date=Дата на създаване: +document_properties_modification_date=Дата на промяна: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Създател: +document_properties_producer=PDF произведен от: +document_properties_version=Издание на PDF: +document_properties_page_count=Брой страници: +document_properties_page_size=Размер на страницата: +document_properties_page_size_unit_inches=инч +document_properties_page_size_unit_millimeters=мм +document_properties_page_size_orientation_portrait=портрет +document_properties_page_size_orientation_landscape=пейзаж +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Правни въпроси +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Бърз преглед: +document_properties_linearized_yes=Да +document_properties_linearized_no=Не +document_properties_close=Затваряне + +print_progress_message=Подготвяне на документа за отпечатване… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Отказ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Превключване на страничната лента +toggle_sidebar_label=Превключване на страничната лента +document_outline.title=Показване на структурата на документа (двукратно щракване за свиване/разгъване на всичко) +document_outline_label=Структура на документа +attachments.title=Показване на притурките +attachments_label=Притурки +thumbs.title=Показване на миниатюрите +thumbs_label=Миниатюри +findbar.title=Намиране в документа +findbar_label=Търсене + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Страница {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Миниатюра на страница {{page}} + +# Find panel button title and messages +find_input.title=Търсене +find_input.placeholder=Търсене в документа… +find_previous.title=Намиране на предишно съвпадение на фразата +find_previous_label=Предишна +find_next.title=Намиране на следващо съвпадение на фразата +find_next_label=Следваща +find_highlight=Открояване на всички +find_match_case_label=Съвпадение на регистъра +find_entire_word_label=Цели думи +find_reached_top=Достигнато е началото на документа, продължаване от края +find_reached_bottom=Достигнат е краят на документа, продължаване от началото +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} от {{total}} съвпадение +find_match_count[two]={{current}} от {{total}} съвпадения +find_match_count[few]={{current}} от {{total}} съвпадения +find_match_count[many]={{current}} от {{total}} съвпадения +find_match_count[other]={{current}} от {{total}} съвпадения +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Повече от {{limit}} съвпадения +find_match_count_limit[one]=Повече от {{limit}} съвпадение +find_match_count_limit[two]=Повече от {{limit}} съвпадения +find_match_count_limit[few]=Повече от {{limit}} съвпадения +find_match_count_limit[many]=Повече от {{limit}} съвпадения +find_match_count_limit[other]=Повече от {{limit}} съвпадения +find_not_found=Фразата не е намерена + +# Error panel labels +error_more_info=Повече информация +error_less_info=По-малко информация +error_close=Затваряне +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=Издание на PDF.js {{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Съобщение: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Ред: {{line}} +rendering_error=Грешка при изчертаване на страницата. + +# Predefined zoom values +page_scale_width=Ширина на страницата +page_scale_fit=Вместване в страницата +page_scale_auto=Автоматично мащабиране +page_scale_actual=Действителен размер +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Получи се грешка при зареждане на PDF-а. +invalid_file_error=Невалиден или повреден PDF файл. +missing_file_error=Липсващ PDF файл. +unexpected_response_error=Неочакван отговор от сървъра. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Анотация {{type}}] +password_label=Въведете парола за отваряне на този PDF файл. +password_invalid=Невалидна парола. Моля, опитайте отново. +password_ok=Добре +password_cancel=Отказ + +printing_not_supported=Внимание: Този четец няма пълна поддръжка на отпечатване. +printing_not_ready=Внимание: Този PDF файл не е напълно зареден за печат. +web_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове. + diff --git a/src/assets/pdf-annotation/web/locale/bn/viewer.properties b/src/assets/pdf-annotation/web/locale/bn/viewer.properties new file mode 100755 index 0000000..366f2e5 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/bn/viewer.properties @@ -0,0 +1,239 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=পূর্ববর্তী পাতা +previous_label=পূর্ববর্তী +next.title=পরবর্তী পাতা +next_label=পরবর্তী + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=পাতা +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} এর +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} এর {{pageNumber}}) + +zoom_out.title=ছোট আকারে প্রদর্শন +zoom_out_label=ছোট আকারে প্রদর্শন +zoom_in.title=বড় আকারে প্রদর্শন +zoom_in_label=বড় আকারে প্রদর্শন +zoom.title=বড় আকারে প্রদর্শন +presentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন +presentation_mode_label=উপস্থাপনা মোড +open_file.title=ফাইল খুলুন +open_file_label=খুলুন +print.title=মুদ্রণ +print_label=মুদ্রণ +download.title=ডাউনলোড +download_label=ডাউনলোড +bookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন) +bookmark_label=বর্তমান অবস্থা + +# Secondary toolbar and context menu +tools.title=টুল +tools_label=টুল +first_page.title=প্রথম পাতায় যাও +first_page_label=প্রথম পাতায় যাও +last_page.title=শেষ পাতায় যাও +last_page_label=শেষ পাতায় যাও +page_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও +page_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও +page_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও +page_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও + +cursor_text_select_tool.title=লেখা নির্বাচক টুল সক্রিয় করুন +cursor_text_select_tool_label=লেখা নির্বাচক টুল +cursor_hand_tool.title=হ্যান্ড টুল সক্রিয় করুন +cursor_hand_tool_label=হ্যান্ড টুল + +scroll_vertical.title=উলম্ব স্ক্রলিং ব্যবহার করুন +scroll_vertical_label=উলম্ব স্ক্রলিং +scroll_horizontal.title=অনুভূমিক স্ক্রলিং ব্যবহার করুন +scroll_horizontal_label=অনুভূমিক স্ক্রলিং +scroll_wrapped.title=Wrapped স্ক্রোলিং ব্যবহার করুন +scroll_wrapped_label=Wrapped স্ক্রোলিং + +spread_none.title=পেজ স্প্রেডগুলোতে যোগদান করবেন না +spread_none_label=Spreads নেই +spread_odd_label=বিজোড় Spreads +spread_even_label=জোড় Spreads + +# Document properties dialog box +document_properties.title=নথি বৈশিষ্ট্য… +document_properties_label=নথি বৈশিষ্ট্য… +document_properties_file_name=ফাইলের নাম: +document_properties_file_size=ফাইলের আকার: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} কেবি ({{size_b}} বাইট) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} এমবি ({{size_b}} বাইট) +document_properties_title=শিরোনাম: +document_properties_author=লেখক: +document_properties_subject=বিষয়: +document_properties_keywords=কীওয়ার্ড: +document_properties_creation_date=তৈরির তারিখ: +document_properties_modification_date=পরিবর্তনের তারিখ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=প্রস্তুতকারক: +document_properties_producer=পিডিএফ প্রস্তুতকারক: +document_properties_version=পিডিএফ সংষ্করণ: +document_properties_page_count=মোট পাতা: +document_properties_page_size=পাতার সাইজ: +document_properties_page_size_unit_inches=এর মধ্যে +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=উলম্ব +document_properties_page_size_orientation_landscape=অনুভূমিক +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=লেটার +document_properties_page_size_name_legal=লীগাল +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=হ্যাঁ +document_properties_linearized_no=না +document_properties_close=বন্ধ + +print_progress_message=মুদ্রণের জন্য নথি প্রস্তুত করা হচ্ছে… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=বাতিল + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=সাইডবার টগল করুন +toggle_sidebar_label=সাইডবার টগল করুন +document_outline.title=নথির আউটলাইন দেখাও (সব আইটেম প্রসারিত/সঙ্কুচিত করতে ডবল ক্লিক করুন) +document_outline_label=নথির রূপরেখা +attachments.title=সংযুক্তি দেখাও +attachments_label=সংযুক্তি +thumbs.title=থাম্বনেইল সমূহ প্রদর্শন করুন +thumbs_label=থাম্বনেইল সমূহ +findbar.title=নথির মধ্যে খুঁজুন +findbar_label=খুঁজুন + +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=পাতা {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} পাতার থাম্বনেইল + +# Find panel button title and messages +find_input.title=খুঁজুন +find_input.placeholder=নথির মধ্যে খুঁজুন… +find_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান +find_previous_label=পূর্ববর্তী +find_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান +find_next_label=পরবর্তী +find_highlight=সব হাইলাইট করুন +find_match_case_label=অক্ষরের ছাঁদ মেলানো +find_entire_word_label=সম্পূর্ণ শব্দ +find_reached_top=পাতার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে +find_reached_bottom=পাতার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} এর {{current}} মিল +find_match_count[two]={{total}} এর {{current}} মিল +find_match_count[few]={{total}} এর {{current}} মিল +find_match_count[many]={{total}} এর {{current}} মিল +find_match_count[other]={{total}} এর {{current}} মিল +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} এর বেশি মিল +find_match_count_limit[one]={{limit}} এর বেশি মিল +find_match_count_limit[two]={{limit}} এর বেশি মিল +find_match_count_limit[few]={{limit}} এর বেশি মিল +find_match_count_limit[many]={{limit}} এর বেশি মিল +find_match_count_limit[other]={{limit}} এর বেশি মিল +find_not_found=বাক্যাংশ পাওয়া যায়নি + +# Error panel labels +error_more_info=আরও তথ্য +error_less_info=কম তথ্য +error_close=বন্ধ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=বার্তা: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=নথি: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=লাইন: {{line}} +rendering_error=পাতা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে। + +# Predefined zoom values +page_scale_width=পাতার প্রস্থ +page_scale_fit=পাতা ফিট করুন +page_scale_auto=স্বয়ংক্রিয় জুম +page_scale_actual=প্রকৃত আকার +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে। +invalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল। +missing_file_error=নিখোঁজ PDF ফাইল। +unexpected_response_error=অপ্রত্যাশীত সার্ভার প্রতিক্রিয়া। + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} টীকা] +password_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন। +password_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন। +password_ok=ঠিক আছে +password_cancel=বাতিল + +printing_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়। +printing_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি। +web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না। + diff --git a/src/assets/pdf-annotation/web/locale/bo/viewer.properties b/src/assets/pdf-annotation/web/locale/bo/viewer.properties new file mode 100755 index 0000000..d3b3933 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/bo/viewer.properties @@ -0,0 +1,238 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=དྲ་ངོས་སྔོན་མ +previous_label=སྔོན་མ +next.title=དྲ་ངོས་རྗེས་མ +next_label=རྗེས་མ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ཤོག་ངོས +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=of {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Zoom Out +zoom_out_label=Zoom Out +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Switch to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Print +print_label=Print +download.title=Download +download_label=Download +bookmark.title=Current view (copy or open in new window) +bookmark_label=Current View + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Go to First Page +first_page_label=Go to First Page +last_page.title=Go to Last Page +last_page_label=Go to Last Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Counterclockwise +page_rotate_ccw_label=Rotate Counterclockwise + +cursor_text_select_tool.title=Enable Text Selection Tool +cursor_text_select_tool_label=Text Selection Tool +cursor_hand_tool.title=Enable Hand Tool +cursor_hand_tool_label=Hand Tool + +scroll_vertical.title=Use Vertical Scrolling +scroll_vertical_label=Vertical Scrolling +scroll_horizontal.title=Use Horizontal Scrolling +scroll_horizontal_label=Horizontal Scrolling +scroll_wrapped.title=Use Wrapped Scrolling +scroll_wrapped_label=Wrapped Scrolling + +spread_none.title=Do not join page spreads +spread_none_label=No Spreads +spread_odd.title=Join page spreads starting with odd-numbered pages +spread_odd_label=Odd Spreads +spread_even.title=Join page spreads starting with even-numbered pages +spread_even_label=Even Spreads + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subject: +document_properties_keywords=Keywords: +document_properties_creation_date=Creation Date: +document_properties_modification_date=Modification Date: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Count: +document_properties_page_size=Page Size: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portrait +document_properties_page_size_orientation_landscape=landscape +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Yes +document_properties_linearized_no=No +document_properties_close=Close + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancel + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebar +toggle_sidebar_label=Toggle Sidebar +document_outline.title=Show Document Outline (double-click to expand/collapse all items) +document_outline_label=Document Outline +attachments.title=Show Attachments +attachments_label=Attachments +thumbs.title=Show Thumbnails +thumbs_label=Thumbnails +findbar.title=Find in Document +findbar_label=Find + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail of Page {{page}} + +# Find panel button title and messages +find_input.title=Find +find_input.placeholder=Find in document… +find_previous.title=Find the previous occurrence of the phrase +find_previous_label=Previous +find_next.title=Find the next occurrence of the phrase +find_next_label=Next +find_highlight=Highlight all +find_match_case_label=Match case +find_entire_word_label=Whole words +find_reached_top=Reached top of document, continued from bottom +find_reached_bottom=Reached end of document, continued from top +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} of {{total}} match +find_match_count[two]={{current}} of {{total}} matches +find_match_count[few]={{current}} of {{total}} matches +find_match_count[many]={{current}} of {{total}} matches +find_match_count[other]={{current}} of {{total}} matches +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=More than {{limit}} matches +find_match_count_limit[one]=More than {{limit}} match +find_match_count_limit[two]=More than {{limit}} matches +find_match_count_limit[few]=More than {{limit}} matches +find_match_count_limit[many]=More than {{limit}} matches +find_match_count_limit[other]=More than {{limit}} matches +find_not_found=Phrase not found + +# Error panel labels +error_more_info=More Information +error_less_info=Less Information +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} +rendering_error=An error occurred while rendering the page. + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=An error occurred while loading the PDF. +invalid_file_error=Invalid or corrupted PDF file. +missing_file_error=Missing PDF file. +unexpected_response_error=Unexpected server response. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Enter the password to open this PDF file. +password_invalid=Invalid password. Please try again. +password_ok=OK +password_cancel=Cancel + +printing_not_supported=Warning: Printing is not fully supported by this browser. +printing_not_ready=Warning: The PDF is not fully loaded for printing. +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. + diff --git a/src/assets/pdf-annotation/web/locale/br/viewer.properties b/src/assets/pdf-annotation/web/locale/br/viewer.properties new file mode 100755 index 0000000..ea3b696 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/br/viewer.properties @@ -0,0 +1,247 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pajenn a-raok +previous_label=A-raok +next.title=Pajenn war-lerc'h +next_label=War-lerc'h + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pajenn +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=eus {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} war {{pagesCount}}) + +zoom_out.title=Zoum bihanaat +zoom_out_label=Zoum bihanaat +zoom_in.title=Zoum brasaat +zoom_in_label=Zoum brasaat +zoom.title=Zoum +presentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn +presentation_mode_label=Mod kinnigadenn +open_file.title=Digeriñ ur restr +open_file_label=Digeriñ ur restr +print.title=Moullañ +print_label=Moullañ +download.title=Pellgargañ +download_label=Pellgargañ +bookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez) +bookmark_label=Gwel bremanel + +# Secondary toolbar and context menu +tools.title=Ostilhoù +tools_label=Ostilhoù +first_page.title=Mont d'ar bajenn gentañ +first_page_label=Mont d'ar bajenn gentañ +last_page.title=Mont d'ar bajenn diwezhañ +last_page_label=Mont d'ar bajenn diwezhañ +page_rotate_cw.title=C'hwelañ gant roud ar bizied +page_rotate_cw_label=C'hwelañ gant roud ar bizied +page_rotate_ccw.title=C'hwelañ gant roud gin ar bizied +page_rotate_ccw_label=C'hwelañ gant roud gin ar bizied + +cursor_text_select_tool.title=Gweredekaat an ostilh diuzañ testenn +cursor_text_select_tool_label=Ostilh diuzañ testenn +cursor_hand_tool.title=Gweredekaat an ostilh dorn +cursor_hand_tool_label=Ostilh dorn + +scroll_vertical.title=Arverañ an dibunañ a-blom +scroll_vertical_label=Dibunañ a-serzh +scroll_horizontal.title=Arverañ an dibunañ a-blaen +scroll_horizontal_label=Dibunañ a-blaen +scroll_wrapped.title=Arverañ an dibunañ paket +scroll_wrapped_label=Dibunañ paket + +spread_none.title=Chom hep stagañ ar skignadurioù +spread_none_label=Skignadenn ebet +spread_odd.title=Lakaat ar pajennadoù en ur gregiñ gant ar pajennoù ampar +spread_odd_label=Pajennoù ampar +spread_even.title=Lakaat ar pajennadoù en ur gregiñ gant ar pajennoù par +spread_even_label=Pajennoù par + +# Document properties dialog box +document_properties.title=Perzhioù an teul… +document_properties_label=Perzhioù an teul… +document_properties_file_name=Anv restr: +document_properties_file_size=Ment ar restr: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} Me ({{size_b}} eizhbit) +document_properties_title=Titl: +document_properties_author=Aozer: +document_properties_subject=Danvez: +document_properties_keywords=Gerioù-alc'hwez: +document_properties_creation_date=Deiziad krouiñ: +document_properties_modification_date=Deiziad kemmañ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Krouer: +document_properties_producer=Kenderc'her PDF: +document_properties_version=Handelv PDF: +document_properties_page_count=Niver a bajennoù: +document_properties_page_size=Ment ar bajenn: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=poltred +document_properties_page_size_orientation_landscape=gweledva +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Lizher +document_properties_page_size_name_legal=Lezennel +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Gwel Web Herrek: +document_properties_linearized_yes=Ya +document_properties_linearized_no=Ket +document_properties_close=Serriñ + +print_progress_message=O prientiñ an teul evit moullañ... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Nullañ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez +toggle_sidebar_notification2.title=Trec'haoliñ ar varrenn-gostez (ur steuñv pe stagadennoù a zo en teul) +toggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez +document_outline.title=Diskouez steuñv an teul (daouglikit evit brasaat/bihanaat an holl elfennoù) +document_outline_label=Sinedoù an teuliad +attachments.title=Diskouez ar c'henstagadurioù +attachments_label=Kenstagadurioù +layers.title=Diskouez ar gwiskadoù (daou-glikañ evit adderaouekaat an holl gwiskadoù d'o stad dre ziouer) +layers_label=Gwiskadoù +thumbs.title=Diskouez ar melvennoù +thumbs_label=Melvennoù +findbar.title=Klask e-barzh an teuliad +findbar_label=Klask + +additional_layers=Gwiskadoù ouzhpenn +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pajenn {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pajenn {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Melvenn ar bajenn {{page}} + +# Find panel button title and messages +find_input.title=Klask +find_input.placeholder=Klask e-barzh an teuliad +find_previous.title=Kavout an tamm frazenn kent o klotañ ganti +find_previous_label=Kent +find_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti +find_next_label=War-lerc'h +find_highlight=Usskediñ pep tra +find_match_case_label=Teurel evezh ouzh ar pennlizherennoù +find_entire_word_label=Gerioù a-bezh +find_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz +find_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=Klotadenn {{current}} war {{total}} +find_match_count[two]=Klotadenn {{current}} war {{total}} +find_match_count[few]=Klotadenn {{current}} war {{total}} +find_match_count[many]=Klotadenn {{current}} war {{total}} +find_match_count[other]=Klotadenn {{current}} war {{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Muioc'h eget {{limit}} a glotadennoù +find_match_count_limit[one]=Muioc'h eget {{limit}} a glotadennoù +find_match_count_limit[two]=Muioc'h eget {{limit}} a glotadennoù +find_match_count_limit[few]=Muioc'h eget {{limit}} a glotadennoù +find_match_count_limit[many]=Muioc'h eget {{limit}} a glotadennoù +find_match_count_limit[other]=Muioc'h eget {{limit}} a glotadennoù +find_not_found=N'haller ket kavout ar frazenn + +# Error panel labels +error_more_info=Muioc'h a ditouroù +error_less_info=Nebeutoc'h a ditouroù +error_close=Serriñ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js handelv {{version}} (kempunadur: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Kemennadenn: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Torn: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Restr: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linenn: {{line}} +rendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad. + +# Predefined zoom values +page_scale_width=Led ar bajenn +page_scale_fit=Pajenn a-bezh +page_scale_auto=Zoum emgefreek +page_scale_actual=Ment wir +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=O kargañ… +loading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF. +invalid_file_error=Restr PDF didalvoudek pe kontronet. +missing_file_error=Restr PDF o vankout. +unexpected_response_error=Respont dic'hortoz a-berzh an dafariad + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Notennañ] +password_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ. +password_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij. +password_ok=Mat eo +password_cancel=Nullañ + +printing_not_supported=Kemenn: N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ. +printing_not_ready=Kemenn: N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn. +web_fonts_disabled=Diweredekaet eo an nodrezhoù web: n'haller ket arverañ an nodrezhoù PDF enframmet. + diff --git a/src/assets/pdf-annotation/web/locale/brx/viewer.properties b/src/assets/pdf-annotation/web/locale/brx/viewer.properties new file mode 100755 index 0000000..8211505 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/brx/viewer.properties @@ -0,0 +1,205 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=आगोलनि बिलाइ +previous_label=आगोलनि +next.title=उननि बिलाइ +next_label=उननि + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=बिलाइ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} नि +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} नि {{pageNumber}}) + +zoom_out.title=फिसायै जुम खालाम +zoom_out_label=फिसायै जुम खालाम +zoom_in.title=गेदेरै जुम खालाम +zoom_in_label=गेदेरै जुम खालाम +zoom.title=जुम खालाम +presentation_mode.title=दिन्थिफुंनाय म'डआव थां +presentation_mode_label=दिन्थिफुंनाय म'ड +open_file.title=फाइलखौ खेव +open_file_label=खेव +print.title=साफाय +print_label=साफाय +download.title=डाउनल'ड खालाम +download_label=डाउनल'ड खालाम +bookmark.title=दानि नुथाय (गोदान उइन्ड'आव कपि खालाम एबा खेव) +bookmark_label=दानि नुथाय + +# Secondary toolbar and context menu +tools.title=टुल +tools_label=टुल +first_page.title=गिबि बिलाइआव थां +first_page_label=गिबि बिलाइआव थां +last_page.title=जोबथा बिलाइआव थां +last_page_label=जोबथा बिलाइआव थां +page_rotate_cw.title=घरि गिदिंनाय फार्से फिदिं +page_rotate_cw_label=घरि गिदिंनाय फार्से फिदिं +page_rotate_ccw.title=घरि गिदिंनाय उल्था फार्से फिदिं +page_rotate_ccw_label=घरि गिदिंनाय उल्था फार्से फिदिं + + + + +# Document properties dialog box +document_properties.title=फोरमान बिलाइनि आखुथाय... +document_properties_label=फोरमान बिलाइनि आखुथाय... +document_properties_file_name=फाइलनि मुं: +document_properties_file_size=फाइलनि महर: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} बाइट) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} बाइट) +document_properties_title=बिमुं: +document_properties_author=लिरगिरि: +document_properties_subject=आयदा: +document_properties_keywords=गाहाय सोदोब: +document_properties_creation_date=सोरजिनाय अक्ट': +document_properties_modification_date=सुद्रायनाय अक्ट': +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=सोरजिग्रा: +document_properties_producer=PDF दिहुनग्रा: +document_properties_version=PDF बिसान: +document_properties_page_count=बिलाइनि हिसाब: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=प'र्ट्रेट +document_properties_page_size_orientation_landscape=लेण्डस्केप +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=लायजाम +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized_yes=नंगौ +document_properties_linearized_no=नङा +document_properties_close=बन्द खालाम + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=नेवसि + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=टग्गल साइडबार +toggle_sidebar_label=टग्गल साइडबार +document_outline_label=फोरमान बिलाइ सिमा हांखो +attachments.title=नांजाब होनायखौ दिन्थि +attachments_label=नांजाब होनाय +thumbs.title=थामनेइलखौ दिन्थि +thumbs_label=थामनेइल +findbar.title=फोरमान बिलाइआव नागिरना दिहुन +findbar_label=नायगिरना दिहुन + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=बिलाइ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=बिलाइ {{page}} नि थामनेइल + +# Find panel button title and messages +find_input.title=नायगिरना दिहुन +find_input.placeholder=फोरमान बिलाइआव नागिरना दिहुन... +find_previous.title=बाथ्रा खोन्दोबनि सिगांनि नुजाथिनायखौ नागिर +find_previous_label=आगोलनि +find_next.title=बाथ्रा खोन्दोबनि उननि नुजाथिनायखौ नागिर +find_next_label=उननि +find_highlight=गासैखौबो हाइलाइट खालाम +find_match_case_label=गोरोबनाय केस +find_reached_top=थालो निफ्राय जागायनानै फोरमान बिलाइनि बिजौआव सौहैबाय +find_reached_bottom=बिजौ निफ्राय जागायनानै फोरमान बिलाइनि बिजौआव सौहैबाय +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_not_found=बाथ्रा खोन्दोब मोनाखै + +# Error panel labels +error_more_info=गोबां फोरमायथिहोग्रा +error_less_info=खम फोरमायथिहोग्रा +error_close=बन्द खालाम +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=खौरां: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=स्टेक: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=फाइल: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=सारि: {{line}} +rendering_error=बिलाइखौ राव सोलायनाय समाव मोनसे गोरोन्थि जादों। + +# Predefined zoom values +page_scale_width=बिलाइनि गुवार +page_scale_fit=बिलाइ गोरोबनाय +page_scale_auto=गावनोगाव जुम +page_scale_actual=थार महर +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF ल'ड खालामनाय समाव मोनसे गोरोन्थि जाबाय। +invalid_file_error=बाहायजायै एबा गाज्रि जानाय PDF फाइल +missing_file_error=गोमानाय PDF फाइल +unexpected_response_error=मिजिंथियै सार्भार फिननाय। + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} सोदोब बेखेवनाय] +password_label=बे PDF फाइलखौ खेवनो पासवार्ड हाबहो। +password_invalid=बाहायजायै पासवार्ड। अननानै फिन नाजा। +password_ok=OK +password_cancel=नेवसि + +printing_not_supported=सांग्रांथि: साफायनाया बे ब्राउजारजों आबुङै हेफाजाब होजाया। +printing_not_ready=सांग्रांथि: PDF खौ साफायनायनि थाखाय फुरायै ल'ड खालामाखै। +web_fonts_disabled=वेब फन्टखौ लोरबां खालामबाय: अरजाबहोनाय PDF फन्टखौ बाहायनो हायाखै। + diff --git a/src/assets/pdf-annotation/web/locale/bs/viewer.properties b/src/assets/pdf-annotation/web/locale/bs/viewer.properties new file mode 100755 index 0000000..b482bb1 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/bs/viewer.properties @@ -0,0 +1,194 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Prethodna strana +previous_label=Prethodna +next.title=Sljedeća strna +next_label=Sljedeća + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strana +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=od {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} od {{pagesCount}}) + +zoom_out.title=Umanji +zoom_out_label=Umanji +zoom_in.title=Uvećaj +zoom_in_label=Uvećaj +zoom.title=Uvećanje +presentation_mode.title=Prebaci se u prezentacijski režim +presentation_mode_label=Prezentacijski režim +open_file.title=Otvori fajl +open_file_label=Otvori +print.title=Štampaj +print_label=Štampaj +download.title=Preuzmi +download_label=Preuzmi +bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru) +bookmark_label=Trenutni prikaz + +# Secondary toolbar and context menu +tools.title=Alati +tools_label=Alati +first_page.title=Idi na prvu stranu +first_page_label=Idi na prvu stranu +last_page.title=Idi na zadnju stranu +last_page_label=Idi na zadnju stranu +page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu +page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu +page_rotate_ccw.title=Rotiraj suprotno smjeru kazaljke na satu +page_rotate_ccw_label=Rotiraj suprotno smjeru kazaljke na satu + +cursor_text_select_tool.title=Omogući alat za označavanje teksta +cursor_text_select_tool_label=Alat za označavanje teksta +cursor_hand_tool.title=Omogući ručni alat +cursor_hand_tool_label=Ručni alat + +# Document properties dialog box +document_properties.title=Svojstva dokumenta... +document_properties_label=Svojstva dokumenta... +document_properties_file_name=Naziv fajla: +document_properties_file_size=Veličina fajla: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajta) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajta) +document_properties_title=Naslov: +document_properties_author=Autor: +document_properties_subject=Predmet: +document_properties_keywords=Ključne riječi: +document_properties_creation_date=Datum kreiranja: +document_properties_modification_date=Datum promjene: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Kreator: +document_properties_producer=PDF stvaratelj: +document_properties_version=PDF verzija: +document_properties_page_count=Broj stranica: +document_properties_page_size=Veličina stranice: +document_properties_page_size_unit_inches=u +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=uspravno +document_properties_page_size_orientation_landscape=vodoravno +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Pismo +document_properties_page_size_name_legal=Pravni +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +document_properties_close=Zatvori + +print_progress_message=Pripremam dokument za štampu… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Otkaži + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Uključi/isključi bočnu traku +toggle_sidebar_label=Uključi/isključi bočnu traku +document_outline.title=Prikaži outline dokumenta (dvoklik za skupljanje/širenje svih stavki) +document_outline_label=Konture dokumenta +attachments.title=Prikaži priloge +attachments_label=Prilozi +thumbs.title=Prikaži thumbnailove +thumbs_label=Thumbnailovi +findbar.title=Pronađi u dokumentu +findbar_label=Pronađi + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strana {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail strane {{page}} + +# Find panel button title and messages +find_input.title=Pronađi +find_input.placeholder=Pronađi u dokumentu… +find_previous.title=Pronađi prethodno pojavljivanje fraze +find_previous_label=Prethodno +find_next.title=Pronađi sljedeće pojavljivanje fraze +find_next_label=Sljedeće +find_highlight=Označi sve +find_match_case_label=Osjetljivost na karaktere +find_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna +find_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha +find_not_found=Fraza nije pronađena + +# Error panel labels +error_more_info=Više informacija +error_less_info=Manje informacija +error_close=Zatvori +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Poruka: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fajl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linija: {{line}} +rendering_error=Došlo je do greške prilikom renderiranja strane. + +# Predefined zoom values +page_scale_width=Širina strane +page_scale_fit=Uklopi stranu +page_scale_auto=Automatsko uvećanje +page_scale_actual=Stvarna veličina +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Došlo je do greške prilikom učitavanja PDF-a. +invalid_file_error=Neispravan ili oštećen PDF fajl. +missing_file_error=Nedostaje PDF fajl. +unexpected_response_error=Neočekivani odgovor servera. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} pribilješka] +password_label=Upišite lozinku da biste otvorili ovaj PDF fajl. +password_invalid=Pogrešna lozinka. Pokušajte ponovo. +password_ok=OK +password_cancel=Otkaži + +printing_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru. +printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje. +web_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove. + diff --git a/src/assets/pdf-annotation/web/locale/ca/viewer.properties b/src/assets/pdf-annotation/web/locale/ca/viewer.properties new file mode 100755 index 0000000..eaa4571 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ca/viewer.properties @@ -0,0 +1,251 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pàgina anterior +previous_label=Anterior +next.title=Pàgina següent +next_label=Següent + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pàgina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Redueix +zoom_out_label=Redueix +zoom_in.title=Amplia +zoom_in_label=Amplia +zoom.title=Escala +presentation_mode.title=Canvia al mode de presentació +presentation_mode_label=Mode de presentació +open_file.title=Obre el fitxer +open_file_label=Obre +print.title=Imprimeix +print_label=Imprimeix +download.title=Baixa +download_label=Baixa +bookmark.title=Vista actual (copia o obre en una finestra nova) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Eines +tools_label=Eines +first_page.title=Vés a la primera pàgina +first_page_label=Vés a la primera pàgina +last_page.title=Vés a l'última pàgina +last_page_label=Vés a l'última pàgina +page_rotate_cw.title=Gira cap a la dreta +page_rotate_cw_label=Gira cap a la dreta +page_rotate_ccw.title=Gira cap a l'esquerra +page_rotate_ccw_label=Gira cap a l'esquerra + +cursor_text_select_tool.title=Habilita l'eina de selecció de text +cursor_text_select_tool_label=Eina de selecció de text +cursor_hand_tool.title=Habilita l'eina de mà +cursor_hand_tool_label=Eina de mà + +scroll_page.title=Usa el desplaçament de pàgina +scroll_page_label=Desplaçament de pàgina +scroll_vertical.title=Utilitza el desplaçament vertical +scroll_vertical_label=Desplaçament vertical +scroll_horizontal.title=Utilitza el desplaçament horitzontal +scroll_horizontal_label=Desplaçament horitzontal +scroll_wrapped.title=Activa el desplaçament continu +scroll_wrapped_label=Desplaçament continu + +spread_none.title=No agrupis les pàgines de dues en dues +spread_none_label=Una sola pàgina +spread_odd.title=Mostra dues pàgines començant per les pàgines de numeració senar +spread_odd_label=Doble pàgina (senar) +spread_even.title=Mostra dues pàgines començant per les pàgines de numeració parell +spread_even_label=Doble pàgina (parell) + +# Document properties dialog box +document_properties.title=Propietats del document… +document_properties_label=Propietats del document… +document_properties_file_name=Nom del fitxer: +document_properties_file_size=Mida del fitxer: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Títol: +document_properties_author=Autor: +document_properties_subject=Assumpte: +document_properties_keywords=Paraules clau: +document_properties_creation_date=Data de creació: +document_properties_modification_date=Data de modificació: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Generador de PDF: +document_properties_version=Versió de PDF: +document_properties_page_count=Nombre de pàgines: +document_properties_page_size=Mida de la pàgina: +document_properties_page_size_unit_inches=polzades +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=apaïsat +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista web ràpida: +document_properties_linearized_yes=Sí +document_properties_linearized_no=No +document_properties_close=Tanca + +print_progress_message=S'està preparant la impressió del document… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancel·la + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Mostra/amaga la barra lateral +toggle_sidebar_notification2.title=Mostra/amaga la barra lateral (el document conté un esquema, adjuncions o capes) +toggle_sidebar_label=Mostra/amaga la barra lateral +document_outline.title=Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements) +document_outline_label=Esquema del document +attachments.title=Mostra les adjuncions +attachments_label=Adjuncions +layers.title=Mostra les capes (doble clic per restablir totes les capes al seu estat per defecte) +layers_label=Capes +thumbs.title=Mostra les miniatures +thumbs_label=Miniatures +current_outline_item.title=Cerca l'element d'esquema actual +current_outline_item_label=Element d'esquema actual +findbar.title=Cerca al document +findbar_label=Cerca + +additional_layers=Capes addicionals +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pàgina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pàgina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la pàgina {{page}} + +# Find panel button title and messages +find_input.title=Cerca +find_input.placeholder=Cerca al document… +find_previous.title=Cerca l'anterior coincidència de l'expressió +find_previous_label=Anterior +find_next.title=Cerca la següent coincidència de l'expressió +find_next_label=Següent +find_highlight=Ressalta-ho tot +find_match_case_label=Distingeix entre majúscules i minúscules +find_entire_word_label=Paraules senceres +find_reached_top=S'ha arribat al principi del document, es continua pel final +find_reached_bottom=S'ha arribat al final del document, es continua pel principi +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} coincidència +find_match_count[two]={{current}} de {{total}} coincidències +find_match_count[few]={{current}} de {{total}} coincidències +find_match_count[many]={{current}} de {{total}} coincidències +find_match_count[other]={{current}} de {{total}} coincidències +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Més de {{limit}} coincidències +find_match_count_limit[one]=Més d'{{limit}} coincidència +find_match_count_limit[two]=Més de {{limit}} coincidències +find_match_count_limit[few]=Més de {{limit}} coincidències +find_match_count_limit[many]=Més de {{limit}} coincidències +find_match_count_limit[other]=Més de {{limit}} coincidències +find_not_found=No s'ha trobat l'expressió + +# Error panel labels +error_more_info=Més informació +error_less_info=Menys informació +error_close=Tanca +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (muntatge: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Missatge: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fitxer: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línia: {{line}} +rendering_error=S'ha produït un error mentre es renderitzava la pàgina. + +# Predefined zoom values +page_scale_width=Amplada de la pàgina +page_scale_fit=Ajusta la pàgina +page_scale_auto=Zoom automàtic +page_scale_actual=Mida real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=S'està carregant… +loading_error=S'ha produït un error en carregar el PDF. +invalid_file_error=El fitxer PDF no és vàlid o està malmès. +missing_file_error=Falta el fitxer PDF. +unexpected_response_error=Resposta inesperada del servidor. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotació {{type}}] +password_label=Introduïu la contrasenya per obrir aquest fitxer PDF. +password_invalid=La contrasenya no és vàlida. Torneu-ho a provar. +password_ok=D'acord +password_cancel=Cancel·la + +printing_not_supported=Avís: la impressió no és plenament funcional en aquest navegador. +printing_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo. +web_fonts_disabled=Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF. + diff --git a/src/assets/pdf-annotation/web/locale/cak/viewer.properties b/src/assets/pdf-annotation/web/locale/cak/viewer.properties new file mode 100755 index 0000000..6be4710 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/cak/viewer.properties @@ -0,0 +1,249 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Jun kan ruxaq +previous_label=Jun kan +next.title=Jun chik ruxaq +next_label=Jun chik + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Ruxaq +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=richin {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} richin {{pagesCount}}) + +zoom_out.title=Tich'utinirisäx +zoom_out_label=Tich'utinirisäx +zoom_in.title=Tinimirisäx +zoom_in_label=Tinimirisäx +zoom.title=Sum +presentation_mode.title=Tijal ri rub'anikil niwachin +presentation_mode_label=Pa rub'eyal niwachin +open_file.title=Tijaq Yakb'äl +open_file_label=Tijaq +print.title=Titz'ajb'äx +print_label=Titz'ajb'äx +download.title=Tiqasäx +download_label=Tiqasäx +bookmark.title=Rutz'etik wakami (tiwachib'ëx o tijaq pa jun k'ak'a' tzuwäch) +bookmark_label=Rutzub'al wakami + +# Secondary toolbar and context menu +tools.title=Samajib'äl +tools_label=Samajib'äl +first_page.title=Tib'e pa nab'ey ruxaq +first_page_label=Tib'e pa nab'ey ruxaq +last_page.title=Tib'e pa ruk'isib'äl ruxaq +last_page_label=Tib'e pa ruk'isib'äl ruxaq +page_rotate_cw.title=Tisutïx pan ajkiq'a' +page_rotate_cw_label=Tisutïx pan ajkiq'a' +page_rotate_ccw.title=Tisutïx pan ajxokon +page_rotate_ccw_label=Tisutïx pan ajxokon + +cursor_text_select_tool.title=Titzij ri rusamajib'al Rucha'ik Rucholajem Tzij +cursor_text_select_tool_label=Rusamajib'al Rucha'ik Rucholajem Tzij +cursor_hand_tool.title=Titzij ri q'ab'aj samajib'äl +cursor_hand_tool_label=Q'ab'aj Samajib'äl + +scroll_vertical.title=Tokisäx Pa'äl Q'axanem +scroll_vertical_label=Pa'äl Q'axanem +scroll_horizontal.title=Tokisäx Kotz'öl Q'axanem +scroll_horizontal_label=Kotz'öl Q'axanem +scroll_wrapped.title=Tokisäx Tzub'aj Q'axanem +scroll_wrapped_label=Tzub'aj Q'axanem + +spread_none.title=Man ketun taq ruxaq pa rub'eyal wuj +spread_none_label=Majun Rub'eyal +spread_odd.title=Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun man k'ulaj ta rajilab'al +spread_odd_label=Man K'ulaj Ta Rub'eyal +spread_even.title=Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun k'ulaj rajilab'al +spread_even_label=K'ulaj Rub'eyal + +# Document properties dialog box +document_properties.title=Taq richinil wuj… +document_properties_label=Taq richinil wuj… +document_properties_file_name=Rub'i' yakb'äl: +document_properties_file_size=Runimilem yakb'äl: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=B'i'aj: +document_properties_author=B'anel: +document_properties_subject=Taqikil: +document_properties_keywords=Kixe'el taq tzij: +document_properties_creation_date=Ruq'ijul xtz'uk: +document_properties_modification_date=Ruq'ijul xjalwachïx: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Q'inonel: +document_properties_producer=PDF b'anöy: +document_properties_version=PDF ruwäch: +document_properties_page_count=Jarupe' ruxaq: +document_properties_page_size=Runimilem ri Ruxaq: +document_properties_page_size_unit_inches=pa +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=rupalem +document_properties_page_size_orientation_landscape=rukotz'olem +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Loman wuj +document_properties_page_size_name_legal=Taqanel tzijol +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Anin Rutz'etik Ajk'amaya'l: +document_properties_linearized_yes=Ja' +document_properties_linearized_no=Mani +document_properties_close=Titz'apïx + +print_progress_message=Ruchojmirisaxik wuj richin nitz'ajb'äx… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Tiq'at + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Tijal ri ajxikin kajtz'ik +toggle_sidebar_notification2.title=Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqo/kuchuj) +toggle_sidebar_label=Tijal ri ajxikin kajtz'ik +document_outline.title=Tik'ut pe ruch'akulal wuj (kamul-pitz'oj richin nirik'/nich'utinirisäx ronojel ruch'akulal) +document_outline_label=Ruch'akulal wuj +attachments.title=Kek'ut pe ri taq taqoj +attachments_label=Taq taqoj +layers.title=Kek'ut taq Kuchuj (ka'i'-pitz' richin yetzolïx ronojel ri taq kuchuj e k'o wi) +layers_label=Taq kuchuj +thumbs.title=Kek'ut pe taq ch'utiq +thumbs_label=Koköj +current_outline_item.title=Kekanöx Taq Ch'akulal Kik'wan Chib'äl +current_outline_item_label=Taq Ch'akulal Kik'wan Chib'äl +findbar.title=Tikanöx chupam ri wuj +findbar_label=Tikanöx + +additional_layers=Tz'aqat ta Kuchuj +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Ruxaq {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Ruxaq {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ruch'utinirisaxik ruxaq {{page}} + +# Find panel button title and messages +find_input.title=Tikanöx +find_input.placeholder=Tikanöx pa wuj… +find_previous.title=Tib'an b'enam pa ri jun kan q'aptzij xilitäj +find_previous_label=Jun kan +find_next.title=Tib'e pa ri jun chik pajtzij xilitäj +find_next_label=Jun chik +find_highlight=Tiya' retal ronojel +find_match_case_label=Tuk'äm ri' kik'in taq nimatz'ib' chuqa' taq ch'utitz'ib' +find_entire_word_label=Tz'aqät taq tzij +find_reached_top=Xb'eq'i' ri rutikirib'al wuj, xtikanöx k'a pa ruk'isib'äl +find_reached_bottom=Xb'eq'i' ri ruk'isib'äl wuj, xtikanöx pa rutikirib'al +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} richin {{total}} nuk'äm ri' +find_match_count[two]={{current}} richin {{total}} nikik'äm ki' +find_match_count[few]={{current}} richin {{total}} nikik'äm ki' +find_match_count[many]={{current}} richin {{total}} nikik'äm ki' +find_match_count[other]={{current}} richin {{total}} nikik'äm ki' +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=K'ïy chi re {{limit}} nikik'äm ki' +find_match_count_limit[one]=K'ïy chi re {{limit}} nuk'äm ri' +find_match_count_limit[two]=K'ïy chi re {{limit}} nikik'äm ki' +find_match_count_limit[few]=K'ïy chi re {{limit}} nikik'äm ki' +find_match_count_limit[many]=K'ïy chi re {{limit}} nikik'äm ki' +find_match_count_limit[other]=K'ïy chi re {{limit}} nikik'äm ki' +find_not_found=Man xilitäj ta ri pajtzij + +# Error panel labels +error_more_info=Ch'aqa' chik rutzijol +error_less_info=Jub'a' ok rutzijol +error_close=Titz'apïx +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Uqxa'n: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Tzub'aj: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Yakb'äl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=B'ey: {{line}} +rendering_error=Xk'ulwachitäj jun sachoj toq ninuk'wachij ri ruxaq. + +# Predefined zoom values +page_scale_width=Ruwa ruxaq +page_scale_fit=Tinuk' ruxaq +page_scale_auto=Yonil chi nimilem +page_scale_actual=Runimilem Wakami +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Nisamäj… +loading_error=\u0020Xk'ulwachitäj jun sach'oj toq xnuk'ux ri PDF . +invalid_file_error=Man oke ta o yujtajinäq ri PDF yakb'äl. +missing_file_error=Man xilitäj ta ri PDF yakb'äl. +unexpected_response_error=Man oyob'en ta tz'olin rutzij ruk'u'x samaj. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Tz'ib'anïk] +password_label=Tatz'ib'aj ri ewan tzij richin najäq re yakb'äl re' pa PDF. +password_invalid=Man okel ta ri ewan tzij: Tatojtob'ej chik. +password_ok=Ütz +password_cancel=Tiq'at + +printing_not_supported=Rutzijol k'ayewal: Ri rutz'ajb'axik man koch'el ta ronojel pa re okik'amaya'l re'. +printing_not_ready=Rutzijol k'ayewal: Ri PDF man xusamajij ta ronojel richin nitz'ajb'äx. +web_fonts_disabled=E chupül ri taq ajk'amaya'l tz'ib': man tikirel ta nokisäx ri taq tz'ib' PDF pa ch'ikenïk + diff --git a/src/assets/pdf-annotation/web/locale/ckb/viewer.properties b/src/assets/pdf-annotation/web/locale/ckb/viewer.properties new file mode 100755 index 0000000..91403cd --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ckb/viewer.properties @@ -0,0 +1,234 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=پەڕەی پێشوو +previous_label=پێشوو +next.title=پەڕەی دوواتر +next_label=دوواتر + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=پەرە +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=لە {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} لە {{pagesCount}}) + +zoom_out.title=ڕۆچوونی +zoom_out_label=ڕۆچوونی +zoom_in.title=هێنانەپێش +zoom_in_label=هێنانەپێش +zoom.title=زووم +presentation_mode.title=گۆڕین بۆ دۆخی پێشکەشکردن +presentation_mode_label=دۆخی پێشکەشکردن +open_file.title=پەڕگە بکەرەوە +open_file_label=کردنەوە +print.title=چاپکردن +print_label=چاپکردن +download.title=داگرتن +download_label=داگرتن +bookmark.title=پێشبینینی ئێستا(لەبەریبگرەوە یان پەنجەرەیەکی نوێ بکەرەوە) +bookmark_label=پیشبینینی ئێستا + +# Secondary toolbar and context menu +tools.title=ئامرازەکان +tools_label=ئامرازەکان +first_page.title=برۆ بۆ یەکەم پەڕە +first_page_label=بڕۆ بۆ یەکەم پەڕە +last_page.title=بڕۆ بۆ کۆتا پەڕە +last_page_label=بڕۆ بۆ کۆتا پەڕە +page_rotate_cw.title=ئاڕاستەی میلی کاتژمێر +page_rotate_cw_label=ئاڕاستەی میلی کاتژمێر +page_rotate_ccw.title=پێچەوانەی میلی کاتژمێر +page_rotate_ccw_label=پێچەوانەی میلی کاتژمێر + +cursor_text_select_tool.title=توڵامرازی نیشانکەری دەق چالاک بکە +cursor_text_select_tool_label=توڵامرازی نیشانکەری دەق +cursor_hand_tool.title=توڵامرازی دەستی چالاک بکە +cursor_hand_tool_label=توڵامرازی دەستی + +scroll_vertical.title=ناردنی ئەستوونی بەکاربێنە +scroll_vertical_label=ناردنی ئەستوونی +scroll_horizontal.title=ناردنی ئاسۆیی بەکاربێنە +scroll_horizontal_label=ناردنی ئاسۆیی +scroll_wrapped.title=ناردنی لوولکراو بەکاربێنە +scroll_wrapped_label=ناردنی لوولکراو + + +# Document properties dialog box +document_properties.title=تایبەتمەندییەکانی بەڵگەنامە... +document_properties_label=تایبەتمەندییەکانی بەڵگەنامە... +document_properties_file_name=ناوی پەڕگە: +document_properties_file_size=قەبارەی پەڕگە: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} کب ({{size_b}} بایت) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} مب ({{size_b}} بایت) +document_properties_title=سەردێڕ: +document_properties_author=نووسەر +document_properties_subject=بابەت: +document_properties_keywords=کلیلەوشە: +document_properties_creation_date=بەرواری درووستکردن: +document_properties_modification_date=بەرواری دەستکاریکردن: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=درووستکەر: +document_properties_producer=بەرهەمهێنەری PDF: +document_properties_version=وەشانی PDF: +document_properties_page_count=ژمارەی پەرەکان: +document_properties_page_size=قەبارەی پەڕە: +document_properties_page_size_unit_inches=ئینچ +document_properties_page_size_unit_millimeters=ملم +document_properties_page_size_orientation_portrait=پۆرترەیت(درێژ) +document_properties_page_size_orientation_landscape=پانیی +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=نامە +document_properties_page_size_name_legal=یاسایی +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=پیشاندانی وێبی خێرا: +document_properties_linearized_yes=بەڵێ +document_properties_linearized_no=نەخێر +document_properties_close=داخستن + +print_progress_message=بەڵگەنامە ئامادەدەکرێت بۆ چاپکردن... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=پاشگەزبوونەوە + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=لاتەنیشت پیشاندان/شاردنەوە +toggle_sidebar_label=لاتەنیشت پیشاندان/شاردنەوە +document_outline_label=سنووری چوارچێوە +attachments.title=پاشکۆکان پیشان بدە +attachments_label=پاشکۆکان +layers_label=چینەکان +thumbs.title=وێنۆچکە پیشان بدە +thumbs_label=وێنۆچکە +findbar.title=لە بەڵگەنامە بگەرێ +findbar_label=دۆزینەوە + +additional_layers=چینی زیاتر +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=پەڕەی {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=وێنۆچکەی پەڕەی {{page}} + +# Find panel button title and messages +find_input.title=دۆزینەوە +find_input.placeholder=لە بەڵگەنامە بگەرێ... +find_previous.title=هەبوونی پێشوو بدۆزرەوە لە ڕستەکەدا +find_previous_label=پێشوو +find_next.title=هەبوونی داهاتوو بدۆزەرەوە لە ڕستەکەدا +find_next_label=دوواتر +find_highlight=هەمووی نیشانە بکە +find_match_case_label=دۆخی لەیەکچوون +find_entire_word_label=هەموو وشەکان +find_reached_top=گەشتیتە سەرەوەی بەڵگەنامە، لە خوارەوە دەستت پێکرد +find_reached_bottom=گەشتیتە کۆتایی بەڵگەنامە. لەسەرەوە دەستت پێکرد +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} لە کۆی {{total}} لەیەکچوو +find_match_count[two]={{current}} لە کۆی {{total}} لەیەکچوو +find_match_count[few]={{current}} لە کۆی {{total}} لەیەکچوو +find_match_count[many]={{current}} لە کۆی {{total}} لەیەکچوو +find_match_count[other]={{current}} لە کۆی {{total}} لەیەکچوو +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=زیاتر لە {{limit}} لەیەکچوو +find_match_count_limit[one]=زیاتر لە {{limit}} لەیەکچوو +find_match_count_limit[two]=زیاتر لە {{limit}} لەیەکچوو +find_match_count_limit[few]=زیاتر لە {{limit}} لەیەکچوو +find_match_count_limit[many]=زیاتر لە {{limit}} لەیەکچوو +find_match_count_limit[other]=زیاتر لە {{limit}} لەیەکچوو +find_not_found=نووسین نەدۆزرایەوە + +# Error panel labels +error_more_info=زانیاری زیاتر +error_less_info=زانیاری کەمتر +error_close=داخستن +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=پەیام: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=لەسەریەک: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=پەڕگە: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=هێڵ: {{line}} +rendering_error=هەڵەیەک ڕوویدا لە کاتی پوختەکردنی (ڕێندەر) پەڕە. + +# Predefined zoom values +page_scale_width=پانی پەڕە +page_scale_fit=پڕبوونی پەڕە +page_scale_auto=زوومی خۆکار +page_scale_actual=قەبارەی ڕاستی +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=هەڵەیەک ڕوویدا لە کاتی بارکردنی PDF. +invalid_file_error=پەڕگەی pdf تێکچووە یان نەگونجاوە. +missing_file_error=پەڕگەی pdf بوونی نیە. +unexpected_response_error=وەڵامی ڕاژەخوازی نەخوازراو. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} سەرنج] +password_label=وشەی تێپەڕ بنووسە بۆ کردنەوەی پەڕگەی pdf. +password_invalid=وشەی تێپەڕ هەڵەیە. تکایە دووبارە هەوڵ بدەرەوە. +password_ok=باشە +password_cancel=پاشگەزبوونەوە + +printing_not_supported=ئاگاداربە: چاپکردن بە تەواوی پشتگیر ناکرێت لەم وێبگەڕە. +printing_not_ready=ئاگاداربە: PDF بە تەواوی بارنەبووە بۆ چاپکردن. +web_fonts_disabled=جۆرەپیتی وێب ناچالاکە: نەتوانی جۆرەپیتی تێخراوی ناو pdfـەکە بەکاربێت. + diff --git a/src/assets/pdf-annotation/web/locale/cs/viewer.properties b/src/assets/pdf-annotation/web/locale/cs/viewer.properties new file mode 100755 index 0000000..21c0ada --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/cs/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Přejde na předchozí stránku +previous_label=Předchozí +next.title=Přejde na následující stránku +next_label=Další + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Stránka +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Zmenší velikost +zoom_out_label=Zmenšit +zoom_in.title=Zvětší velikost +zoom_in_label=Zvětšit +zoom.title=Nastaví velikost +presentation_mode.title=Přepne do režimu prezentace +presentation_mode_label=Režim prezentace +open_file.title=Otevře soubor +open_file_label=Otevřít +print.title=Vytiskne dokument +print_label=Vytisknout +download.title=Stáhne dokument +download_label=Stáhnout +save.title=Uložit +save_label=Uložit +bookmark.title=Současný pohled (kopírovat nebo otevřít v novém okně) +bookmark_label=Současný pohled + +# Secondary toolbar and context menu +tools.title=Nástroje +tools_label=Nástroje +first_page.title=Přejde na první stránku +first_page_label=Přejít na první stránku +last_page.title=Přejde na poslední stránku +last_page_label=Přejít na poslední stránku +page_rotate_cw.title=Otočí po směru hodin +page_rotate_cw_label=Otočit po směru hodin +page_rotate_ccw.title=Otočí proti směru hodin +page_rotate_ccw_label=Otočit proti směru hodin + +cursor_text_select_tool.title=Povolí výběr textu +cursor_text_select_tool_label=Výběr textu +cursor_hand_tool.title=Povolí nástroj ručička +cursor_hand_tool_label=Nástroj ručička + +scroll_page.title=Posouvat po stránkách +scroll_page_label=Posouvání po stránkách +scroll_vertical.title=Použít svislé posouvání +scroll_vertical_label=Svislé posouvání +scroll_horizontal.title=Použít vodorovné posouvání +scroll_horizontal_label=Vodorovné posouvání +scroll_wrapped.title=Použít postupné posouvání +scroll_wrapped_label=Postupné posouvání + +spread_none.title=Nesdružovat stránky +spread_none_label=Žádné sdružení +spread_odd.title=Sdruží stránky s umístěním lichých vlevo +spread_odd_label=Sdružení stránek (liché vlevo) +spread_even.title=Sdruží stránky s umístěním sudých vlevo +spread_even_label=Sdružení stránek (sudé vlevo) + +# Document properties dialog box +document_properties.title=Vlastnosti dokumentu… +document_properties_label=Vlastnosti dokumentu… +document_properties_file_name=Název souboru: +document_properties_file_size=Velikost souboru: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtů) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtů) +document_properties_title=Název stránky: +document_properties_author=Autor: +document_properties_subject=Předmět: +document_properties_keywords=Klíčová slova: +document_properties_creation_date=Datum vytvoření: +document_properties_modification_date=Datum úpravy: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Vytvořil: +document_properties_producer=Tvůrce PDF: +document_properties_version=Verze PDF: +document_properties_page_count=Počet stránek: +document_properties_page_size=Velikost stránky: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=na výšku +document_properties_page_size_orientation_landscape=na šířku +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Dopis +document_properties_page_size_name_legal=Právní dokument +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Rychlé zobrazování z webu: +document_properties_linearized_yes=Ano +document_properties_linearized_no=Ne +document_properties_close=Zavřít + +print_progress_message=Příprava dokumentu pro tisk… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Zrušit + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Postranní lišta +toggle_sidebar_notification2.title=Přepnout postranní lištu (dokument obsahuje osnovu/přílohy/vrstvy) +toggle_sidebar_label=Postranní lišta +document_outline.title=Zobrazí osnovu dokumentu (poklepání přepne zobrazení všech položek) +document_outline_label=Osnova dokumentu +attachments.title=Zobrazí přílohy +attachments_label=Přílohy +layers.title=Zobrazit vrstvy (poklepáním obnovíte všechny vrstvy do výchozího stavu) +layers_label=Vrstvy +thumbs.title=Zobrazí náhledy +thumbs_label=Náhledy +current_outline_item.title=Najít aktuální položku v osnově +current_outline_item_label=Aktuální položka v osnově +findbar.title=Najde v dokumentu +findbar_label=Najít + +additional_layers=Další vrstvy +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Strana {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strana {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Náhled strany {{page}} + +# Find panel button title and messages +find_input.title=Najít +find_input.placeholder=Najít v dokumentu… +find_previous.title=Najde předchozí výskyt hledaného textu +find_previous_label=Předchozí +find_next.title=Najde další výskyt hledaného textu +find_next_label=Další +find_highlight=Zvýraznit +find_match_case_label=Rozlišovat velikost +find_match_diacritics_label=Rozlišovat diakritiku +find_entire_word_label=Celá slova +find_reached_top=Dosažen začátek dokumentu, pokračuje se od konce +find_reached_bottom=Dosažen konec dokumentu, pokračuje se od začátku +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}}. z {{total}} výskytu +find_match_count[two]={{current}}. z {{total}} výskytů +find_match_count[few]={{current}}. z {{total}} výskytů +find_match_count[many]={{current}}. z {{total}} výskytů +find_match_count[other]={{current}}. z {{total}} výskytů +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Více než {{limit}} výskytů +find_match_count_limit[one]=Více než {{limit}} výskyt +find_match_count_limit[two]=Více než {{limit}} výskyty +find_match_count_limit[few]=Více než {{limit}} výskyty +find_match_count_limit[many]=Více než {{limit}} výskytů +find_match_count_limit[other]=Více než {{limit}} výskytů +find_not_found=Hledaný text nenalezen + +# Error panel labels +error_more_info=Více informací +error_less_info=Méně informací +error_close=Zavřít +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (sestavení: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Zpráva: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Zásobník: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Soubor: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Řádek: {{line}} + +# Predefined zoom values +page_scale_width=Podle šířky +page_scale_fit=Podle výšky +page_scale_auto=Automatická velikost +page_scale_actual=Skutečná velikost +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Načítání… +loading_error=Při nahrávání PDF nastala chyba. +invalid_file_error=Neplatný nebo chybný soubor PDF. +missing_file_error=Chybí soubor PDF. +unexpected_response_error=Neočekávaná odpověď serveru. + +rendering_error=Při vykreslování stránky nastala chyba. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotace typu {{type}}] +password_label=Pro otevření PDF souboru vložte heslo. +password_invalid=Neplatné heslo. Zkuste to znovu. +password_ok=OK +password_cancel=Zrušit + +printing_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován. +printing_not_ready=Upozornění: Dokument PDF není kompletně načten. +web_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Kreslení +editor_ink2_label=Kreslení + +free_text2_default_content=Začněte psát… + +# Editor Parameters +editor_free_text_color=Barva +editor_free_text_size=Velikost +editor_ink_color=Barva +editor_ink_thickness=Tloušťka +editor_ink_opacity=Průhlednost + +# Editor aria +editor_free_text2_aria_label=Textový editor +editor_ink2_aria_label=Editor kreslení +editor_ink_canvas_aria_label=Uživatelem vytvořený obrázek diff --git a/src/assets/pdf-annotation/web/locale/cy/viewer.properties b/src/assets/pdf-annotation/web/locale/cy/viewer.properties new file mode 100755 index 0000000..b3345e1 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/cy/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Tudalen Flaenorol +previous_label=Blaenorol +next.title=Tudalen Nesaf +next_label=Nesaf + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Tudalen +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=o {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} o {{pagesCount}}) + +zoom_out.title=Chwyddo Allan +zoom_out_label=Chwyddo Allan +zoom_in.title=Chwyddo Mewn +zoom_in_label=Chwyddo Mewn +zoom.title=Chwyddo +presentation_mode.title=Newid i'r Modd Cyflwyno +presentation_mode_label=Modd Cyflwyno +open_file.title=Agor Ffeil +open_file_label=Agor +print.title=Argraffu +print_label=Argraffu +download.title=Llwyth +download_label=Llwytho i Lawr +save.title=Cadw +save_label=Cadw +bookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd) +bookmark_label=Golwg Gyfredol + +# Secondary toolbar and context menu +tools.title=Offer +tools_label=Offer +first_page.title=Mynd i'r Dudalen Gyntaf +first_page_label=Mynd i'r Dudalen Gyntaf +last_page.title=Mynd i'r Dudalen Olaf +last_page_label=Mynd i'r Dudalen Olaf +page_rotate_cw.title=Cylchdroi Clocwedd +page_rotate_cw_label=Cylchdroi Clocwedd +page_rotate_ccw.title=Cylchdroi Gwrthglocwedd +page_rotate_ccw_label=Cylchdroi Gwrthglocwedd + +cursor_text_select_tool.title=Galluogi Dewis Offeryn Testun +cursor_text_select_tool_label=Offeryn Dewis Testun +cursor_hand_tool.title=Galluogi Offeryn Llaw +cursor_hand_tool_label=Offeryn Llaw + +scroll_page.title=Defnyddio Sgrolio Tudalen +scroll_page_label=Sgrolio Tudalen +scroll_vertical.title=Defnyddio Sgrolio Fertigol +scroll_vertical_label=Sgrolio Fertigol +scroll_horizontal.title=Defnyddio Sgrolio Llorweddol +scroll_horizontal_label=Sgrolio Llorweddol +scroll_wrapped.title=Defnyddio Sgrolio Amlapio +scroll_wrapped_label=Sgrolio Amlapio + +spread_none.title=Peidio uno trawsdaleniadau +spread_none_label=Dim Trawsdaleniadau +spread_odd.title=Uno trawsdaleniadau gan gychwyn gyda thudalennau odrif +spread_odd_label=Trawsdaleniadau Odrif +spread_even.title=Uno trawsdaleniadau gan gychwyn gyda thudalennau eilrif +spread_even_label=Trawsdaleniadau Eilrif + +# Document properties dialog box +document_properties.title=Priodweddau Dogfen… +document_properties_label=Priodweddau Dogfen… +document_properties_file_name=Enw ffeil: +document_properties_file_size=Maint ffeil: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} beit) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} beit) +document_properties_title=Teitl: +document_properties_author=Awdur: +document_properties_subject=Pwnc: +document_properties_keywords=Allweddair: +document_properties_creation_date=Dyddiad Creu: +document_properties_modification_date=Dyddiad Addasu: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Crewr: +document_properties_producer=Cynhyrchydd PDF: +document_properties_version=Fersiwn PDF: +document_properties_page_count=Cyfrif Tudalen: +document_properties_page_size=Maint Tudalen: +document_properties_page_size_unit_inches=o fewn +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portread +document_properties_page_size_orientation_landscape=tirlun +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Llythyr +document_properties_page_size_name_legal=Cyfreithiol +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Golwg Gwe Cyflym: +document_properties_linearized_yes=Iawn +document_properties_linearized_no=Na +document_properties_close=Cau + +print_progress_message=Paratoi dogfen ar gyfer ei hargraffu… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Diddymu + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toglo'r Bar Ochr +toggle_sidebar_notification2.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys amlinelliadau/atodiadau/haenau) +toggle_sidebar_label=Toglo'r Bar Ochr +document_outline.title=Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem) +document_outline_label=Amlinelliad Dogfen +attachments.title=Dangos Atodiadau +attachments_label=Atodiadau +layers.title=Dangos Haenau (cliciwch ddwywaith i ailosod yr holl haenau i'r cyflwr rhagosodedig) +layers_label=Haenau +thumbs.title=Dangos Lluniau Bach +thumbs_label=Lluniau Bach +current_outline_item.title=Canfod yr Eitem Amlinellol Gyfredol +current_outline_item_label=Yr Eitem Amlinellol Gyfredol +findbar.title=Canfod yn y Ddogfen +findbar_label=Canfod + +additional_layers=Haenau Ychwanegol +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Tudalen {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Tudalen {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Llun Bach Tudalen {{page}} + +# Find panel button title and messages +find_input.title=Canfod +find_input.placeholder=Canfod yn y ddogfen… +find_previous.title=Canfod enghraifft flaenorol o'r ymadrodd +find_previous_label=Blaenorol +find_next.title=Canfod enghraifft nesaf yr ymadrodd +find_next_label=Nesaf +find_highlight=Amlygu popeth +find_match_case_label=Cydweddu maint +find_match_diacritics_label=Diacritigau Cyfatebol +find_entire_word_label=Geiriau cyfan +find_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod +find_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} o {{total}} cydweddiad +find_match_count[two]={{current}} o {{total}} cydweddiad +find_match_count[few]={{current}} o {{total}} cydweddiad +find_match_count[many]={{current}} o {{total}} cydweddiad +find_match_count[other]={{current}} o {{total}} cydweddiad +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mwy na {{limit}} cydweddiad +find_match_count_limit[one]=Mwy na {{limit}} cydweddiad +find_match_count_limit[two]=Mwy na {{limit}} cydweddiad +find_match_count_limit[few]=Mwy na {{limit}} cydweddiad +find_match_count_limit[many]=Mwy na {{limit}} cydweddiad +find_match_count_limit[other]=Mwy na {{limit}} cydweddiad +find_not_found=Heb ganfod ymadrodd + +# Error panel labels +error_more_info=Rhagor o Wybodaeth +error_less_info=Llai o wybodaeth +error_close=Cau +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Neges: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stac: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ffeil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Llinell: {{line}} + +# Predefined zoom values +page_scale_width=Lled Tudalen +page_scale_fit=Ffit Tudalen +page_scale_auto=Chwyddo Awtomatig +page_scale_actual=Maint Gwirioneddol +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Yn llwytho… +loading_error=Digwyddodd gwall wrth lwytho'r PDF. +invalid_file_error=Ffeil PDF annilys neu llwgr. +missing_file_error=Ffeil PDF coll. +unexpected_response_error=Ymateb annisgwyl gan y gweinydd. + +rendering_error=Digwyddodd gwall wrth adeiladu'r dudalen. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anodiad {{type}} ] +password_label=Rhowch gyfrinair i agor y PDF. +password_invalid=Cyfrinair annilys. Ceisiwch eto. +password_ok=Iawn +password_cancel=Diddymu + +printing_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr. +printing_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu. +web_fonts_disabled=Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig. + +# Editor +editor_free_text2.title=Testun +editor_free_text2_label=Testun +editor_ink2.title=Lluniadu +editor_ink2_label=Lluniadu + +free_text2_default_content=Cychwyn teipio… + +# Editor Parameters +editor_free_text_color=Lliw +editor_free_text_size=Maint +editor_ink_color=Lliw +editor_ink_thickness=Trwch +editor_ink_opacity=Didreiddedd + +# Editor aria +editor_free_text2_aria_label=Golygydd Testun +editor_ink2_aria_label=Golygydd Lluniadu +editor_ink_canvas_aria_label=Delwedd wedi'i chreu gan ddefnyddwyr diff --git a/src/assets/pdf-annotation/web/locale/da/viewer.properties b/src/assets/pdf-annotation/web/locale/da/viewer.properties new file mode 100755 index 0000000..326033c --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/da/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Forrige side +previous_label=Forrige +next.title=Næste side +next_label=Næste + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=af {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} af {{pagesCount}}) + +zoom_out.title=Zoom ud +zoom_out_label=Zoom ud +zoom_in.title=Zoom ind +zoom_in_label=Zoom ind +zoom.title=Zoom +presentation_mode.title=Skift til fuldskærmsvisning +presentation_mode_label=Fuldskærmsvisning +open_file.title=Åbn fil +open_file_label=Åbn +print.title=Udskriv +print_label=Udskriv +download.title=Hent +download_label=Hent +save.title=Gem +save_label=Gem +bookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue) +bookmark_label=Aktuel visning + +# Secondary toolbar and context menu +tools.title=Funktioner +tools_label=Funktioner +first_page.title=Gå til første side +first_page_label=Gå til første side +last_page.title=Gå til sidste side +last_page_label=Gå til sidste side +page_rotate_cw.title=Roter med uret +page_rotate_cw_label=Roter med uret +page_rotate_ccw.title=Roter mod uret +page_rotate_ccw_label=Roter mod uret + +cursor_text_select_tool.title=Aktiver markeringsværktøj +cursor_text_select_tool_label=Markeringsværktøj +cursor_hand_tool.title=Aktiver håndværktøj +cursor_hand_tool_label=Håndværktøj + +scroll_page.title=Brug sidescrolling +scroll_page_label=Sidescrolling +scroll_vertical.title=Brug vertikal scrolling +scroll_vertical_label=Vertikal scrolling +scroll_horizontal.title=Brug horisontal scrolling +scroll_horizontal_label=Horisontal scrolling +scroll_wrapped.title=Brug ombrudt scrolling +scroll_wrapped_label=Ombrudt scrolling + +spread_none.title=Vis enkeltsider +spread_none_label=Enkeltsider +spread_odd.title=Vis opslag med ulige sidenumre til venstre +spread_odd_label=Opslag med forside +spread_even.title=Vis opslag med lige sidenumre til venstre +spread_even_label=Opslag uden forside + +# Document properties dialog box +document_properties.title=Dokumentegenskaber… +document_properties_label=Dokumentegenskaber… +document_properties_file_name=Filnavn: +document_properties_file_size=Filstørrelse: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Forfatter: +document_properties_subject=Emne: +document_properties_keywords=Nøgleord: +document_properties_creation_date=Oprettet: +document_properties_modification_date=Redigeret: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Program: +document_properties_producer=PDF-producent: +document_properties_version=PDF-version: +document_properties_page_count=Antal sider: +document_properties_page_size=Sidestørrelse: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=stående +document_properties_page_size_orientation_landscape=liggende +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Hurtig web-visning: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Nej +document_properties_close=Luk + +print_progress_message=Forbereder dokument til udskrivning… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Annuller + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Slå sidepanel til eller fra +toggle_sidebar_notification2.title=Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede filer/lag) +toggle_sidebar_label=Slå sidepanel til eller fra +document_outline.title=Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer) +document_outline_label=Dokument-disposition +attachments.title=Vis vedhæftede filer +attachments_label=Vedhæftede filer +layers.title=Vis lag (dobbeltklik for at nulstille alle lag til standard-tilstanden) +layers_label=Lag +thumbs.title=Vis miniaturer +thumbs_label=Miniaturer +current_outline_item.title=Find det aktuelle dispositions-element +current_outline_item_label=Aktuelt dispositions-element +findbar.title=Find i dokument +findbar_label=Find + +additional_layers=Yderligere lag +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Side {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniature af side {{page}} + +# Find panel button title and messages +find_input.title=Find +find_input.placeholder=Find i dokument… +find_previous.title=Find den forrige forekomst +find_previous_label=Forrige +find_next.title=Find den næste forekomst +find_next_label=Næste +find_highlight=Fremhæv alle +find_match_case_label=Forskel på store og små bogstaver +find_match_diacritics_label=Diakritiske tegn +find_entire_word_label=Hele ord +find_reached_top=Toppen af siden blev nået, fortsatte fra bunden +find_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} af {{total}} forekomst +find_match_count[two]={{current}} af {{total}} forekomster +find_match_count[few]={{current}} af {{total}} forekomster +find_match_count[many]={{current}} af {{total}} forekomster +find_match_count[other]={{current}} af {{total}} forekomster +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mere end {{limit}} forekomster +find_match_count_limit[one]=Mere end {{limit}} forekomst +find_match_count_limit[two]=Mere end {{limit}} forekomster +find_match_count_limit[few]=Mere end {{limit}} forekomster +find_match_count_limit[many]=Mere end {{limit}} forekomster +find_match_count_limit[other]=Mere end {{limit}} forekomster +find_not_found=Der blev ikke fundet noget + +# Error panel labels +error_more_info=Mere information +error_less_info=Mindre information +error_close=Luk +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Fejlmeddelelse: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linje: {{line}} + +# Predefined zoom values +page_scale_width=Sidebredde +page_scale_fit=Tilpas til side +page_scale_auto=Automatisk zoom +page_scale_actual=Faktisk størrelse +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Indlæser… +loading_error=Der opstod en fejl ved indlæsning af PDF-filen. +invalid_file_error=PDF-filen er ugyldig eller ødelagt. +missing_file_error=Manglende PDF-fil. +unexpected_response_error=Uventet svar fra serveren. + +rendering_error=Der opstod en fejl ved generering af siden. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}kommentar] +password_label=Angiv adgangskode til at åbne denne PDF-fil. +password_invalid=Ugyldig adgangskode. Prøv igen. +password_ok=OK +password_cancel=Fortryd + +printing_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren. +printing_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning. +web_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Tegn +editor_ink2_label=Tegn + +free_text2_default_content=Begynd at skrive… + +# Editor Parameters +editor_free_text_color=Farve +editor_free_text_size=Størrelse +editor_ink_color=Farve +editor_ink_thickness=Tykkelse +editor_ink_opacity=Uigennemsigtighed + +# Editor aria +editor_free_text2_aria_label=Teksteditor +editor_ink2_aria_label=Tegnings-editor +editor_ink_canvas_aria_label=Brugeroprettet billede diff --git a/src/assets/pdf-annotation/web/locale/de/viewer.properties b/src/assets/pdf-annotation/web/locale/de/viewer.properties new file mode 100755 index 0000000..bb87c87 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/de/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Eine Seite zurück +previous_label=Zurück +next.title=Eine Seite vor +next_label=Vor + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Seite +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=von {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} von {{pagesCount}}) + +zoom_out.title=Verkleinern +zoom_out_label=Verkleinern +zoom_in.title=Vergrößern +zoom_in_label=Vergrößern +zoom.title=Zoom +presentation_mode.title=In Präsentationsmodus wechseln +presentation_mode_label=Präsentationsmodus +open_file.title=Datei öffnen +open_file_label=Öffnen +print.title=Drucken +print_label=Drucken +download.title=Dokument speichern +download_label=Speichern +save.title=Speichern +save_label=Speichern +bookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster) +bookmark_label=Aktuelle Ansicht + +# Secondary toolbar and context menu +tools.title=Werkzeuge +tools_label=Werkzeuge +first_page.title=Erste Seite anzeigen +first_page_label=Erste Seite anzeigen +last_page.title=Letzte Seite anzeigen +last_page_label=Letzte Seite anzeigen +page_rotate_cw.title=Im Uhrzeigersinn drehen +page_rotate_cw_label=Im Uhrzeigersinn drehen +page_rotate_ccw.title=Gegen Uhrzeigersinn drehen +page_rotate_ccw_label=Gegen Uhrzeigersinn drehen + +cursor_text_select_tool.title=Textauswahl-Werkzeug aktivieren +cursor_text_select_tool_label=Textauswahl-Werkzeug +cursor_hand_tool.title=Hand-Werkzeug aktivieren +cursor_hand_tool_label=Hand-Werkzeug + +scroll_page.title=Seiten einzeln anordnen +scroll_page_label=Einzelseitenanordnung +scroll_vertical.title=Seiten übereinander anordnen +scroll_vertical_label=Vertikale Seitenanordnung +scroll_horizontal.title=Seiten nebeneinander anordnen +scroll_horizontal_label=Horizontale Seitenanordnung +scroll_wrapped.title=Seiten neben- und übereinander anordnen, abhängig vom Platz +scroll_wrapped_label=Kombinierte Seitenanordnung + +spread_none.title=Seiten nicht nebeneinander anzeigen +spread_none_label=Einzelne Seiten +spread_odd.title=Jeweils eine ungerade und eine gerade Seite nebeneinander anzeigen +spread_odd_label=Ungerade + gerade Seite +spread_even.title=Jeweils eine gerade und eine ungerade Seite nebeneinander anzeigen +spread_even_label=Gerade + ungerade Seite + +# Document properties dialog box +document_properties.title=Dokumenteigenschaften +document_properties_label=Dokumenteigenschaften… +document_properties_file_name=Dateiname: +document_properties_file_size=Dateigröße: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} Bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} Bytes) +document_properties_title=Titel: +document_properties_author=Autor: +document_properties_subject=Thema: +document_properties_keywords=Stichwörter: +document_properties_creation_date=Erstelldatum: +document_properties_modification_date=Bearbeitungsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Anwendung: +document_properties_producer=PDF erstellt mit: +document_properties_version=PDF-Version: +document_properties_page_count=Seitenzahl: +document_properties_page_size=Seitengröße: +document_properties_page_size_unit_inches=Zoll +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=Hochformat +document_properties_page_size_orientation_landscape=Querformat +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Schnelle Webanzeige: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Nein +document_properties_close=Schließen + +print_progress_message=Dokument wird für Drucken vorbereitet… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Abbrechen + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sidebar umschalten +toggle_sidebar_notification2.title=Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge/Ebenen) +toggle_sidebar_label=Sidebar umschalten +document_outline.title=Dokumentstruktur anzeigen (Doppelklicken, um alle Einträge aus- bzw. einzuklappen) +document_outline_label=Dokumentstruktur +attachments.title=Anhänge anzeigen +attachments_label=Anhänge +layers.title=Ebenen anzeigen (Doppelklicken, um alle Ebenen auf den Standardzustand zurückzusetzen) +layers_label=Ebenen +thumbs.title=Miniaturansichten anzeigen +thumbs_label=Miniaturansichten +current_outline_item.title=Aktuelles Struktur-Element finden +current_outline_item_label=Aktuelles Struktur-Element +findbar.title=Dokument durchsuchen +findbar_label=Suchen + +additional_layers=Zusätzliche Ebenen +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Seite {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Seite {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniaturansicht von Seite {{page}} + +# Find panel button title and messages +find_input.title=Suchen +find_input.placeholder=Im Dokument suchen… +find_previous.title=Vorheriges Vorkommen des Suchbegriffs finden +find_previous_label=Zurück +find_next.title=Nächstes Vorkommen des Suchbegriffs finden +find_next_label=Weiter +find_highlight=Alle hervorheben +find_match_case_label=Groß-/Kleinschreibung beachten +find_match_diacritics_label=Akzente +find_entire_word_label=Ganze Wörter +find_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort +find_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} von {{total}} Übereinstimmung +find_match_count[two]={{current}} von {{total}} Übereinstimmungen +find_match_count[few]={{current}} von {{total}} Übereinstimmungen +find_match_count[many]={{current}} von {{total}} Übereinstimmungen +find_match_count[other]={{current}} von {{total}} Übereinstimmungen +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mehr als {{limit}} Übereinstimmungen +find_match_count_limit[one]=Mehr als {{limit}} Übereinstimmung +find_match_count_limit[two]=Mehr als {{limit}} Übereinstimmungen +find_match_count_limit[few]=Mehr als {{limit}} Übereinstimmungen +find_match_count_limit[many]=Mehr als {{limit}} Übereinstimmungen +find_match_count_limit[other]=Mehr als {{limit}} Übereinstimmungen +find_not_found=Suchbegriff nicht gefunden + +# Error panel labels +error_more_info=Mehr Informationen +error_less_info=Weniger Informationen +error_close=Schließen +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js Version {{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Nachricht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Aufrufliste: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datei: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Zeile: {{line}} + +# Predefined zoom values +page_scale_width=Seitenbreite +page_scale_fit=Seitengröße +page_scale_auto=Automatischer Zoom +page_scale_actual=Originalgröße +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Wird geladen… +loading_error=Beim Laden der PDF-Datei trat ein Fehler auf. +invalid_file_error=Ungültige oder beschädigte PDF-Datei +missing_file_error=Fehlende PDF-Datei +unexpected_response_error=Unerwartete Antwort des Servers + +rendering_error=Beim Darstellen der Seite trat ein Fehler auf. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anlage: {{type}}] +password_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein. +password_invalid=Falsches Passwort. Bitte versuchen Sie es erneut. +password_ok=OK +password_cancel=Abbrechen + +printing_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt. +printing_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen. +web_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Zeichnen +editor_ink2_label=Zeichnen + +free_text2_default_content=Schreiben beginnen… + +# Editor Parameters +editor_free_text_color=Farbe +editor_free_text_size=Größe +editor_ink_color=Farbe +editor_ink_thickness=Dicke +editor_ink_opacity=Deckkraft + +# Editor aria +editor_free_text2_aria_label=Texteditor +editor_ink2_aria_label=Zeichnungseditor +editor_ink_canvas_aria_label=Vom Benutzer erstelltes Bild diff --git a/src/assets/pdf-annotation/web/locale/dsb/viewer.properties b/src/assets/pdf-annotation/web/locale/dsb/viewer.properties new file mode 100755 index 0000000..87d09b4 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/dsb/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pjerwjejšny bok +previous_label=Slědk +next.title=Pśiducy bok +next_label=Dalej + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Bok +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Pómjeńšyś +zoom_out_label=Pómjeńšyś +zoom_in.title=Pówětšyś +zoom_in_label=Pówětšyś +zoom.title=Skalěrowanje +presentation_mode.title=Do prezentaciskego modusa pśejś +presentation_mode_label=Prezentaciski modus +open_file.title=Dataju wócyniś +open_file_label=Wócyniś +print.title=Śišćaś +print_label=Śišćaś +download.title=Ześěgnuś +download_label=Ześěgnuś +save.title=Składowaś +save_label=Składowaś +bookmark.title=Aktualny naglěd (kopěrowaś abo w nowem woknje wócyniś) +bookmark_label=Aktualny naglěd + +# Secondary toolbar and context menu +tools.title=Rědy +tools_label=Rědy +first_page.title=K prědnemu bokoju +first_page_label=K prědnemu bokoju +last_page.title=K slědnemu bokoju +last_page_label=K slědnemu bokoju +page_rotate_cw.title=Wobwjertnuś ako špěra źo +page_rotate_cw_label=Wobwjertnuś ako špěra źo +page_rotate_ccw.title=Wobwjertnuś nawopaki ako špěra źo +page_rotate_ccw_label=Wobwjertnuś nawopaki ako špěra źo + +cursor_text_select_tool.title=Rěd za wuběranje teksta zmóžniś +cursor_text_select_tool_label=Rěd za wuběranje teksta +cursor_hand_tool.title=Rucny rěd zmóžniś +cursor_hand_tool_label=Rucny rěd + +scroll_page.title=Kulanje boka wužywaś +scroll_page_label=Kulanje boka +scroll_vertical.title=Wertikalne suwanje wužywaś +scroll_vertical_label=Wertikalne suwanje +scroll_horizontal.title=Horicontalne suwanje wužywaś +scroll_horizontal_label=Horicontalne suwanje +scroll_wrapped.title=Pózlažke suwanje wužywaś +scroll_wrapped_label=Pózlažke suwanje + +spread_none.title=Boki njezwězaś +spread_none_label=Žeden dwójny bok +spread_odd.title=Boki zachopinajucy z njerownymi bokami zwězaś +spread_odd_label=Njerowne boki +spread_even.title=Boki zachopinajucy z rownymi bokami zwězaś +spread_even_label=Rowne boki + +# Document properties dialog box +document_properties.title=Dokumentowe kakosći… +document_properties_label=Dokumentowe kakosći… +document_properties_file_name=Mě dataje: +document_properties_file_size=Wjelikosć dataje: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtow) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtow) +document_properties_title=Titel: +document_properties_author=Awtor: +document_properties_subject=Tema: +document_properties_keywords=Klucowe słowa: +document_properties_creation_date=Datum napóranja: +document_properties_modification_date=Datum změny: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Awtor: +document_properties_producer=PDF-gótowaŕ: +document_properties_version=PDF-wersija: +document_properties_page_count=Licba bokow: +document_properties_page_size=Wjelikosć boka: +document_properties_page_size_unit_inches=col +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=wusoki format +document_properties_page_size_orientation_landscape=prěcny format +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Jo +document_properties_linearized_no=Ně +document_properties_close=Zacyniś + +print_progress_message=Dokument pśigótujo se za śišćanje… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Pśetergnuś + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Bócnicu pokazaś/schowaś +toggle_sidebar_notification2.title=Bocnicu pśešaltowaś (dokument rozrědowanje/pśipiski/warstwy wopśimujo) +toggle_sidebar_label=Bócnicu pokazaś/schowaś +document_outline.title=Dokumentowe naraźenje pokazaś (dwójne kliknjenje, aby se wšykne zapiski pokazali/schowali) +document_outline_label=Dokumentowa struktura +attachments.title=Pśidanki pokazaś +attachments_label=Pśidanki +layers.title=Warstwy pokazaś (klikniśo dwójcy, aby wšykne warstwy na standardny staw slědk stajił) +layers_label=Warstwy +thumbs.title=Miniatury pokazaś +thumbs_label=Miniatury +current_outline_item.title=Aktualny rozrědowański zapisk pytaś +current_outline_item_label=Aktualny rozrědowański zapisk +findbar.title=W dokumenśe pytaś +findbar_label=Pytaś + +additional_layers=Dalšne warstwy +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Bok {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Bok {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura boka {{page}} + +# Find panel button title and messages +find_input.title=Pytaś +find_input.placeholder=W dokumenśe pytaś… +find_previous.title=Pjerwjejšne wustupowanje pytańskego wuraza pytaś +find_previous_label=Slědk +find_next.title=Pśidujuce wustupowanje pytańskego wuraza pytaś +find_next_label=Dalej +find_highlight=Wšykne wuzwignuś +find_match_case_label=Na wjelikopisanje źiwaś +find_match_diacritics_label=Diakritiske znamuška wužywaś +find_entire_word_label=Cełe słowa +find_reached_top=Zachopjeńk dokumenta dostany, pókšacujo se z kóńcom +find_reached_bottom=Kóńc dokumenta dostany, pókšacujo se ze zachopjeńkom +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} z {{total}} wótpowědnika +find_match_count[two]={{current}} z {{total}} wótpowědnikowu +find_match_count[few]={{current}} z {{total}} wótpowědnikow +find_match_count[many]={{current}} z {{total}} wótpowědnikow +find_match_count[other]={{current}} z {{total}} wótpowědnikow +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Wěcej ako {{limit}} wótpowědnikow +find_match_count_limit[one]=Wěcej ako {{limit}} wótpowědnik +find_match_count_limit[two]=Wěcej ako {{limit}} wótpowědnika +find_match_count_limit[few]=Wěcej ako {{limit}} wótpowědniki +find_match_count_limit[many]=Wěcej ako {{limit}} wótpowědnikow +find_match_count_limit[other]=Wěcej ako {{limit}} wótpowědnikow +find_not_found=Pytański wuraz njejo se namakał + +# Error panel labels +error_more_info=Wěcej informacijow +error_less_info=Mjenjej informacijow +error_close=Zacyniś +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Powěźenka: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Lisćina zawołanjow: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dataja: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Smužka: {{line}} + +# Predefined zoom values +page_scale_width=Šyrokosć boka +page_scale_fit=Wjelikosć boka +page_scale_auto=Awtomatiske skalěrowanje +page_scale_actual=Aktualna wjelikosć +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Zacytujo se… +loading_error=Pśi zacytowanju PDF jo zmólka nastała. +invalid_file_error=Njepłaśiwa abo wobškóźona PDF-dataja. +missing_file_error=Felujuca PDF-dataja. +unexpected_response_error=Njewócakane serwerowe wótegrono. + +rendering_error=Pśi zwobraznjanju boka jo zmólka nastała. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Typ pśipiskow: {{type}}] +password_label=Zapódajśo gronidło, aby PDF-dataju wócynił. +password_invalid=Njepłaśiwe gronidło. Pšosym wopytajśo hyšći raz. +password_ok=W pórěźe +password_cancel=Pśetergnuś + +printing_not_supported=Warnowanje: Śišćanje njepódpěra se połnje pśez toś ten wobglědowak. +printing_not_ready=Warnowanje: PDF njejo se za śišćanje dopołnje zacytał. +web_fonts_disabled=Webpisma su znjemóžnjone: njejo móžno, zasajźone PDF-pisma wužywaś. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Kresliś +editor_ink2_label=Kresliś + +free_text2_default_content=Zachopśo pisaś… + +# Editor Parameters +editor_free_text_color=Barwa +editor_free_text_size=Wjelikosć +editor_ink_color=Barwa +editor_ink_thickness=Tłustosć +editor_ink_opacity=Opacita + +# Editor aria +editor_free_text2_aria_label=Tekstowy editor +editor_ink2_aria_label=Kresleński editor +editor_ink_canvas_aria_label=Wobraz napórany wót wužywarja diff --git a/src/assets/pdf-annotation/web/locale/el/viewer.properties b/src/assets/pdf-annotation/web/locale/el/viewer.properties new file mode 100755 index 0000000..3ee6427 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/el/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Προηγούμενη σελίδα +previous_label=Προηγούμενη +next.title=Επόμενη σελίδα +next_label=Επόμενη + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Σελίδα +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=από {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} από {{pagesCount}}) + +zoom_out.title=Σμίκρυνση +zoom_out_label=Σμίκρυνση +zoom_in.title=Μεγέθυνση +zoom_in_label=Μεγέθυνση +zoom.title=Ζουμ +presentation_mode.title=Εναλλαγή σε λειτουργία παρουσίασης +presentation_mode_label=Λειτουργία παρουσίασης +open_file.title=Άνοιγμα αρχείου +open_file_label=Άνοιγμα +print.title=Εκτύπωση +print_label=Εκτύπωση +download.title=Λήψη +download_label=Λήψη +save.title=Αποθήκευση +save_label=Αποθήκευση +bookmark.title=Τρέχουσα προβολή (αντιγραφή ή άνοιγμα σε νέο παράθυρο) +bookmark_label=Τρέχουσα προβολή + +# Secondary toolbar and context menu +tools.title=Εργαλεία +tools_label=Εργαλεία +first_page.title=Μετάβαση στην πρώτη σελίδα +first_page_label=Μετάβαση στην πρώτη σελίδα +last_page.title=Μετάβαση στην τελευταία σελίδα +last_page_label=Μετάβαση στην τελευταία σελίδα +page_rotate_cw.title=Δεξιόστροφη περιστροφή +page_rotate_cw_label=Δεξιόστροφη περιστροφή +page_rotate_ccw.title=Αριστερόστροφη περιστροφή +page_rotate_ccw_label=Αριστερόστροφη περιστροφή + +cursor_text_select_tool.title=Ενεργοποίηση εργαλείου επιλογής κειμένου +cursor_text_select_tool_label=Εργαλείο επιλογής κειμένου +cursor_hand_tool.title=Ενεργοποίηση εργαλείου χεριού +cursor_hand_tool_label=Εργαλείο χεριού + +scroll_page.title=Χρήση κύλισης σελίδας +scroll_page_label=Κύλιση σελίδας +scroll_vertical.title=Χρήση κάθετης κύλισης +scroll_vertical_label=Κάθετη κύλιση +scroll_horizontal.title=Χρήση οριζόντιας κύλισης +scroll_horizontal_label=Οριζόντια κύλιση +scroll_wrapped.title=Χρήση κυκλικής κύλισης +scroll_wrapped_label=Κυκλική κύλιση + +spread_none.title=Να μην γίνει σύνδεση επεκτάσεων σελίδων +spread_none_label=Χωρίς επεκτάσεις +spread_odd.title=Σύνδεση επεκτάσεων σελίδων ξεκινώντας από τις μονές σελίδες +spread_odd_label=Μονές επεκτάσεις +spread_even.title=Σύνδεση επεκτάσεων σελίδων ξεκινώντας από τις ζυγές σελίδες +spread_even_label=Ζυγές επεκτάσεις + +# Document properties dialog box +document_properties.title=Ιδιότητες εγγράφου… +document_properties_label=Ιδιότητες εγγράφου… +document_properties_file_name=Όνομα αρχείου: +document_properties_file_size=Μέγεθος αρχείου: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Τίτλος: +document_properties_author=Συγγραφέας: +document_properties_subject=Θέμα: +document_properties_keywords=Λέξεις-κλειδιά: +document_properties_creation_date=Ημερομηνία δημιουργίας: +document_properties_modification_date=Ημερομηνία τροποποίησης: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Δημιουργός: +document_properties_producer=Παραγωγός PDF: +document_properties_version=Έκδοση PDF: +document_properties_page_count=Αριθμός σελίδων: +document_properties_page_size=Μέγεθος σελίδας: +document_properties_page_size_unit_inches=ίντσες +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=κατακόρυφα +document_properties_page_size_orientation_landscape=οριζόντια +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Επιστολή +document_properties_page_size_name_legal=Τύπου Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Ταχεία προβολή ιστού: +document_properties_linearized_yes=Ναι +document_properties_linearized_no=Όχι +document_properties_close=Κλείσιμο + +print_progress_message=Προετοιμασία του εγγράφου για εκτύπωση… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Ακύρωση + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=(Απ)ενεργοποίηση πλαϊνής γραμμής +toggle_sidebar_notification2.title=(Απ)ενεργοποίηση πλαϊνής γραμμής (το έγγραφο περιέχει περίγραμμα/συνημμένα/επίπεδα) +toggle_sidebar_label=(Απ)ενεργοποίηση πλαϊνής γραμμής +document_outline.title=Εμφάνιση διάρθρωσης εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων) +document_outline_label=Διάρθρωση εγγράφου +attachments.title=Εμφάνιση συνημμένων +attachments_label=Συνημμένα +layers.title=Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση) +layers_label=Επίπεδα +thumbs.title=Εμφάνιση μικρογραφιών +thumbs_label=Μικρογραφίες +current_outline_item.title=Εύρεση τρέχοντος στοιχείου διάρθρωσης +current_outline_item_label=Τρέχον στοιχείο διάρθρωσης +findbar.title=Εύρεση στο έγγραφο +findbar_label=Εύρεση + +additional_layers=Επιπρόσθετα επίπεδα +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Σελίδα {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Σελίδα {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Μικρογραφία σελίδας {{page}} + +# Find panel button title and messages +find_input.title=Εύρεση +find_input.placeholder=Εύρεση στο έγγραφο… +find_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης +find_previous_label=Προηγούμενο +find_next.title=Εύρεση της επόμενης εμφάνισης της φράσης +find_next_label=Επόμενο +find_highlight=Επισήμανση όλων +find_match_case_label=Συμφωνία πεζών/κεφαλαίων +find_match_diacritics_label=Αντιστοίχιση διακριτικών +find_entire_word_label=Ολόκληρες λέξεις +find_reached_top=Φτάσατε στην αρχή του εγγράφου, συνέχεια από το τέλος +find_reached_bottom=Φτάσατε στο τέλος του εγγράφου, συνέχεια από την αρχή +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} από {{total}} αντιστοιχία +find_match_count[two]={{current}} από {{total}} αντιστοιχίες +find_match_count[few]={{current}} από {{total}} αντιστοιχίες +find_match_count[many]={{current}} από {{total}} αντιστοιχίες +find_match_count[other]={{current}} από {{total}} αντιστοιχίες +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Περισσότερες από {{limit}} αντιστοιχίες +find_match_count_limit[one]=Περισσότερες από {{limit}} αντιστοιχία +find_match_count_limit[two]=Περισσότερες από {{limit}} αντιστοιχίες +find_match_count_limit[few]=Περισσότερες από {{limit}} αντιστοιχίες +find_match_count_limit[many]=Περισσότερες από {{limit}} αντιστοιχίες +find_match_count_limit[other]=Περισσότερες από {{limit}} αντιστοιχίες +find_not_found=Η φράση δεν βρέθηκε + +# Error panel labels +error_more_info=Περισσότερες πληροφορίες +error_less_info=Λιγότερες πληροφορίες +error_close=Κλείσιμο +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (έκδοση: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Μήνυμα: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Στοίβα: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Αρχείο: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Γραμμή: {{line}} + +# Predefined zoom values +page_scale_width=Πλάτος σελίδας +page_scale_fit=Μέγεθος σελίδας +page_scale_auto=Αυτόματο ζουμ +page_scale_actual=Πραγματικό μέγεθος +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Φόρτωση… +loading_error=Προέκυψε σφάλμα κατά τη φόρτωση του PDF. +invalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF. +missing_file_error=Λείπει αρχείο PDF. +unexpected_response_error=Μη αναμενόμενη απόκριση από το διακομιστή. + +rendering_error=Προέκυψε σφάλμα κατά την εμφάνιση της σελίδας. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Σχόλιο «{{type}}»] +password_label=Εισαγάγετε τον κωδικό πρόσβασης για να ανοίξετε αυτό το αρχείο PDF. +password_invalid=Μη έγκυρος κωδικός πρόσβασης. Παρακαλώ δοκιμάστε ξανά. +password_ok=OK +password_cancel=Ακύρωση + +printing_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από το πρόγραμμα περιήγησης. +printing_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση. +web_fonts_disabled=Οι γραμματοσειρές ιστού είναι ανενεργές: δεν είναι δυνατή η χρήση των ενσωματωμένων γραμματοσειρών PDF. + +# Editor +editor_free_text2.title=Κείμενο +editor_free_text2_label=Κείμενο +editor_ink2.title=Σχέδιο +editor_ink2_label=Σχέδιο + +free_text2_default_content=Ξεκινήστε να πληκτρολογείτε… + +# Editor Parameters +editor_free_text_color=Χρώμα +editor_free_text_size=Μέγεθος +editor_ink_color=Χρώμα +editor_ink_thickness=Πάχος +editor_ink_opacity=Αδιαφάνεια + +# Editor aria +editor_free_text2_aria_label=Επεξεργασία κειμένου +editor_ink2_aria_label=Επεξεργασία σχεδίων +editor_ink_canvas_aria_label=Εικόνα από τον χρήστη diff --git a/src/assets/pdf-annotation/web/locale/en-CA/viewer.properties b/src/assets/pdf-annotation/web/locale/en-CA/viewer.properties new file mode 100755 index 0000000..0ad449f --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/en-CA/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Previous Page +previous_label=Previous +next.title=Next Page +next_label=Next + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Page +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=of {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Zoom Out +zoom_out_label=Zoom Out +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Switch to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Print +print_label=Print +download.title=Download +download_label=Download +save.title=Save +save_label=Save +bookmark.title=Current view (copy or open in new window) +bookmark_label=Current View + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Go to First Page +first_page_label=Go to First Page +last_page.title=Go to Last Page +last_page_label=Go to Last Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Counterclockwise +page_rotate_ccw_label=Rotate Counterclockwise + +cursor_text_select_tool.title=Enable Text Selection Tool +cursor_text_select_tool_label=Text Selection Tool +cursor_hand_tool.title=Enable Hand Tool +cursor_hand_tool_label=Hand Tool + +scroll_page.title=Use Page Scrolling +scroll_page_label=Page Scrolling +scroll_vertical.title=Use Vertical Scrolling +scroll_vertical_label=Vertical Scrolling +scroll_horizontal.title=Use Horizontal Scrolling +scroll_horizontal_label=Horizontal Scrolling +scroll_wrapped.title=Use Wrapped Scrolling +scroll_wrapped_label=Wrapped Scrolling + +spread_none.title=Do not join page spreads +spread_none_label=No Spreads +spread_odd.title=Join page spreads starting with odd-numbered pages +spread_odd_label=Odd Spreads +spread_even.title=Join page spreads starting with even-numbered pages +spread_even_label=Even Spreads + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subject: +document_properties_keywords=Keywords: +document_properties_creation_date=Creation Date: +document_properties_modification_date=Modification Date: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Count: +document_properties_page_size=Page Size: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portrait +document_properties_page_size_orientation_landscape=landscape +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Yes +document_properties_linearized_no=No +document_properties_close=Close + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancel + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebar +toggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers) +toggle_sidebar_label=Toggle Sidebar +document_outline.title=Show Document Outline (double-click to expand/collapse all items) +document_outline_label=Document Outline +attachments.title=Show Attachments +attachments_label=Attachments +layers.title=Show Layers (double-click to reset all layers to the default state) +layers_label=Layers +thumbs.title=Show Thumbnails +thumbs_label=Thumbnails +current_outline_item.title=Find Current Outline Item +current_outline_item_label=Current Outline Item +findbar.title=Find in Document +findbar_label=Find + +additional_layers=Additional Layers +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Page {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail of Page {{page}} + +# Find panel button title and messages +find_input.title=Find +find_input.placeholder=Find in document… +find_previous.title=Find the previous occurrence of the phrase +find_previous_label=Previous +find_next.title=Find the next occurrence of the phrase +find_next_label=Next +find_highlight=Highlight All +find_match_case_label=Match Case +find_match_diacritics_label=Match Diacritics +find_entire_word_label=Whole Words +find_reached_top=Reached top of document, continued from bottom +find_reached_bottom=Reached end of document, continued from top +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} of {{total}} match +find_match_count[two]={{current}} of {{total}} matches +find_match_count[few]={{current}} of {{total}} matches +find_match_count[many]={{current}} of {{total}} matches +find_match_count[other]={{current}} of {{total}} matches +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=More than {{limit}} matches +find_match_count_limit[one]=More than {{limit}} match +find_match_count_limit[two]=More than {{limit}} matches +find_match_count_limit[few]=More than {{limit}} matches +find_match_count_limit[many]=More than {{limit}} matches +find_match_count_limit[other]=More than {{limit}} matches +find_not_found=Phrase not found + +# Error panel labels +error_more_info=More Information +error_less_info=Less Information +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Loading… +loading_error=An error occurred while loading the PDF. +invalid_file_error=Invalid or corrupted PDF file. +missing_file_error=Missing PDF file. +unexpected_response_error=Unexpected server response. + +rendering_error=An error occurred while rendering the page. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Enter the password to open this PDF file. +password_invalid=Invalid password. Please try again. +password_ok=OK +password_cancel=Cancel + +printing_not_supported=Warning: Printing is not fully supported by this browser. +printing_not_ready=Warning: The PDF is not fully loaded for printing. +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Draw +editor_ink2_label=Draw + +free_text2_default_content=Start typing… + +# Editor Parameters +editor_free_text_color=Colour +editor_free_text_size=Size +editor_ink_color=Colour +editor_ink_thickness=Thickness +editor_ink_opacity=Opacity + +# Editor aria +editor_free_text2_aria_label=Text Editor +editor_ink2_aria_label=Draw Editor +editor_ink_canvas_aria_label=User-created image diff --git a/src/assets/pdf-annotation/web/locale/en-GB/viewer.properties b/src/assets/pdf-annotation/web/locale/en-GB/viewer.properties new file mode 100755 index 0000000..02f8a07 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/en-GB/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Previous Page +previous_label=Previous +next.title=Next Page +next_label=Next + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Page +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=of {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Zoom Out +zoom_out_label=Zoom Out +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Switch to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Print +print_label=Print +download.title=Download +download_label=Download +save.title=Save +save_label=Save +bookmark.title=Current view (copy or open in new window) +bookmark_label=Current View + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Go to First Page +first_page_label=Go to First Page +last_page.title=Go to Last Page +last_page_label=Go to Last Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Anti-Clockwise +page_rotate_ccw_label=Rotate Anti-Clockwise + +cursor_text_select_tool.title=Enable Text Selection Tool +cursor_text_select_tool_label=Text Selection Tool +cursor_hand_tool.title=Enable Hand Tool +cursor_hand_tool_label=Hand Tool + +scroll_page.title=Use Page Scrolling +scroll_page_label=Page Scrolling +scroll_vertical.title=Use Vertical Scrolling +scroll_vertical_label=Vertical Scrolling +scroll_horizontal.title=Use Horizontal Scrolling +scroll_horizontal_label=Horizontal Scrolling +scroll_wrapped.title=Use Wrapped Scrolling +scroll_wrapped_label=Wrapped Scrolling + +spread_none.title=Do not join page spreads +spread_none_label=No Spreads +spread_odd.title=Join page spreads starting with odd-numbered pages +spread_odd_label=Odd Spreads +spread_even.title=Join page spreads starting with even-numbered pages +spread_even_label=Even Spreads + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subject: +document_properties_keywords=Keywords: +document_properties_creation_date=Creation Date: +document_properties_modification_date=Modification Date: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Count: +document_properties_page_size=Page Size: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portrait +document_properties_page_size_orientation_landscape=landscape +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Yes +document_properties_linearized_no=No +document_properties_close=Close + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancel + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebar +toggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers) +toggle_sidebar_label=Toggle Sidebar +document_outline.title=Show Document Outline (double-click to expand/collapse all items) +document_outline_label=Document Outline +attachments.title=Show Attachments +attachments_label=Attachments +layers.title=Show Layers (double-click to reset all layers to the default state) +layers_label=Layers +thumbs.title=Show Thumbnails +thumbs_label=Thumbnails +current_outline_item.title=Find Current Outline Item +current_outline_item_label=Current Outline Item +findbar.title=Find in Document +findbar_label=Find + +additional_layers=Additional Layers +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Page {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail of Page {{page}} + +# Find panel button title and messages +find_input.title=Find +find_input.placeholder=Find in document… +find_previous.title=Find the previous occurrence of the phrase +find_previous_label=Previous +find_next.title=Find the next occurrence of the phrase +find_next_label=Next +find_highlight=Highlight All +find_match_case_label=Match Case +find_match_diacritics_label=Match Diacritics +find_entire_word_label=Whole Words +find_reached_top=Reached top of document, continued from bottom +find_reached_bottom=Reached end of document, continued from top +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} of {{total}} match +find_match_count[two]={{current}} of {{total}} matches +find_match_count[few]={{current}} of {{total}} matches +find_match_count[many]={{current}} of {{total}} matches +find_match_count[other]={{current}} of {{total}} matches +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=More than {{limit}} matches +find_match_count_limit[one]=More than {{limit}} match +find_match_count_limit[two]=More than {{limit}} matches +find_match_count_limit[few]=More than {{limit}} matches +find_match_count_limit[many]=More than {{limit}} matches +find_match_count_limit[other]=More than {{limit}} matches +find_not_found=Phrase not found + +# Error panel labels +error_more_info=More Information +error_less_info=Less Information +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Loading… +loading_error=An error occurred while loading the PDF. +invalid_file_error=Invalid or corrupted PDF file. +missing_file_error=Missing PDF file. +unexpected_response_error=Unexpected server response. + +rendering_error=An error occurred while rendering the page. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Enter the password to open this PDF file. +password_invalid=Invalid password. Please try again. +password_ok=OK +password_cancel=Cancel + +printing_not_supported=Warning: Printing is not fully supported by this browser. +printing_not_ready=Warning: The PDF is not fully loaded for printing. +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Draw +editor_ink2_label=Draw + +free_text2_default_content=Start typing… + +# Editor Parameters +editor_free_text_color=Colour +editor_free_text_size=Size +editor_ink_color=Colour +editor_ink_thickness=Thickness +editor_ink_opacity=Opacity + +# Editor aria +editor_free_text2_aria_label=Text Editor +editor_ink2_aria_label=Draw Editor +editor_ink_canvas_aria_label=User-created image diff --git a/src/assets/pdf-annotation/web/locale/en-US/viewer.properties b/src/assets/pdf-annotation/web/locale/en-US/viewer.properties new file mode 100755 index 0000000..ad2d892 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/en-US/viewer.properties @@ -0,0 +1,253 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Previous Page +previous_label=Previous +next.title=Next Page +next_label=Next + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Page +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=of {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Zoom Out +zoom_out_label=Zoom Out +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Switch to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Print +print_label=Print +save.title=Save +save_label=Save +bookmark.title=Current view (copy or open in new window) +bookmark_label=Current View + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Go to First Page +first_page_label=Go to First Page +last_page.title=Go to Last Page +last_page_label=Go to Last Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Counterclockwise +page_rotate_ccw_label=Rotate Counterclockwise + +cursor_text_select_tool.title=Enable Text Selection Tool +cursor_text_select_tool_label=Text Selection Tool +cursor_hand_tool.title=Enable Hand Tool +cursor_hand_tool_label=Hand Tool + +scroll_page.title=Use Page Scrolling +scroll_page_label=Page Scrolling +scroll_vertical.title=Use Vertical Scrolling +scroll_vertical_label=Vertical Scrolling +scroll_horizontal.title=Use Horizontal Scrolling +scroll_horizontal_label=Horizontal Scrolling +scroll_wrapped.title=Use Wrapped Scrolling +scroll_wrapped_label=Wrapped Scrolling + +spread_none.title=Do not join page spreads +spread_none_label=No Spreads +spread_odd.title=Join page spreads starting with odd-numbered pages +spread_odd_label=Odd Spreads +spread_even.title=Join page spreads starting with even-numbered pages +spread_even_label=Even Spreads + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subject: +document_properties_keywords=Keywords: +document_properties_creation_date=Creation Date: +document_properties_modification_date=Modification Date: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Count: +document_properties_page_size=Page Size: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portrait +document_properties_page_size_orientation_landscape=landscape +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Yes +document_properties_linearized_no=No +document_properties_close=Close + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancel + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebar +toggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers) +toggle_sidebar_label=Toggle Sidebar +document_outline.title=Show Document Outline (double-click to expand/collapse all items) +document_outline_label=Document Outline +attachments.title=Show Attachments +attachments_label=Attachments +layers.title=Show Layers (double-click to reset all layers to the default state) +layers_label=Layers +thumbs.title=Show Thumbnails +thumbs_label=Thumbnails +current_outline_item.title=Find Current Outline Item +current_outline_item_label=Current Outline Item +findbar.title=Find in Document +findbar_label=Find + +additional_layers=Additional Layers +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Page {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail of Page {{page}} + +# Find panel button title and messages +find_input.title=Find +find_input.placeholder=Find in document… +find_previous.title=Find the previous occurrence of the phrase +find_previous_label=Previous +find_next.title=Find the next occurrence of the phrase +find_next_label=Next +find_highlight=Highlight All +find_match_case_label=Match Case +find_match_diacritics_label=Match Diacritics +find_entire_word_label=Whole Words +find_reached_top=Reached top of document, continued from bottom +find_reached_bottom=Reached end of document, continued from top +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} of {{total}} match +find_match_count[two]={{current}} of {{total}} matches +find_match_count[few]={{current}} of {{total}} matches +find_match_count[many]={{current}} of {{total}} matches +find_match_count[other]={{current}} of {{total}} matches +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=More than {{limit}} matches +find_match_count_limit[one]=More than {{limit}} match +find_match_count_limit[two]=More than {{limit}} matches +find_match_count_limit[few]=More than {{limit}} matches +find_match_count_limit[many]=More than {{limit}} matches +find_match_count_limit[other]=More than {{limit}} matches +find_not_found=Phrase not found + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Loading… +loading_error=An error occurred while loading the PDF. +invalid_file_error=Invalid or corrupted PDF file. +missing_file_error=Missing PDF file. +unexpected_response_error=Unexpected server response. +rendering_error=An error occurred while rendering the page. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Enter the password to open this PDF file. +password_invalid=Invalid password. Please try again. +password_ok=OK +password_cancel=Cancel + +printing_not_supported=Warning: Printing is not fully supported by this browser. +printing_not_ready=Warning: The PDF is not fully loaded for printing. +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Draw +editor_ink2_label=Draw + +free_text2_default_content=Start typing… + +# Editor Parameters +editor_free_text_color=Color +editor_free_text_size=Size +editor_ink_color=Color +editor_ink_thickness=Thickness +editor_ink_opacity=Opacity + +# Editor aria +editor_free_text2_aria_label=Text Editor +editor_ink2_aria_label=Draw Editor +editor_ink_canvas_aria_label=User-created image diff --git a/src/assets/pdf-annotation/web/locale/eo/viewer.properties b/src/assets/pdf-annotation/web/locale/eo/viewer.properties new file mode 100755 index 0000000..b542100 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/eo/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Antaŭa paĝo +previous_label=Malantaŭen +next.title=Venonta paĝo +next_label=Antaŭen + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Paĝo +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=el {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} el {{pagesCount}}) + +zoom_out.title=Malpligrandigi +zoom_out_label=Malpligrandigi +zoom_in.title=Pligrandigi +zoom_in_label=Pligrandigi +zoom.title=Pligrandigilo +presentation_mode.title=Iri al prezenta reĝimo +presentation_mode_label=Prezenta reĝimo +open_file.title=Malfermi dosieron +open_file_label=Malfermi +print.title=Presi +print_label=Presi +download.title=Elŝuti +download_label=Elŝuti +save.title=Konservi +save_label=Konservi +bookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro) +bookmark_label=Nuna vido + +# Secondary toolbar and context menu +tools.title=Iloj +tools_label=Iloj +first_page.title=Iri al la unua paĝo +first_page_label=Iri al la unua paĝo +last_page.title=Iri al la lasta paĝo +last_page_label=Iri al la lasta paĝo +page_rotate_cw.title=Rotaciigi dekstrume +page_rotate_cw_label=Rotaciigi dekstrume +page_rotate_ccw.title=Rotaciigi maldekstrume +page_rotate_ccw_label=Rotaciigi maldekstrume + +cursor_text_select_tool.title=Aktivigi tekstan elektilon +cursor_text_select_tool_label=Teksta elektilo +cursor_hand_tool.title=Aktivigi ilon de mano +cursor_hand_tool_label=Ilo de mano + +scroll_page.title=Uzi ŝovadon de paĝo +scroll_page_label=Ŝovado de paĝo +scroll_vertical.title=Uzi vertikalan ŝovadon +scroll_vertical_label=Vertikala ŝovado +scroll_horizontal.title=Uzi horizontalan ŝovadon +scroll_horizontal_label=Horizontala ŝovado +scroll_wrapped.title=Uzi ambaŭdirektan ŝovadon +scroll_wrapped_label=Ambaŭdirekta ŝovado + +spread_none.title=Ne montri paĝojn po du +spread_none_label=Unupaĝa vido +spread_odd.title=Kunigi paĝojn komencante per nepara paĝo +spread_odd_label=Po du paĝoj, neparaj maldekstre +spread_even.title=Kunigi paĝojn komencante per para paĝo +spread_even_label=Po du paĝoj, paraj maldekstre + +# Document properties dialog box +document_properties.title=Atributoj de dokumento… +document_properties_label=Atributoj de dokumento… +document_properties_file_name=Nomo de dosiero: +document_properties_file_size=Grando de dosiero: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KO ({{size_b}} oktetoj) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MO ({{size_b}} oktetoj) +document_properties_title=Titolo: +document_properties_author=Aŭtoro: +document_properties_subject=Temo: +document_properties_keywords=Ŝlosilvorto: +document_properties_creation_date=Dato de kreado: +document_properties_modification_date=Dato de modifo: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Kreinto: +document_properties_producer=Produktinto de PDF: +document_properties_version=Versio de PDF: +document_properties_page_count=Nombro de paĝoj: +document_properties_page_size=Grando de paĝo: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertikala +document_properties_page_size_orientation_landscape=horizontala +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letera +document_properties_page_size_name_legal=Jura +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Rapida tekstaĵa vido: +document_properties_linearized_yes=Jes +document_properties_linearized_no=Ne +document_properties_close=Fermi + +print_progress_message=Preparo de dokumento por presi ĝin … +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Nuligi + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Montri/kaŝi flankan strion +toggle_sidebar_notification2.title=Montri/kaŝi flankan strion (la dokumento enhavas konturon/kunsendaĵojn/tavolojn) +toggle_sidebar_label=Montri/kaŝi flankan strion +document_outline.title=Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn) +document_outline_label=Konturo de dokumento +attachments.title=Montri kunsendaĵojn +attachments_label=Kunsendaĵojn +layers.title=Montri tavolojn (duoble alklaku por remeti ĉiujn tavolojn en la norman staton) +layers_label=Tavoloj +thumbs.title=Montri miniaturojn +thumbs_label=Miniaturoj +current_outline_item.title=Trovi nunan konturan elementon +current_outline_item_label=Nuna kontura elemento +findbar.title=Serĉi en dokumento +findbar_label=Serĉi + +additional_layers=Aldonaj tavoloj +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Paĝo {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Paĝo {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniaturo de paĝo {{page}} + +# Find panel button title and messages +find_input.title=Serĉi +find_input.placeholder=Serĉi en dokumento… +find_previous.title=Serĉi la antaŭan aperon de la frazo +find_previous_label=Malantaŭen +find_next.title=Serĉi la venontan aperon de la frazo +find_next_label=Antaŭen +find_highlight=Elstarigi ĉiujn +find_match_case_label=Distingi inter majuskloj kaj minuskloj +find_match_diacritics_label=Respekti supersignojn +find_entire_word_label=Tutaj vortoj +find_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino +find_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} el {{total}} kongruo +find_match_count[two]={{current}} el {{total}} kongruoj +find_match_count[few]={{current}} el {{total}} kongruoj +find_match_count[many]={{current}} el {{total}} kongruoj +find_match_count[other]={{current}} el {{total}} kongruoj +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Pli ol {{limit}} kongruoj +find_match_count_limit[one]=Pli ol {{limit}} kongruo +find_match_count_limit[two]=Pli ol {{limit}} kongruoj +find_match_count_limit[few]=Pli ol {{limit}} kongruoj +find_match_count_limit[many]=Pli ol {{limit}} kongruoj +find_match_count_limit[other]=Pli ol {{limit}} kongruoj +find_not_found=Frazo ne trovita + +# Error panel labels +error_more_info=Pli da informo +error_less_info=Malpli da informo +error_close=Fermi +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesaĝo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stako: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dosiero: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linio: {{line}} + +# Predefined zoom values +page_scale_width=Larĝo de paĝo +page_scale_fit=Adapti paĝon +page_scale_auto=Aŭtomata skalo +page_scale_actual=Reala grando +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Ŝargado… +loading_error=Okazis eraro dum la ŝargado de la PDF dosiero. +invalid_file_error=Nevalida aŭ difektita PDF dosiero. +missing_file_error=Mankas dosiero PDF. +unexpected_response_error=Neatendita respondo de servilo. + +rendering_error=Okazis eraro dum la montro de la paĝo. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Prinoto: {{type}}] +password_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF. +password_invalid=Nevalida pasvorto. Bonvolu provi denove. +password_ok=Akcepti +password_cancel=Nuligi + +printing_not_supported=Averto: tiu ĉi retumilo ne plene subtenas presadon. +printing_not_ready=Averto: la PDF dosiero ne estas plene ŝargita por presado. +web_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF. + +# Editor +editor_free_text2.title=Teksto +editor_free_text2_label=Teksto +editor_ink2.title=Desegni +editor_ink2_label=Desegni + +free_text2_default_content=Ektajpi… + +# Editor Parameters +editor_free_text_color=Koloro +editor_free_text_size=Grando +editor_ink_color=Koloro +editor_ink_thickness=Dikeco +editor_ink_opacity=Maldiafaneco + +# Editor aria +editor_free_text2_aria_label=Tekstan redaktilon +editor_ink2_aria_label=Desegnan redaktilon +editor_ink_canvas_aria_label=Bildo kreita de uzanto diff --git a/src/assets/pdf-annotation/web/locale/es-AR/viewer.properties b/src/assets/pdf-annotation/web/locale/es-AR/viewer.properties new file mode 100755 index 0000000..3d8fc25 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/es-AR/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=( {{pageNumber}} de {{pagesCount}} ) + +zoom_out.title=Alejar +zoom_out_label=Alejar +zoom_in.title=Acercar +zoom_in_label=Acercar +zoom.title=Zoom +presentation_mode.title=Cambiar a modo presentación +presentation_mode_label=Modo presentación +open_file.title=Abrir archivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +save.title=Guardar +save_label=Guardar +bookmark.title=Vista actual (copiar o abrir en nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Herramientas +tools_label=Herramientas +first_page.title=Ir a primera página +first_page_label=Ir a primera página +last_page.title=Ir a última página +last_page_label=Ir a última página +page_rotate_cw.title=Rotar horario +page_rotate_cw_label=Rotar horario +page_rotate_ccw.title=Rotar antihorario +page_rotate_ccw_label=Rotar antihorario + +cursor_text_select_tool.title=Habilitar herramienta de selección de texto +cursor_text_select_tool_label=Herramienta de selección de texto +cursor_hand_tool.title=Habilitar herramienta mano +cursor_hand_tool_label=Herramienta mano + +scroll_page.title=Usar desplazamiento de página +scroll_page_label=Desplazamiento de página +scroll_vertical.title=Usar desplazamiento vertical +scroll_vertical_label=Desplazamiento vertical +scroll_horizontal.title=Usar desplazamiento vertical +scroll_horizontal_label=Desplazamiento horizontal +scroll_wrapped.title=Usar desplazamiento encapsulado +scroll_wrapped_label=Desplazamiento encapsulado + +spread_none.title=No unir páginas dobles +spread_none_label=Sin dobles +spread_odd.title=Unir páginas dobles comenzando con las impares +spread_odd_label=Dobles impares +spread_even.title=Unir páginas dobles comenzando con las pares +spread_even_label=Dobles pares + +# Document properties dialog box +document_properties.title=Propiedades del documento… +document_properties_label=Propiedades del documento… +document_properties_file_name=Nombre de archivo: +document_properties_file_size=Tamaño de archovo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras clave: +document_properties_creation_date=Fecha de creación: +document_properties_modification_date=Fecha de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=PDF Productor: +document_properties_version=Versión de PDF: +document_properties_page_count=Cantidad de páginas: +document_properties_page_size=Tamaño de página: +document_properties_page_size_unit_inches=en +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=normal +document_properties_page_size_orientation_landscape=apaisado +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista rápida de la Web: +document_properties_linearized_yes=Sí +document_properties_linearized_no=No +document_properties_close=Cerrar + +print_progress_message=Preparando documento para imprimir… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Alternar barra lateral +toggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas) +toggle_sidebar_label=Alternar barra lateral +document_outline.title=Mostrar esquema del documento (doble clic para expandir/colapsar todos los ítems) +document_outline_label=Esquema del documento +attachments.title=Mostrar adjuntos +attachments_label=Adjuntos +layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +layers_label=Capas +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Buscar elemento de esquema actual +current_outline_item_label=Elemento de esquema actual +findbar.title=Buscar en documento +findbar_label=Buscar + +additional_layers=Capas adicionales +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Página {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de página {{page}} + +# Find panel button title and messages +find_input.title=Buscar +find_input.placeholder=Buscar en documento… +find_previous.title=Buscar la aparición anterior de la frase +find_previous_label=Anterior +find_next.title=Buscar la siguiente aparición de la frase +find_next_label=Siguiente +find_highlight=Resaltar todo +find_match_case_label=Coincidir mayúsculas +find_match_diacritics_label=Coincidir diacríticos +find_entire_word_label=Palabras completas +find_reached_top=Inicio de documento alcanzado, continuando desde abajo +find_reached_bottom=Fin de documento alcanzando, continuando desde arriba +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} coincidencias +find_match_count[two]={{current}} de {{total}} coincidencias +find_match_count[few]={{current}} de {{total}} coincidencias +find_match_count[many]={{current}} de {{total}} coincidencias +find_match_count[other]={{current}} de {{total}} coincidencias +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Más de {{limit}} coincidencias +find_match_count_limit[one]=Más de {{limit}} coinciden +find_match_count_limit[two]=Más de {{limit}} coincidencias +find_match_count_limit[few]=Más de {{limit}} coincidencias +find_match_count_limit[many]=Más de {{limit}} coincidencias +find_match_count_limit[other]=Más de {{limit}} coincidencias +find_not_found=Frase no encontrada + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Cerrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaje: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línea: {{line}} + +# Predefined zoom values +page_scale_width=Ancho de página +page_scale_fit=Ajustar página +page_scale_auto=Zoom automático +page_scale_actual=Tamaño real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Cargando… +loading_error=Ocurrió un error al cargar el PDF. +invalid_file_error=Archivo PDF no válido o cocrrupto. +missing_file_error=Archivo PDF faltante. +unexpected_response_error=Respuesta del servidor inesperada. + +rendering_error=Ocurrió un error al dibujar la página. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Anotación] +password_label=Ingrese la contraseña para abrir este archivo PDF +password_invalid=Contraseña inválida. Intente nuevamente. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador. +printing_not_ready=Advertencia: El PDF no está completamente cargado para impresión. +web_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF. + +# Editor +editor_free_text2.title=Texto +editor_free_text2_label=Texto +editor_ink2.title=Dibujar +editor_ink2_label=Dibujar + +free_text2_default_content=Empezar a tipear… + +# Editor Parameters +editor_free_text_color=Color +editor_free_text_size=Tamaño +editor_ink_color=Color +editor_ink_thickness=Espesor +editor_ink_opacity=Opacidad + +# Editor aria +editor_free_text2_aria_label=Editor de texto +editor_ink2_aria_label=Editor de dibujos +editor_ink_canvas_aria_label=Imagen creada por el usuario diff --git a/src/assets/pdf-annotation/web/locale/es-CL/viewer.properties b/src/assets/pdf-annotation/web/locale/es-CL/viewer.properties new file mode 100755 index 0000000..32368b2 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/es-CL/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Alejar +zoom_out_label=Alejar +zoom_in.title=Acercar +zoom_in_label=Acercar +zoom.title=Ampliación +presentation_mode.title=Cambiar al modo de presentación +presentation_mode_label=Modo de presentación +open_file.title=Abrir archivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +save.title=Guardar +save_label=Guardar +bookmark.title=Vista actual (copiar o abrir en nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Herramientas +tools_label=Herramientas +first_page.title=Ir a la primera página +first_page_label=Ir a la primera página +last_page.title=Ir a la última página +last_page_label=Ir a la última página +page_rotate_cw.title=Girar a la derecha +page_rotate_cw_label=Girar a la derecha +page_rotate_ccw.title=Girar a la izquierda +page_rotate_ccw_label=Girar a la izquierda + +cursor_text_select_tool.title=Activar la herramienta de selección de texto +cursor_text_select_tool_label=Herramienta de selección de texto +cursor_hand_tool.title=Activar la herramienta de mano +cursor_hand_tool_label=Herramienta de mano + +scroll_page.title=Usar desplazamiento de página +scroll_page_label=Desplazamiento de página +scroll_vertical.title=Usar desplazamiento vertical +scroll_vertical_label=Desplazamiento vertical +scroll_horizontal.title=Usar desplazamiento horizontal +scroll_horizontal_label=Desplazamiento horizontal +scroll_wrapped.title=Usar desplazamiento en bloque +scroll_wrapped_label=Desplazamiento en bloque + +spread_none.title=No juntar páginas a modo de libro +spread_none_label=Vista de una página +spread_odd.title=Junta las páginas partiendo con una de número impar +spread_odd_label=Vista de libro impar +spread_even.title=Junta las páginas partiendo con una de número par +spread_even_label=Vista de libro par + +# Document properties dialog box +document_properties.title=Propiedades del documento… +document_properties_label=Propiedades del documento… +document_properties_file_name=Nombre de archivo: +document_properties_file_size=Tamaño del archivo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras clave: +document_properties_creation_date=Fecha de creación: +document_properties_modification_date=Fecha de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Productor del PDF: +document_properties_version=Versión de PDF: +document_properties_page_count=Cantidad de páginas: +document_properties_page_size=Tamaño de la página: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=horizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Oficio +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista rápida en Web: +document_properties_linearized_yes=Sí +document_properties_linearized_no=No +document_properties_close=Cerrar + +print_progress_message=Preparando documento para impresión… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Barra lateral +toggle_sidebar_notification2.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos/capas) +toggle_sidebar_label=Mostrar u ocultar la barra lateral +document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos) +document_outline_label=Esquema del documento +attachments.title=Mostrar adjuntos +attachments_label=Adjuntos +layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +layers_label=Capas +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Buscar elemento de esquema actual +current_outline_item_label=Elemento de esquema actual +findbar.title=Buscar en el documento +findbar_label=Buscar + +additional_layers=Capas adicionales +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Página {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la página {{page}} + +# Find panel button title and messages +find_input.title=Encontrar +find_input.placeholder=Encontrar en el documento… +find_previous.title=Buscar la aparición anterior de la frase +find_previous_label=Previo +find_next.title=Buscar la siguiente aparición de la frase +find_next_label=Siguiente +find_highlight=Destacar todos +find_match_case_label=Coincidir mayús./minús. +find_match_diacritics_label=Coincidir diacríticos +find_entire_word_label=Palabras completas +find_reached_top=Se alcanzó el inicio del documento, continuando desde el final +find_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=Coincidencia {{current}} de {{total}} +find_match_count[two]=Coincidencia {{current}} de {{total}} +find_match_count[few]=Coincidencia {{current}} de {{total}} +find_match_count[many]=Coincidencia {{current}} de {{total}} +find_match_count[other]=Coincidencia {{current}} de {{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Más de {{limit}} coincidencias +find_match_count_limit[one]=Más de {{limit}} coincidencia +find_match_count_limit[two]=Más de {{limit}} coincidencias +find_match_count_limit[few]=Más de {{limit}} coincidencias +find_match_count_limit[many]=Más de {{limit}} coincidencias +find_match_count_limit[other]=Más de {{limit}} coincidencias +find_not_found=Frase no encontrada + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Cerrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilación: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaje: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línea: {{line}} + +# Predefined zoom values +page_scale_width=Ancho de página +page_scale_fit=Ajuste de página +page_scale_auto=Aumento automático +page_scale_actual=Tamaño actual +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Cargando… +loading_error=Ocurrió un error al cargar el PDF. +invalid_file_error=Archivo PDF inválido o corrupto. +missing_file_error=Falta el archivo PDF. +unexpected_response_error=Respuesta del servidor inesperada. + +rendering_error=Ocurrió un error al renderizar la página. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Anotación] +password_label=Ingrese la contraseña para abrir este archivo PDF. +password_invalid=Contraseña inválida. Por favor, vuelve a intentarlo. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Advertencia: Imprimir no está soportado completamente por este navegador. +printing_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso. +web_fonts_disabled=Las tipografías web están desactivadas: imposible usar las fuentes PDF embebidas. + +# Editor +editor_free_text2.title=Texto +editor_free_text2_label=Texto +editor_ink2.title=Dibujar +editor_ink2_label=Dibujar + +free_text2_default_content=Empieza a escribir… + +# Editor Parameters +editor_free_text_color=Color +editor_free_text_size=Tamaño +editor_ink_color=Color +editor_ink_thickness=Grosor +editor_ink_opacity=Opacidad + +# Editor aria +editor_free_text2_aria_label=Editor de texto +editor_ink2_aria_label=Editor de dibujos +editor_ink_canvas_aria_label=Imagen creada por el usuario diff --git a/src/assets/pdf-annotation/web/locale/es-ES/viewer.properties b/src/assets/pdf-annotation/web/locale/es-ES/viewer.properties new file mode 100755 index 0000000..4b71870 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/es-ES/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reducir +zoom_out_label=Reducir +zoom_in.title=Aumentar +zoom_in_label=Aumentar +zoom.title=Tamaño +presentation_mode.title=Cambiar al modo presentación +presentation_mode_label=Modo presentación +open_file.title=Abrir archivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +save.title=Guardar +save_label=Guardar +bookmark.title=Vista actual (copiar o abrir en una nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Herramientas +tools_label=Herramientas +first_page.title=Ir a la primera página +first_page_label=Ir a la primera página +last_page.title=Ir a la última página +last_page_label=Ir a la última página +page_rotate_cw.title=Rotar en sentido horario +page_rotate_cw_label=Rotar en sentido horario +page_rotate_ccw.title=Rotar en sentido antihorario +page_rotate_ccw_label=Rotar en sentido antihorario + +cursor_text_select_tool.title=Activar herramienta de selección de texto +cursor_text_select_tool_label=Herramienta de selección de texto +cursor_hand_tool.title=Activar herramienta de mano +cursor_hand_tool_label=Herramienta de mano + +scroll_page.title=Usar desplazamiento de página +scroll_page_label=Desplazamiento de página +scroll_vertical.title=Usar desplazamiento vertical +scroll_vertical_label=Desplazamiento vertical +scroll_horizontal.title=Usar desplazamiento horizontal +scroll_horizontal_label=Desplazamiento horizontal +scroll_wrapped.title=Usar desplazamiento en bloque +scroll_wrapped_label=Desplazamiento en bloque + +spread_none.title=No juntar páginas en vista de libro +spread_none_label=Vista de libro +spread_odd.title=Juntar las páginas partiendo de una con número impar +spread_odd_label=Vista de libro impar +spread_even.title=Juntar las páginas partiendo de una con número par +spread_even_label=Vista de libro par + +# Document properties dialog box +document_properties.title=Propiedades del documento… +document_properties_label=Propiedades del documento… +document_properties_file_name=Nombre de archivo: +document_properties_file_size=Tamaño de archivo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras clave: +document_properties_creation_date=Fecha de creación: +document_properties_modification_date=Fecha de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Productor PDF: +document_properties_version=Versión PDF: +document_properties_page_count=Número de páginas: +document_properties_page_size=Tamaño de la página: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=horizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista rápida de la web: +document_properties_linearized_yes=Sí +document_properties_linearized_no=No +document_properties_close=Cerrar + +print_progress_message=Preparando documento para impresión… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Cambiar barra lateral +toggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas) +toggle_sidebar_label=Cambiar barra lateral +document_outline.title=Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos) +document_outline_label=Resumen de documento +attachments.title=Mostrar adjuntos +attachments_label=Adjuntos +layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +layers_label=Capas +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Encontrar elemento de esquema actual +current_outline_item_label=Elemento de esquema actual +findbar.title=Buscar en el documento +findbar_label=Buscar + +additional_layers=Capas adicionales +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Página {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la página {{page}} + +# Find panel button title and messages +find_input.title=Buscar +find_input.placeholder=Buscar en el documento… +find_previous.title=Encontrar la anterior aparición de la frase +find_previous_label=Anterior +find_next.title=Encontrar la siguiente aparición de esta frase +find_next_label=Siguiente +find_highlight=Resaltar todos +find_match_case_label=Coincidencia de mayús./minús. +find_match_diacritics_label=Coincidir diacríticos +find_entire_word_label=Palabras completas +find_reached_top=Se alcanzó el inicio del documento, se continúa desde el final +find_reached_bottom=Se alcanzó el final del documento, se continúa desde el inicio +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} coincidencia +find_match_count[two]={{current}} de {{total}} coincidencias +find_match_count[few]={{current}} de {{total}} coincidencias +find_match_count[many]={{current}} de {{total}} coincidencias +find_match_count[other]={{current}} de {{total}} coincidencias +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Más de {{limit}} coincidencias +find_match_count_limit[one]=Más de {{limit}} coincidencia +find_match_count_limit[two]=Más de {{limit}} coincidencias +find_match_count_limit[few]=Más de {{limit}} coincidencias +find_match_count_limit[many]=Más de {{limit}} coincidencias +find_match_count_limit[other]=Más de {{limit}} coincidencias +find_not_found=Frase no encontrada + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Cerrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaje: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línea: {{line}} + +# Predefined zoom values +page_scale_width=Anchura de la página +page_scale_fit=Ajuste de la página +page_scale_auto=Tamaño automático +page_scale_actual=Tamaño real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Cargando… +loading_error=Ocurrió un error al cargar el PDF. +invalid_file_error=Fichero PDF no válido o corrupto. +missing_file_error=No hay fichero PDF. +unexpected_response_error=Respuesta inesperada del servidor. + +rendering_error=Ocurrió un error al renderizar la página. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotación {{type}}] +password_label=Introduzca la contraseña para abrir este archivo PDF. +password_invalid=Contraseña no válida. Vuelva a intentarlo. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Advertencia: Imprimir no está totalmente soportado por este navegador. +printing_not_ready=Advertencia: Este PDF no se ha cargado completamente para poder imprimirse. +web_fonts_disabled=Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas. + +# Editor +editor_free_text2.title=Texto +editor_free_text2_label=Texto +editor_ink2.title=Dibujar +editor_ink2_label=Dibujar + +free_text2_default_content=Empezar a escribir… + +# Editor Parameters +editor_free_text_color=Color +editor_free_text_size=Tamaño +editor_ink_color=Color +editor_ink_thickness=Grosor +editor_ink_opacity=Opacidad + +# Editor aria +editor_free_text2_aria_label=Editor de texto +editor_ink2_aria_label=Editor de dibujos +editor_ink_canvas_aria_label=Imagen creada por el usuario diff --git a/src/assets/pdf-annotation/web/locale/es-MX/viewer.properties b/src/assets/pdf-annotation/web/locale/es-MX/viewer.properties new file mode 100755 index 0000000..68d8b07 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/es-MX/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reducir +zoom_out_label=Reducir +zoom_in.title=Aumentar +zoom_in_label=Aumentar +zoom.title=Zoom +presentation_mode.title=Cambiar al modo presentación +presentation_mode_label=Modo presentación +open_file.title=Abrir archivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +save.title=Guardar +save_label=Guardar +bookmark.title=Vista actual (copiar o abrir en una nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Herramientas +tools_label=Herramientas +first_page.title=Ir a la primera página +first_page_label=Ir a la primera página +last_page.title=Ir a la última página +last_page_label=Ir a la última página +page_rotate_cw.title=Girar a la derecha +page_rotate_cw_label=Girar a la derecha +page_rotate_ccw.title=Girar a la izquierda +page_rotate_ccw_label=Girar a la izquierda + +cursor_text_select_tool.title=Activar la herramienta de selección de texto +cursor_text_select_tool_label=Herramienta de selección de texto +cursor_hand_tool.title=Activar la herramienta de mano +cursor_hand_tool_label=Herramienta de mano + +scroll_page.title=Usar desplazamiento de página +scroll_page_label=Desplazamiento de página +scroll_vertical.title=Usar desplazamiento vertical +scroll_vertical_label=Desplazamiento vertical +scroll_horizontal.title=Usar desplazamiento horizontal +scroll_horizontal_label=Desplazamiento horizontal +scroll_wrapped.title=Usar desplazamiento encapsulado +scroll_wrapped_label=Desplazamiento encapsulado + +spread_none.title=No unir páginas separadas +spread_none_label=Vista de una página +spread_odd.title=Unir las páginas partiendo con una de número impar +spread_odd_label=Vista de libro impar +spread_even.title=Juntar las páginas partiendo con una de número par +spread_even_label=Vista de libro par + +# Document properties dialog box +document_properties.title=Propiedades del documento… +document_properties_label=Propiedades del documento… +document_properties_file_name=Nombre del archivo: +document_properties_file_size=Tamaño del archivo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras claves: +document_properties_creation_date=Fecha de creación: +document_properties_modification_date=Fecha de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Productor PDF: +document_properties_version=Versión PDF: +document_properties_page_count=Número de páginas: +document_properties_page_size=Tamaño de la página: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=horizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Oficio +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista rápida de la web: +document_properties_linearized_yes=Sí +document_properties_linearized_no=No +document_properties_close=Cerrar + +print_progress_message=Preparando documento para impresión… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Cambiar barra lateral +toggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas) +toggle_sidebar_label=Cambiar barra lateral +document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos) +document_outline_label=Esquema del documento +attachments.title=Mostrar adjuntos +attachments_label=Adjuntos +layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado) +layers_label=Capas +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Buscar elemento de esquema actual +current_outline_item_label=Elemento de esquema actual +findbar.title=Buscar en el documento +findbar_label=Buscar + +additional_layers=Capas adicionales +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Página {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la página {{page}} + +# Find panel button title and messages +find_input.title=Buscar +find_input.placeholder=Buscar en el documento… +find_previous.title=Ir a la anterior frase encontrada +find_previous_label=Anterior +find_next.title=Ir a la siguiente frase encontrada +find_next_label=Siguiente +find_highlight=Resaltar todo +find_match_case_label=Coincidir con mayúsculas y minúsculas +find_match_diacritics_label=Coincidir diacríticos +find_entire_word_label=Palabras completas +find_reached_top=Se alcanzó el inicio del documento, se buscará al final +find_reached_bottom=Se alcanzó el final del documento, se buscará al inicio +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} coincidencia +find_match_count[two]={{current}} de {{total}} coincidencias +find_match_count[few]={{current}} de {{total}} coincidencias +find_match_count[many]={{current}} de {{total}} coincidencias +find_match_count[other]={{current}} de {{total}} coincidencias +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Más de {{limit}} coincidencias +find_match_count_limit[one]=Más de {{limit}} coinciden +find_match_count_limit[two]=Más de {{limit}} coincidencias +find_match_count_limit[few]=Más de {{limit}} coincidencias +find_match_count_limit[many]=Más de {{limit}} coincidencias +find_match_count_limit[other]=Más de {{limit}} coincidencias +find_not_found=No se encontró la frase + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Cerrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaje: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línea: {{line}} + +# Predefined zoom values +page_scale_width=Ancho de página +page_scale_fit=Ajustar página +page_scale_auto=Zoom automático +page_scale_actual=Tamaño real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Cargando… +loading_error=Un error ocurrió al cargar el PDF. +invalid_file_error=Archivo PDF invalido o dañado. +missing_file_error=Archivo PDF no encontrado. +unexpected_response_error=Respuesta inesperada del servidor. + +rendering_error=Un error ocurrió al renderizar la página. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} anotación] +password_label=Ingresa la contraseña para abrir este archivo PDF. +password_invalid=Contraseña inválida. Por favor intenta de nuevo. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador. +printing_not_ready=Advertencia: El PDF no cargo completamente para impresión. +web_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas. + +# Editor +editor_free_text2.title=Texto +editor_free_text2_label=Texto +editor_ink2.title=Dibujar +editor_ink2_label=Dibujar + +free_text2_default_content=Empieza a escribir… + +# Editor Parameters +editor_free_text_color=Color +editor_free_text_size=Tamaño +editor_ink_color=Color +editor_ink_thickness=Grossor +editor_ink_opacity=Opacidad + +# Editor aria +editor_free_text2_aria_label=Editor de texto +editor_ink2_aria_label=Editor de dibujo +editor_ink_canvas_aria_label=Imagen creada por el usuario diff --git a/src/assets/pdf-annotation/web/locale/et/viewer.properties b/src/assets/pdf-annotation/web/locale/et/viewer.properties new file mode 100755 index 0000000..1af8a40 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/et/viewer.properties @@ -0,0 +1,262 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Eelmine lehekülg +previous_label=Eelmine +next.title=Järgmine lehekülg +next_label=Järgmine + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Leht +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}}/{{pagesCount}}) + +zoom_out.title=Vähenda +zoom_out_label=Vähenda +zoom_in.title=Suurenda +zoom_in_label=Suurenda +zoom.title=Suurendamine +presentation_mode.title=Lülitu esitlusrežiimi +presentation_mode_label=Esitlusrežiim +open_file.title=Ava fail +open_file_label=Ava +print.title=Prindi +print_label=Prindi +download.title=Laadi alla +download_label=Laadi alla +bookmark.title=Praegune vaade (kopeeri või ava uues aknas) +bookmark_label=Praegune vaade + +# Secondary toolbar and context menu +tools.title=Tööriistad +tools_label=Tööriistad +first_page.title=Mine esimesele leheküljele +first_page_label=Mine esimesele leheküljele +last_page.title=Mine viimasele leheküljele +last_page_label=Mine viimasele leheküljele +page_rotate_cw.title=Pööra päripäeva +page_rotate_cw_label=Pööra päripäeva +page_rotate_ccw.title=Pööra vastupäeva +page_rotate_ccw_label=Pööra vastupäeva + +cursor_text_select_tool.title=Luba teksti valimise tööriist +cursor_text_select_tool_label=Teksti valimise tööriist +cursor_hand_tool.title=Luba sirvimistööriist +cursor_hand_tool_label=Sirvimistööriist + +scroll_page.title=Kasutatakse lehe kaupa kerimist +scroll_page_label=Lehe kaupa kerimine +scroll_vertical.title=Kasuta vertikaalset kerimist +scroll_vertical_label=Vertikaalne kerimine +scroll_horizontal.title=Kasuta horisontaalset kerimist +scroll_horizontal_label=Horisontaalne kerimine +scroll_wrapped.title=Kasuta rohkem mahutavat kerimist +scroll_wrapped_label=Rohkem mahutav kerimine + +spread_none.title=Ära kõrvuta lehekülgi +spread_none_label=Lehtede kõrvutamine puudub +spread_odd.title=Kõrvuta leheküljed, alustades paaritute numbritega lehekülgedega +spread_odd_label=Kõrvutamine paaritute numbritega alustades +spread_even.title=Kõrvuta leheküljed, alustades paarisnumbritega lehekülgedega +spread_even_label=Kõrvutamine paarisnumbritega alustades + +# Document properties dialog box +document_properties.title=Dokumendi omadused… +document_properties_label=Dokumendi omadused… +document_properties_file_name=Faili nimi: +document_properties_file_size=Faili suurus: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KiB ({{size_b}} baiti) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MiB ({{size_b}} baiti) +document_properties_title=Pealkiri: +document_properties_author=Autor: +document_properties_subject=Teema: +document_properties_keywords=Märksõnad: +document_properties_creation_date=Loodud: +document_properties_modification_date=Muudetud: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Looja: +document_properties_producer=Generaator: +document_properties_version=Generaatori versioon: +document_properties_page_count=Lehekülgi: +document_properties_page_size=Lehe suurus: +document_properties_page_size_unit_inches=tolli +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertikaalpaigutus +document_properties_page_size_orientation_landscape=rõhtpaigutus +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized="Fast Web View" tugi: +document_properties_linearized_yes=Jah +document_properties_linearized_no=Ei +document_properties_close=Sulge + +print_progress_message=Dokumendi ettevalmistamine printimiseks… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Loobu + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Näita külgriba +toggle_sidebar_notification2.title=Näita külgriba (dokument sisaldab sisukorda/manuseid/kihte) +toggle_sidebar_label=Näita külgriba +document_outline.title=Näita sisukorda (kõigi punktide laiendamiseks/ahendamiseks topeltklõpsa) +document_outline_label=Näita sisukorda +attachments.title=Näita manuseid +attachments_label=Manused +layers.title=Näita kihte (kõikide kihtide vaikeolekusse lähtestamiseks topeltklõpsa) +layers_label=Kihid +thumbs.title=Näita pisipilte +thumbs_label=Pisipildid +current_outline_item.title=Otsi üles praegune kontuuriüksus +current_outline_item_label=Praegune kontuuriüksus +findbar.title=Otsi dokumendist +findbar_label=Otsi + +additional_layers=Täiendavad kihid +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Lehekülg {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}. lehekülg +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. lehekülje pisipilt + +# Find panel button title and messages +find_input.title=Otsi +find_input.placeholder=Otsi dokumendist… +find_previous.title=Otsi fraasi eelmine esinemiskoht +find_previous_label=Eelmine +find_next.title=Otsi fraasi järgmine esinemiskoht +find_next_label=Järgmine +find_highlight=Too kõik esile +find_match_case_label=Tõstutundlik +find_match_diacritics_label=Otsitakse diakriitiliselt +find_entire_word_label=Täissõnad +find_reached_top=Jõuti dokumendi algusesse, jätkati lõpust +find_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=vaste {{current}}/{{total}} +find_match_count[two]=vaste {{current}}/{{total}} +find_match_count[few]=vaste {{current}}/{{total}} +find_match_count[many]=vaste {{current}}/{{total}} +find_match_count[other]=vaste {{current}}/{{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Rohkem kui {{limit}} vastet +find_match_count_limit[one]=Rohkem kui {{limit}} vaste +find_match_count_limit[two]=Rohkem kui {{limit}} vastet +find_match_count_limit[few]=Rohkem kui {{limit}} vastet +find_match_count_limit[many]=Rohkem kui {{limit}} vastet +find_match_count_limit[other]=Rohkem kui {{limit}} vastet +find_not_found=Fraasi ei leitud + +# Error panel labels +error_more_info=Rohkem teavet +error_less_info=Vähem teavet +error_close=Sulge +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Teade: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fail: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rida: {{line}} +rendering_error=Lehe renderdamisel esines viga. + +# Predefined zoom values +page_scale_width=Mahuta laiusele +page_scale_fit=Mahuta leheküljele +page_scale_auto=Automaatne suurendamine +page_scale_actual=Tegelik suurus +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Laadimine… +loading_error=PDFi laadimisel esines viga. +invalid_file_error=Vigane või rikutud PDF-fail. +missing_file_error=PDF-fail puudub. +unexpected_response_error=Ootamatu vastus serverilt. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=PDF-faili avamiseks sisesta parool. +password_invalid=Vigane parool. Palun proovi uuesti. +password_ok=Sobib +password_cancel=Loobu + +printing_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud. +printing_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud. +web_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada. + +# Editor +editor_none.title=Keela annotatsioonide muutmine +editor_none_label=Keela muutmine +editor_free_text.title=Lisa vabateksti annotatsioon +editor_free_text_label=Vabateksti annotatsioon +editor_ink.title=Lisa tindiannotatsioon +editor_ink_label=Tindiannotatsioon + +free_text_default_content=Sisesta tekst… + diff --git a/src/assets/pdf-annotation/web/locale/eu/viewer.properties b/src/assets/pdf-annotation/web/locale/eu/viewer.properties new file mode 100755 index 0000000..c60ab93 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/eu/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Aurreko orria +previous_label=Aurrekoa +next.title=Hurrengo orria +next_label=Hurrengoa + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Orria +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages={{pagesCount}}/{{pageNumber}} + +zoom_out.title=Urrundu zooma +zoom_out_label=Urrundu zooma +zoom_in.title=Gerturatu zooma +zoom_in_label=Gerturatu zooma +zoom.title=Zooma +presentation_mode.title=Aldatu aurkezpen modura +presentation_mode_label=Arkezpen modua +open_file.title=Ireki fitxategia +open_file_label=Ireki +print.title=Inprimatu +print_label=Inprimatu +download.title=Deskargatu +download_label=Deskargatu +save.title=Gorde +save_label=Gorde +bookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian) +bookmark_label=Uneko ikuspegia + +# Secondary toolbar and context menu +tools.title=Tresnak +tools_label=Tresnak +first_page.title=Joan lehen orrira +first_page_label=Joan lehen orrira +last_page.title=Joan azken orrira +last_page_label=Joan azken orrira +page_rotate_cw.title=Biratu erlojuaren norantzan +page_rotate_cw_label=Biratu erlojuaren norantzan +page_rotate_ccw.title=Biratu erlojuaren aurkako norantzan +page_rotate_ccw_label=Biratu erlojuaren aurkako norantzan + +cursor_text_select_tool.title=Gaitu testuaren hautapen tresna +cursor_text_select_tool_label=Testuaren hautapen tresna +cursor_hand_tool.title=Gaitu eskuaren tresna +cursor_hand_tool_label=Eskuaren tresna + +scroll_page.title=Erabili orriaren korritzea +scroll_page_label=Orriaren korritzea +scroll_vertical.title=Erabili korritze bertikala +scroll_vertical_label=Korritze bertikala +scroll_horizontal.title=Erabili korritze horizontala +scroll_horizontal_label=Korritze horizontala +scroll_wrapped.title=Erabili korritze egokitua +scroll_wrapped_label=Korritze egokitua + +spread_none.title=Ez elkartu barreiatutako orriak +spread_none_label=Barreiatzerik ez +spread_odd.title=Elkartu barreiatutako orriak bakoiti zenbakidunekin hasita +spread_odd_label=Barreiatze bakoitia +spread_even.title=Elkartu barreiatutako orriak bikoiti zenbakidunekin hasita +spread_even_label=Barreiatze bikoitia + +# Document properties dialog box +document_properties.title=Dokumentuaren propietateak… +document_properties_label=Dokumentuaren propietateak… +document_properties_file_name=Fitxategi-izena: +document_properties_file_size=Fitxategiaren tamaina: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Izenburua: +document_properties_author=Egilea: +document_properties_subject=Gaia: +document_properties_keywords=Gako-hitzak: +document_properties_creation_date=Sortze-data: +document_properties_modification_date=Aldatze-data: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Sortzailea: +document_properties_producer=PDFaren ekoizlea: +document_properties_version=PDF bertsioa: +document_properties_page_count=Orrialde kopurua: +document_properties_page_size=Orriaren tamaina: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=bertikala +document_properties_page_size_orientation_landscape=horizontala +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Gutuna +document_properties_page_size_name_legal=Legala +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Webeko ikuspegi bizkorra: +document_properties_linearized_yes=Bai +document_properties_linearized_no=Ez +document_properties_close=Itxi + +print_progress_message=Dokumentua inprimatzeko prestatzen… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent=%{{progress}} +print_progress_close=Utzi + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Txandakatu alboko barra +toggle_sidebar_notification2.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak/geruzak ditu) +toggle_sidebar_label=Txandakatu alboko barra +document_outline.title=Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko) +document_outline_label=Dokumentuaren eskema +attachments.title=Erakutsi eranskinak +attachments_label=Eranskinak +layers.title=Erakutsi geruzak (klik bikoitza geruza guztiak egoera lehenetsira berrezartzeko) +layers_label=Geruzak +thumbs.title=Erakutsi koadro txikiak +thumbs_label=Koadro txikiak +current_outline_item.title=Bilatu uneko eskemaren elementua +current_outline_item_label=Uneko eskemaren elementua +findbar.title=Bilatu dokumentuan +findbar_label=Bilatu + +additional_layers=Geruza gehigarriak +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark={{page}}. orria +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}. orria +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. orriaren koadro txikia + +# Find panel button title and messages +find_input.title=Bilatu +find_input.placeholder=Bilatu dokumentuan… +find_previous.title=Bilatu esaldiaren aurreko parekatzea +find_previous_label=Aurrekoa +find_next.title=Bilatu esaldiaren hurrengo parekatzea +find_next_label=Hurrengoa +find_highlight=Nabarmendu guztia +find_match_case_label=Bat etorri maiuskulekin/minuskulekin +find_match_diacritics_label=Bereizi diakritikoak +find_entire_word_label=Hitz osoak +find_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen +find_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}}/{{current}}. bat etortzea +find_match_count[two]={{total}}/{{current}}. bat etortzea +find_match_count[few]={{total}}/{{current}}. bat etortzea +find_match_count[many]={{total}}/{{current}}. bat etortzea +find_match_count[other]={{total}}/{{current}}. bat etortzea +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} bat-etortze baino gehiago +find_match_count_limit[one]=Bat-etortze {{limit}} baino gehiago +find_match_count_limit[two]={{limit}} bat-etortze baino gehiago +find_match_count_limit[few]={{limit}} bat-etortze baino gehiago +find_match_count_limit[many]={{limit}} bat-etortze baino gehiago +find_match_count_limit[other]={{limit}} bat-etortze baino gehiago +find_not_found=Esaldia ez da aurkitu + +# Error panel labels +error_more_info=Informazio gehiago +error_less_info=Informazio gutxiago +error_close=Itxi +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (eraikuntza: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mezua: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fitxategia: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lerroa: {{line}} + +# Predefined zoom values +page_scale_width=Orriaren zabalera +page_scale_fit=Doitu orrira +page_scale_auto=Zoom automatikoa +page_scale_actual=Benetako tamaina +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent=%{{scale}} + +# Loading indicator messages +loading=Kargatzen… +loading_error=Errorea gertatu da PDFa kargatzean. +invalid_file_error=PDF fitxategi baliogabe edo hondatua. +missing_file_error=PDF fitxategia falta da. +unexpected_response_error=Espero gabeko zerbitzariaren erantzuna. + +rendering_error=Errorea gertatu da orria errendatzean. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ohartarazpena] +password_label=Idatzi PDF fitxategi hau irekitzeko pasahitza. +password_invalid=Pasahitz baliogabea. Saiatu berriro mesedez. +password_ok=Ados +password_cancel=Utzi + +printing_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan. +printing_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko. +web_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili. + +# Editor +editor_free_text2.title=Testua +editor_free_text2_label=Testua +editor_ink2.title=Marrazkia +editor_ink2_label=Marrazkia + +free_text2_default_content=Hasi idazten… + +# Editor Parameters +editor_free_text_color=Kolorea +editor_free_text_size=Tamaina +editor_ink_color=Kolorea +editor_ink_thickness=Loditasuna +editor_ink_opacity=Opakutasuna + +# Editor aria +editor_free_text2_aria_label=Testu-editorea +editor_ink2_aria_label=Marrazki-editorea +editor_ink_canvas_aria_label=Erabiltzaileak sortutako irudia diff --git a/src/assets/pdf-annotation/web/locale/fa/viewer.properties b/src/assets/pdf-annotation/web/locale/fa/viewer.properties new file mode 100755 index 0000000..f39748d --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/fa/viewer.properties @@ -0,0 +1,216 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=صفحهٔ قبلی +previous_label=قبلی +next.title=صفحهٔ بعدی +next_label=بعدی + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=صفحه +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=از {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}}از {{pagesCount}}) + +zoom_out.title=کوچک‌نمایی +zoom_out_label=کوچک‌نمایی +zoom_in.title=بزرگ‌نمایی +zoom_in_label=بزرگ‌نمایی +zoom.title=زوم +presentation_mode.title=تغییر به حالت ارائه +presentation_mode_label=حالت ارائه +open_file.title=باز کردن پرونده +open_file_label=باز کردن +print.title=چاپ +print_label=چاپ +download.title=بارگیری +download_label=بارگیری +bookmark.title=نمای فعلی (رونوشت و یا نشان دادن در پنجره جدید) +bookmark_label=نمای فعلی + +# Secondary toolbar and context menu +tools.title=ابزارها +tools_label=ابزارها +first_page.title=برو به اولین صفحه +first_page_label=برو به اولین صفحه +last_page.title=برو به آخرین صفحه +last_page_label=برو به آخرین صفحه +page_rotate_cw.title=چرخش ساعتگرد +page_rotate_cw_label=چرخش ساعتگرد +page_rotate_ccw.title=چرخش پاد ساعتگرد +page_rotate_ccw_label=چرخش پاد ساعتگرد + +cursor_text_select_tool.title=فعال کردن ابزارِ انتخابِ متن +cursor_text_select_tool_label=ابزارِ انتخابِ متن +cursor_hand_tool.title=فعال کردن ابزارِ دست +cursor_hand_tool_label=ابزار دست + +scroll_vertical.title=استفاده از پیمایش عمودی +scroll_vertical_label=پیمایش عمودی +scroll_horizontal.title=استفاده از پیمایش افقی +scroll_horizontal_label=پیمایش افقی + + +# Document properties dialog box +document_properties.title=خصوصیات سند... +document_properties_label=خصوصیات سند... +document_properties_file_name=نام فایل: +document_properties_file_size=حجم پرونده: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} کیلوبایت ({{size_b}} بایت) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} مگابایت ({{size_b}} بایت) +document_properties_title=عنوان: +document_properties_author=نویسنده: +document_properties_subject=موضوع: +document_properties_keywords=کلیدواژه‌ها: +document_properties_creation_date=تاریخ ایجاد: +document_properties_modification_date=تاریخ ویرایش: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}، {{time}} +document_properties_creator=ایجاد کننده: +document_properties_producer=ایجاد کننده PDF: +document_properties_version=نسخه PDF: +document_properties_page_count=تعداد صفحات: +document_properties_page_size=اندازه صفحه: +document_properties_page_size_unit_inches=اینچ +document_properties_page_size_unit_millimeters=میلی‌متر +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=نامه +document_properties_page_size_name_legal=حقوقی +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized_yes=بله +document_properties_linearized_no=خیر +document_properties_close=بستن + +print_progress_message=آماده سازی مدارک برای چاپ کردن… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=لغو + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=باز و بسته کردن نوار کناری +toggle_sidebar_label=تغییرحالت نوارکناری +document_outline.title=نمایش رئوس مطالب مدارک(برای بازشدن/جمع شدن همه موارد دوبار کلیک کنید) +document_outline_label=طرح نوشتار +attachments.title=نمایش پیوست‌ها +attachments_label=پیوست‌ها +thumbs.title=نمایش تصاویر بندانگشتی +thumbs_label=تصاویر بندانگشتی +findbar.title=جستجو در سند +findbar_label=پیدا کردن + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=صفحه {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}} + +# Find panel button title and messages +find_input.title=پیدا کردن +find_input.placeholder=پیدا کردن در سند… +find_previous.title=پیدا کردن رخداد قبلی عبارت +find_previous_label=قبلی +find_next.title=پیدا کردن رخداد بعدی عبارت +find_next_label=بعدی +find_highlight=برجسته و هایلایت کردن همه موارد +find_match_case_label=تطبیق کوچکی و بزرگی حروف +find_entire_word_label=تمام کلمه‌ها +find_reached_top=به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم +find_reached_bottom=به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count[one]={{current}} از {{total}} مطابقت دارد +find_match_count[two]={{current}} از {{total}} مطابقت دارد +find_match_count[few]={{current}} از {{total}} مطابقت دارد +find_match_count[many]={{current}} از {{total}} مطابقت دارد +find_match_count[other]={{current}} از {{total}} مطابقت دارد +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_not_found=عبارت پیدا نشد + +# Error panel labels +error_more_info=اطلاعات بیشتر +error_less_info=اطلاعات کمتر +error_close=بستن +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=‏PDF.js ورژن{{version}} ‏(ساخت: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=پیام: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=توده: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=پرونده: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=سطر: {{line}} +rendering_error=هنگام بارگیری صفحه خطایی رخ داد. + +# Predefined zoom values +page_scale_width=عرض صفحه +page_scale_fit=اندازه کردن صفحه +page_scale_auto=بزرگنمایی خودکار +page_scale_actual=اندازه واقعی‌ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=هنگام بارگیری پرونده PDF خطایی رخ داد. +invalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد. +missing_file_error=پرونده PDF یافت نشد. +unexpected_response_error=پاسخ پیش بینی نشده سرور + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=جهت باز کردن پرونده PDF گذرواژه را وارد نمائید. +password_invalid=گذرواژه نامعتبر. لطفا مجددا تلاش کنید. +password_ok=تأیید +password_cancel=لغو + +printing_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود. +printing_not_ready=اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد. +web_fonts_disabled=فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد. + diff --git a/src/assets/pdf-annotation/web/locale/ff/viewer.properties b/src/assets/pdf-annotation/web/locale/ff/viewer.properties new file mode 100755 index 0000000..9acff5b --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ff/viewer.properties @@ -0,0 +1,235 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Hello Ɓennungo +previous_label=Ɓennuɗo +next.title=Hello faango +next_label=Yeeso + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Hello +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=e nder {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Lonngo Woɗɗa +zoom_out_label=Lonngo Woɗɗa +zoom_in.title=Lonngo Ara +zoom_in_label=Lonngo Ara +zoom.title=Lonngo +presentation_mode.title=Faytu to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Uddit Fiilde +open_file_label=Uddit +print.title=Winndito +print_label=Winndito +download.title=Aawto +download_label=Aawto +bookmark.title=Jiytol gonangol (natto walla uddit e henorde) +bookmark_label=Jiytol Gonangol + +# Secondary toolbar and context menu +tools.title=Kuutorɗe +tools_label=Kuutorɗe +first_page.title=Yah to hello adanngo +first_page_label=Yah to hello adanngo +last_page.title=Yah to hello wattindiingo +last_page_label=Yah to hello wattindiingo +page_rotate_cw.title=Yiiltu Faya Ñaamo +page_rotate_cw_label=Yiiltu Faya Ñaamo +page_rotate_ccw.title=Yiiltu Faya Nano +page_rotate_ccw_label=Yiiltu Faya Nano + +cursor_text_select_tool.title=Gollin kaɓirgel cuɓirgel binndi +cursor_text_select_tool_label=Kaɓirgel cuɓirgel binndi +cursor_hand_tool.title=Hurmin kuutorgal junngo +cursor_hand_tool_label=Kaɓirgel junngo + +scroll_vertical.title=Huutoro gorwitol daringol +scroll_vertical_label=Gorwitol daringol +scroll_horizontal.title=Huutoro gorwitol lelingol +scroll_horizontal_label=Gorwitol daringol +scroll_wrapped.title=Huutoro gorwitol coomingol +scroll_wrapped_label=Gorwitol coomingol + +spread_none.title=Hoto tawtu kelle kelle +spread_none_label=Alaa Spreads +spread_odd.title=Tawtu kelle puɗɗortooɗe kelle teelɗe +spread_odd_label=Kelle teelɗe +spread_even.title=Tawtu ɗereeji kelle puɗɗoriiɗi kelle teeltuɗe +spread_even_label=Kelle teeltuɗe + +# Document properties dialog box +document_properties.title=Keeroraaɗi Winndannde… +document_properties_label=Keeroraaɗi Winndannde… +document_properties_file_name=Innde fiilde: +document_properties_file_size=Ɓetol fiilde: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bite) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bite) +document_properties_title=Tiitoonde: +document_properties_author=Binnduɗo: +document_properties_subject=Toɓɓere: +document_properties_keywords=Kelmekele jiytirɗe: +document_properties_creation_date=Ñalnde Sosaa: +document_properties_modification_date=Ñalnde Waylaa: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Cosɗo: +document_properties_producer=Paggiiɗo PDF: +document_properties_version=Yamre PDF: +document_properties_page_count=Limoore Kelle: +document_properties_page_size=Ɓeto Hello: +document_properties_page_size_unit_inches=nder +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=dariingo +document_properties_page_size_orientation_landscape=wertiingo +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Ɓataake +document_properties_page_size_name_legal=Laawol +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Ɗisngo geese yaawngo: +document_properties_linearized_yes=Eey +document_properties_linearized_no=Alaa +document_properties_close=Uddu + +print_progress_message=Nana heboo winnditaade fiilannde… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Haaytu + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggilo Palal Sawndo +toggle_sidebar_label=Toggilo Palal Sawndo +document_outline.title=Hollu Ƴiyal Fiilannde (dobdobo ngam wertude/taggude teme fof) +document_outline_label=Toɓɓe Fiilannde +attachments.title=Hollu Ɗisanɗe +attachments_label=Ɗisanɗe +thumbs.title=Hollu Dooɓe +thumbs_label=Dooɓe +findbar.title=Yiylo e fiilannde +findbar_label=Yiytu + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Hello {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Dooɓre Hello {{page}} + +# Find panel button title and messages +find_input.title=Yiytu +find_input.placeholder=Yiylo nder dokimaa +find_previous.title=Yiylo cilol ɓennugol konngol ngol +find_previous_label=Ɓennuɗo +find_next.title=Yiylo cilol garowol konngol ngol +find_next_label=Yeeso +find_highlight=Jalbin fof +find_match_case_label=Jaaɓnu darnde +find_entire_word_label=Kelme timmuɗe tan +find_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les +find_reached_bottom=Heɓii hoore fiilannde, jokku faya les +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} wonande laabi {{total}} +find_match_count[two]={{current}} wonande laabi {{total}} +find_match_count[few]={{current}} wonande laabi {{total}} +find_match_count[many]={{current}} wonande laabi {{total}} +find_match_count[other]={{current}} wonande laabi {{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Ko ɓuri laabi {{limit}} +find_match_count_limit[one]=Ko ɓuri laani {{limit}} +find_match_count_limit[two]=Ko ɓuri laabi {{limit}} +find_match_count_limit[few]=Ko ɓuri laabi {{limit}} +find_match_count_limit[many]=Ko ɓuri laabi {{limit}} +find_match_count_limit[other]=Ko ɓuri laabi {{limit}} +find_not_found=Konngi njiyataa + +# Error panel labels +error_more_info=Ɓeydu Humpito +error_less_info=Ustu Humpito +error_close=Uddu +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Ɓatakuure: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fiilde: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Gorol: {{line}} +rendering_error=Juumre waɗii tuma nde yoŋkittoo hello. + +# Predefined zoom values +page_scale_width=Njaajeendi Hello +page_scale_fit=Keƴeendi Hello +page_scale_auto=Loongorde Jaajol +page_scale_actual=Ɓetol Jaati +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Juumre waɗii tuma nde loowata PDF oo. +invalid_file_error=Fiilde PDF moƴƴaani walla jiibii. +missing_file_error=Fiilde PDF ena ŋakki. +unexpected_response_error=Jaabtol sarworde tijjinooka. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Siiftannde] +password_label=Naatu finnde ngam uddite ndee fiilde PDF. +password_invalid=Finnde moƴƴaani. Tiiɗno eto kadi. +password_ok=OK +password_cancel=Haaytu + +printing_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde. +printing_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol. +web_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe. + diff --git a/src/assets/pdf-annotation/web/locale/fi/viewer.properties b/src/assets/pdf-annotation/web/locale/fi/viewer.properties new file mode 100755 index 0000000..653510d --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/fi/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Edellinen sivu +previous_label=Edellinen +next.title=Seuraava sivu +next_label=Seuraava + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Sivu +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Loitonna +zoom_out_label=Loitonna +zoom_in.title=Lähennä +zoom_in_label=Lähennä +zoom.title=Suurennus +presentation_mode.title=Siirry esitystilaan +presentation_mode_label=Esitystila +open_file.title=Avaa tiedosto +open_file_label=Avaa +print.title=Tulosta +print_label=Tulosta +download.title=Lataa +download_label=Lataa +save.title=Tallenna +save_label=Tallenna +bookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan) +bookmark_label=Avoin ikkuna + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Siirry ensimmäiselle sivulle +first_page_label=Siirry ensimmäiselle sivulle +last_page.title=Siirry viimeiselle sivulle +last_page_label=Siirry viimeiselle sivulle +page_rotate_cw.title=Kierrä oikealle +page_rotate_cw_label=Kierrä oikealle +page_rotate_ccw.title=Kierrä vasemmalle +page_rotate_ccw_label=Kierrä vasemmalle + +cursor_text_select_tool.title=Käytä tekstinvalintatyökalua +cursor_text_select_tool_label=Tekstinvalintatyökalu +cursor_hand_tool.title=Käytä käsityökalua +cursor_hand_tool_label=Käsityökalu + +scroll_page.title=Käytä sivun vieritystä +scroll_page_label=Sivun vieritys +scroll_vertical.title=Käytä pystysuuntaista vieritystä +scroll_vertical_label=Pystysuuntainen vieritys +scroll_horizontal.title=Käytä vaakasuuntaista vieritystä +scroll_horizontal_label=Vaakasuuntainen vieritys +scroll_wrapped.title=Käytä rivittyvää vieritystä +scroll_wrapped_label=Rivittyvä vieritys + +spread_none.title=Älä yhdistä sivuja aukeamiksi +spread_none_label=Ei aukeamia +spread_odd.title=Yhdistä sivut aukeamiksi alkaen parittomalta sivulta +spread_odd_label=Parittomalta alkavat aukeamat +spread_even.title=Yhdistä sivut aukeamiksi alkaen parilliselta sivulta +spread_even_label=Parilliselta alkavat aukeamat + +# Document properties dialog box +document_properties.title=Dokumentin ominaisuudet… +document_properties_label=Dokumentin ominaisuudet… +document_properties_file_name=Tiedoston nimi: +document_properties_file_size=Tiedoston koko: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kt ({{size_b}} tavua) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} Mt ({{size_b}} tavua) +document_properties_title=Otsikko: +document_properties_author=Tekijä: +document_properties_subject=Aihe: +document_properties_keywords=Avainsanat: +document_properties_creation_date=Luomispäivämäärä: +document_properties_modification_date=Muokkauspäivämäärä: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Luoja: +document_properties_producer=PDF-tuottaja: +document_properties_version=PDF-versio: +document_properties_page_count=Sivujen määrä: +document_properties_page_size=Sivun koko: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=pysty +document_properties_page_size_orientation_landscape=vaaka +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Nopea web-katselu: +document_properties_linearized_yes=Kyllä +document_properties_linearized_no=Ei +document_properties_close=Sulje + +print_progress_message=Valmistellaan dokumenttia tulostamista varten… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Peruuta + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Näytä/piilota sivupaneeli +toggle_sidebar_notification2.title=Näytä/piilota sivupaneeli (dokumentissa on sisällys/liitteitä/tasoja) +toggle_sidebar_label=Näytä/piilota sivupaneeli +document_outline.title=Näytä dokumentin sisällys (laajenna tai kutista kohdat kaksoisnapsauttamalla) +document_outline_label=Dokumentin sisällys +attachments.title=Näytä liitteet +attachments_label=Liitteet +layers.title=Näytä tasot (kaksoisnapsauta palauttaaksesi kaikki tasot oletustilaan) +layers_label=Tasot +thumbs.title=Näytä pienoiskuvat +thumbs_label=Pienoiskuvat +current_outline_item.title=Etsi nykyinen sisällyksen kohta +current_outline_item_label=Nykyinen sisällyksen kohta +findbar.title=Etsi dokumentista +findbar_label=Etsi + +additional_layers=Lisätasot +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Sivu {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Sivu {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Pienoiskuva sivusta {{page}} + +# Find panel button title and messages +find_input.title=Etsi +find_input.placeholder=Etsi dokumentista… +find_previous.title=Etsi hakusanan edellinen osuma +find_previous_label=Edellinen +find_next.title=Etsi hakusanan seuraava osuma +find_next_label=Seuraava +find_highlight=Korosta kaikki +find_match_case_label=Huomioi kirjainkoko +find_match_diacritics_label=Erota tarkkeet +find_entire_word_label=Kokonaiset sanat +find_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta +find_reached_bottom=Päästiin dokumentin loppuun, jatketaan alusta +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} / {{total}} osuma +find_match_count[two]={{current}} / {{total}} osumaa +find_match_count[few]={{current}} / {{total}} osumaa +find_match_count[many]={{current}} / {{total}} osumaa +find_match_count[other]={{current}} / {{total}} osumaa +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Enemmän kuin {{limit}} osumaa +find_match_count_limit[one]=Enemmän kuin {{limit}} osuma +find_match_count_limit[two]=Enemmän kuin {{limit}} osumaa +find_match_count_limit[few]=Enemmän kuin {{limit}} osumaa +find_match_count_limit[many]=Enemmän kuin {{limit}} osumaa +find_match_count_limit[other]=Enemmän kuin {{limit}} osumaa +find_not_found=Hakusanaa ei löytynyt + +# Error panel labels +error_more_info=Lisätietoja +error_less_info=Lisätietoja +error_close=Sulje +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (kooste: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Virheilmoitus: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pino: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Tiedosto: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rivi: {{line}} + +# Predefined zoom values +page_scale_width=Sivun leveys +page_scale_fit=Koko sivu +page_scale_auto=Automaattinen suurennus +page_scale_actual=Todellinen koko +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Ladataan… +loading_error=Tapahtui virhe ladattaessa PDF-tiedostoa. +invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto. +missing_file_error=Puuttuva PDF-tiedosto. +unexpected_response_error=Odottamaton vastaus palvelimelta. + +rendering_error=Tapahtui virhe piirrettäessä sivua. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-merkintä] +password_label=Kirjoita PDF-tiedoston salasana. +password_invalid=Virheellinen salasana. Yritä uudestaan. +password_ok=OK +password_cancel=Peruuta + +printing_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja. +printing_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa. +web_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja. + +# Editor +editor_free_text2.title=Teksti +editor_free_text2_label=Teksti +editor_ink2.title=Piirros +editor_ink2_label=Piirros + +free_text2_default_content=Aloita kirjoittaminen… + +# Editor Parameters +editor_free_text_color=Väri +editor_free_text_size=Koko +editor_ink_color=Väri +editor_ink_thickness=Paksuus +editor_ink_opacity=Peittävyys + +# Editor aria +editor_free_text2_aria_label=Tekstimuokkain +editor_ink2_aria_label=Piirrustusmuokkain +editor_ink_canvas_aria_label=Käyttäjän luoma kuva diff --git a/src/assets/pdf-annotation/web/locale/fr/viewer.properties b/src/assets/pdf-annotation/web/locale/fr/viewer.properties new file mode 100755 index 0000000..692a413 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/fr/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Page précédente +previous_label=Précédent +next.title=Page suivante +next_label=Suivant + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Page +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=sur {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} sur {{pagesCount}}) + +zoom_out.title=Zoom arrière +zoom_out_label=Zoom arrière +zoom_in.title=Zoom avant +zoom_in_label=Zoom avant +zoom.title=Zoom +presentation_mode.title=Basculer en mode présentation +presentation_mode_label=Mode présentation +open_file.title=Ouvrir le fichier +open_file_label=Ouvrir le fichier +print.title=Imprimer +print_label=Imprimer +download.title=Télécharger +download_label=Télécharger +save.title=Enregistrer +save_label=Enregistrer +bookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre) +bookmark_label=Affichage actuel + +# Secondary toolbar and context menu +tools.title=Outils +tools_label=Outils +first_page.title=Aller à la première page +first_page_label=Aller à la première page +last_page.title=Aller à la dernière page +last_page_label=Aller à la dernière page +page_rotate_cw.title=Rotation horaire +page_rotate_cw_label=Rotation horaire +page_rotate_ccw.title=Rotation antihoraire +page_rotate_ccw_label=Rotation antihoraire + +cursor_text_select_tool.title=Activer l’outil de sélection de texte +cursor_text_select_tool_label=Outil de sélection de texte +cursor_hand_tool.title=Activer l’outil main +cursor_hand_tool_label=Outil main + +scroll_page.title=Utiliser le défilement par page +scroll_page_label=Défilement par page +scroll_vertical.title=Utiliser le défilement vertical +scroll_vertical_label=Défilement vertical +scroll_horizontal.title=Utiliser le défilement horizontal +scroll_horizontal_label=Défilement horizontal +scroll_wrapped.title=Utiliser le défilement par bloc +scroll_wrapped_label=Défilement par bloc + +spread_none.title=Ne pas afficher les pages deux à deux +spread_none_label=Pas de double affichage +spread_odd.title=Afficher les pages par deux, impaires à gauche +spread_odd_label=Doubles pages, impaires à gauche +spread_even.title=Afficher les pages par deux, paires à gauche +spread_even_label=Doubles pages, paires à gauche + +# Document properties dialog box +document_properties.title=Propriétés du document… +document_properties_label=Propriétés du document… +document_properties_file_name=Nom du fichier : +document_properties_file_size=Taille du fichier : +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} Ko ({{size_b}} octets) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} Mo ({{size_b}} octets) +document_properties_title=Titre : +document_properties_author=Auteur : +document_properties_subject=Sujet : +document_properties_keywords=Mots-clés : +document_properties_creation_date=Date de création : +document_properties_modification_date=Modifié le : +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} à {{time}} +document_properties_creator=Créé par : +document_properties_producer=Outil de conversion PDF : +document_properties_version=Version PDF : +document_properties_page_count=Nombre de pages : +document_properties_page_size=Taille de la page : +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portrait +document_properties_page_size_orientation_landscape=paysage +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=lettre +document_properties_page_size_name_legal=document juridique +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Affichage rapide des pages web : +document_properties_linearized_yes=Oui +document_properties_linearized_no=Non +document_properties_close=Fermer + +print_progress_message=Préparation du document pour l’impression… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Annuler + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Afficher/Masquer le panneau latéral +toggle_sidebar_notification2.title=Afficher/Masquer le panneau latéral (le document contient des signets/pièces jointes/calques) +toggle_sidebar_label=Afficher/Masquer le panneau latéral +document_outline.title=Afficher les signets du document (double-cliquer pour développer/réduire tous les éléments) +document_outline_label=Signets du document +attachments.title=Afficher les pièces jointes +attachments_label=Pièces jointes +layers.title=Afficher les calques (double-cliquer pour réinitialiser tous les calques à l’état par défaut) +layers_label=Calques +thumbs.title=Afficher les vignettes +thumbs_label=Vignettes +current_outline_item.title=Trouver l’élément de plan actuel +current_outline_item_label=Élément de plan actuel +findbar.title=Rechercher dans le document +findbar_label=Rechercher + +additional_layers=Calques additionnels +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Page {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Vignette de la page {{page}} + +# Find panel button title and messages +find_input.title=Rechercher +find_input.placeholder=Rechercher dans le document… +find_previous.title=Trouver l’occurrence précédente de l’expression +find_previous_label=Précédent +find_next.title=Trouver la prochaine occurrence de l’expression +find_next_label=Suivant +find_highlight=Tout surligner +find_match_case_label=Respecter la casse +find_match_diacritics_label=Respecter les accents et diacritiques +find_entire_word_label=Mots entiers +find_reached_top=Haut de la page atteint, poursuite depuis la fin +find_reached_bottom=Bas de la page atteint, poursuite au début +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=Occurrence {{current}} sur {{total}} +find_match_count[two]=Occurrence {{current}} sur {{total}} +find_match_count[few]=Occurrence {{current}} sur {{total}} +find_match_count[many]=Occurrence {{current}} sur {{total}} +find_match_count[other]=Occurrence {{current}} sur {{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Plus de {{limit}} correspondances +find_match_count_limit[one]=Plus de {{limit}} correspondance +find_match_count_limit[two]=Plus de {{limit}} correspondances +find_match_count_limit[few]=Plus de {{limit}} correspondances +find_match_count_limit[many]=Plus de {{limit}} correspondances +find_match_count_limit[other]=Plus de {{limit}} correspondances +find_not_found=Expression non trouvée + +# Error panel labels +error_more_info=Plus d’informations +error_less_info=Moins d’informations +error_close=Fermer +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message : {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pile : {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fichier : {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Ligne : {{line}} + +# Predefined zoom values +page_scale_width=Pleine largeur +page_scale_fit=Page entière +page_scale_auto=Zoom automatique +page_scale_actual=Taille réelle +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Chargement… +loading_error=Une erreur s’est produite lors du chargement du fichier PDF. +invalid_file_error=Fichier PDF invalide ou corrompu. +missing_file_error=Fichier PDF manquant. +unexpected_response_error=Réponse inattendue du serveur. + +rendering_error=Une erreur s’est produite lors de l’affichage de la page. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} à {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Annotation {{type}}] +password_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF. +password_invalid=Mot de passe incorrect. Veuillez réessayer. +password_ok=OK +password_cancel=Annuler + +printing_not_supported=Attention : l’impression n’est pas totalement prise en charge par ce navigateur. +printing_not_ready=Attention : le PDF n’est pas entièrement chargé pour pouvoir l’imprimer. +web_fonts_disabled=Les polices web sont désactivées : impossible d’utiliser les polices intégrées au PDF. + +# Editor +editor_free_text2.title=Texte +editor_free_text2_label=Texte +editor_ink2.title=Dessiner +editor_ink2_label=Dessiner + +free_text2_default_content=Commencer à écrire… + +# Editor Parameters +editor_free_text_color=Couleur +editor_free_text_size=Taille +editor_ink_color=Couleur +editor_ink_thickness=Épaisseur +editor_ink_opacity=Opacité + +# Editor aria +editor_free_text2_aria_label=Éditeur de texte +editor_ink2_aria_label=Éditeur de dessin +editor_ink_canvas_aria_label=Image créée par l’utilisateur·trice diff --git a/src/assets/pdf-annotation/web/locale/fur/viewer.properties b/src/assets/pdf-annotation/web/locale/fur/viewer.properties new file mode 100755 index 0000000..82dcd1a --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/fur/viewer.properties @@ -0,0 +1,267 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagjine precedente +previous_label=Indaûr +next.title=Prossime pagjine +next_label=Indevant + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagjine +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=di {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} di {{pagesCount}}) + +zoom_out.title=Impiçulìs +zoom_out_label=Impiçulìs +zoom_in.title=Ingrandìs +zoom_in_label=Ingrandìs +zoom.title=Ingrandiment +presentation_mode.title=Passe ae modalitât presentazion +presentation_mode_label=Modalitât presentazion +open_file.title=Vierç un file +open_file_label=Vierç +print.title=Stampe +print_label=Stampe +download.title=Discjame +download_label=Discjame +bookmark.title=Viodude atuâl (copie o vierç intun gnûf barcon) +bookmark_label=Viodude atuâl + +# Secondary toolbar and context menu +tools.title=Struments +tools_label=Struments +first_page.title=Va ae prime pagjine +first_page_label=Va ae prime pagjine +last_page.title=Va ae ultime pagjine +last_page_label=Va ae ultime pagjine +page_rotate_cw.title=Zire in sens orari +page_rotate_cw_label=Zire in sens orari +page_rotate_ccw.title=Zire in sens antiorari +page_rotate_ccw_label=Zire in sens antiorari + +cursor_text_select_tool.title=Ative il strument di selezion dal test +cursor_text_select_tool_label=Strument di selezion dal test +cursor_hand_tool.title=Ative il strument manute +cursor_hand_tool_label=Strument manute + +scroll_page.title=Dopre il scoriment des pagjinis +scroll_page_label=Scoriment pagjinis +scroll_vertical.title=Dopre scoriment verticâl +scroll_vertical_label=Scoriment verticâl +scroll_horizontal.title=Dopre scoriment orizontâl +scroll_horizontal_label=Scoriment orizontâl +scroll_wrapped.title=Dopre scoriment par blocs +scroll_wrapped_label=Scoriment par blocs + +spread_none.title=No sta meti dongje pagjinis in cubie +spread_none_label=No cubiis di pagjinis +spread_odd.title=Met dongje cubiis di pagjinis scomençant des pagjinis dispar +spread_odd_label=Cubiis di pagjinis, dispar a çampe +spread_even.title=Met dongje cubiis di pagjinis scomençant des pagjinis pâr +spread_even_label=Cubiis di pagjinis, pâr a çampe + +# Document properties dialog box +document_properties.title=Proprietâts dal document… +document_properties_label=Proprietâts dal document… +document_properties_file_name=Non dal file: +document_properties_file_size=Dimension dal file: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titul: +document_properties_author=Autôr: +document_properties_subject=Ogjet: +document_properties_keywords=Peraulis clâf: +document_properties_creation_date=Date di creazion: +document_properties_modification_date=Date di modifiche: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creatôr +document_properties_producer=Gjeneradôr PDF: +document_properties_version=Version PDF: +document_properties_page_count=Numar di pagjinis: +document_properties_page_size=Dimension de pagjine: +document_properties_page_size_unit_inches=oncis +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=verticâl +document_properties_page_size_orientation_landscape=orizontâl +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letare +document_properties_page_size_name_legal=Legâl +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Visualizazion web svelte: +document_properties_linearized_yes=Sì +document_properties_linearized_no=No +document_properties_close=Siere + +print_progress_message=Daûr a prontâ il document pe stampe… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Anule + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Ative/Disative sbare laterâl +toggle_sidebar_notification2.title=Ative/Disative sbare laterâl (il document al conten struture/zontis/strâts) +toggle_sidebar_label=Ative/Disative sbare laterâl +document_outline.title=Mostre la struture dal document (dopli clic par slargjâ/strenzi ducj i elements) +document_outline_label=Struture dal document +attachments.title=Mostre lis zontis +attachments_label=Zontis +layers.title=Mostre i strâts (dopli clic par ristabilî ducj i strâts al stât predefinît) +layers_label=Strâts +thumbs.title=Mostre miniaturis +thumbs_label=Miniaturis +current_outline_item.title=Cjate l'element de struture atuâl +current_outline_item_label=Element de struture atuâl +findbar.title=Cjate tal document +findbar_label=Cjate + +additional_layers=Strâts adizionâi +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pagjine {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagjine {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniature de pagjine {{page}} + +# Find panel button title and messages +find_input.title=Cjate +find_input.placeholder=Cjate tal document… +find_previous.title=Cjate il câs precedent dal test +find_previous_label=Precedent +find_next.title=Cjate il câs sucessîf dal test +find_next_label=Sucessîf +find_highlight=Evidenzie dut +find_match_case_label=Fâs distinzion tra maiusculis e minusculis +find_match_diacritics_label=Corispondence diacritiche +find_entire_word_label=Peraulis interiis +find_reached_top=Si è rivâts al inizi dal document e si à continuât de fin +find_reached_bottom=Si è rivât ae fin dal document e si à continuât dal inizi +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} di {{total}} corispondence +find_match_count[two]={{current}} di {{total}} corispondencis +find_match_count[few]={{current}} di {{total}} corispondencis +find_match_count[many]={{current}} di {{total}} corispondencis +find_match_count[other]={{current}} di {{total}} corispondencis +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Plui di {{limit}} corispondencis +find_match_count_limit[one]=Plui di {{limit}} corispondence +find_match_count_limit[two]=Plui di {{limit}} corispondencis +find_match_count_limit[few]=Plui di {{limit}} corispondencis +find_match_count_limit[many]=Plui di {{limit}} corispondencis +find_match_count_limit[other]=Plui di {{limit}} corispondencis +find_not_found=Test no cjatât + +# Error panel labels +error_more_info=Altris informazions +error_less_info=Mancul informazions +error_close=Siere +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilazion: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Messaç: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rie: {{line}} +rendering_error=Al è vignût fûr un erôr tal realizâ la visualizazion de pagjine. + +# Predefined zoom values +page_scale_width=Largjece de pagjine +page_scale_fit=Pagjine interie +page_scale_auto=Ingrandiment automatic +page_scale_actual=Dimension reâl +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Daûr a cjamâ… +loading_error=Al è vignût fûr un erôr intant che si cjariave il PDF. +invalid_file_error=File PDF no valit o ruvinât. +missing_file_error=Al mancje il file PDF. +unexpected_response_error=Rispueste dal servidôr inspietade. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotazion {{type}}] +password_label=Inserìs la password par vierzi chest file PDF. +password_invalid=Password no valide. Par plasê torne prove. +password_ok=Va ben +password_cancel=Anule + +printing_not_supported=Atenzion: la stampe no je supuartade ad implen di chest navigadôr. +printing_not_ready=Atenzion: il PDF nol è stât cjamât dal dut pe stampe. +web_fonts_disabled=I caratars dal Web a son disativâts: Impussibil doprâ i caratars PDF incorporâts. + +# Editor +editor_none.title=Disative modifiche notis +editor_none_label=Disative modifiche +editor_free_text.title=Zonte note FreeText (test libar) +editor_free_text_label=Note FreeText (test libar) +editor_ink.title=Zonte note a pene +editor_ink_label=Note a pene + +free_text_default_content=Inserìs test… + +# Editor aria +editor_free_text_aria_label=Editôr di test libar +editor_ink_aria_label=Editôr a pene + +editor_ink_canvas_aria_label=Imagjin creade dal utent diff --git a/src/assets/pdf-annotation/web/locale/fy-NL/viewer.properties b/src/assets/pdf-annotation/web/locale/fy-NL/viewer.properties new file mode 100755 index 0000000..f7068ae --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/fy-NL/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Foarige side +previous_label=Foarige +next.title=Folgjende side +next_label=Folgjende + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=fan {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} fan {{pagesCount}}) + +zoom_out.title=Utzoome +zoom_out_label=Utzoome +zoom_in.title=Ynzoome +zoom_in_label=Ynzoome +zoom.title=Zoome +presentation_mode.title=Wikselje nei presintaasjemodus +presentation_mode_label=Presintaasjemodus +open_file.title=Bestân iepenje +open_file_label=Iepenje +print.title=Ofdrukke +print_label=Ofdrukke +download.title=Downloade +download_label=Downloade +save.title=Bewarje +save_label=Bewarje +bookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster) +bookmark_label=Aktuele finster + +# Secondary toolbar and context menu +tools.title=Ark +tools_label=Ark +first_page.title=Gean nei earste side +first_page_label=Gean nei earste side +last_page.title=Gean nei lêste side +last_page_label=Gean nei lêste side +page_rotate_cw.title=Rjochtsom draaie +page_rotate_cw_label=Rjochtsom draaie +page_rotate_ccw.title=Linksom draaie +page_rotate_ccw_label=Linksom draaie + +cursor_text_select_tool.title=Tekstseleksjehelpmiddel ynskeakelje +cursor_text_select_tool_label=Tekstseleksjehelpmiddel +cursor_hand_tool.title=Hânhelpmiddel ynskeakelje +cursor_hand_tool_label=Hânhelpmiddel + +scroll_page.title=Sideskowen brûke +scroll_page_label=Sideskowen +scroll_vertical.title=Fertikaal skowe brûke +scroll_vertical_label=Fertikaal skowe +scroll_horizontal.title=Horizontaal skowe brûke +scroll_horizontal_label=Horizontaal skowe +scroll_wrapped.title=Skowe mei oersjoch brûke +scroll_wrapped_label=Skowe mei oersjoch + +spread_none.title=Sidesprieding net gearfetsje +spread_none_label=Gjin sprieding +spread_odd.title=Sidesprieding gearfetsje te starten mei ûneven nûmers +spread_odd_label=Uneven sprieding +spread_even.title=Sidesprieding gearfetsje te starten mei even nûmers +spread_even_label=Even sprieding + +# Document properties dialog box +document_properties.title=Dokuminteigenskippen… +document_properties_label=Dokuminteigenskippen… +document_properties_file_name=Bestânsnamme: +document_properties_file_size=Bestânsgrutte: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Auteur: +document_properties_subject=Underwerp: +document_properties_keywords=Kaaiwurden: +document_properties_creation_date=Oanmaakdatum: +document_properties_modification_date=Bewurkingsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Makker: +document_properties_producer=PDF-makker: +document_properties_version=PDF-ferzje: +document_properties_page_count=Siden: +document_properties_page_size=Sideformaat: +document_properties_page_size_unit_inches=yn +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=steand +document_properties_page_size_orientation_landscape=lizzend +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Juridysk +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Flugge webwerjefte: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Nee +document_properties_close=Slute + +print_progress_message=Dokumint tariede oar ôfdrukken… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Annulearje + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sidebalke yn-/útskeakelje +toggle_sidebar_notification2.title=Sidebalke yn-/útskeakelje (dokumint befettet oersjoch/bylagen/lagen) +toggle_sidebar_label=Sidebalke yn-/útskeakelje +document_outline.title=Dokumintoersjoch toane (dûbelklik om alle items út/yn te klappen) +document_outline_label=Dokumintoersjoch +attachments.title=Bylagen toane +attachments_label=Bylagen +layers.title=Lagen toane (dûbelklik om alle lagen nei de standertsteat werom te setten) +layers_label=Lagen +thumbs.title=Foarbylden toane +thumbs_label=Foarbylden +current_outline_item.title=Aktueel item yn ynhâldsopjefte sykje +current_outline_item_label=Aktueel item yn ynhâldsopjefte +findbar.title=Sykje yn dokumint +findbar_label=Sykje + +additional_layers=Oanfoljende lagen +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Side {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Foarbyld fan side {{page}} + +# Find panel button title and messages +find_input.title=Sykje +find_input.placeholder=Sykje yn dokumint… +find_previous.title=It foarige foarkommen fan de tekst sykje +find_previous_label=Foarige +find_next.title=It folgjende foarkommen fan de tekst sykje +find_next_label=Folgjende +find_highlight=Alles markearje +find_match_case_label=Haadlettergefoelich +find_match_diacritics_label=Diakrityske tekens brûke +find_entire_word_label=Hiele wurden +find_reached_top=Boppekant fan dokumint berikt, trochgien fan ûnder ôf +find_reached_bottom=Ein fan dokumint berikt, trochgien fan boppe ôf +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} fan {{total}} oerienkomst +find_match_count[two]={{current}} fan {{total}} oerienkomsten +find_match_count[few]={{current}} fan {{total}} oerienkomsten +find_match_count[many]={{current}} fan {{total}} oerienkomsten +find_match_count[other]={{current}} fan {{total}} oerienkomsten +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mear as {{limit}} oerienkomsten +find_match_count_limit[one]=Mear as {{limit}} oerienkomst +find_match_count_limit[two]=Mear as {{limit}} oerienkomsten +find_match_count_limit[few]=Mear as {{limit}} oerienkomsten +find_match_count_limit[many]=Mear as {{limit}} oerienkomsten +find_match_count_limit[other]=Mear as {{limit}} oerienkomsten +find_not_found=Tekst net fûn + +# Error panel labels +error_more_info=Mear ynformaasje +error_less_info=Minder ynformaasje +error_close=Slute +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js f{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Berjocht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Bestân: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rigel: {{line}} + +# Predefined zoom values +page_scale_width=Sidebreedte +page_scale_fit=Hiele side +page_scale_auto=Automatysk zoome +page_scale_actual=Werklike grutte +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Lade… +loading_error=Der is in flater bard by it laden fan de PDF. +invalid_file_error=Ynfalide of korruptearre PDF-bestân. +missing_file_error=PDF-bestân ûntbrekt. +unexpected_response_error=Unferwacht serverantwurd. + +rendering_error=Der is in flater bard by it renderjen fan de side. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-annotaasje] +password_label=Jou it wachtwurd om dit PDF-bestân te iepenjen. +password_invalid=Ferkeard wachtwurd. Probearje opnij. +password_ok=OK +password_cancel=Annulearje + +printing_not_supported=Warning: Printen is net folslein stipe troch dizze browser. +printing_not_ready=Warning: PDF is net folslein laden om ôf te drukken. +web_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Tekenje +editor_ink2_label=Tekenje + +free_text2_default_content=Begjin mei typen… + +# Editor Parameters +editor_free_text_color=Kleur +editor_free_text_size=Grutte +editor_ink_color=Kleur +editor_ink_thickness=Tsjokte +editor_ink_opacity=Transparânsje + +# Editor aria +editor_free_text2_aria_label=Tekstbewurker +editor_ink2_aria_label=Tekeningbewurker +editor_ink_canvas_aria_label=Troch brûker makke ôfbylding diff --git a/src/assets/pdf-annotation/web/locale/ga-IE/viewer.properties b/src/assets/pdf-annotation/web/locale/ga-IE/viewer.properties new file mode 100755 index 0000000..31833e7 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ga-IE/viewer.properties @@ -0,0 +1,202 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=An Leathanach Roimhe Seo +previous_label=Roimhe Seo +next.title=An Chéad Leathanach Eile +next_label=Ar Aghaidh + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Leathanach +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=as {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} as {{pagesCount}}) + +zoom_out.title=Súmáil Amach +zoom_out_label=Súmáil Amach +zoom_in.title=Súmáil Isteach +zoom_in_label=Súmáil Isteach +zoom.title=Súmáil +presentation_mode.title=Úsáid an Mód Láithreoireachta +presentation_mode_label=Mód Láithreoireachta +open_file.title=Oscail Comhad +open_file_label=Oscail +print.title=Priontáil +print_label=Priontáil +download.title=Íoslódáil +download_label=Íoslódáil +bookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua) +bookmark_label=An tAmharc Reatha + +# Secondary toolbar and context menu +tools.title=Uirlisí +tools_label=Uirlisí +first_page.title=Go dtí an chéad leathanach +first_page_label=Go dtí an chéad leathanach +last_page.title=Go dtí an leathanach deiridh +last_page_label=Go dtí an leathanach deiridh +page_rotate_cw.title=Rothlaigh ar deiseal +page_rotate_cw_label=Rothlaigh ar deiseal +page_rotate_ccw.title=Rothlaigh ar tuathal +page_rotate_ccw_label=Rothlaigh ar tuathal + +cursor_text_select_tool.title=Cumasaigh an Uirlis Roghnaithe Téacs +cursor_text_select_tool_label=Uirlis Roghnaithe Téacs +cursor_hand_tool.title=Cumasaigh an Uirlis Láimhe +cursor_hand_tool_label=Uirlis Láimhe + + + +# Document properties dialog box +document_properties.title=Airíonna na Cáipéise… +document_properties_label=Airíonna na Cáipéise… +document_properties_file_name=Ainm an chomhaid: +document_properties_file_size=Méid an chomhaid: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} beart) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} beart) +document_properties_title=Teideal: +document_properties_author=Údar: +document_properties_subject=Ábhar: +document_properties_keywords=Eochairfhocail: +document_properties_creation_date=Dáta Cruthaithe: +document_properties_modification_date=Dáta Athraithe: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Cruthaitheoir: +document_properties_producer=Cruthaitheoir an PDF: +document_properties_version=Leagan PDF: +document_properties_page_count=Líon Leathanach: +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_close=Dún + +print_progress_message=Cáipéis á hullmhú le priontáil… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cealaigh + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Scoránaigh an Barra Taoibh +toggle_sidebar_label=Scoránaigh an Barra Taoibh +document_outline.title=Taispeáin Imlíne na Cáipéise (déchliceáil chun chuile rud a leathnú nó a laghdú) +document_outline_label=Creatlach na Cáipéise +attachments.title=Taispeáin Iatáin +attachments_label=Iatáin +thumbs.title=Taispeáin Mionsamhlacha +thumbs_label=Mionsamhlacha +findbar.title=Aimsigh sa Cháipéis +findbar_label=Aimsigh + +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Leathanach {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Mionsamhail Leathanaigh {{page}} + +# Find panel button title and messages +find_input.title=Aimsigh +find_input.placeholder=Aimsigh sa cháipéis… +find_previous.title=Aimsigh an sampla roimhe seo den nath seo +find_previous_label=Roimhe seo +find_next.title=Aimsigh an chéad sampla eile den nath sin +find_next_label=Ar aghaidh +find_highlight=Aibhsigh uile +find_match_case_label=Cásíogair +find_entire_word_label=Focail iomlána +find_reached_top=Ag barr na cáipéise, ag leanúint ón mbun +find_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_not_found=Frása gan aimsiú + +# Error panel labels +error_more_info=Tuilleadh Eolais +error_less_info=Níos Lú Eolais +error_close=Dún +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Teachtaireacht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Cruach: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Comhad: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Líne: {{line}} +rendering_error=Tharla earráid agus an leathanach á leagan amach. + +# Predefined zoom values +page_scale_width=Leithead Leathanaigh +page_scale_fit=Laghdaigh go dtí an Leathanach +page_scale_auto=Súmáil Uathoibríoch +page_scale_actual=Fíormhéid +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error=Tharla earráid agus an cháipéis PDF á lódáil. +invalid_file_error=Comhad neamhbhailí nó truaillithe PDF. +missing_file_error=Comhad PDF ar iarraidh. +unexpected_response_error=Freagra ón bhfreastalaí nach rabhthas ag súil leis. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anótáil {{type}}] +password_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt. +password_invalid=Focal faire mícheart. Déan iarracht eile. +password_ok=OK +password_cancel=Cealaigh + +printing_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán. +printing_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán lódáilte. +web_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid. + diff --git a/src/assets/pdf-annotation/web/locale/gd/viewer.properties b/src/assets/pdf-annotation/web/locale/gd/viewer.properties new file mode 100755 index 0000000..c510c6b --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/gd/viewer.properties @@ -0,0 +1,249 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=An duilleag roimhe +previous_label=Air ais +next.title=An ath-dhuilleag +next_label=Air adhart + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Duilleag +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=à {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} à {{pagesCount}}) + +zoom_out.title=Sùm a-mach +zoom_out_label=Sùm a-mach +zoom_in.title=Sùm a-steach +zoom_in_label=Sùm a-steach +zoom.title=Sùm +presentation_mode.title=Gearr leum dhan mhodh taisbeanaidh +presentation_mode_label=Am modh taisbeanaidh +open_file.title=Fosgail faidhle +open_file_label=Fosgail +print.title=Clò-bhuail +print_label=Clò-bhuail +download.title=Luchdaich a-nuas +download_label=Luchdaich a-nuas +bookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr) +bookmark_label=An sealladh làithreach + +# Secondary toolbar and context menu +tools.title=Innealan +tools_label=Innealan +first_page.title=Rach gun chiad duilleag +first_page_label=Rach gun chiad duilleag +last_page.title=Rach gun duilleag mu dheireadh +last_page_label=Rach gun duilleag mu dheireadh +page_rotate_cw.title=Cuairtich gu deiseil +page_rotate_cw_label=Cuairtich gu deiseil +page_rotate_ccw.title=Cuairtich gu tuathail +page_rotate_ccw_label=Cuairtich gu tuathail + +cursor_text_select_tool.title=Cuir an comas inneal taghadh an teacsa +cursor_text_select_tool_label=Inneal taghadh an teacsa +cursor_hand_tool.title=Cuir inneal na làimhe an comas +cursor_hand_tool_label=Inneal na làimhe + +scroll_vertical.title=Cleachd sgroladh inghearach +scroll_vertical_label=Sgroladh inghearach +scroll_horizontal.title=Cleachd sgroladh còmhnard +scroll_horizontal_label=Sgroladh còmhnard +scroll_wrapped.title=Cleachd sgroladh paisgte +scroll_wrapped_label=Sgroladh paisgte + +spread_none.title=Na cuir còmhla sgoileadh dhuilleagan +spread_none_label=Gun sgaoileadh dhuilleagan +spread_odd.title=Cuir còmhla duilleagan sgaoilte a thòisicheas le duilleagan aig a bheil àireamh chorr +spread_odd_label=Sgaoileadh dhuilleagan corra +spread_even.title=Cuir còmhla duilleagan sgaoilte a thòisicheas le duilleagan aig a bheil àireamh chothrom +spread_even_label=Sgaoileadh dhuilleagan cothrom + +# Document properties dialog box +document_properties.title=Roghainnean na sgrìobhainne… +document_properties_label=Roghainnean na sgrìobhainne… +document_properties_file_name=Ainm an fhaidhle: +document_properties_file_size=Meud an fhaidhle: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Tiotal: +document_properties_author=Ùghdar: +document_properties_subject=Cuspair: +document_properties_keywords=Faclan-luirg: +document_properties_creation_date=Latha a chruthachaidh: +document_properties_modification_date=Latha atharrachaidh: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Cruthadair: +document_properties_producer=Saothraiche a' PDF: +document_properties_version=Tionndadh a' PDF: +document_properties_page_count=Àireamh de dhuilleagan: +document_properties_page_size=Meud na duilleige: +document_properties_page_size_unit_inches=ann an +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portraid +document_properties_page_size_orientation_landscape=dreach-tìre +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Litir +document_properties_page_size_name_legal=Laghail +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Grad shealladh-lìn: +document_properties_linearized_yes=Tha +document_properties_linearized_no=Chan eil +document_properties_close=Dùin + +print_progress_message=Ag ullachadh na sgrìobhainn airson clò-bhualadh… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Sguir dheth + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toglaich am bàr-taoibh +toggle_sidebar_notification2.title=Toglaich am bàr-taoibh (tha oir-loidhne/ceanglachain/breathan aig an sgrìobhainn) +toggle_sidebar_label=Toglaich am bàr-taoibh +document_outline.title=Seall oir-loidhne na sgrìobhainn (dèan briogadh dùbailte airson a h-uile nì a leudachadh/a cho-theannadh) +document_outline_label=Oir-loidhne na sgrìobhainne +attachments.title=Seall na ceanglachain +attachments_label=Ceanglachain +layers.title=Seall na breathan (dèan briogadh dùbailte airson a h-uile breath ath-shuidheachadh dhan staid bhunaiteach) +layers_label=Breathan +thumbs.title=Seall na dealbhagan +thumbs_label=Dealbhagan +current_outline_item.title=Lorg nì làithreach na h-oir-loidhne +current_outline_item_label=Nì làithreach na h-oir-loidhne +findbar.title=Lorg san sgrìobhainn +findbar_label=Lorg + +additional_layers=Barrachd breathan +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Duilleag {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Duilleag a {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Dealbhag duilleag a {{page}} + +# Find panel button title and messages +find_input.title=Lorg +find_input.placeholder=Lorg san sgrìobhainn... +find_previous.title=Lorg làthair roimhe na h-abairt seo +find_previous_label=Air ais +find_next.title=Lorg ath-làthair na h-abairt seo +find_next_label=Air adhart +find_highlight=Soillsich a h-uile +find_match_case_label=Aire do litrichean mòra is beaga +find_entire_word_label=Faclan-slàna +find_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige +find_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} à {{total}} mhaids +find_match_count[two]={{current}} à {{total}} mhaids +find_match_count[few]={{current}} à {{total}} maidsichean +find_match_count[many]={{current}} à {{total}} maids +find_match_count[other]={{current}} à {{total}} maids +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Barrachd air {{limit}} maids +find_match_count_limit[one]=Barrachd air {{limit}} mhaids +find_match_count_limit[two]=Barrachd air {{limit}} mhaids +find_match_count_limit[few]=Barrachd air {{limit}} maidsichean +find_match_count_limit[many]=Barrachd air {{limit}} maids +find_match_count_limit[other]=Barrachd air {{limit}} maids +find_not_found=Cha deach an abairt a lorg + +# Error panel labels +error_more_info=Barrachd fiosrachaidh +error_less_info=Nas lugha de dh'fhiosrachadh +error_close=Dùin +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Teachdaireachd: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stac: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Faidhle: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Loidhne: {{line}} +rendering_error=Thachair mearachd rè reandaradh na duilleige. + +# Predefined zoom values +page_scale_width=Leud na duilleige +page_scale_fit=Freagair ri meud na duilleige +page_scale_auto=Sùm fèin-obrachail +page_scale_actual=Am fìor-mheud +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=’Ga luchdadh… +loading_error=Thachair mearachd rè luchdadh a' PDF. +invalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte. +missing_file_error=Faidhle PDF a tha a dhìth. +unexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Nòtachadh {{type}}] +password_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh. +password_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist? +password_ok=Ceart ma-thà +password_cancel=Sguir dheth + +printing_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh. +printing_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh. +web_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh. + diff --git a/src/assets/pdf-annotation/web/locale/gl/viewer.properties b/src/assets/pdf-annotation/web/locale/gl/viewer.properties new file mode 100755 index 0000000..0aa2ef1 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/gl/viewer.properties @@ -0,0 +1,249 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Páxina anterior +previous_label=Anterior +next.title=Seguinte páxina +next_label=Seguinte + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Páxina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reducir +zoom_out_label=Reducir +zoom_in.title=Ampliar +zoom_in_label=Ampliar +zoom.title=Zoom +presentation_mode.title=Cambiar ao modo presentación +presentation_mode_label=Modo presentación +open_file.title=Abrir ficheiro +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar ou abrir nunha nova xanela) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Ferramentas +tools_label=Ferramentas +first_page.title=Ir á primeira páxina +first_page_label=Ir á primeira páxina +last_page.title=Ir á última páxina +last_page_label=Ir á última páxina +page_rotate_cw.title=Rotar no sentido das agullas do reloxo +page_rotate_cw_label=Rotar no sentido das agullas do reloxo +page_rotate_ccw.title=Rotar no sentido contrario ás agullas do reloxo +page_rotate_ccw_label=Rotar no sentido contrario ás agullas do reloxo + +cursor_text_select_tool.title=Activar a ferramenta de selección de texto +cursor_text_select_tool_label=Ferramenta de selección de texto +cursor_hand_tool.title=Activar a ferramenta man +cursor_hand_tool_label=Ferramenta man + +scroll_vertical.title=Usar o desprazamento vertical +scroll_vertical_label=Desprazamento vertical +scroll_horizontal.title=Usar o desprazamento horizontal +scroll_horizontal_label=Desprazamento horizontal +scroll_wrapped.title=Usar desprazamento en bloque +scroll_wrapped_label=Desprazamento en bloque + +spread_none.title=Non agrupar páxinas +spread_none_label=Ningún agrupamento +spread_odd.title=Crea grupo de páxinas que comezan con números de páxina impares +spread_odd_label=Agrupamento impar +spread_even.title=Crea grupo de páxinas que comezan con números de páxina pares +spread_even_label=Agrupamento par + +# Document properties dialog box +document_properties.title=Propiedades do documento… +document_properties_label=Propiedades do documento… +document_properties_file_name=Nome do ficheiro: +document_properties_file_size=Tamaño do ficheiro: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras clave: +document_properties_creation_date=Data de creación: +document_properties_modification_date=Data de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creado por: +document_properties_producer=Xenerador do PDF: +document_properties_version=Versión de PDF: +document_properties_page_count=Número de páxinas: +document_properties_page_size=Tamaño da páxina: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=Vertical +document_properties_page_size_orientation_landscape=Horizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Visualización rápida das páxinas web: +document_properties_linearized_yes=Si +document_properties_linearized_no=Non +document_properties_close=Pechar + +print_progress_message=Preparando documento para imprimir… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Amosar/agochar a barra lateral +toggle_sidebar_notification2.title=Alternar barra lateral (o documento contén esquema/anexos/capas) +toggle_sidebar_label=Amosar/agochar a barra lateral +document_outline.title=Amosar o esquema do documento (prema dúas veces para expandir/contraer todos os elementos) +document_outline_label=Esquema do documento +attachments.title=Amosar anexos +attachments_label=Anexos +layers.title=Mostrar capas (prema dúas veces para restaurar todas as capas o estado predeterminado) +layers_label=Capas +thumbs.title=Amosar miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Atopar o elemento delimitado actualmente +current_outline_item_label=Elemento delimitado actualmente +findbar.title=Atopar no documento +findbar_label=Atopar + +additional_layers=Capas adicionais +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Páxina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Páxina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da páxina {{page}} + +# Find panel button title and messages +find_input.title=Atopar +find_input.placeholder=Atopar no documento… +find_previous.title=Atopar a anterior aparición da frase +find_previous_label=Anterior +find_next.title=Atopar a seguinte aparición da frase +find_next_label=Seguinte +find_highlight=Realzar todo +find_match_case_label=Diferenciar maiúsculas de minúsculas +find_entire_word_label=Palabras completas +find_reached_top=Chegouse ao inicio do documento, continuar desde o final +find_reached_bottom=Chegouse ao final do documento, continuar desde o inicio +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} coincidencia +find_match_count[two]={{current}} de {{total}} coincidencias +find_match_count[few]={{current}} de {{total}} coincidencias +find_match_count[many]={{current}} de {{total}} coincidencias +find_match_count[other]={{current}} de {{total}} coincidencias +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Máis de {{limit}} coincidencias +find_match_count_limit[one]=Máis de {{limit}} coincidencia +find_match_count_limit[two]=Máis de {{limit}} coincidencias +find_match_count_limit[few]=Máis de {{limit}} coincidencias +find_match_count_limit[many]=Máis de {{limit}} coincidencias +find_match_count_limit[other]=Máis de {{limit}} coincidencias +find_not_found=Non se atopou a frase + +# Error panel labels +error_more_info=Máis información +error_less_info=Menos información +error_close=Pechar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaxe: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ficheiro: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Liña: {{line}} +rendering_error=Produciuse un erro ao representar a páxina. + +# Predefined zoom values +page_scale_width=Largura da páxina +page_scale_fit=Axuste de páxina +page_scale_auto=Zoom automático +page_scale_actual=Tamaño actual +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=A cargar… +loading_error=Produciuse un erro ao cargar o PDF. +invalid_file_error=Ficheiro PDF danado ou non válido. +missing_file_error=Falta o ficheiro PDF. +unexpected_response_error=Resposta inesperada do servidor. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotación {{type}}] +password_label=Escriba o contrasinal para abrir este ficheiro PDF. +password_invalid=Contrasinal incorrecto. Tente de novo. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador. +printing_not_ready=Aviso: O PDF non se cargou completamente para imprimirse. +web_fonts_disabled=Desactiváronse as fontes web: foi imposíbel usar as fontes incrustadas no PDF. + diff --git a/src/assets/pdf-annotation/web/locale/gn/viewer.properties b/src/assets/pdf-annotation/web/locale/gn/viewer.properties new file mode 100755 index 0000000..0b6ab83 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/gn/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Kuatiarogue mboyvegua +previous_label=Mboyvegua +next.title=Kuatiarogue upeigua +next_label=Upeigua + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Kuatiarogue +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} gui +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Momichĩ +zoom_out_label=Momichĩ +zoom_in.title=Mbotuicha +zoom_in_label=Mbotuicha +zoom.title=Tuichakue +presentation_mode.title=Jehechauka reko moambue +presentation_mode_label=Jehechauka reko +open_file.title=Marandurendápe jeike +open_file_label=Jeike +print.title=Monguatia +print_label=Monguatia +download.title=Mboguejy +download_label=Mboguejy +save.title=Ñongatu +save_label=Ñongatu +bookmark.title=Ag̃agua jehecha (mbohasarã térã eike peteĩ ovetã pyahúpe) +bookmark_label=Ag̃agua jehecha + +# Secondary toolbar and context menu +tools.title=Tembipuru +tools_label=Tembipuru +first_page.title=Kuatiarogue ñepyrũme jeho +first_page_label=Kuatiarogue ñepyrũme jeho +last_page.title=Kuatiarogue pahápe jeho +last_page_label=Kuatiarogue pahápe jeho +page_rotate_cw.title=Aravóicha mbojere +page_rotate_cw_label=Aravóicha mbojere +page_rotate_ccw.title=Aravo rapykue gotyo mbojere +page_rotate_ccw_label=Aravo rapykue gotyo mbojere + +cursor_text_select_tool.title=Emyandy moñe’ẽrã jeporavo rembipuru +cursor_text_select_tool_label=Moñe’ẽrã jeporavo rembipuru +cursor_hand_tool.title=Tembipuru po pegua myandy +cursor_hand_tool_label=Tembipuru po pegua + +scroll_page.title=Eipuru kuatiarogue jeku’e +scroll_page_label=Kuatiarogue jeku’e +scroll_vertical.title=Eipuru jeku’e ykeguáva +scroll_vertical_label=Jeku’e ykeguáva +scroll_horizontal.title=Eipuru jeku’e yvate gotyo +scroll_horizontal_label=Jeku’e yvate gotyo +scroll_wrapped.title=Eipuru jeku’e mbohyrupyre +scroll_wrapped_label=Jeku’e mbohyrupyre + +spread_none.title=Ani ejuaju spreads kuatiarogue ndive +spread_none_label=Spreads ỹre +spread_odd.title=Embojuaju kuatiarogue jepysokue eñepyrũvo kuatiarogue impar-vagui +spread_odd_label=Spreads impar +spread_even.title=Embojuaju kuatiarogue jepysokue eñepyrũvo kuatiarogue par-vagui +spread_even_label=Ipukuve uvei + +# Document properties dialog box +document_properties.title=Kuatia mba’etee… +document_properties_label=Kuatia mba’etee… +document_properties_file_name=Marandurenda réra: +document_properties_file_size=Marandurenda tuichakue: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Teratee: +document_properties_author=Apohára: +document_properties_subject=Mba’egua: +document_properties_keywords=Jehero: +document_properties_creation_date=Teñoihague arange: +document_properties_modification_date=Iñambue hague arange: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Apo’ypyha: +document_properties_producer=PDF mbosako’iha: +document_properties_version=PDF mbojuehegua: +document_properties_page_count=Kuatiarogue papapy: +document_properties_page_size=Kuatiarogue tuichakue: +document_properties_page_size_unit_inches=Amo +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=Oĩháicha +document_properties_page_size_orientation_landscape=apaisado +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Kuatiañe’ẽ +document_properties_page_size_name_legal=Tee +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Ñanduti jahecha pya’e: +document_properties_linearized_yes=Añete +document_properties_linearized_no=Ahániri +document_properties_close=Mboty + +print_progress_message=Embosako’i kuatia emonguatia hag̃ua… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Heja + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Tenda yke moambue +toggle_sidebar_notification2.title=Embojopyru tenda ykegua (kuatia oguereko kuaakaha/moirũha/ñuãha) +toggle_sidebar_label=Tenda yke moambue +document_outline.title=Ehechauka kuatia rape (eikutu mokõi jey embotuicha/emomichĩ hag̃ua opavavete mba’epuru) +document_outline_label=Kuatia apopyre +attachments.title=Moirũha jehechauka +attachments_label=Moirũha +layers.title=Ehechauka ñuãha (eikutu jo’a emomba’apo hag̃ua opaite ñuãha tekoypýpe) +layers_label=Ñuãha +thumbs.title=Mba’emirĩ jehechauka +thumbs_label=Mba’emirĩ +current_outline_item.title=Eheka mba’epuru ag̃aguaitéva +current_outline_item_label=Mba’epuru ag̃aguaitéva +findbar.title=Kuatiápe jeheka +findbar_label=Juhu + +additional_layers=Ñuãha moirũguáva +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Kuatiarogue {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Kuatiarogue {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Kuatiarogue mba’emirĩ {{page}} + +# Find panel button title and messages +find_input.title=Juhu +find_input.placeholder=Kuatiápe jejuhu… +find_previous.title=Ejuhu ñe’ẽrysýi osẽ’ypy hague +find_previous_label=Mboyvegua +find_next.title=Eho ñe’ẽ juhupyre upeiguávape +find_next_label=Upeigua +find_highlight=Embojekuaavepa +find_match_case_label=Ejesareko taiguasu/taimichĩre +find_match_diacritics_label=Diacrítico moñondive +find_entire_word_label=Ñe’ẽ oĩmbáva +find_reached_top=Ojehupyty kuatia ñepyrũ, oku’ejeýta kuatia paha guive +find_reached_bottom=Ojehupyty kuatia paha, oku’ejeýta kuatia ñepyrũ guive +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} {{total}} ojojoguáva +find_match_count[two]={{current}} {{total}} ojojoguáva +find_match_count[few]={{current}} {{total}} ojojoguáva +find_match_count[many]={{current}} {{total}} ojojoguáva +find_match_count[other]={{current}} {{total}} ojojoguáva +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Hetave {{limit}} ojojoguáva +find_match_count_limit[one]=Hetave {{limit}} ojojogua +find_match_count_limit[two]=Hetave {{limit}} ojojoguáva +find_match_count_limit[few]=Hetave {{limit}} ojojoguáva +find_match_count_limit[many]=Hetave {{limit}} ojojoguáva +find_match_count_limit[other]=Hetave {{limit}} ojojoguáva +find_not_found=Ñe’ẽrysýi ojejuhu’ỹva + +# Error panel labels +error_more_info=Maranduve +error_less_info=Sa’ive marandu +error_close=Mboty +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Ñe’ẽmondo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Mbojo’apy: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Marandurenda: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Tairenda: {{line}} + +# Predefined zoom values +page_scale_width=Kuatiarogue pekue +page_scale_fit=Kuatiarogue ñemoĩporã +page_scale_auto=Tuichakue ijeheguíva +page_scale_actual=Tuichakue ag̃agua +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Henyhẽhína… +loading_error=Oiko jejavy PDF oñemyeñyhẽnguévo. +invalid_file_error=PDF marandurenda ndoikóiva térã ivaipyréva. +missing_file_error=Ndaipóri PDF marandurenda +unexpected_response_error=Mohendahavusu mbohovái ñeha’arõ’ỹva. + +rendering_error=Oiko jejavy ehechaukasévo kuatiarogue. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Jehaipy {{type}}] +password_label=Emoinge ñe’ẽñemi eipe’a hag̃ua ko marandurenda PDF. +password_invalid=Ñe’ẽñemi ndoikóiva. Eha’ã jey. +password_ok=MONEĨ +password_cancel=Heja + +printing_not_supported=Kyhyjerã: Ñembokuatia ndojokupytypái ko kundahára ndive. +printing_not_ready=Kyhyjerã: Ko PDF nahenyhẽmbái oñembokuatia hag̃uáicha. +web_fonts_disabled=Ñanduti taity oñemongéma: ndaikatumo’ãi eipuru PDF jehai’íva taity. + +# Editor +editor_free_text2.title=Moñe’ẽrã +editor_free_text2_label=Moñe’ẽrã +editor_ink2.title=Moha’ãnga +editor_ink2_label=Moha’ãnga + +free_text2_default_content=Ehai ñepyrũ… + +# Editor Parameters +editor_free_text_color=Sa’y +editor_free_text_size=Tuichakue +editor_ink_color=Sa’y +editor_ink_thickness=Anambusu +editor_ink_opacity=Pytũngy + +# Editor aria +editor_free_text2_aria_label=Moñe’ẽrã moheñoiha +editor_ink2_aria_label=Ta’ãnga moheñoiha +editor_ink_canvas_aria_label=Ta’ãnga omoheñóiva puruhára diff --git a/src/assets/pdf-annotation/web/locale/gu-IN/viewer.properties b/src/assets/pdf-annotation/web/locale/gu-IN/viewer.properties new file mode 100755 index 0000000..8e6c44f --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/gu-IN/viewer.properties @@ -0,0 +1,235 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=પહેલાનુ પાનું +previous_label=પહેલાનુ +next.title=આગળનુ પાનું +next_label=આગળનું + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=પાનું +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=નો {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} નો {{pagesCount}}) + +zoom_out.title=મોટુ કરો +zoom_out_label=મોટુ કરો +zoom_in.title=નાનું કરો +zoom_in_label=નાનું કરો +zoom.title=નાનું મોટુ કરો +presentation_mode.title=રજૂઆત સ્થિતિમાં જાવ +presentation_mode_label=રજૂઆત સ્થિતિ +open_file.title=ફાઇલ ખોલો +open_file_label=ખોલો +print.title=છાપો +print_label=છારો +download.title=ડાઉનલોડ +download_label=ડાઉનલોડ +bookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો) +bookmark_label=વર્તમાન દૃશ્ય + +# Secondary toolbar and context menu +tools.title=સાધનો +tools_label=સાધનો +first_page.title=પહેલાં પાનામાં જાવ +first_page_label=પ્રથમ પાનાં પર જાવ +last_page.title=છેલ્લા પાનાં પર જાવ +last_page_label=છેલ્લા પાનાં પર જાવ +page_rotate_cw.title=ઘડિયાળનાં કાંટા તરફ ફેરવો +page_rotate_cw_label=ઘડિયાળનાં કાંટા તરફ ફેરવો +page_rotate_ccw.title=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો +page_rotate_ccw_label=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો + +cursor_text_select_tool.title=ટેક્સ્ટ પસંદગી ટૂલ સક્ષમ કરો +cursor_text_select_tool_label=ટેક્સ્ટ પસંદગી ટૂલ +cursor_hand_tool.title=હાથનાં સાધનને સક્રિય કરો +cursor_hand_tool_label=હેન્ડ ટૂલ + +scroll_vertical.title=ઊભી સ્ક્રોલિંગનો ઉપયોગ કરો +scroll_vertical_label=ઊભી સ્ક્રોલિંગ +scroll_horizontal.title=આડી સ્ક્રોલિંગનો ઉપયોગ કરો +scroll_horizontal_label=આડી સ્ક્રોલિંગ +scroll_wrapped.title=આવરિત સ્ક્રોલિંગનો ઉપયોગ કરો +scroll_wrapped_label=આવરિત સ્ક્રોલિંગ + +spread_none.title=પૃષ્ઠ સ્પ્રેડમાં જોડાવશો નહીં +spread_none_label=કોઈ સ્પ્રેડ નથી +spread_odd.title=એકી-ક્રમાંકિત પૃષ્ઠો સાથે પ્રારંભ થતાં પૃષ્ઠ સ્પ્રેડમાં જોડાઓ +spread_odd_label=એકી સ્પ્રેડ્સ +spread_even.title=નંબર-ક્રમાંકિત પૃષ્ઠોથી શરૂ થતાં પૃષ્ઠ સ્પ્રેડમાં જોડાઓ +spread_even_label=સરખું ફેલાવવું + +# Document properties dialog box +document_properties.title=દસ્તાવેજ ગુણધર્મો… +document_properties_label=દસ્તાવેજ ગુણધર્મો… +document_properties_file_name=ફાઇલ નામ: +document_properties_file_size=ફાઇલ માપ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} બાઇટ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} બાઇટ) +document_properties_title=શીર્ષક: +document_properties_author=લેખક: +document_properties_subject=વિષય: +document_properties_keywords=કિવર્ડ: +document_properties_creation_date=નિર્માણ તારીખ: +document_properties_modification_date=ફેરફાર તારીખ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=નિર્માતા: +document_properties_producer=PDF નિર્માતા: +document_properties_version=PDF આવૃત્તિ: +document_properties_page_count=પાનાં ગણતરી: +document_properties_page_size=પૃષ્ઠનું કદ: +document_properties_page_size_unit_inches=ઇંચ +document_properties_page_size_unit_millimeters=મીમી +document_properties_page_size_orientation_portrait=ઉભું +document_properties_page_size_orientation_landscape=આડુ +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=પત્ર +document_properties_page_size_name_legal=કાયદાકીય +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=ઝડપી વૅબ દૃશ્ય: +document_properties_linearized_yes=હા +document_properties_linearized_no=ના +document_properties_close=બંધ કરો + +print_progress_message=છાપકામ માટે દસ્તાવેજ તૈયાર કરી રહ્યા છે… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=રદ કરો + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ટૉગલ બાજુપટ્ટી +toggle_sidebar_label=ટૉગલ બાજુપટ્ટી +document_outline.title=દસ્તાવેજની રૂપરેખા બતાવો(બધી આઇટમ્સને વિસ્તૃત/સંકુચિત કરવા માટે ડબલ-ક્લિક કરો) +document_outline_label=દસ્તાવેજ રૂપરેખા +attachments.title=જોડાણોને બતાવો +attachments_label=જોડાણો +thumbs.title=થંબનેલ્સ બતાવો +thumbs_label=થંબનેલ્સ +findbar.title=દસ્તાવેજમાં શોધો +findbar_label=શોધો + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=પાનું {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ + +# Find panel button title and messages +find_input.title=શોધો +find_input.placeholder=દસ્તાવેજમાં શોધો… +find_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો +find_previous_label=પહેલાંનુ +find_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો +find_next_label=આગળનું +find_highlight=બધુ પ્રકાશિત કરો +find_match_case_label=કેસ બંધબેસાડો +find_entire_word_label=સંપૂર્ણ શબ્દો +find_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ +find_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} માંથી {{current}} સરખું મળ્યું +find_match_count[two]={{total}} માંથી {{current}} સરખા મળ્યાં +find_match_count[few]={{total}} માંથી {{current}} સરખા મળ્યાં +find_match_count[many]={{total}} માંથી {{current}} સરખા મળ્યાં +find_match_count[other]={{total}} માંથી {{current}} સરખા મળ્યાં +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} કરતાં વધુ સરખા મળ્યાં +find_match_count_limit[one]={{limit}} કરતાં વધુ સરખું મળ્યું +find_match_count_limit[two]={{limit}} કરતાં વધુ સરખા મળ્યાં +find_match_count_limit[few]={{limit}} કરતાં વધુ સરખા મળ્યાં +find_match_count_limit[many]={{limit}} કરતાં વધુ સરખા મળ્યાં +find_match_count_limit[other]={{limit}} કરતાં વધુ સરખા મળ્યાં +find_not_found=શબ્દસમૂહ મળ્યુ નથી + +# Error panel labels +error_more_info=વધારે જાણકારી +error_less_info=ઓછી જાણકારી +error_close=બંધ કરો +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=સંદેશો: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=સ્ટેક: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ફાઇલ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=વાક્ય: {{line}} +rendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય. + +# Predefined zoom values +page_scale_width=પાનાની પહોળાઇ +page_scale_fit=પાનું બંધબેસતુ +page_scale_auto=આપમેળે નાનુંમોટુ કરો +page_scale_actual=ચોક્કસ માપ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય. +invalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ. +missing_file_error=ગુમ થયેલ PDF ફાઇલ. +unexpected_response_error=અનપેક્ષિત સર્વર પ્રતિસાદ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો. +password_invalid=અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો. +password_ok=બરાબર +password_cancel=રદ કરો + +printing_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી. +printing_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે. +web_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ. + diff --git a/src/assets/pdf-annotation/web/locale/he/viewer.properties b/src/assets/pdf-annotation/web/locale/he/viewer.properties new file mode 100755 index 0000000..3b63afe --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/he/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=דף קודם +previous_label=קודם +next.title=דף הבא +next_label=הבא + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=דף +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=מתוך {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} מתוך {{pagesCount}}) + +zoom_out.title=התרחקות +zoom_out_label=התרחקות +zoom_in.title=התקרבות +zoom_in_label=התקרבות +zoom.title=מרחק מתצוגה +presentation_mode.title=מעבר למצב מצגת +presentation_mode_label=מצב מצגת +open_file.title=פתיחת קובץ +open_file_label=פתיחה +print.title=הדפסה +print_label=הדפסה +download.title=הורדה +download_label=הורדה +save.title=שמירה +save_label=שמירה +bookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש) +bookmark_label=תצוגה נוכחית + +# Secondary toolbar and context menu +tools.title=כלים +tools_label=כלים +first_page.title=מעבר לעמוד הראשון +first_page_label=מעבר לעמוד הראשון +last_page.title=מעבר לעמוד האחרון +last_page_label=מעבר לעמוד האחרון +page_rotate_cw.title=הטיה עם כיוון השעון +page_rotate_cw_label=הטיה עם כיוון השעון +page_rotate_ccw.title=הטיה כנגד כיוון השעון +page_rotate_ccw_label=הטיה כנגד כיוון השעון + +cursor_text_select_tool.title=הפעלת כלי בחירת טקסט +cursor_text_select_tool_label=כלי בחירת טקסט +cursor_hand_tool.title=הפעלת כלי היד +cursor_hand_tool_label=כלי יד + +scroll_page.title=שימוש בגלילת עמוד +scroll_page_label=גלילת עמוד +scroll_vertical.title=שימוש בגלילה אנכית +scroll_vertical_label=גלילה אנכית +scroll_horizontal.title=שימוש בגלילה אופקית +scroll_horizontal_label=גלילה אופקית +scroll_wrapped.title=שימוש בגלילה רציפה +scroll_wrapped_label=גלילה רציפה + +spread_none.title=לא לצרף מפתחי עמודים +spread_none_label=ללא מפתחים +spread_odd.title=צירוף מפתחי עמודים שמתחילים בדפים עם מספרים אי־זוגיים +spread_odd_label=מפתחים אי־זוגיים +spread_even.title=צירוף מפתחי עמודים שמתחילים בדפים עם מספרים זוגיים +spread_even_label=מפתחים זוגיים + +# Document properties dialog box +document_properties.title=מאפייני מסמך… +document_properties_label=מאפייני מסמך… +document_properties_file_name=שם קובץ: +document_properties_file_size=גודל הקובץ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים) +document_properties_title=כותרת: +document_properties_author=מחבר: +document_properties_subject=נושא: +document_properties_keywords=מילות מפתח: +document_properties_creation_date=תאריך יצירה: +document_properties_modification_date=תאריך שינוי: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=יוצר: +document_properties_producer=יצרן PDF: +document_properties_version=גרסת PDF: +document_properties_page_count=מספר דפים: +document_properties_page_size=גודל העמוד: +document_properties_page_size_unit_inches=אינ׳ +document_properties_page_size_unit_millimeters=מ״מ +document_properties_page_size_orientation_portrait=לאורך +document_properties_page_size_orientation_landscape=לרוחב +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=מכתב +document_properties_page_size_name_legal=דף משפטי +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=תצוגת דף מהירה: +document_properties_linearized_yes=כן +document_properties_linearized_no=לא +document_properties_close=סגירה + +print_progress_message=מסמך בהכנה להדפסה… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ביטול + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=הצגה/הסתרה של סרגל הצד +toggle_sidebar_notification2.title=החלפת תצוגת סרגל צד (מסמך שמכיל תוכן עניינים/קבצים מצורפים/שכבות) +toggle_sidebar_label=הצגה/הסתרה של סרגל הצד +document_outline.title=הצגת תוכן העניינים של המסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים) +document_outline_label=תוכן העניינים של המסמך +attachments.title=הצגת צרופות +attachments_label=צרופות +layers.title=הצגת שכבות (יש ללחוץ לחיצה כפולה כדי לאפס את כל השכבות למצב ברירת המחדל) +layers_label=שכבות +thumbs.title=הצגת תצוגה מקדימה +thumbs_label=תצוגה מקדימה +current_outline_item.title=מציאת פריט תוכן העניינים הנוכחי +current_outline_item_label=פריט תוכן העניינים הנוכחי +findbar.title=חיפוש במסמך +findbar_label=חיפוש + +additional_layers=שכבות נוספות +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=עמוד {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=עמוד {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=תצוגה מקדימה של עמוד {{page}} + +# Find panel button title and messages +find_input.title=חיפוש +find_input.placeholder=חיפוש במסמך… +find_previous.title=מציאת המופע הקודם של הביטוי +find_previous_label=קודם +find_next.title=מציאת המופע הבא של הביטוי +find_next_label=הבא +find_highlight=הדגשת הכול +find_match_case_label=התאמת אותיות +find_match_diacritics_label=התאמה דיאקריטית +find_entire_word_label=מילים שלמות +find_reached_top=הגיע לראש הדף, ממשיך מלמטה +find_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=תוצאה {{current}} מתוך {{total}} +find_match_count[two]={{current}} מתוך {{total}} תוצאות +find_match_count[few]={{current}} מתוך {{total}} תוצאות +find_match_count[many]={{current}} מתוך {{total}} תוצאות +find_match_count[other]={{current}} מתוך {{total}} תוצאות +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=יותר מ־{{limit}} תוצאות +find_match_count_limit[one]=יותר מתוצאה אחת +find_match_count_limit[two]=יותר מ־{{limit}} תוצאות +find_match_count_limit[few]=יותר מ־{{limit}} תוצאות +find_match_count_limit[many]=יותר מ־{{limit}} תוצאות +find_match_count_limit[other]=יותר מ־{{limit}} תוצאות +find_not_found=הביטוי לא נמצא + +# Error panel labels +error_more_info=מידע נוסף +error_less_info=פחות מידע +error_close=סגירה +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js גרסה {{version}} (בנייה: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=הודעה: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=תוכן מחסנית: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=קובץ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=שורה: {{line}} + +# Predefined zoom values +page_scale_width=רוחב העמוד +page_scale_fit=התאמה לעמוד +page_scale_auto=מרחק מתצוגה אוטומטי +page_scale_actual=גודל אמיתי +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=בטעינה… +loading_error=אירעה שגיאה בעת טעינת ה־PDF. +invalid_file_error=קובץ PDF פגום או לא תקין. +missing_file_error=קובץ PDF חסר. +unexpected_response_error=תגובת שרת לא צפויה. + +rendering_error=אירעה שגיאה בעת עיבוד הדף. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[הערת {{type}}] +password_label=נא להכניס את הססמה לפתיחת קובץ PDF זה. +password_invalid=ססמה שגויה. נא לנסות שנית. +password_ok=אישור +password_cancel=ביטול + +printing_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה. +printing_not_ready=אזהרה: מסמך ה־PDF לא נטען לחלוטין עד מצב שמאפשר הדפסה. +web_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים. + +# Editor +editor_free_text2.title=טקסט +editor_free_text2_label=טקסט +editor_ink2.title=ציור +editor_ink2_label=ציור + +free_text2_default_content=להתחיל להקליד… + +# Editor Parameters +editor_free_text_color=צבע +editor_free_text_size=גודל +editor_ink_color=צבע +editor_ink_thickness=עובי +editor_ink_opacity=אטימות + +# Editor aria +editor_free_text2_aria_label=עורך טקסט +editor_ink2_aria_label=עורך ציור +editor_ink_canvas_aria_label=תמונה שנוצרה על־ידי משתמש diff --git a/src/assets/pdf-annotation/web/locale/hi-IN/viewer.properties b/src/assets/pdf-annotation/web/locale/hi-IN/viewer.properties new file mode 100755 index 0000000..e296f0a --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/hi-IN/viewer.properties @@ -0,0 +1,235 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=पिछला पृष्ठ +previous_label=पिछला +next.title=अगला पृष्ठ +next_label=आगे + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=पृष्ठ: +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} का +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=\u0020छोटा करें +zoom_out_label=\u0020छोटा करें +zoom_in.title=बड़ा करें +zoom_in_label=बड़ा करें +zoom.title=बड़ा-छोटा करें +presentation_mode.title=प्रस्तुति अवस्था में जाएँ +presentation_mode_label=\u0020प्रस्तुति अवस्था +open_file.title=फ़ाइल खोलें +open_file_label=\u0020खोलें +print.title=छापें +print_label=\u0020छापें +download.title=डाउनलोड +download_label=डाउनलोड +bookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें) +bookmark_label=\u0020मौजूदा दृश्य + +# Secondary toolbar and context menu +tools.title=औज़ार +tools_label=औज़ार +first_page.title=प्रथम पृष्ठ पर जाएँ +first_page_label=प्रथम पृष्ठ पर जाएँ +last_page.title=अंतिम पृष्ठ पर जाएँ +last_page_label=\u0020अंतिम पृष्ठ पर जाएँ +page_rotate_cw.title=घड़ी की दिशा में घुमाएँ +page_rotate_cw_label=घड़ी की दिशा में घुमाएँ +page_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ +page_rotate_ccw_label=\u0020घड़ी की दिशा से उल्टा घुमाएँ + +cursor_text_select_tool.title=पाठ चयन उपकरण सक्षम करें +cursor_text_select_tool_label=पाठ चयन उपकरण +cursor_hand_tool.title=हस्त उपकरण सक्षम करें +cursor_hand_tool_label=हस्त उपकरण + +scroll_vertical.title=लंबवत स्क्रॉलिंग का उपयोग करें +scroll_vertical_label=लंबवत स्क्रॉलिंग +scroll_horizontal.title=क्षितिजिय स्क्रॉलिंग का उपयोग करें +scroll_horizontal_label=क्षितिजिय स्क्रॉलिंग +scroll_wrapped.title=व्राप्पेड स्क्रॉलिंग का उपयोग करें + +spread_none_label=कोई स्प्रेड उपलब्ध नहीं +spread_odd.title=विषम-क्रमांकित पृष्ठों से प्रारंभ होने वाले पृष्ठ स्प्रेड में शामिल हों +spread_odd_label=विषम फैलाव + +# Document properties dialog box +document_properties.title=दस्तावेज़ विशेषता... +document_properties_label=दस्तावेज़ विशेषता... +document_properties_file_name=फ़ाइल नाम: +document_properties_file_size=फाइल आकारः +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=शीर्षक: +document_properties_author=लेखकः +document_properties_subject=विषय: +document_properties_keywords=कुंजी-शब्द: +document_properties_creation_date=निर्माण दिनांक: +document_properties_modification_date=संशोधन दिनांक: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=निर्माता: +document_properties_producer=PDF उत्पादक: +document_properties_version=PDF संस्करण: +document_properties_page_count=पृष्ठ गिनती: +document_properties_page_size=पृष्ठ आकार: +document_properties_page_size_unit_inches=इंच +document_properties_page_size_unit_millimeters=मिमी +document_properties_page_size_orientation_portrait=पोर्ट्रेट +document_properties_page_size_orientation_landscape=लैंडस्केप +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=पत्र +document_properties_page_size_name_legal=क़ानूनी +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=तीव्र वेब व्यू: +document_properties_linearized_yes=हाँ +document_properties_linearized_no=नहीं +document_properties_close=बंद करें + +print_progress_message=छपाई के लिए दस्तावेज़ को तैयार किया जा रहा है... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=रद्द करें + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=\u0020स्लाइडर टॉगल करें +toggle_sidebar_label=स्लाइडर टॉगल करें +document_outline.title=दस्तावेज़ की रूपरेखा दिखाइए (सारी वस्तुओं को फलने अथवा समेटने के लिए दो बार क्लिक करें) +document_outline_label=दस्तावेज़ आउटलाइन +attachments.title=संलग्नक दिखायें +attachments_label=संलग्नक +thumbs.title=लघुछवियाँ दिखाएँ +thumbs_label=लघु छवि +findbar.title=\u0020दस्तावेज़ में ढूँढ़ें +findbar_label=ढूँढें + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=पृष्ठ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=पृष्ठ {{page}} की लघु-छवि + +# Find panel button title and messages +find_input.title=ढूँढें +find_input.placeholder=दस्तावेज़ में खोजें... +find_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें +find_previous_label=पिछला +find_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें +find_next_label=अगला +find_highlight=\u0020सभी आलोकित करें +find_match_case_label=मिलान स्थिति +find_entire_word_label=संपूर्ण शब्द +find_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें +find_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} में {{current}} मेल +find_match_count[two]={{total}} में {{current}} मेल +find_match_count[few]={{total}} में {{current}} मेल +find_match_count[many]={{total}} में {{current}} मेल +find_match_count[other]={{total}} में {{current}} मेल +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} से अधिक मेल +find_match_count_limit[one]={{limit}} से अधिक मेल +find_match_count_limit[two]={{limit}} से अधिक मेल +find_match_count_limit[few]={{limit}} से अधिक मेल +find_match_count_limit[many]={{limit}} से अधिक मेल +find_match_count_limit[other]={{limit}} से अधिक मेल +find_not_found=वाक्यांश नहीं मिला + +# Error panel labels +error_more_info=अधिक सूचना +error_less_info=कम सूचना +error_close=बंद करें +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=\u0020संदेश: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=स्टैक: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=फ़ाइल: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=पंक्ति: {{line}} +rendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई. + +# Predefined zoom values +page_scale_width=\u0020पृष्ठ चौड़ाई +page_scale_fit=पृष्ठ फिट +page_scale_auto=स्वचालित जूम +page_scale_actual=वास्तविक आकार +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF लोड करते समय एक त्रुटि हुई. +invalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल. +missing_file_error=\u0020अनुपस्थित PDF फ़ाइल. +unexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=\u0020[{{type}} Annotation] +password_label=इस PDF फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें. +password_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें. +password_ok=OK +password_cancel=रद्द करें + +printing_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है. +printing_not_ready=चेतावनी: PDF छपाई के लिए पूरी तरह से लोड नहीं है. +web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ. + diff --git a/src/assets/pdf-annotation/web/locale/hr/viewer.properties b/src/assets/pdf-annotation/web/locale/hr/viewer.properties new file mode 100755 index 0000000..251eb61 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/hr/viewer.properties @@ -0,0 +1,267 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Prethodna stranica +previous_label=Prethodna +next.title=Sljedeća stranica +next_label=Sljedeća + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Stranica +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=od {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} od {{pagesCount}}) + +zoom_out.title=Umanji +zoom_out_label=Umanji +zoom_in.title=Uvećaj +zoom_in_label=Uvećaj +zoom.title=Zumiranje +presentation_mode.title=Prebaci u prezentacijski način rada +presentation_mode_label=Prezentacijski način rada +open_file.title=Otvori datoteku +open_file_label=Otvori +print.title=Ispiši +print_label=Ispiši +download.title=Preuzmi +download_label=Preuzmi +save.title=Spremi +save_label=Spremi +bookmark.title=Trenutačni prikaz (kopiraj ili otvori u novom prozoru) +bookmark_label=Trenutačni prikaz + +# Secondary toolbar and context menu +tools.title=Alati +tools_label=Alati +first_page.title=Idi na prvu stranicu +first_page_label=Idi na prvu stranicu +last_page.title=Idi na posljednju stranicu +last_page_label=Idi na posljednju stranicu +page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu +page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu +page_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu +page_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu + +cursor_text_select_tool.title=Omogući alat za označavanje teksta +cursor_text_select_tool_label=Alat za označavanje teksta +cursor_hand_tool.title=Omogući ručni alat +cursor_hand_tool_label=Ručni alat + +scroll_vertical.title=Koristi okomito pomicanje +scroll_vertical_label=Okomito pomicanje +scroll_horizontal.title=Koristi vodoravno pomicanje +scroll_horizontal_label=Vodoravno pomicanje +scroll_wrapped.title=Koristi kontinuirani raspored stranica +scroll_wrapped_label=Kontinuirani raspored stranica + +spread_none.title=Ne izrađuj duplerice +spread_none_label=Pojedinačne stranice +spread_odd.title=Izradi duplerice koje počinju s neparnim stranicama +spread_odd_label=Neparne duplerice +spread_even.title=Izradi duplerice koje počinju s parnim stranicama +spread_even_label=Parne duplerice + +# Document properties dialog box +document_properties.title=Svojstva dokumenta … +document_properties_label=Svojstva dokumenta … +document_properties_file_name=Naziv datoteke: +document_properties_file_size=Veličina datoteke: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtova) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtova) +document_properties_title=Naslov: +document_properties_author=Autor: +document_properties_subject=Predmet: +document_properties_keywords=Ključne riječi: +document_properties_creation_date=Datum stvaranja: +document_properties_modification_date=Datum promjene: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Stvaratelj: +document_properties_producer=PDF stvaratelj: +document_properties_version=PDF verzija: +document_properties_page_count=Broj stranica: +document_properties_page_size=Dimenzije stranice: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=uspravno +document_properties_page_size_orientation_landscape=položeno +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Brzi web pregled: +document_properties_linearized_yes=Da +document_properties_linearized_no=Ne +document_properties_close=Zatvori + +print_progress_message=Pripremanje dokumenta za ispis… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Odustani + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Prikaži/sakrij bočnu traku +toggle_sidebar_notification2.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži strukturu/privitke/slojeve) +toggle_sidebar_label=Prikaži/sakrij bočnu traku +document_outline.title=Prikaži strukturu dokumenta (dvostruki klik za rasklapanje/sklapanje svih stavki) +document_outline_label=Struktura dokumenta +attachments.title=Prikaži privitke +attachments_label=Privitci +layers.title=Prikaži slojeve (dvoklik za vraćanje svih slojeva u zadano stanje) +layers_label=Slojevi +thumbs.title=Prikaži minijature +thumbs_label=Minijature +current_outline_item.title=Pronađi trenutačni element strukture +current_outline_item_label=Trenutačni element strukture +findbar.title=Pronađi u dokumentu +findbar_label=Pronađi + +additional_layers=Dodatni slojevi +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Stranica {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Stranica {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Minijatura stranice {{page}} + +# Find panel button title and messages +find_input.title=Pronađi +find_input.placeholder=Pronađi u dokumentu … +find_previous.title=Pronađi prethodno pojavljivanje ovog izraza +find_previous_label=Prethodno +find_next.title=Pronađi sljedeće pojavljivanje ovog izraza +find_next_label=Sljedeće +find_highlight=Istankni sve +find_match_case_label=Razlikovanje velikih i malih slova +find_entire_word_label=Cijele riječi +find_reached_top=Dosegnut početak dokumenta, nastavak s kraja +find_reached_bottom=Dosegnut kraj dokumenta, nastavak s početka +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} od {{total}} se podudara +find_match_count[two]={{current}} od {{total}} se podudara +find_match_count[few]={{current}} od {{total}} se podudara +find_match_count[many]={{current}} od {{total}} se podudara +find_match_count[other]={{current}} od {{total}} se podudara +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Više od {{limit}} podudaranja +find_match_count_limit[one]=Više od {{limit}} podudaranja +find_match_count_limit[two]=Više od {{limit}} podudaranja +find_match_count_limit[few]=Više od {{limit}} podudaranja +find_match_count_limit[many]=Više od {{limit}} podudaranja +find_match_count_limit[other]=Više od {{limit}} podudaranja +find_not_found=Izraz nije pronađen + +# Error panel labels +error_more_info=Više informacija +error_less_info=Manje informacija +error_close=Zatvori +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Poruka: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stog: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datoteka: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Redak: {{line}} + +# Predefined zoom values +page_scale_width=Prilagodi širini prozora +page_scale_fit=Prilagodi veličini prozora +page_scale_auto=Automatsko zumiranje +page_scale_actual=Stvarna veličina +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Učitavanje… +loading_error=Došlo je do greške pri učitavanju PDF-a. +invalid_file_error=Neispravna ili oštećena PDF datoteka. +missing_file_error=Nedostaje PDF datoteka. +unexpected_response_error=Neočekivani odgovor poslužitelja. + +rendering_error=Došlo je do greške prilikom iscrtavanja stranice. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Bilješka] +password_label=Za otvoranje ove PDF datoteku upiši lozinku. +password_invalid=Neispravna lozinka. Pokušaj ponovo. +password_ok=U redu +password_cancel=Odustani + +printing_not_supported=Upozorenje: Ovaj preglednik ne podržava u potpunosti ispisivanje. +printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis. +web_fonts_disabled=Web fontovi su deaktivirani: nije moguće koristiti ugrađene PDF fontove. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst + +free_text2_default_content=Počni tipkati … + +# Editor Parameters +editor_free_text_color=Boja +editor_free_text_size=Veličina +editor_ink_color=Boja +editor_ink_thickness=Debljina +editor_ink_opacity=Neprozirnost + +# Editor aria +editor_free_text2_aria_label=Uređivač teksta diff --git a/src/assets/pdf-annotation/web/locale/hsb/viewer.properties b/src/assets/pdf-annotation/web/locale/hsb/viewer.properties new file mode 100755 index 0000000..cf7ac90 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/hsb/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Předchadna strona +previous_label=Wróćo +next.title=Přichodna strona +next_label=Dale + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strona +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Pomjeńšić +zoom_out_label=Pomjeńšić +zoom_in.title=Powjetšić +zoom_in_label=Powjetšić +zoom.title=Skalowanje +presentation_mode.title=Do prezentaciskeho modusa přeńć +presentation_mode_label=Prezentaciski modus +open_file.title=Dataju wočinić +open_file_label=Wočinić +print.title=Ćišćeć +print_label=Ćišćeć +download.title=Sćahnyć +download_label=Sćahnyć +save.title=Składować +save_label=Składować +bookmark.title=Aktualny napohlad (kopěrować abo w nowym woknje wočinić) +bookmark_label=Aktualny napohlad + +# Secondary toolbar and context menu +tools.title=Nastroje +tools_label=Nastroje +first_page.title=K prěnjej stronje +first_page_label=K prěnjej stronje +last_page.title=K poslednjej stronje +last_page_label=K poslednjej stronje +page_rotate_cw.title=K směrej časnika wjerćeć +page_rotate_cw_label=K směrej časnika wjerćeć +page_rotate_ccw.title=Přećiwo směrej časnika wjerćeć +page_rotate_ccw_label=Přećiwo směrej časnika wjerćeć + +cursor_text_select_tool.title=Nastroj za wuběranje teksta zmóžnić +cursor_text_select_tool_label=Nastroj za wuběranje teksta +cursor_hand_tool.title=Ručny nastroj zmóžnić +cursor_hand_tool_label=Ručny nastroj + +scroll_page.title=Kulenje strony wužiwać +scroll_page_label=Kulenje strony +scroll_vertical.title=Wertikalne suwanje wužiwać +scroll_vertical_label=Wertikalne suwanje +scroll_horizontal.title=Horicontalne suwanje wužiwać +scroll_horizontal_label=Horicontalne suwanje +scroll_wrapped.title=Postupne suwanje wužiwać +scroll_wrapped_label=Postupne suwanje + +spread_none.title=Strony njezwjazać +spread_none_label=Žana dwójna strona +spread_odd.title=Strony započinajo z njerunymi stronami zwjazać +spread_odd_label=Njerune strony +spread_even.title=Strony započinajo z runymi stronami zwjazać +spread_even_label=Rune strony + +# Document properties dialog box +document_properties.title=Dokumentowe kajkosće… +document_properties_label=Dokumentowe kajkosće… +document_properties_file_name=Mjeno dataje: +document_properties_file_size=Wulkosć dataje: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtow) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtow) +document_properties_title=Titul: +document_properties_author=Awtor: +document_properties_subject=Předmjet: +document_properties_keywords=Klučowe słowa: +document_properties_creation_date=Datum wutworjenja: +document_properties_modification_date=Datum změny: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Awtor: +document_properties_producer=PDF-zhotowjer: +document_properties_version=PDF-wersija: +document_properties_page_count=Ličba stronow: +document_properties_page_size=Wulkosć strony: +document_properties_page_size_unit_inches=cól +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=wysoki format +document_properties_page_size_orientation_landscape=prěčny format +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Haj +document_properties_linearized_no=Ně +document_properties_close=Začinić + +print_progress_message=Dokument so za ćišćenje přihotuje… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Přetorhnyć + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Bóčnicu pokazać/schować +toggle_sidebar_notification2.title=Bóčnicu přepinać (dokument rozrjad/přiwěški/woršty wobsahuje) +toggle_sidebar_label=Bóčnicu pokazać/schować +document_outline.title=Dokumentowy naćisk pokazać (dwójne kliknjenje, zo bychu so wšě zapiski pokazali/schowali) +document_outline_label=Dokumentowa struktura +attachments.title=Přiwěški pokazać +attachments_label=Přiwěški +layers.title=Woršty pokazać (klikńće dwójce, zo byšće wšě woršty na standardny staw wróćo stajił) +layers_label=Woršty +thumbs.title=Miniatury pokazać +thumbs_label=Miniatury +current_outline_item.title=Aktualny rozrjadowy zapisk pytać +current_outline_item_label=Aktualny rozrjadowy zapisk +findbar.title=W dokumenće pytać +findbar_label=Pytać + +additional_layers=Dalše woršty +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Strona {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strona {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura strony {{page}} + +# Find panel button title and messages +find_input.title=Pytać +find_input.placeholder=W dokumenće pytać… +find_previous.title=Předchadne wustupowanje pytanskeho wuraza pytać +find_previous_label=Wróćo +find_next.title=Přichodne wustupowanje pytanskeho wuraza pytać +find_next_label=Dale +find_highlight=Wšě wuzběhnyć +find_match_case_label=Wulkopisanje wobkedźbować +find_match_diacritics_label=Diakritiske znamješka wužiwać +find_entire_word_label=Cyłe słowa +find_reached_top=Spočatk dokumenta docpěty, pokročuje so z kóncom +find_reached_bottom=Kónc dokument docpěty, pokročuje so ze spočatkom +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} z {{total}} wotpowědnika +find_match_count[two]={{current}} z {{total}} wotpowědnikow +find_match_count[few]={{current}} z {{total}} wotpowědnikow +find_match_count[many]={{current}} z {{total}} wotpowědnikow +find_match_count[other]={{current}} z {{total}} wotpowědnikow +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Wjace hač {{limit}} wotpowědnikow +find_match_count_limit[one]=Wjace hač {{limit}} wotpowědnik +find_match_count_limit[two]=Wjace hač {{limit}} wotpowědnikaj +find_match_count_limit[few]=Wjace hač {{limit}} wotpowědniki +find_match_count_limit[many]=Wjace hač {{limit}} wotpowědnikow +find_match_count_limit[other]=Wjace hač {{limit}} wotpowědnikow +find_not_found=Pytanski wuraz njeje so namakał + +# Error panel labels +error_more_info=Wjace informacijow +error_less_info=Mjenje informacijow +error_close=Začinić +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Zdźělenka: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Lisćina zawołanjow: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dataja: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linka: {{line}} + +# Predefined zoom values +page_scale_width=Šěrokosć strony +page_scale_fit=Wulkosć strony +page_scale_auto=Awtomatiske skalowanje +page_scale_actual=Aktualna wulkosć +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Začituje so… +loading_error=Při začitowanju PDF je zmylk wustupił. +invalid_file_error=Njepłaćiwa abo wobškodźena PDF-dataja. +missing_file_error=Falowaca PDF-dataja. +unexpected_response_error=Njewočakowana serwerowa wotmołwa. + +rendering_error=Při zwobraznjenju strony je zmylk wustupił. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Typ přispomnjenki: {{type}}] +password_label=Zapodajće hesło, zo byšće PDF-dataju wočinił. +password_invalid=Njepłaćiwe hesło. Prošu spytajće hišće raz. +password_ok=W porjadku +password_cancel=Přetorhnyć + +printing_not_supported=Warnowanje: Ćišćenje so přez tutón wobhladowak połnje njepodpěruje. +printing_not_ready=Warnowanje: PDF njeje so za ćišćenje dospołnje začitał. +web_fonts_disabled=Webpisma su znjemóžnjene: njeje móžno, zasadźene PDF-pisma wužiwać. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Rysować +editor_ink2_label=Rysować + +free_text2_default_content=Započńće pisać… + +# Editor Parameters +editor_free_text_color=Barba +editor_free_text_size=Wulkosć +editor_ink_color=Barba +editor_ink_thickness=Tołstosć +editor_ink_opacity=Opacita + +# Editor aria +editor_free_text2_aria_label=Tekstowy editor +editor_ink2_aria_label=Rysowanski editor +editor_ink_canvas_aria_label=Wobraz wutworjeny wot wužiwarja diff --git a/src/assets/pdf-annotation/web/locale/hu/viewer.properties b/src/assets/pdf-annotation/web/locale/hu/viewer.properties new file mode 100755 index 0000000..e921180 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/hu/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Előző oldal +previous_label=Előző +next.title=Következő oldal +next_label=Tovább + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Oldal +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=összesen: {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Kicsinyítés +zoom_out_label=Kicsinyítés +zoom_in.title=Nagyítás +zoom_in_label=Nagyítás +zoom.title=Nagyítás +presentation_mode.title=Váltás bemutató módba +presentation_mode_label=Bemutató mód +open_file.title=Fájl megnyitása +open_file_label=Megnyitás +print.title=Nyomtatás +print_label=Nyomtatás +download.title=Letöltés +download_label=Letöltés +save.title=Mentés +save_label=Mentés +bookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban) +bookmark_label=Aktuális nézet + +# Secondary toolbar and context menu +tools.title=Eszközök +tools_label=Eszközök +first_page.title=Ugrás az első oldalra +first_page_label=Ugrás az első oldalra +last_page.title=Ugrás az utolsó oldalra +last_page_label=Ugrás az utolsó oldalra +page_rotate_cw.title=Forgatás az óramutató járásával egyezően +page_rotate_cw_label=Forgatás az óramutató járásával egyezően +page_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen +page_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen + +cursor_text_select_tool.title=Szövegkijelölő eszköz bekapcsolása +cursor_text_select_tool_label=Szövegkijelölő eszköz +cursor_hand_tool.title=Kéz eszköz bekapcsolása +cursor_hand_tool_label=Kéz eszköz + +scroll_page.title=Oldalgörgetés használata +scroll_page_label=Oldalgörgetés +scroll_vertical.title=Függőleges görgetés használata +scroll_vertical_label=Függőleges görgetés +scroll_horizontal.title=Vízszintes görgetés használata +scroll_horizontal_label=Vízszintes görgetés +scroll_wrapped.title=Rácsos elrendezés használata +scroll_wrapped_label=Rácsos elrendezés + +spread_none.title=Ne tapassza össze az oldalakat +spread_none_label=Nincs összetapasztás +spread_odd.title=Lapok összetapasztása, a páratlan számú oldalakkal kezdve +spread_odd_label=Összetapasztás: páratlan +spread_even.title=Lapok összetapasztása, a páros számú oldalakkal kezdve +spread_even_label=Összetapasztás: páros + +# Document properties dialog box +document_properties.title=Dokumentum tulajdonságai… +document_properties_label=Dokumentum tulajdonságai… +document_properties_file_name=Fájlnév: +document_properties_file_size=Fájlméret: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bájt) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bájt) +document_properties_title=Cím: +document_properties_author=Szerző: +document_properties_subject=Tárgy: +document_properties_keywords=Kulcsszavak: +document_properties_creation_date=Létrehozás dátuma: +document_properties_modification_date=Módosítás dátuma: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Létrehozta: +document_properties_producer=PDF előállító: +document_properties_version=PDF verzió: +document_properties_page_count=Oldalszám: +document_properties_page_size=Lapméret: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=álló +document_properties_page_size_orientation_landscape=fekvő +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Jogi információk +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Gyors webes nézet: +document_properties_linearized_yes=Igen +document_properties_linearized_no=Nem +document_properties_close=Bezárás + +print_progress_message=Dokumentum előkészítése nyomtatáshoz… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Mégse + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Oldalsáv be/ki +toggle_sidebar_notification2.title=Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket/rétegeket tartalmaz) +toggle_sidebar_label=Oldalsáv be/ki +document_outline.title=Dokumentum megjelenítése online (dupla kattintás minden elem kinyitásához/összecsukásához) +document_outline_label=Dokumentumvázlat +attachments.title=Mellékletek megjelenítése +attachments_label=Van melléklet +layers.title=Rétegek megjelenítése (dupla kattintás az összes réteg alapértelmezett állapotra visszaállításához) +layers_label=Rétegek +thumbs.title=Bélyegképek megjelenítése +thumbs_label=Bélyegképek +current_outline_item.title=Jelenlegi vázlatelem megkeresése +current_outline_item_label=Jelenlegi vázlatelem +findbar.title=Keresés a dokumentumban +findbar_label=Keresés + +additional_layers=További rétegek +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark={{page}}. oldal +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}. oldal +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. oldal bélyegképe + +# Find panel button title and messages +find_input.title=Keresés +find_input.placeholder=Keresés a dokumentumban… +find_previous.title=A kifejezés előző előfordulásának keresése +find_previous_label=Előző +find_next.title=A kifejezés következő előfordulásának keresése +find_next_label=Tovább +find_highlight=Összes kiemelése +find_match_case_label=Kis- és nagybetűk megkülönböztetése +find_match_diacritics_label=Diakritikus jelek +find_entire_word_label=Teljes szavak +find_reached_top=A dokumentum eleje elérve, folytatás a végétől +find_reached_bottom=A dokumentum vége elérve, folytatás az elejétől +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} / {{total}} találat +find_match_count[two]={{current}} / {{total}} találat +find_match_count[few]={{current}} / {{total}} találat +find_match_count[many]={{current}} / {{total}} találat +find_match_count[other]={{current}} / {{total}} találat +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Több mint {{limit}} találat +find_match_count_limit[one]=Több mint {{limit}} találat +find_match_count_limit[two]=Több mint {{limit}} találat +find_match_count_limit[few]=Több mint {{limit}} találat +find_match_count_limit[many]=Több mint {{limit}} találat +find_match_count_limit[other]=Több mint {{limit}} találat +find_not_found=A kifejezés nem található + +# Error panel labels +error_more_info=További tudnivalók +error_less_info=Kevesebb információ +error_close=Bezárás +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Üzenet: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Verem: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fájl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Sor: {{line}} + +# Predefined zoom values +page_scale_width=Oldalszélesség +page_scale_fit=Teljes oldal +page_scale_auto=Automatikus nagyítás +page_scale_actual=Valódi méret +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Betöltés… +loading_error=Hiba történt a PDF betöltésekor. +invalid_file_error=Érvénytelen vagy sérült PDF fájl. +missing_file_error=Hiányzó PDF fájl. +unexpected_response_error=Váratlan kiszolgálóválasz. + +rendering_error=Hiba történt az oldal feldolgozása közben. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} megjegyzés] +password_label=Adja meg a jelszót a PDF fájl megnyitásához. +password_invalid=Helytelen jelszó. Próbálja újra. +password_ok=OK +password_cancel=Mégse + +printing_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást. +printing_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz. +web_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek. + +# Editor +editor_free_text2.title=Szöveg +editor_free_text2_label=Szöveg +editor_ink2.title=Rajzolás +editor_ink2_label=Rajzolás + +free_text2_default_content=Kezdjen el gépelni… + +# Editor Parameters +editor_free_text_color=Szín +editor_free_text_size=Méret +editor_ink_color=Szín +editor_ink_thickness=Vastagság +editor_ink_opacity=Átlátszatlanság + +# Editor aria +editor_free_text2_aria_label=Szövegszerkesztő +editor_ink2_aria_label=Rajzszerkesztő +editor_ink_canvas_aria_label=Felhasználó által készített kép diff --git a/src/assets/pdf-annotation/web/locale/hy-AM/viewer.properties b/src/assets/pdf-annotation/web/locale/hy-AM/viewer.properties new file mode 100755 index 0000000..a868897 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/hy-AM/viewer.properties @@ -0,0 +1,239 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Նախորդ էջը +previous_label=Նախորդը +next.title=Հաջորդ էջը +next_label=Հաջորդը + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Էջ. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}}-ից\u0020 +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}}-ը {{pagesCount}})-ից + +zoom_out.title=Փոքրացնել +zoom_out_label=Փոքրացնել +zoom_in.title=Խոշորացնել +zoom_in_label=Խոշորացնել +zoom.title=Մասշտաբը\u0020 +presentation_mode.title=Անցնել Ներկայացման եղանակին +presentation_mode_label=Ներկայացման եղանակ +open_file.title=Բացել նիշք +open_file_label=Բացել +print.title=Տպել +print_label=Տպել +download.title=Բեռնել +download_label=Բեռնել +bookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում) +bookmark_label=Ընթացիկ տեսքը + +# Secondary toolbar and context menu +tools.title=Գործիքներ +tools_label=Գործիքներ +first_page.title=Անցնել առաջին էջին +first_page_label=Անցնել առաջին էջին +last_page.title=Անցնել վերջին էջին +last_page_label=Անցնել վերջին էջին +page_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի +page_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի +page_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի +page_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի + +cursor_text_select_tool.title=Միացնել գրույթ ընտրելու գործիքը +cursor_text_select_tool_label=Գրույթը ընտրելու գործիք +cursor_hand_tool.title=Միացնել Ձեռքի գործիքը +cursor_hand_tool_label=Ձեռքի գործիք + +scroll_vertical.title=Օգտագործել ուղղահայաց ոլորում +scroll_vertical_label=Ուղղահայաց ոլորում +scroll_horizontal.title=Օգտագործել հորիզոնական ոլորում +scroll_horizontal_label=Հորիզոնական ոլորում +scroll_wrapped.title=Օգտագործել փաթաթված ոլորում +scroll_wrapped_label=Փաթաթված ոլորում + +spread_none.title=Մի միացեք էջի վերածածկերին +spread_none_label=Չկա վերածածկեր +spread_odd.title=Միացեք էջի վերածածկերին սկսելով՝ կենտ համարակալված էջերով +spread_odd_label=Կենտ վերածածկեր +spread_even.title=Միացեք էջի վերածածկերին սկսելով՝ զույգ համարակալված էջերով +spread_even_label=Զույգ վերածածկեր + +# Document properties dialog box +document_properties.title=Փաստաթղթի հատկությունները… +document_properties_label=Փաստաթղթի հատկությունները… +document_properties_file_name=Նիշքի անունը. +document_properties_file_size=Նիշք չափը. +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ) +document_properties_title=Վերնագիր. +document_properties_author=Հեղինակ․ +document_properties_subject=Վերնագիր. +document_properties_keywords=Հիմնաբառ. +document_properties_creation_date=Ստեղծելու ամսաթիվը. +document_properties_modification_date=Փոփոխելու ամսաթիվը. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Ստեղծող. +document_properties_producer=PDF-ի հեղինակը. +document_properties_version=PDF-ի տարբերակը. +document_properties_page_count=Էջերի քանակը. +document_properties_page_size=Էջի չափը. +document_properties_page_size_unit_inches=ում +document_properties_page_size_unit_millimeters=մմ +document_properties_page_size_orientation_portrait=ուղղաձիգ +document_properties_page_size_orientation_landscape=հորիզոնական +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Նամակ +document_properties_page_size_name_legal=Օրինական +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Արագ վեբ դիտում․ +document_properties_linearized_yes=Այո +document_properties_linearized_no=Ոչ +document_properties_close=Փակել + +print_progress_message=Նախապատրաստում է փաստաթուղթը տպելուն... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Չեղարկել + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Բացել/Փակել Կողային վահանակը +toggle_sidebar_label=Բացել/Փակել Կողային վահանակը +document_outline.title=Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միավորները ընդարձակելու/կոծկելու համար) +document_outline_label=Փաստաթղթի բովանդակությունը +attachments.title=Ցուցադրել կցորդները +attachments_label=Կցորդներ +thumbs.title=Ցուցադրել Մանրապատկերը +thumbs_label=Մանրապատկերը +findbar.title=Գտնել փաստաթղթում +findbar_label=Որոնում + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Էջը {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Էջի մանրապատկերը {{page}} + +# Find panel button title and messages +find_input.title=Որոնում +find_input.placeholder=Գտնել փաստաթղթում... +find_previous.title=Գտնել անրահայտության նախորդ հանդիպումը +find_previous_label=Նախորդը +find_next.title=Գտիր արտահայտության հաջորդ հանդիպումը +find_next_label=Հաջորդը +find_highlight=Գունանշել բոլորը +find_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել +find_entire_word_label=Ամբողջ բառերը +find_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից +find_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ հոգնակի(ընդհանուր) ]} +find_match_count[one]={{current}} {{total}}-ի համընկնումից +find_match_count[two]={{current}} {{total}}-ի համընկնումներից +find_match_count[few]={{current}} {{total}}-ի համընկնումներից +find_match_count[many]={{current}} {{total}}-ի համընկնումներից +find_match_count[other]={{current}} {{total}}-ի համընկնումներից +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ հոգնակի (սահմանը) ]} +find_match_count_limit[zero]=Ավելին քան {{limit}} համընկնումները +find_match_count_limit[one]=Ավելին քան {{limit}} համընկնումը +find_match_count_limit[two]=Ավելին քան {{limit}} համընկնումներներ +find_match_count_limit[few]=Ավելին քան {{limit}} համընկնումներներ +find_match_count_limit[many]=Ավելին քան {{limit}} համընկնումներներ +find_match_count_limit[other]=Ավելին քան {{limit}} համընկնումներներ +find_not_found=Արտահայտությունը չգտնվեց + +# Error panel labels +error_more_info=Ավելի շատ տեղեկություն +error_less_info=Քիչ տեղեկություն +error_close=Փակել +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (կառուցումը. {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Գրությունը. {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Շեղջ. {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ֆայլ. {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Տողը. {{line}} +rendering_error=Սխալ՝ էջը ստեղծելիս: + +# Predefined zoom values +page_scale_width=Էջի լայնքը +page_scale_fit=Ձգել էջը +page_scale_auto=Ինքնաշխատ +page_scale_actual=Իրական չափը +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Սխալ՝ PDF ֆայլը բացելիս։ +invalid_file_error=Սխալ կամ վնասված PDF ֆայլ: +missing_file_error=PDF ֆայլը բացակայում է: +unexpected_response_error=Սպասարկիչի անսպասելի պատասխան: + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Ծանոթություն] +password_label=Մուտքագրեք PDF-ի գաղտնաբառը: +password_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք: +password_ok=Լավ +password_cancel=Չեղարկել + +printing_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։ +printing_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար: +web_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները: + diff --git a/src/assets/pdf-annotation/web/locale/hye/viewer.properties b/src/assets/pdf-annotation/web/locale/hye/viewer.properties new file mode 100755 index 0000000..40194da --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/hye/viewer.properties @@ -0,0 +1,252 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Նախորդ էջ +previous_label=Նախորդը +next.title=Յաջորդ էջ +next_label=Յաջորդը + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=էջ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}}-ից\u0020 +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}}-ը {{pagesCount}})-ից + +zoom_out.title=Փոքրացնել +zoom_out_label=Փոքրացնել +zoom_in.title=Խոշորացնել +zoom_in_label=Խոշորացնել +zoom.title=Խոշորացում +presentation_mode.title=Անցնել ներկայացման եղանակին +presentation_mode_label=Ներկայացման եղանակ +open_file.title=Բացել նիշքը +open_file_label=Բացել +print.title=Տպել +print_label=Տպել +download.title=Բեռնել +download_label=Բեռնել +bookmark.title=Ընթացիկ տեսքով (պատճէնել կամ բացել նոր պատուհանում) +bookmark_label=Ընթացիկ տեսք + +# Secondary toolbar and context menu +tools.title=Գործիքներ +tools_label=Գործիքներ +first_page.title=Գնալ դէպի առաջին էջ +first_page_label=Գնալ դէպի առաջին էջ +last_page.title=Գնալ դէպի վերջին էջ +last_page_label=Գնալ դէպի վերջին էջ +page_rotate_cw.title=Պտտել ժամացոյցի սլաքի ուղղութեամբ +page_rotate_cw_label=Պտտել ժամացոյցի սլաքի ուղղութեամբ +page_rotate_ccw.title=Պտտել ժամացոյցի սլաքի հակառակ ուղղութեամբ +page_rotate_ccw_label=Պտտել ժամացոյցի սլաքի հակառակ ուղղութեամբ + +cursor_text_select_tool.title=Միացնել գրոյթ ընտրելու գործիքը +cursor_text_select_tool_label=Գրուածք ընտրելու գործիք +cursor_hand_tool.title=Միացնել ձեռքի գործիքը +cursor_hand_tool_label=Ձեռքի գործիք + +scroll_page.title=Աւգտագործել էջի ոլորում +scroll_page_label=Էջի ոլորում +scroll_vertical.title=Աւգտագործել ուղղահայեաց ոլորում +scroll_vertical_label=Ուղղահայեաց ոլորում +scroll_horizontal.title=Աւգտագործել հորիզոնական ոլորում +scroll_horizontal_label=Հորիզոնական ոլորում +scroll_wrapped.title=Աւգտագործել փաթաթուած ոլորում +scroll_wrapped_label=Փաթաթուած ոլորում + +spread_none.title=Մի միացէք էջի կոնտեքստում +spread_none_label=Չկայ կոնտեքստ +spread_odd.title=Միացէք էջի կոնտեքստին սկսելով՝ կենտ համարակալուած էջերով +spread_odd_label=Տարաւրինակ կոնտեքստ +spread_even.title=Միացէք էջի կոնտեքստին սկսելով՝ զոյգ համարակալուած էջերով +spread_even_label=Հաւասար վերածածկեր + +# Document properties dialog box +document_properties.title=Փաստաթղթի հատկութիւնները… +document_properties_label=Փաստաթղթի յատկութիւնները… +document_properties_file_name=Նիշքի անունը․ +document_properties_file_size=Նիշք չափը. +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ) +document_properties_title=Վերնագիր +document_properties_author=Հեղինակ․ +document_properties_subject=առարկայ +document_properties_keywords=Հիմնաբառեր +document_properties_creation_date=Ստեղծման ամսաթիւ +document_properties_modification_date=Փոփոխութեան ամսաթիւ. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Ստեղծող +document_properties_producer=PDF-ի Արտադրողը. +document_properties_version=PDF-ի տարբերակը. +document_properties_page_count=Էջերի քանակը. +document_properties_page_size=Էջի չափը. +document_properties_page_size_unit_inches=ում +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=ուղղաձիգ +document_properties_page_size_orientation_landscape=հորիզոնական +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Նամակ +document_properties_page_size_name_legal=Աւրինական +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Արագ վեբ դիտում․ +document_properties_linearized_yes=Այո +document_properties_linearized_no=Ոչ +document_properties_close=Փակել + +print_progress_message=Նախապատրաստում է փաստաթուղթը տպելուն… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Չեղարկել + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Փոխարկել կողային վահանակը +toggle_sidebar_notification2.title=Փոխանջատել կողմնասիւնը (փաստաթուղթը պարունակում է ուրուագիծ/կցորդներ/շերտեր) +toggle_sidebar_label=Փոխարկել կողային վահանակը +document_outline.title=Ցուցադրել փաստաթղթի ուրուագիծը (կրկնակի սեղմէք՝ միաւորները ընդարձակելու/կոծկելու համար) +document_outline_label=Փաստաթղթի ուրուագիծ +attachments.title=Ցուցադրել կցորդները +attachments_label=Կցորդներ +layers.title=Ցուցադրել շերտերը (կրկնահպել վերակայելու բոլոր շերտերը սկզբնադիր վիճակի) +layers_label=Շերտեր +thumbs.title=Ցուցադրել մանրապատկերը +thumbs_label=Մանրապատկեր +current_outline_item.title=Գտէք ընթացիկ գծագրման տարրը +current_outline_item_label=Ընթացիկ գծագրման տարր +findbar.title=Գտնել փաստաթղթում +findbar_label=Որոնում + +additional_layers=Լրացուցիչ շերտեր +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Էջ {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Էջը {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Էջի մանրապատկերը {{page}} + +# Find panel button title and messages +find_input.title=Որոնում +find_input.placeholder=Գտնել փաստաթղթում… +find_previous.title=Գտնել արտայայտութեան նախորդ արտայայտութիւնը +find_previous_label=Նախորդը +find_next.title=Գտիր արտայայտութեան յաջորդ արտայայտութիւնը +find_next_label=Հաջորդը +find_highlight=Գունանշել բոլորը +find_match_case_label=Հաշուի առնել հանգամանքը +find_match_diacritics_label=Հնչիւնատարբերիչ նշանների համապատասխանեցում +find_entire_word_label=Ամբողջ բառերը +find_reached_top=Հասել եք փաստաթղթի վերեւին,շարունակել ներքեւից +find_reached_bottom=Հասել էք փաստաթղթի վերջին, շարունակել վերեւից +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} {{total}}-ի համընկնումից +find_match_count[two]={{current}} {{total}}-ի համընկնումներից +find_match_count[few]={{current}} {{total}}-ի համընկնումներից +find_match_count[many]={{current}} {{total}}-ի համընկնումներից +find_match_count[other]={{current}} {{total}}-ի համընկնումներից +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Աւելին քան {{limit}} համընկնումները +find_match_count_limit[one]=Աւելին քան {{limit}} համընկնումը +find_match_count_limit[two]=Աւելին քան {{limit}} համընկնումները +find_match_count_limit[few]=Աւելին քան {{limit}} համընկնումները +find_match_count_limit[many]=Աւելին քան {{limit}} համընկնումները +find_match_count_limit[other]=Աւելին քան {{limit}} համընկնումները +find_not_found=Արտայայտութիւնը չգտնուեց + +# Error panel labels +error_more_info=Աւելի շատ տեղեկութիւն +error_less_info=Քիչ տեղեկութիւն +error_close=Փակել +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (կառուցումը. {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Գրութիւնը. {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Շեղջ. {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=նիշք․ {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Տողը. {{line}} +rendering_error=Սխալ է տեղի ունեցել էջի մեկնաբանման ժամանակ + +# Predefined zoom values +page_scale_width=Էջի լայնութիւն +page_scale_fit=Հարմարեցնել էջը +page_scale_auto=Ինքնաշխատ խոշորացում +page_scale_actual=Իրական չափը +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Բեռնում… +loading_error=PDF նիշքը բացելիս սխալ է տեղի ունեցել։ +invalid_file_error=Սխալ կամ վնասուած PDF նիշք։ +missing_file_error=PDF նիշքը բացակաիւմ է։ +unexpected_response_error=Սպասարկիչի անսպասելի պատասխան։ + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Ծանոթութիւն] +password_label=Մուտքագրէք գաղտնաբառը այս PDF նիշքը բացելու համար +password_invalid=Գաղտնաբառը սխալ է: Կրկին փորձէք: +password_ok=Լաւ +password_cancel=Չեղարկել + +printing_not_supported=Զգուշացում. Տպելը ամբողջութեամբ չի աջակցուում զննարկիչի կողմից։ +printing_not_ready=Զգուշացում. PDF֊ը ամբողջութեամբ չի բեռնաւորուել տպելու համար։ +web_fonts_disabled=Վեբ-տառատեսակները անջատուած են. հնարաւոր չէ աւգտագործել ներկառուցուած PDF տառատեսակները։ + diff --git a/src/assets/pdf-annotation/web/locale/ia/viewer.properties b/src/assets/pdf-annotation/web/locale/ia/viewer.properties new file mode 100755 index 0000000..a797fef --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ia/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina previe +previous_label=Previe +next.title=Pagina sequente +next_label=Sequente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Distantiar +zoom_out_label=Distantiar +zoom_in.title=Approximar +zoom_in_label=Approximar +zoom.title=Zoom +presentation_mode.title=Excambiar a modo presentation +presentation_mode_label=Modo presentation +open_file.title=Aperir le file +open_file_label=Aperir +print.title=Imprimer +print_label=Imprimer +download.title=Discargar +download_label=Discargar +save.title=Salvar +save_label=Salvar +bookmark.title=Vista actual (copiar o aperir in un nove fenestra) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Instrumentos +tools_label=Instrumentos +first_page.title=Ir al prime pagina +first_page_label=Ir al prime pagina +last_page.title=Ir al prime pagina +last_page_label=Ir al prime pagina +page_rotate_cw.title=Rotar in senso horari +page_rotate_cw_label=Rotar in senso horari +page_rotate_ccw.title=Rotar in senso antihorari +page_rotate_ccw_label=Rotar in senso antihorari + +cursor_text_select_tool.title=Activar le instrumento de selection de texto +cursor_text_select_tool_label=Instrumento de selection de texto +cursor_hand_tool.title=Activar le instrumento mano +cursor_hand_tool_label=Instrumento mano + +scroll_page.title=Usar rolamento de pagina +scroll_page_label=Rolamento de pagina +scroll_vertical.title=Usar rolamento vertical +scroll_vertical_label=Rolamento vertical +scroll_horizontal.title=Usar rolamento horizontal +scroll_horizontal_label=Rolamento horizontal +scroll_wrapped.title=Usar rolamento incapsulate +scroll_wrapped_label=Rolamento incapsulate + +spread_none.title=Non junger paginas dual +spread_none_label=Sin paginas dual +spread_odd.title=Junger paginas dual a partir de paginas con numeros impar +spread_odd_label=Paginas dual impar +spread_even.title=Junger paginas dual a partir de paginas con numeros par +spread_even_label=Paginas dual par + +# Document properties dialog box +document_properties.title=Proprietates del documento… +document_properties_label=Proprietates del documento… +document_properties_file_name=Nomine del file: +document_properties_file_size=Dimension de file: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titulo: +document_properties_author=Autor: +document_properties_subject=Subjecto: +document_properties_keywords=Parolas clave: +document_properties_creation_date=Data de creation: +document_properties_modification_date=Data de modification: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=Productor PDF: +document_properties_version=Version PDF: +document_properties_page_count=Numero de paginas: +document_properties_page_size=Dimension del pagina: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=horizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Littera +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista web rapide: +document_properties_linearized_yes=Si +document_properties_linearized_no=No +document_properties_close=Clauder + +print_progress_message=Preparation del documento pro le impression… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancellar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Monstrar/celar le barra lateral +toggle_sidebar_notification2.title=Monstrar/celar le barra lateral (le documento contine structura/attachamentos/stratos) +toggle_sidebar_label=Monstrar/celar le barra lateral +document_outline.title=Monstrar le schema del documento (clic duple pro expander/contraher tote le elementos) +document_outline_label=Schema del documento +attachments.title=Monstrar le annexos +attachments_label=Annexos +layers.title=Monstrar stratos (clicca duple pro remontar tote le stratos al stato predefinite) +layers_label=Stratos +thumbs.title=Monstrar le vignettes +thumbs_label=Vignettes +current_outline_item.title=Trovar le elemento de structura actual +current_outline_item_label=Elemento de structura actual +findbar.title=Cercar in le documento +findbar_label=Cercar + +additional_layers=Altere stratos +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pagina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Vignette del pagina {{page}} + +# Find panel button title and messages +find_input.title=Cercar +find_input.placeholder=Cercar in le documento… +find_previous.title=Trovar le previe occurrentia del phrase +find_previous_label=Previe +find_next.title=Trovar le successive occurrentia del phrase +find_next_label=Sequente +find_highlight=Evidentiar toto +find_match_case_label=Distinguer majusculas/minusculas +find_match_diacritics_label=Differentiar diacriticos +find_entire_word_label=Parolas integre +find_reached_top=Initio del documento attingite, continuation ab fin +find_reached_bottom=Fin del documento attingite, continuation ab initio +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} concordantia +find_match_count[two]={{current}} de {{total}} concordantias +find_match_count[few]={{current}} de {{total}} concordantias +find_match_count[many]={{current}} de {{total}} concordantias +find_match_count[other]={{current}} de {{total}} concordantias +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Plus de {{limit}} concordantias +find_match_count_limit[one]=Plus de {{limit}} concordantia +find_match_count_limit[two]=Plus de {{limit}} concordantias +find_match_count_limit[few]=Plus de {{limit}} concordantias +find_match_count_limit[many]=Plus de {{limit}} correspondentias +find_match_count_limit[other]=Plus de {{limit}} concordantias +find_not_found=Phrase non trovate + +# Error panel labels +error_more_info=Plus de informationes +error_less_info=Minus de informationes +error_close=Clauder +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linea: {{line}} + +# Predefined zoom values +page_scale_width=Plen largor del pagina +page_scale_fit=Pagina integre +page_scale_auto=Zoom automatic +page_scale_actual=Dimension real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Cargante… +loading_error=Un error occurreva durante que on cargava le file PDF. +invalid_file_error=File PDF corrumpite o non valide. +missing_file_error=File PDF mancante. +unexpected_response_error=Responsa del servitor inexpectate. + +rendering_error=Un error occurreva durante que on processava le pagina. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Insere le contrasigno pro aperir iste file PDF. +password_invalid=Contrasigno invalide. Per favor retenta. +password_ok=OK +password_cancel=Cancellar + +printing_not_supported=Attention : le impression non es totalmente supportate per ce navigator. +printing_not_ready=Attention: le file PDF non es integremente cargate pro lo poter imprimer. +web_fonts_disabled=Le typos de litteras web es disactivate: impossibile usar le typos de litteras PDF incorporate. + +# Editor +editor_free_text2.title=Texto +editor_free_text2_label=Texto +editor_ink2.title=Designar +editor_ink2_label=Designar + +free_text2_default_content=Comenciar a scriber… + +# Editor Parameters +editor_free_text_color=Color +editor_free_text_size=Dimension +editor_ink_color=Color +editor_ink_thickness=Spissor +editor_ink_opacity=Opacitate + +# Editor aria +editor_free_text2_aria_label=Editor de texto +editor_ink2_aria_label=Editor de designos +editor_ink_canvas_aria_label=Imagine create per le usator diff --git a/src/assets/pdf-annotation/web/locale/id/viewer.properties b/src/assets/pdf-annotation/web/locale/id/viewer.properties new file mode 100755 index 0000000..fc4f2df --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/id/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Laman Sebelumnya +previous_label=Sebelumnya +next.title=Laman Selanjutnya +next_label=Selanjutnya + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Halaman +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=dari {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} dari {{pagesCount}}) + +zoom_out.title=Perkecil +zoom_out_label=Perkecil +zoom_in.title=Perbesar +zoom_in_label=Perbesar +zoom.title=Perbesaran +presentation_mode.title=Ganti ke Mode Presentasi +presentation_mode_label=Mode Presentasi +open_file.title=Buka Berkas +open_file_label=Buka +print.title=Cetak +print_label=Cetak +download.title=Unduh +download_label=Unduh +save.title=Simpan +save_label=Simpan +bookmark.title=Tampilan Sekarang (salin atau buka di jendela baru) +bookmark_label=Tampilan Sekarang + +# Secondary toolbar and context menu +tools.title=Alat +tools_label=Alat +first_page.title=Buka Halaman Pertama +first_page_label=Buka Halaman Pertama +last_page.title=Buka Halaman Terakhir +last_page_label=Buka Halaman Terakhir +page_rotate_cw.title=Putar Searah Jarum Jam +page_rotate_cw_label=Putar Searah Jarum Jam +page_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam +page_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam + +cursor_text_select_tool.title=Aktifkan Alat Seleksi Teks +cursor_text_select_tool_label=Alat Seleksi Teks +cursor_hand_tool.title=Aktifkan Alat Tangan +cursor_hand_tool_label=Alat Tangan + +scroll_page.title=Gunakan Pengguliran Laman +scroll_page_label=Pengguliran Laman +scroll_vertical.title=Gunakan Penggeseran Vertikal +scroll_vertical_label=Penggeseran Vertikal +scroll_horizontal.title=Gunakan Penggeseran Horizontal +scroll_horizontal_label=Penggeseran Horizontal +scroll_wrapped.title=Gunakan Penggeseran Terapit +scroll_wrapped_label=Penggeseran Terapit + +spread_none.title=Jangan gabungkan lembar halaman +spread_none_label=Tidak Ada Lembaran +spread_odd.title=Gabungkan lembar lamanan mulai dengan halaman ganjil +spread_odd_label=Lembaran Ganjil +spread_even.title=Gabungkan lembar halaman dimulai dengan halaman genap +spread_even_label=Lembaran Genap + +# Document properties dialog box +document_properties.title=Properti Dokumen… +document_properties_label=Properti Dokumen… +document_properties_file_name=Nama berkas: +document_properties_file_size=Ukuran berkas: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Judul: +document_properties_author=Penyusun: +document_properties_subject=Subjek: +document_properties_keywords=Kata Kunci: +document_properties_creation_date=Tanggal Dibuat: +document_properties_modification_date=Tanggal Dimodifikasi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Pembuat: +document_properties_producer=Pemroduksi PDF: +document_properties_version=Versi PDF: +document_properties_page_count=Jumlah Halaman: +document_properties_page_size=Ukuran Laman: +document_properties_page_size_unit_inches=inci +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=tegak +document_properties_page_size_orientation_landscape=mendatar +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Tampilan Web Kilat: +document_properties_linearized_yes=Ya +document_properties_linearized_no=Tidak +document_properties_close=Tutup + +print_progress_message=Menyiapkan dokumen untuk pencetakan… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Batalkan + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping +toggle_sidebar_notification2.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran/lapisan) +toggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping +document_outline.title=Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item) +document_outline_label=Kerangka Dokumen +attachments.title=Tampilkan Lampiran +attachments_label=Lampiran +layers.title=Tampilkan Lapisan (klik ganda untuk mengatur ulang semua lapisan ke keadaan baku) +layers_label=Lapisan +thumbs.title=Tampilkan Miniatur +thumbs_label=Miniatur +current_outline_item.title=Cari Butir Ikhtisar Saat Ini +current_outline_item_label=Butir Ikhtisar Saat Ini +findbar.title=Temukan di Dokumen +findbar_label=Temukan + +additional_layers=Lapisan Tambahan +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Halaman {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Laman {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatur Laman {{page}} + +# Find panel button title and messages +find_input.title=Temukan +find_input.placeholder=Temukan di dokumen… +find_previous.title=Temukan kata sebelumnya +find_previous_label=Sebelumnya +find_next.title=Temukan lebih lanjut +find_next_label=Selanjutnya +find_highlight=Sorot semuanya +find_match_case_label=Cocokkan BESAR/kecil +find_match_diacritics_label=Pencocokan Diakritik +find_entire_word_label=Seluruh teks +find_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah +find_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} dari {{total}} hasil +find_match_count[two]={{current}} dari {{total}} hasil +find_match_count[few]={{current}} dari {{total}} hasil +find_match_count[many]={{current}} dari {{total}} hasil +find_match_count[other]={{current}} dari {{total}} hasil +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Ditemukan lebih dari {{limit}} +find_match_count_limit[one]=Ditemukan lebih dari {{limit}} +find_match_count_limit[two]=Ditemukan lebih dari {{limit}} +find_match_count_limit[few]=Ditemukan lebih dari {{limit}} +find_match_count_limit[many]=Ditemukan lebih dari {{limit}} +find_match_count_limit[other]=Ditemukan lebih dari {{limit}} +find_not_found=Frasa tidak ditemukan + +# Error panel labels +error_more_info=Lebih Banyak Informasi +error_less_info=Lebih Sedikit Informasi +error_close=Tutup +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Pesan: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Berkas: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Baris: {{line}} + +# Predefined zoom values +page_scale_width=Lebar Laman +page_scale_fit=Muat Laman +page_scale_auto=Perbesaran Otomatis +page_scale_actual=Ukuran Asli +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Memuat… +loading_error=Galat terjadi saat memuat PDF. +invalid_file_error=Berkas PDF tidak valid atau rusak. +missing_file_error=Berkas PDF tidak ada. +unexpected_response_error=Balasan server yang tidak diharapkan. + +rendering_error=Galat terjadi saat merender laman. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotasi {{type}}] +password_label=Masukkan sandi untuk membuka berkas PDF ini. +password_invalid=Sandi tidak valid. Silakan coba lagi. +password_ok=Oke +password_cancel=Batal + +printing_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini. +printing_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak. +web_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat. + +# Editor +editor_free_text2.title=Teks +editor_free_text2_label=Teks +editor_ink2.title=Gambar +editor_ink2_label=Gambar + +free_text2_default_content=Mulai mengetik… + +# Editor Parameters +editor_free_text_color=Warna +editor_free_text_size=Ukuran +editor_ink_color=Warna +editor_ink_thickness=Ketebalan +editor_ink_opacity=Opasitas + +# Editor aria +editor_free_text2_aria_label=Editor Teks +editor_ink2_aria_label=Editor Gambar +editor_ink_canvas_aria_label=Gambar yang dibuat pengguna diff --git a/src/assets/pdf-annotation/web/locale/is/viewer.properties b/src/assets/pdf-annotation/web/locale/is/viewer.properties new file mode 100755 index 0000000..3c9f04b --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/is/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Fyrri síða +previous_label=Fyrri +next.title=Næsta síða +next_label=Næsti + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Síða +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=af {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} af {{pagesCount}}) + +zoom_out.title=Minnka aðdrátt +zoom_out_label=Minnka aðdrátt +zoom_in.title=Auka aðdrátt +zoom_in_label=Auka aðdrátt +zoom.title=Aðdráttur +presentation_mode.title=Skipta yfir á kynningarham +presentation_mode_label=Kynningarhamur +open_file.title=Opna skrá +open_file_label=Opna +print.title=Prenta +print_label=Prenta +download.title=Hala niður +download_label=Hala niður +save.title=Vista +save_label=Vista +bookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga) +bookmark_label=Núverandi sýn + +# Secondary toolbar and context menu +tools.title=Verkfæri +tools_label=Verkfæri +first_page.title=Fara á fyrstu síðu +first_page_label=Fara á fyrstu síðu +last_page.title=Fara á síðustu síðu +last_page_label=Fara á síðustu síðu +page_rotate_cw.title=Snúa réttsælis +page_rotate_cw_label=Snúa réttsælis +page_rotate_ccw.title=Snúa rangsælis +page_rotate_ccw_label=Snúa rangsælis + +cursor_text_select_tool.title=Virkja textavalsáhald +cursor_text_select_tool_label=Textavalsáhald +cursor_hand_tool.title=Virkja handarverkfæri +cursor_hand_tool_label=Handarverkfæri + +scroll_page.title=Nota síðuskrun +scroll_page_label=Síðuskrun +scroll_vertical.title=Nota lóðrétt skrun +scroll_vertical_label=Lóðrétt skrun +scroll_horizontal.title=Nota lárétt skrun +scroll_horizontal_label=Lárétt skrun +scroll_wrapped.title=Nota línuskipt síðuskrun +scroll_wrapped_label=Línuskipt síðuskrun + +spread_none.title=Ekki taka þátt í dreifingu síðna +spread_none_label=Engin dreifing +spread_odd.title=Taka þátt í dreifingu síðna með oddatölum +spread_odd_label=Oddatöludreifing +spread_even.title=Taktu þátt í dreifingu síðna með jöfnuntölum +spread_even_label=Jafnatöludreifing + +# Document properties dialog box +document_properties.title=Eiginleikar skjals… +document_properties_label=Eiginleikar skjals… +document_properties_file_name=Skráarnafn: +document_properties_file_size=Skrárstærð: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titill: +document_properties_author=Hönnuður: +document_properties_subject=Efni: +document_properties_keywords=Stikkorð: +document_properties_creation_date=Búið til: +document_properties_modification_date=Dags breytingar: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Höfundur: +document_properties_producer=PDF framleiðandi: +document_properties_version=PDF útgáfa: +document_properties_page_count=Blaðsíðufjöldi: +document_properties_page_size=Stærð síðu: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=skammsnið +document_properties_page_size_orientation_landscape=langsnið +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fljótleg vefskoðun: +document_properties_linearized_yes=Já +document_properties_linearized_no=Nei +document_properties_close=Loka + +print_progress_message=Undirbý skjal fyrir prentun… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Hætta við + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Víxla hliðarspjaldi af/á +toggle_sidebar_notification2.title=Víxla hliðarslá (skjal inniheldur yfirlit/viðhengi/lög) +toggle_sidebar_label=Víxla hliðarspjaldi af/á +document_outline.title=Sýna yfirlit skjals (tvísmelltu til að opna/loka öllum hlutum) +document_outline_label=Efnisskipan skjals +attachments.title=Sýna viðhengi +attachments_label=Viðhengi +layers.title=Birta lög (tvísmelltu til að endurstilla öll lög í sjálfgefna stöðu) +layers_label=Lög +thumbs.title=Sýna smámyndir +thumbs_label=Smámyndir +current_outline_item.title=Finna núverandi atriði efnisskipunar +current_outline_item_label=Núverandi atriði efnisskipunar +findbar.title=Leita í skjali +findbar_label=Leita + +additional_layers=Viðbótarlög +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Síða {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Síða {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Smámynd af síðu {{page}} + +# Find panel button title and messages +find_input.title=Leita +find_input.placeholder=Leita í skjali… +find_previous.title=Leita að fyrra tilfelli þessara orða +find_previous_label=Fyrri +find_next.title=Leita að næsta tilfelli þessara orða +find_next_label=Næsti +find_highlight=Lita allt +find_match_case_label=Passa við stafstöðu +find_match_diacritics_label=Passa við broddstafi +find_entire_word_label=Heil orð +find_reached_top=Náði efst í skjal, held áfram neðst +find_reached_bottom=Náði enda skjals, held áfram efst +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} af {{total}} niðurstöðu +find_match_count[two]={{current}} af {{total}} niðurstöðum +find_match_count[few]={{current}} af {{total}} niðurstöðum +find_match_count[many]={{current}} af {{total}} niðurstöðum +find_match_count[other]={{current}} af {{total}} niðurstöðum +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[one]=Fleiri en {{limit}} niðurstaða +find_match_count_limit[two]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[few]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[many]=Fleiri en {{limit}} niðurstöður +find_match_count_limit[other]=Fleiri en {{limit}} niðurstöður +find_not_found=Fann ekki orðið + +# Error panel labels +error_more_info=Meiri upplýsingar +error_less_info=Minni upplýsingar +error_close=Loka +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Skilaboð: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stafli: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Skrá: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lína: {{line}} + +# Predefined zoom values +page_scale_width=Síðubreidd +page_scale_fit=Passa á síðu +page_scale_auto=Sjálfvirkur aðdráttur +page_scale_actual=Raunstærð +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Hleður… +loading_error=Villa kom upp við að hlaða inn PDF. +invalid_file_error=Ógild eða skemmd PDF skrá. +missing_file_error=Vantar PDF skrá. +unexpected_response_error=Óvænt svar frá netþjóni. + +rendering_error=Upp kom villa við að birta síðuna. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Skýring] +password_label=Sláðu inn lykilorð til að opna þessa PDF skrá. +password_invalid=Ógilt lykilorð. Reyndu aftur. +password_ok=Í lagi +password_cancel=Hætta við + +printing_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra. +printing_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun. +web_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir. + +# Editor +editor_free_text2.title=Texti +editor_free_text2_label=Texti +editor_ink2.title=Teikna +editor_ink2_label=Teikna + +free_text2_default_content=Byrjaðu að skrifa… + +# Editor Parameters +editor_free_text_color=Litur +editor_free_text_size=Stærð +editor_ink_color=Litur +editor_ink_thickness=Þykkt +editor_ink_opacity=Ógegnsæi + +# Editor aria +editor_free_text2_aria_label=Textaritill +editor_ink2_aria_label=Teikniritill +editor_ink_canvas_aria_label=Mynd gerð af notanda diff --git a/src/assets/pdf-annotation/web/locale/it/viewer.properties b/src/assets/pdf-annotation/web/locale/it/viewer.properties new file mode 100755 index 0000000..93f7b34 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/it/viewer.properties @@ -0,0 +1,215 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +previous.title = Pagina precedente +previous_label = Precedente +next.title = Pagina successiva +next_label = Successiva + +page.title = Pagina +of_pages = di {{pagesCount}} +page_of_pages = ({{pageNumber}} di {{pagesCount}}) + +zoom_out.title = Riduci zoom +zoom_out_label = Riduci zoom +zoom_in.title = Aumenta zoom +zoom_in_label = Aumenta zoom +zoom.title = Zoom +presentation_mode.title = Passa alla modalità presentazione +presentation_mode_label = Modalità presentazione +open_file.title = Apri file +open_file_label = Apri +print.title = Stampa +print_label = Stampa +download.title = Scarica questo documento +download_label = Download +save.title = Salva +save_label = Salva +bookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra) +bookmark_label = Visualizzazione corrente + +tools.title = Strumenti +tools_label = Strumenti +first_page.title = Vai alla prima pagina +first_page_label = Vai alla prima pagina +last_page.title = Vai all’ultima pagina +last_page_label = Vai all’ultima pagina +page_rotate_cw.title = Ruota in senso orario +page_rotate_cw_label = Ruota in senso orario +page_rotate_ccw.title = Ruota in senso antiorario +page_rotate_ccw_label = Ruota in senso antiorario + +cursor_text_select_tool.title = Attiva strumento di selezione testo +cursor_text_select_tool_label = Strumento di selezione testo +cursor_hand_tool.title = Attiva strumento mano +cursor_hand_tool_label = Strumento mano + +scroll_page.title = Utilizza scorrimento pagine +scroll_page_label = Scorrimento pagine +scroll_vertical.title = Scorri le pagine in verticale +scroll_vertical_label = Scorrimento verticale +scroll_horizontal.title = Scorri le pagine in orizzontale +scroll_horizontal_label = Scorrimento orizzontale +scroll_wrapped.title = Scorri le pagine in verticale, disponendole da sinistra a destra e andando a capo automaticamente +scroll_wrapped_label = Scorrimento con a capo automatico + +spread_none.title = Non raggruppare pagine +spread_none_label = Nessun raggruppamento +spread_odd.title = Crea gruppi di pagine che iniziano con numeri di pagina dispari +spread_odd_label = Raggruppamento dispari +spread_even.title = Crea gruppi di pagine che iniziano con numeri di pagina pari +spread_even_label = Raggruppamento pari + +document_properties.title = Proprietà del documento… +document_properties_label = Proprietà del documento… +document_properties_file_name = Nome file: +document_properties_file_size = Dimensione file: +document_properties_kb = {{size_kb}} kB ({{size_b}} byte) +document_properties_mb = {{size_mb}} MB ({{size_b}} byte) +document_properties_title = Titolo: +document_properties_author = Autore: +document_properties_subject = Oggetto: +document_properties_keywords = Parole chiave: +document_properties_creation_date = Data creazione: +document_properties_modification_date = Data modifica: +document_properties_date_string = {{date}}, {{time}} +document_properties_creator = Autore originale: +document_properties_producer = Produttore PDF: +document_properties_version = Versione PDF: +document_properties_page_count = Conteggio pagine: +document_properties_page_size = Dimensioni pagina: +document_properties_page_size_unit_inches = in +document_properties_page_size_unit_millimeters = mm +document_properties_page_size_orientation_portrait = verticale +document_properties_page_size_orientation_landscape = orizzontale +document_properties_page_size_name_a3 = A3 +document_properties_page_size_name_a4 = A4 +document_properties_page_size_name_letter = Lettera +document_properties_page_size_name_legal = Legale +document_properties_page_size_dimension_string = {{width}} × {{height}} {{unit}} ({{orientation}}) +document_properties_page_size_dimension_name_string = {{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +document_properties_linearized = Visualizzazione web veloce: +document_properties_linearized_yes = Sì +document_properties_linearized_no = No +document_properties_close = Chiudi + +print_progress_message = Preparazione documento per la stampa… +print_progress_percent = {{progress}}% +print_progress_close = Annulla + +toggle_sidebar.title = Attiva/disattiva barra laterale +toggle_sidebar_notification2.title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati/livelli) +toggle_sidebar_label = Attiva/disattiva barra laterale +document_outline.title = Visualizza la struttura del documento (doppio clic per visualizzare/comprimere tutti gli elementi) +document_outline_label = Struttura documento +attachments.title = Visualizza allegati +attachments_label = Allegati +layers.title = Visualizza livelli (doppio clic per ripristinare tutti i livelli allo stato predefinito) +layers_label = Livelli +thumbs.title = Mostra le miniature +thumbs_label = Miniature +current_outline_item.title = Trova elemento struttura corrente +current_outline_item_label = Elemento struttura corrente +findbar.title = Trova nel documento +findbar_label = Trova + +additional_layers = Livelli aggiuntivi +page_landmark = Pagina {{page}} +thumb_page_title = Pagina {{page}} +thumb_page_canvas = Miniatura della pagina {{page}} + +find_input.title = Trova +find_input.placeholder = Trova nel documento… +find_previous.title = Trova l’occorrenza precedente del testo da cercare +find_previous_label = Precedente +find_next.title = Trova l’occorrenza successiva del testo da cercare +find_next_label = Successivo +find_highlight = Evidenzia +find_match_case_label = Maiuscole/minuscole +find_match_diacritics_label = Segni diacritici +find_entire_word_label = Parole intere +find_reached_top = Raggiunto l’inizio della pagina, continua dalla fine +find_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio +find_match_count = {[ plural(total) ]} +find_match_count[one] = {{current}} di {{total}} corrispondenza +find_match_count[two] = {{current}} di {{total}} corrispondenze +find_match_count[few] = {{current}} di {{total}} corrispondenze +find_match_count[many] = {{current}} di {{total}} corrispondenze +find_match_count[other] = {{current}} di {{total}} corrispondenze +find_match_count_limit = {[ plural(limit) ]} +find_match_count_limit[zero] = Più di {{limit}} corrispondenze +find_match_count_limit[one] = Più di {{limit}} corrispondenza +find_match_count_limit[two] = Più di {{limit}} corrispondenze +find_match_count_limit[few] = Più di {{limit}} corrispondenze +find_match_count_limit[many] = Più di {{limit}} corrispondenze +find_match_count_limit[other] = Più di {{limit}} corrispondenze +find_not_found = Testo non trovato + +error_more_info = Ulteriori informazioni +error_less_info = Nascondi dettagli +error_close = Chiudi +error_version_info = PDF.js v{{version}} (build: {{build}}) +error_message = Messaggio: {{message}} +error_stack = Stack: {{stack}} +error_file = File: {{file}} +error_line = Riga: {{line}} +rendering_error = Si è verificato un errore durante il rendering della pagina. + +page_scale_width = Larghezza pagina +page_scale_fit = Adatta a una pagina +page_scale_auto = Zoom automatico +page_scale_actual = Dimensioni effettive +page_scale_percent = {{scale}}% + +loading = Caricamento in corso… +loading_error = Si è verificato un errore durante il caricamento del PDF. +invalid_file_error = File PDF non valido o danneggiato. +missing_file_error = File PDF non disponibile. +unexpected_response_error = Risposta imprevista del server + +annotation_date_string = {{date}}, {{time}} + +text_annotation_type.alt = [Annotazione: {{type}}] +password_label = Inserire la password per aprire questo file PDF. +password_invalid = Password non corretta. Riprovare. +password_ok = OK +password_cancel = Annulla + +printing_not_supported = Attenzione: la stampa non è completamente supportata da questo browser. +printing_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa. +web_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri incorporati nel PDF. + +# Editor +editor_free_text2.title = Testo +editor_free_text2_label = Testo +editor_ink2.title = Disegno +editor_ink2_label = Disegno + +free_text2_default_content = Inizia a digitare… + +# Editor Parameters +editor_free_text_color = Colore +editor_free_text_size = Dimensione +editor_ink_color = Colore +editor_ink_thickness = Spessore +editor_ink_opacity = Opacità + +# Editor aria +editor_free_text2_aria_label = Editor di testo +editor_ink2_aria_label = Editor disegni +editor_ink_canvas_aria_label = Immagine creata dall’utente diff --git a/src/assets/pdf-annotation/web/locale/ja/viewer.properties b/src/assets/pdf-annotation/web/locale/ja/viewer.properties new file mode 100755 index 0000000..8565dbb --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ja/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=前のページへ戻ります +previous_label=前へ +next.title=次のページへ進みます +next_label=次へ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ページ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=表示を縮小します +zoom_out_label=縮小 +zoom_in.title=表示を拡大します +zoom_in_label=拡大 +zoom.title=拡大/縮小 +presentation_mode.title=プレゼンテーションモードに切り替えます +presentation_mode_label=プレゼンテーションモード +open_file.title=ファイルを開きます +open_file_label=開く +print.title=印刷します +print_label=印刷 +download.title=ダウンロードします +download_label=ダウンロード +save.title=保存します +save_label=保存 +bookmark.title=現在のビューの URL です (コピーまたは新しいウィンドウに開く) +bookmark_label=現在のビュー + +# Secondary toolbar and context menu +tools.title=ツール +tools_label=ツール +first_page.title=最初のページへ移動します +first_page_label=最初のページへ移動 +last_page.title=最後のページへ移動します +last_page_label=最後のページへ移動 +page_rotate_cw.title=ページを右へ回転します +page_rotate_cw_label=右回転 +page_rotate_ccw.title=ページを左へ回転します +page_rotate_ccw_label=左回転 + +cursor_text_select_tool.title=テキスト選択ツールを有効にします +cursor_text_select_tool_label=テキスト選択ツール +cursor_hand_tool.title=手のひらツールを有効にします +cursor_hand_tool_label=手のひらツール + +scroll_page.title=ページ単位でスクロールします +scroll_page_label=ページ単位でスクロール +scroll_vertical.title=縦スクロールにします +scroll_vertical_label=縦スクロール +scroll_horizontal.title=横スクロールにします +scroll_horizontal_label=横スクロール +scroll_wrapped.title=折り返しスクロールにします +scroll_wrapped_label=折り返しスクロール + +spread_none.title=見開きにしません +spread_none_label=見開きにしない +spread_odd.title=奇数ページ開始で見開きにします +spread_odd_label=奇数ページ見開き +spread_even.title=偶数ページ開始で見開きにします +spread_even_label=偶数ページ見開き + +# Document properties dialog box +document_properties.title=文書のプロパティ... +document_properties_label=文書のプロパティ... +document_properties_file_name=ファイル名: +document_properties_file_size=ファイルサイズ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} バイト) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} バイト) +document_properties_title=タイトル: +document_properties_author=作成者: +document_properties_subject=件名: +document_properties_keywords=キーワード: +document_properties_creation_date=作成日: +document_properties_modification_date=更新日: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=アプリケーション: +document_properties_producer=PDF 作成: +document_properties_version=PDF のバージョン: +document_properties_page_count=ページ数: +document_properties_page_size=ページサイズ: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=縦 +document_properties_page_size_orientation_landscape=横 +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=レター +document_properties_page_size_name_legal=リーガル +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=ウェブ表示用に最適化: +document_properties_linearized_yes=はい +document_properties_linearized_no=いいえ +document_properties_close=閉じる + +print_progress_message=文書の印刷を準備しています... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=キャンセル + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=サイドバー表示を切り替えます +toggle_sidebar_notification2.title=サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付 / レイヤー) +toggle_sidebar_label=サイドバーの切り替え +document_outline.title=文書の目次を表示します (ダブルクリックで項目を開閉します) +document_outline_label=文書の目次 +attachments.title=添付ファイルを表示します +attachments_label=添付ファイル +layers.title=レイヤーを表示します (ダブルクリックですべてのレイヤーが初期状態に戻ります) +layers_label=レイヤー +thumbs.title=縮小版を表示します +thumbs_label=縮小版 +current_outline_item.title=現在のアウトライン項目を検索 +current_outline_item_label=現在のアウトライン項目 +findbar.title=文書内を検索します +findbar_label=検索 + +additional_layers=追加レイヤー +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark={{page}} ページ +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} ページ +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} ページの縮小版 + +# Find panel button title and messages +find_input.title=検索 +find_input.placeholder=文書内を検索... +find_previous.title=現在より前の位置で指定文字列が現れる部分を検索します +find_previous_label=前へ +find_next.title=現在より後の位置で指定文字列が現れる部分を検索します +find_next_label=次へ +find_highlight=すべて強調表示 +find_match_case_label=大文字/小文字を区別 +find_match_diacritics_label=発音区別符号を区別 +find_entire_word_label=単語一致 +find_reached_top=文書先頭に到達したので末尾から続けて検索します +find_reached_bottom=文書末尾に到達したので先頭から続けて検索します +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} 件中 {{current}} 件目 +find_match_count[two]={{total}} 件中 {{current}} 件目 +find_match_count[few]={{total}} 件中 {{current}} 件目 +find_match_count[many]={{total}} 件中 {{current}} 件目 +find_match_count[other]={{total}} 件中 {{current}} 件目 +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} 件以上一致 +find_match_count_limit[one]={{limit}} 件以上一致 +find_match_count_limit[two]={{limit}} 件以上一致 +find_match_count_limit[few]={{limit}} 件以上一致 +find_match_count_limit[many]={{limit}} 件以上一致 +find_match_count_limit[other]={{limit}} 件以上一致 +find_not_found=見つかりませんでした + +# Error panel labels +error_more_info=詳細情報 +error_less_info=詳細情報を隠す +error_close=閉じる +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (ビルド: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=メッセージ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=スタック: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ファイル: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=行: {{line}} + +# Predefined zoom values +page_scale_width=幅に合わせる +page_scale_fit=ページのサイズに合わせる +page_scale_auto=自動ズーム +page_scale_actual=実際のサイズ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=読み込み中... +loading_error=PDF の読み込み中にエラーが発生しました。 +invalid_file_error=無効または破損した PDF ファイル。 +missing_file_error=PDF ファイルが見つかりません。 +unexpected_response_error=サーバーから予期せぬ応答がありました。 + +rendering_error=ページのレンダリング中にエラーが発生しました。 + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 注釈] +password_label=この PDF ファイルを開くためのパスワードを入力してください。 +password_invalid=無効なパスワードです。もう一度やり直してください。 +password_ok=OK +password_cancel=キャンセル + +printing_not_supported=警告: このブラウザーでは印刷が完全にサポートされていません。 +printing_not_ready=警告: PDF を印刷するための読み込みが終了していません。 +web_fonts_disabled=ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。 + +# Editor +editor_free_text2.title=フリーテキスト注釈 +editor_free_text2_label=フリーテキスト注釈 +editor_ink2.title=インク注釈 +editor_ink2_label=インク注釈 + +free_text2_default_content=テキストを入力してください... + +# Editor Parameters +editor_free_text_color=色 +editor_free_text_size=サイズ +editor_ink_color=色 +editor_ink_thickness=太さ +editor_ink_opacity=不透明度 + +# Editor aria +editor_free_text2_aria_label=フリーテキスト注釈エディター +editor_ink2_aria_label=インク注釈エディター +editor_ink_canvas_aria_label=ユーザー作成画像 diff --git a/src/assets/pdf-annotation/web/locale/ka/viewer.properties b/src/assets/pdf-annotation/web/locale/ka/viewer.properties new file mode 100755 index 0000000..95282ef --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ka/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=წინა გვერდი +previous_label=წინა +next.title=შემდეგი გვერდი +next_label=შემდეგი + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=გვერდი +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}}-დან +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} {{pagesCount}}-დან) + +zoom_out.title=ზომის შემცირება +zoom_out_label=დაშორება +zoom_in.title=ზომის გაზრდა +zoom_in_label=მოახლოება +zoom.title=ზომა +presentation_mode.title=ჩვენების რეჟიმზე გადართვა +presentation_mode_label=ჩვენების რეჟიმი +open_file.title=ფაილის გახსნა +open_file_label=გახსნა +print.title=ამობეჭდვა +print_label=ამობეჭდვა +download.title=ჩამოტვირთვა +download_label=ჩამოტვირთვა +save.title=შენახვა +save_label=შენახვა +bookmark.title=მიმდინარე ხედი (ასლის აღება ან გახსნა ახალ ფანჯარაში) +bookmark_label=მიმდინარე ხედი + +# Secondary toolbar and context menu +tools.title=ხელსაწყოები +tools_label=ხელსაწყოები +first_page.title=პირველ გვერდზე გადასვლა +first_page_label=პირველ გვერდზე გადასვლა +last_page.title=ბოლო გვერდზე გადასვლა +last_page_label=ბოლო გვერდზე გადასვლა +page_rotate_cw.title=საათის ისრის მიმართულებით შებრუნება +page_rotate_cw_label=მარჯვნივ გადაბრუნება +page_rotate_ccw.title=საათის ისრის საპირისპიროდ შებრუნება +page_rotate_ccw_label=მარცხნივ გადაბრუნება + +cursor_text_select_tool.title=მოსანიშნი მაჩვენებლის გამოყენება +cursor_text_select_tool_label=მოსანიშნი მაჩვენებელი +cursor_hand_tool.title=გადასაადგილებელი მაჩვენებლის გამოყენება +cursor_hand_tool_label=გადასაადგილებელი + +scroll_page.title=გვერდზე გადაადგილების გამოყენება +scroll_page_label=გვერდზე გადაადგილება +scroll_vertical.title=გვერდების შვეულად ჩვენება +scroll_vertical_label=შვეული გადაადგილება +scroll_horizontal.title=გვერდების თარაზულად ჩვენება +scroll_horizontal_label=განივი გადაადგილება +scroll_wrapped.title=გვერდების ცხრილურად ჩვენება +scroll_wrapped_label=ცხრილური გადაადგილება + +spread_none.title=ორ გვერდზე გაშლის გარეშე +spread_none_label=ცალგვერდიანი ჩვენება +spread_odd.title=ორ გვერდზე გაშლა, კენტი გვერდიდან დაწყებული +spread_odd_label=ორ გვერდზე კენტიდან +spread_even.title=ორ გვერდზე გაშლა, ლუწი გვერდიდან დაწყებული +spread_even_label=ორ გვერდზე ლუწიდან + +# Document properties dialog box +document_properties.title=დოკუმენტის შესახებ… +document_properties_label=დოკუმენტის შესახებ… +document_properties_file_name=ფაილის სახელი: +document_properties_file_size=ფაილის მოცულობა: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} კბ ({{size_b}} ბაიტი) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} მბ ({{size_b}} ბაიტი) +document_properties_title=სათაური: +document_properties_author=შემქმნელი: +document_properties_subject=თემა: +document_properties_keywords=საკვანძო სიტყვები: +document_properties_creation_date=შექმნის დრო: +document_properties_modification_date=ჩასწორების დრო: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=გამომცემი: +document_properties_producer=PDF-შემდგენელი: +document_properties_version=PDF-ვერსია: +document_properties_page_count=გვერდები: +document_properties_page_size=გვერდის ზომა: +document_properties_page_size_unit_inches=დუიმი +document_properties_page_size_unit_millimeters=მმ +document_properties_page_size_orientation_portrait=შვეულად +document_properties_page_size_orientation_landscape=თარაზულად +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=მსუბუქი ვებჩვენება: +document_properties_linearized_yes=დიახ +document_properties_linearized_no=არა +document_properties_close=დახურვა + +print_progress_message=დოკუმენტი მზადდება ამოსაბეჭდად… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=გაუქმება + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=გვერდითა ზოლის გამოჩენა/დამალვა +toggle_sidebar_notification2.title=გვერდითი ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს/ფენებს) +toggle_sidebar_label=გვერდითა ზოლის გამოჩენა/დამალვა +document_outline.title=დოკუმენტის სარჩევის ჩვენება (ორმაგი წკაპით თითოეულის ჩამოშლა/აკეცვა) +document_outline_label=დოკუმენტის სარჩევი +attachments.title=დანართების ჩვენება +attachments_label=დანართები +layers.title=ფენების გამოჩენა (ორმაგი წკაპით ყველა ფენის ნაგულისხმევზე დაბრუნება) +layers_label=ფენები +thumbs.title=შეთვალიერება +thumbs_label=ესკიზები +current_outline_item.title=მიმდინარე გვერდის მონახვა სარჩევში +current_outline_item_label=მიმდინარე გვერდი სარჩევში +findbar.title=პოვნა დოკუმენტში +findbar_label=ძიება + +additional_layers=დამატებითი ფენები +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=გვერდი {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=გვერდი {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=გვერდის შეთვალიერება {{page}} + +# Find panel button title and messages +find_input.title=ძიება +find_input.placeholder=პოვნა დოკუმენტში… +find_previous.title=ფრაზის წინა კონტექსტის პოვნა +find_previous_label=წინა +find_next.title=ფრაზის შემდეგი კონტექსტის პოვნა +find_next_label=შემდეგი +find_highlight=ყველას მონიშვნა +find_match_case_label=მთავრულით +find_match_diacritics_label=ნიშნებით +find_entire_word_label=მთლიანი სიტყვები +find_reached_top=მიღწეულია დოკუმენტის დასაწყისი, გრძელდება ბოლოდან +find_reached_bottom=მიღწეულია დოკუმენტის ბოლო, გრძელდება დასაწყისიდან +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} / {{total}} თანხვედრიდან +find_match_count[two]={{current}} / {{total}} თანხვედრიდან +find_match_count[few]={{current}} / {{total}} თანხვედრიდან +find_match_count[many]={{current}} / {{total}} თანხვედრიდან +find_match_count[other]={{current}} / {{total}} თანხვედრიდან +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=არანაკლებ {{limit}} თანხვედრა +find_match_count_limit[one]=არანაკლებ {{limit}} თანხვედრა +find_match_count_limit[two]=არანაკლებ {{limit}} თანხვედრა +find_match_count_limit[few]=არანაკლებ {{limit}} თანხვედრა +find_match_count_limit[many]=არანაკლებ {{limit}} თანხვედრა +find_match_count_limit[other]=არანაკლებ {{limit}} თანხვედრა +find_not_found=ფრაზა ვერ მოიძებნა + +# Error panel labels +error_more_info=ვრცლად +error_less_info=შემოკლებულად +error_close=დახურვა +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=შეტყობინება: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=სტეკი: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ფაილი: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ხაზი: {{line}} + +# Predefined zoom values +page_scale_width=გვერდის სიგანეზე +page_scale_fit=მთლიანი გვერდი +page_scale_auto=ავტომატური +page_scale_actual=საწყისი ზომა +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=ჩატვირთვა… +loading_error=შეცდომა, PDF-ფაილის ჩატვირთვისას. +invalid_file_error=არამართებული ან დაზიანებული PDF-ფაილი. +missing_file_error=ნაკლული PDF-ფაილი. +unexpected_response_error=სერვერის მოულოდნელი პასუხი. + +rendering_error=შეცდომა, გვერდის ჩვენებისას. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} შენიშვნა] +password_label=შეიყვანეთ პაროლი PDF-ფაილის გასახსნელად. +password_invalid=არასწორი პაროლი. გთხოვთ, სცადოთ ხელახლა. +password_ok=კარგი +password_cancel=გაუქმება + +printing_not_supported=გაფრთხილება: ამობეჭდვა ამ ბრაუზერში არაა სრულად მხარდაჭერილი. +printing_not_ready=გაფრთხილება: PDF სრულად ჩატვირთული არაა, ამობეჭდვის დასაწყებად. +web_fonts_disabled=ვებშრიფტები გამორთულია: ჩაშენებული PDF-შრიფტების გამოყენება ვერ ხერხდება. + +# Editor +editor_free_text2.title=წარწერა +editor_free_text2_label=ტექსტი +editor_ink2.title=დახატვა +editor_ink2_label=დახატვა + +free_text2_default_content=აკრიფეთ… + +# Editor Parameters +editor_free_text_color=ფერი +editor_free_text_size=ზომა +editor_ink_color=ფერი +editor_ink_thickness=სისქე +editor_ink_opacity=გაუმჭვირვალობა + +# Editor aria +editor_free_text2_aria_label=ნაწერის ჩასწორება +editor_ink2_aria_label=ნახატის ჩასწორება +editor_ink_canvas_aria_label=მომხმარებლის შექმნილი სურათი diff --git a/src/assets/pdf-annotation/web/locale/kab/viewer.properties b/src/assets/pdf-annotation/web/locale/kab/viewer.properties new file mode 100755 index 0000000..917e7a7 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/kab/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Asebter azewwar +previous_label=Azewwar +next.title=Asebter d-iteddun +next_label=Ddu ɣer zdat + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Asebter +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=ɣef {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} n {{pagesCount}}) + +zoom_out.title=Semẓi +zoom_out_label=Semẓi +zoom_in.title=Semɣeṛ +zoom_in_label=Semɣeṛ +zoom.title=Semɣeṛ/Semẓi +presentation_mode.title=Uɣal ɣer Uskar Tihawt +presentation_mode_label=Askar Tihawt +open_file.title=Ldi Afaylu +open_file_label=Ldi +print.title=Siggez +print_label=Siggez +download.title=Sader +download_label=Azdam +save.title=Sekles +save_label=Sekles +bookmark.title=Timeẓri tamirant (nɣel neɣ ldi ɣef usfaylu amaynut) +bookmark_label=Askan amiran + +# Secondary toolbar and context menu +tools.title=Ifecka +tools_label=Ifecka +first_page.title=Ddu ɣer usebter amezwaru +first_page_label=Ddu ɣer usebter amezwaru +last_page.title=Ddu ɣer usebter aneggaru +last_page_label=Ddu ɣer usebter aneggaru +page_rotate_cw.title=Tuzzya tusrigt +page_rotate_cw_label=Tuzzya tusrigt +page_rotate_ccw.title=Tuzzya amgal-usrig +page_rotate_ccw_label=Tuzzya amgal-usrig + +cursor_text_select_tool.title=Rmed afecku n tefrant n uḍris +cursor_text_select_tool_label=Afecku n tefrant n uḍris +cursor_hand_tool.title=Rmed afecku afus +cursor_hand_tool_label=Afecku afus + +scroll_page.title=Seqdec adrurem n usebter +scroll_page_label=Adrurem n usebter +scroll_vertical.title=Seqdec adrurem ubdid +scroll_vertical_label=Adrurem ubdid +scroll_horizontal.title=Seqdec adrurem aglawan +scroll_horizontal_label=Adrurem aglawan +scroll_wrapped.title=Seqdec adrurem yuẓen +scroll_wrapped_label=Adrurem yuẓen + +spread_none.title=Ur sedday ara isiɣzaf n usebter +spread_none_label=Ulac isiɣzaf +spread_odd.title=Seddu isiɣzaf n usebter ibeddun s yisebtar irayuganen +spread_odd_label=Isiɣzaf irayuganen +spread_even.title=Seddu isiɣzaf n usebter ibeddun s yisebtar iyuganen +spread_even_label=Isiɣzaf iyuganen + +# Document properties dialog box +document_properties.title=Taɣaṛa n isemli… +document_properties_label=Taɣaṛa n isemli… +document_properties_file_name=Isem n ufaylu: +document_properties_file_size=Teɣzi n ufaylu: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KAṬ ({{size_b}} ibiten) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MAṬ ({{size_b}} iṭamḍanen) +document_properties_title=Azwel: +document_properties_author=Ameskar: +document_properties_subject=Amgay: +document_properties_keywords=Awalen n tsaruţ +document_properties_creation_date=Azemz n tmerna: +document_properties_modification_date=Azemz n usnifel: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Yerna-t: +document_properties_producer=Afecku n uselket PDF: +document_properties_version=Lqem PDF: +document_properties_page_count=Amḍan n yisebtar: +document_properties_page_size=Tuγzi n usebter: +document_properties_page_size_unit_inches=deg +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=s teɣzi +document_properties_page_size_orientation_landscape=s tehri +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Asekkil +document_properties_page_size_name_legal=Usḍif +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Taskant Web taruradt: +document_properties_linearized_yes=Ih +document_properties_linearized_no=Ala +document_properties_close=Mdel + +print_progress_message=Aheggi i usiggez n isemli… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Sefsex + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sken/Fer agalis adisan +toggle_sidebar_notification2.title=Ffer/Sekn agalis adisan (isemli yegber aɣawas/ticeqqufin yeddan/tissiwin) +toggle_sidebar_label=Sken/Fer agalis adisan +document_outline.title=Sken isemli (Senned snat tikal i wesemɣer/Afneẓ n iferdisen meṛṛa) +document_outline_label=Isɣalen n isebtar +attachments.title=Sken ticeqqufin yeddan +attachments_label=Ticeqqufin yeddan +layers.title=Skeen tissiwin (sit sin yiberdan i uwennez n meṛṛa tissiwin ɣer waddad amezwer) +layers_label=Tissiwin +thumbs.title=Sken tanfult. +thumbs_label=Tinfulin +current_outline_item.title=Af-d aferdis n uɣawas amiran +current_outline_item_label=Aferdis n uɣawas amiran +findbar.title=Nadi deg isemli +findbar_label=Nadi + +additional_layers=Tissiwin-nniḍen +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Asebter {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Asebter {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Tanfult n usebter {{page}} + +# Find panel button title and messages +find_input.title=Nadi +find_input.placeholder=Nadi deg isemli… +find_previous.title=Aff-d tamseḍriwt n twinest n deffir +find_previous_label=Azewwar +find_next.title=Aff-d timseḍriwt n twinest d-iteddun +find_next_label=Ddu ɣer zdat +find_highlight=Err izirig imaṛṛa +find_match_case_label=Qadeṛ amasal n isekkilen +find_match_diacritics_label=Qadeṛ ifeskilen +find_entire_word_label=Awalen iččuranen +find_reached_top=Yabbeḍ s afella n usebter, tuɣalin s wadda +find_reached_bottom=Tebḍeḍ s adda n usebter, tuɣalin s afella +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} seg {{total}} n tmeɣṛuḍin +find_match_count[two]={{current}} seg {{total}} n tmeɣṛuḍin +find_match_count[few]={{current}} seg {{total}} n tmeɣṛuḍin +find_match_count[many]={{current}} seg {{total}} n tmeɣṛuḍin +find_match_count[other]={{current}} seg {{total}} n tmeɣṛuḍin +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Ugar n {{limit}} n tmeɣṛuḍin +find_match_count_limit[one]=Ugar n {{limit}} n tmeɣṛuḍin +find_match_count_limit[two]=Ugar n {{limit}} n tmeɣṛuḍin +find_match_count_limit[few]=Ugar n {{limit}} n tmeɣṛuḍin +find_match_count_limit[many]=Ugar n {{limit}} n tmeɣṛuḍin +find_match_count_limit[other]=Ugar n {{limit}} n tmeɣṛuḍin +find_not_found=Ulac tawinest + +# Error panel labels +error_more_info=Ugar n telɣut +error_less_info=Drus n isalen +error_close=Mdel +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Izen: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Tanebdant: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Afaylu: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Izirig: {{line}} + +# Predefined zoom values +page_scale_width=Tehri n usebter +page_scale_fit=Asebter imaṛṛa +page_scale_auto=Asemɣeṛ/Asemẓi awurman +page_scale_actual=Teɣzi tilawt +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Asali… +loading_error=Teḍra-d tuccḍa deg alluy n PDF: +invalid_file_error=Afaylu PDF arameɣtu neɣ yexṣeṛ. +missing_file_error=Ulac afaylu PDF. +unexpected_response_error=Aqeddac yerra-d yir tiririt ur nettwaṛǧi ara. + +rendering_error=Teḍra-d tuccḍa deg uskan n usebter. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Tabzimt {{type}}] +password_label=Sekcem awal uffir akken ad ldiḍ afaylu-yagi PDF +password_invalid=Awal uffir mačči d ameɣtu, Ɛreḍ tikelt-nniḍen. +password_ok=IH +password_cancel=Sefsex + +printing_not_supported=Ɣuṛ-k: Asiggez ur ittusefrak ara yakan imaṛṛa deg iminig-a. +printing_not_ready=Ɣuṛ-k: Afaylu PDF ur d-yuli ara imeṛṛa akken ad ittusiggez. +web_fonts_disabled=Tisefsiyin web ttwassensent; D awezɣi useqdec n tsefsiyin yettwarnan ɣer PDF. + +# Editor +editor_free_text2.title=Aḍris +editor_free_text2_label=Aḍris +editor_ink2.title=Suneɣ +editor_ink2_label=Suneɣ + +free_text2_default_content=Bdu tira... + +# Editor Parameters +editor_free_text_color=Initen +editor_free_text_size=Teɣzi +editor_ink_color=Ini +editor_ink_thickness=Tuzert +editor_ink_opacity=Tebrek + +# Editor aria +editor_free_text2_aria_label=Amaẓrag n uḍris +editor_ink2_aria_label=Amaẓrag n usuneɣ +editor_ink_canvas_aria_label=Tugna yettwarnan sɣur useqdac diff --git a/src/assets/pdf-annotation/web/locale/kk/viewer.properties b/src/assets/pdf-annotation/web/locale/kk/viewer.properties new file mode 100755 index 0000000..f433f7d --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/kk/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Алдыңғы парақ +previous_label=Алдыңғысы +next.title=Келесі парақ +next_label=Келесі + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Парақ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ішінен +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=(парақ {{pageNumber}}, {{pagesCount}} ішінен) + +zoom_out.title=Кішірейту +zoom_out_label=Кішірейту +zoom_in.title=Үлкейту +zoom_in_label=Үлкейту +zoom.title=Масштаб +presentation_mode.title=Презентация режиміне ауысу +presentation_mode_label=Презентация режимі +open_file.title=Файлды ашу +open_file_label=Ашу +print.title=Баспаға шығару +print_label=Баспаға шығару +download.title=Жүктеп алу +download_label=Жүктеп алу +save.title=Сақтау +save_label=Сақтау +bookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу) +bookmark_label=Ағымдағы көрініс + +# Secondary toolbar and context menu +tools.title=Құралдар +tools_label=Құралдар +first_page.title=Алғашқы параққа өту +first_page_label=Алғашқы параққа өту +last_page.title=Соңғы параққа өту +last_page_label=Соңғы параққа өту +page_rotate_cw.title=Сағат тілі бағытымен айналдыру +page_rotate_cw_label=Сағат тілі бағытымен бұру +page_rotate_ccw.title=Сағат тілі бағытына қарсы бұру +page_rotate_ccw_label=Сағат тілі бағытына қарсы бұру + +cursor_text_select_tool.title=Мәтінді таңдау құралын іске қосу +cursor_text_select_tool_label=Мәтінді таңдау құралы +cursor_hand_tool.title=Қол құралын іске қосу +cursor_hand_tool_label=Қол құралы + +scroll_page.title=Беттерді айналдыруды пайдалану +scroll_page_label=Беттерді айналдыру +scroll_vertical.title=Вертикалды айналдыруды қолдану +scroll_vertical_label=Вертикалды айналдыру +scroll_horizontal.title=Горизонталды айналдыруды қолдану +scroll_horizontal_label=Горизонталды айналдыру +scroll_wrapped.title=Масштабталатын айналдыруды қолдану +scroll_wrapped_label=Масштабталатын айналдыру + +spread_none.title=Жазық беттер режимін қолданбау +spread_none_label=Жазық беттер режимсіз +spread_odd.title=Жазық беттер тақ нөмірлі беттерден басталады +spread_odd_label=Тақ нөмірлі беттер сол жақтан +spread_even.title=Жазық беттер жұп нөмірлі беттерден басталады +spread_even_label=Жұп нөмірлі беттер сол жақтан + +# Document properties dialog box +document_properties.title=Құжат қасиеттері… +document_properties_label=Құжат қасиеттері… +document_properties_file_name=Файл аты: +document_properties_file_size=Файл өлшемі: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байт) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байт) +document_properties_title=Тақырыбы: +document_properties_author=Авторы: +document_properties_subject=Тақырыбы: +document_properties_keywords=Кілт сөздер: +document_properties_creation_date=Жасалған күні: +document_properties_modification_date=Түзету күні: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Жасаған: +document_properties_producer=PDF өндірген: +document_properties_version=PDF нұсқасы: +document_properties_page_count=Беттер саны: +document_properties_page_size=Бет өлшемі: +document_properties_page_size_unit_inches=дюйм +document_properties_page_size_unit_millimeters=мм +document_properties_page_size_orientation_portrait=тік +document_properties_page_size_orientation_landscape=жатық +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Жылдам Web көрінісі: +document_properties_linearized_yes=Иә +document_properties_linearized_no=Жоқ +document_properties_close=Жабу + +print_progress_message=Құжатты баспаға шығару үшін дайындау… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Бас тарту + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Бүйір панелін көрсету/жасыру +toggle_sidebar_notification2.title=Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар/қабаттар бар) +toggle_sidebar_label=Бүйір панелін көрсету/жасыру +document_outline.title=Құжат құрылымын көрсету (барлық нәрселерді жазық қылу/жинау үшін қос шерту керек) +document_outline_label=Құжат құрамасы +attachments.title=Салынымдарды көрсету +attachments_label=Салынымдар +layers.title=Қабаттарды көрсету (барлық қабаттарды бастапқы күйге келтіру үшін екі рет шертіңіз) +layers_label=Қабаттар +thumbs.title=Кіші көріністерді көрсету +thumbs_label=Кіші көріністер +current_outline_item.title=Құрылымның ағымдағы элементін табу +current_outline_item_label=Құрылымның ағымдағы элементі +findbar.title=Құжаттан табу +findbar_label=Табу + +additional_layers=Қосымша қабаттар +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Бет {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} парағы +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} парағы үшін кіші көрінісі + +# Find panel button title and messages +find_input.title=Табу +find_input.placeholder=Құжаттан табу… +find_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу +find_previous_label=Алдыңғысы +find_next.title=Осы сөздердің мәтіннен келесі кездесуін табу +find_next_label=Келесі +find_highlight=Барлығын түспен ерекшелеу +find_match_case_label=Регистрді ескеру +find_match_diacritics_label=Диакритиканы ескеру +find_entire_word_label=Сөздер толығымен +find_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз +find_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} / {{total}} сәйкестік +find_match_count[two]={{current}} / {{total}} сәйкестік +find_match_count[few]={{current}} / {{total}} сәйкестік +find_match_count[many]={{current}} / {{total}} сәйкестік +find_match_count[other]={{current}} / {{total}} сәйкестік +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} сәйкестіктен көп +find_match_count_limit[one]={{limit}} сәйкестіктен көп +find_match_count_limit[two]={{limit}} сәйкестіктен көп +find_match_count_limit[few]={{limit}} сәйкестіктен көп +find_match_count_limit[many]={{limit}} сәйкестіктен көп +find_match_count_limit[other]={{limit}} сәйкестіктен көп +find_not_found=Сөз(дер) табылмады + +# Error panel labels +error_more_info=Көбірек ақпарат +error_less_info=Азырақ ақпарат +error_close=Жабу +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (жинақ: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Хабарлама: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Жол: {{line}} + +# Predefined zoom values +page_scale_width=Парақ ені +page_scale_fit=Парақты сыйдыру +page_scale_auto=Автомасштабтау +page_scale_actual=Нақты өлшемі +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Жүктелуде… +loading_error=PDF жүктеу кезінде қате кетті. +invalid_file_error=Зақымдалған немесе қате PDF файл. +missing_file_error=PDF файлы жоқ. +unexpected_response_error=Сервердің күтпеген жауабы. + +rendering_error=Парақты өңдеу кезінде қате кетті. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} аңдатпасы] +password_label=Бұл PDF файлын ашу үшін парольді енгізіңіз. +password_invalid=Пароль дұрыс емес. Қайталап көріңіз. +password_ok=ОК +password_cancel=Бас тарту + +printing_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды. +printing_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады. +web_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес. + +# Editor +editor_free_text2.title=Мәтін +editor_free_text2_label=Мәтін +editor_ink2.title=Сурет салу +editor_ink2_label=Сурет салу + +free_text2_default_content=Теруді бастау… + +# Editor Parameters +editor_free_text_color=Түс +editor_free_text_size=Өлшемі +editor_ink_color=Түс +editor_ink_thickness=Қалыңдығы +editor_ink_opacity=Мөлдірсіздігі + +# Editor aria +editor_free_text2_aria_label=Мәтін түзеткіші +editor_ink2_aria_label=Сурет түзеткіші +editor_ink_canvas_aria_label=Пайдаланушы жасаған сурет diff --git a/src/assets/pdf-annotation/web/locale/km/viewer.properties b/src/assets/pdf-annotation/web/locale/km/viewer.properties new file mode 100755 index 0000000..9b5fb73 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/km/viewer.properties @@ -0,0 +1,210 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ទំព័រ​មុន +previous_label=មុន +next.title=ទំព័រ​បន្ទាប់ +next_label=បន្ទាប់ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ទំព័រ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=នៃ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} នៃ {{pagesCount}}) + +zoom_out.title=​បង្រួម +zoom_out_label=​បង្រួម +zoom_in.title=​ពង្រីក +zoom_in_label=​ពង្រីក +zoom.title=ពង្រីក +presentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ +presentation_mode_label=របៀប​បទ​បង្ហាញ +open_file.title=បើក​ឯកសារ +open_file_label=បើក +print.title=បោះពុម្ព +print_label=បោះពុម្ព +download.title=ទាញ​យក +download_label=ទាញ​យក +bookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី) +bookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន + +# Secondary toolbar and context menu +tools.title=ឧបករណ៍ +tools_label=ឧបករណ៍ +first_page.title=ទៅកាន់​ទំព័រ​ដំបូង​ +first_page_label=ទៅកាន់​ទំព័រ​ដំបូង​ +last_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​ +last_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ +page_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា +page_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា +page_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ +page_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ + +cursor_text_select_tool.title=បើក​ឧបករណ៍​ជ្រើស​អត្ថបទ +cursor_text_select_tool_label=ឧបករណ៍​ជ្រើស​អត្ថបទ +cursor_hand_tool.title=បើក​ឧបករណ៍​ដៃ +cursor_hand_tool_label=ឧបករណ៍​ដៃ + + + +# Document properties dialog box +document_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ… +document_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ… +document_properties_file_name=ឈ្មោះ​ឯកសារ៖ +document_properties_file_size=ទំហំ​ឯកសារ៖ +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} បៃ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} បៃ) +document_properties_title=ចំណងជើង៖ +document_properties_author=អ្នក​និពន្ធ៖ +document_properties_subject=ប្រធានបទ៖ +document_properties_keywords=ពាក្យ​គន្លឹះ៖ +document_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖ +document_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖ +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=អ្នក​បង្កើត៖ +document_properties_producer=កម្មវិធី​បង្កើត PDF ៖ +document_properties_version=កំណែ PDF ៖ +document_properties_page_count=ចំនួន​ទំព័រ៖ +document_properties_page_size_unit_inches=អ៊ីញ +document_properties_page_size_unit_millimeters=មម +document_properties_page_size_orientation_portrait=បញ្ឈរ +document_properties_page_size_orientation_landscape=ផ្តេក +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=សំបុត្រ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized_yes=បាទ/ចាស +document_properties_linearized_no=ទេ +document_properties_close=បិទ + +print_progress_message=កំពុង​រៀបចំ​ឯកសារ​សម្រាប់​បោះពុម្ព… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=បោះបង់ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល +toggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល +document_outline.title=បង្ហាញ​គ្រោង​ឯកសារ (ចុច​ទ្វេ​ដង​ដើម្បី​ពង្រីក/បង្រួម​ធាតុ​ទាំងអស់) +document_outline_label=គ្រោង​ឯកសារ +attachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់ +attachments_label=ឯកសារ​ភ្ជាប់ +thumbs.title=បង្ហាញ​រូបភាព​តូចៗ +thumbs_label=រួបភាព​តូចៗ +findbar.title=រក​នៅ​ក្នុង​ឯកសារ +findbar_label=រក + +# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=ទំព័រ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}} + +# Find panel button title and messages +find_input.title=រក +find_input.placeholder=រក​នៅ​ក្នុង​ឯកសារ... +find_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន +find_previous_label=មុន +find_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់ +find_next_label=បន្ទាប់ +find_highlight=បន្លិច​ទាំងអស់ +find_match_case_label=ករណី​ដំណូច +find_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ +find_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា + +# Error panel labels +error_more_info=ព័ត៌មាន​បន្ថែម +error_less_info=ព័ត៌មាន​តិចតួច +error_close=បិទ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=សារ ៖ {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ជង់ ៖ {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ឯកសារ ៖ {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ជួរ ៖ {{line}} +rendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។ + +# Predefined zoom values +page_scale_width=ទទឹង​ទំព័រ +page_scale_fit=សម​ទំព័រ +page_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ +page_scale_actual=ទំហំ​ជាក់ស្ដែង +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។ +invalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។ +missing_file_error=បាត់​ឯកសារ PDF +unexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។ + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់] +password_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។ +password_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។ +password_ok=យល់​ព្រម +password_cancel=បោះបង់ + +printing_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។ +printing_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។ +web_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។ + diff --git a/src/assets/pdf-annotation/web/locale/kn/viewer.properties b/src/assets/pdf-annotation/web/locale/kn/viewer.properties new file mode 100755 index 0000000..1a62056 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/kn/viewer.properties @@ -0,0 +1,187 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ಹಿಂದಿನ ಪುಟ +previous_label=ಹಿಂದಿನ +next.title=ಮುಂದಿನ ಪುಟ +next_label=ಮುಂದಿನ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ಪುಟ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ರಲ್ಲಿ +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} ರಲ್ಲಿ {{pageNumber}}) + +zoom_out.title=ಕಿರಿದಾಗಿಸು +zoom_out_label=ಕಿರಿದಾಗಿಸಿ +zoom_in.title=ಹಿರಿದಾಗಿಸು +zoom_in_label=ಹಿರಿದಾಗಿಸಿ +zoom.title=ಗಾತ್ರಬದಲಿಸು +presentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು +presentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ +open_file.title=ಕಡತವನ್ನು ತೆರೆ +open_file_label=ತೆರೆಯಿರಿ +print.title=ಮುದ್ರಿಸು +print_label=ಮುದ್ರಿಸಿ +download.title=ಇಳಿಸು +download_label=ಇಳಿಸಿಕೊಳ್ಳಿ +bookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ) +bookmark_label=ಪ್ರಸಕ್ತ ನೋಟ + +# Secondary toolbar and context menu +tools.title=ಉಪಕರಣಗಳು +tools_label=ಉಪಕರಣಗಳು +first_page.title=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು +first_page_label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು +last_page.title=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು +last_page_label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು +page_rotate_cw.title=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_cw_label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_ccw.title=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_ccw_label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು + +cursor_text_select_tool.title=ಪಠ್ಯ ಆಯ್ಕೆ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ +cursor_text_select_tool_label=ಪಠ್ಯ ಆಯ್ಕೆಯ ಉಪಕರಣ +cursor_hand_tool.title=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ +cursor_hand_tool_label=ಕೈ ಉಪಕರಣ + + + +# Document properties dialog box +document_properties.title=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... +document_properties_label=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... +document_properties_file_name=ಕಡತದ ಹೆಸರು: +document_properties_file_size=ಕಡತದ ಗಾತ್ರ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} ಬೈಟ್‍ಗಳು) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} ಬೈಟ್‍ಗಳು) +document_properties_title=ಶೀರ್ಷಿಕೆ: +document_properties_author=ಕರ್ತೃ: +document_properties_subject=ವಿಷಯ: +document_properties_keywords=ಮುಖ್ಯಪದಗಳು: +document_properties_creation_date=ರಚಿಸಿದ ದಿನಾಂಕ: +document_properties_modification_date=ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ರಚಿಸಿದವರು: +document_properties_producer=PDF ಉತ್ಪಾದಕ: +document_properties_version=PDF ಆವೃತ್ತಿ: +document_properties_page_count=ಪುಟದ ಎಣಿಕೆ: +document_properties_page_size_unit_inches=ಇದರಲ್ಲಿ +document_properties_page_size_orientation_portrait=ಭಾವಚಿತ್ರ +document_properties_page_size_orientation_landscape=ಪ್ರಕೃತಿ ಚಿತ್ರ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_close=ಮುಚ್ಚು + +print_progress_message=ಮುದ್ರಿಸುವುದಕ್ಕಾಗಿ ದಸ್ತಾವೇಜನ್ನು ಸಿದ್ಧಗೊಳಿಸಲಾಗುತ್ತಿದೆ… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ರದ್ದು ಮಾಡು + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು +toggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು +document_outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ +attachments.title=ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು +attachments_label=ಲಗತ್ತುಗಳು +thumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು +thumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು +findbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು +findbar_label=ಹುಡುಕು + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=ಪುಟ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}} + +# Find panel button title and messages +find_input.title=ಹುಡುಕು +find_input.placeholder=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು… +find_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು +find_previous_label=ಹಿಂದಿನ +find_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು +find_next_label=ಮುಂದಿನ +find_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು +find_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು +find_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು +find_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು +find_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ + +# Error panel labels +error_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ +error_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ +error_close=ಮುಚ್ಚು +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ಸಂದೇಶ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ರಾಶಿ: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ಕಡತ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ಸಾಲು: {{line}} +rendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. + +# Predefined zoom values +page_scale_width=ಪುಟದ ಅಗಲ +page_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ +page_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ +page_scale_actual=ನಿಜವಾದ ಗಾತ್ರ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. +invalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ. +missing_file_error=PDF ಕಡತ ಇಲ್ಲ. +unexpected_response_error=ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ] +password_label=PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ. +password_invalid=ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ. +password_ok=OK +password_cancel=ರದ್ದು ಮಾಡು + +printing_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ. +printing_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ. +web_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. + diff --git a/src/assets/pdf-annotation/web/locale/ko/viewer.properties b/src/assets/pdf-annotation/web/locale/ko/viewer.properties new file mode 100755 index 0000000..1151c27 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ko/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=이전 페이지 +previous_label=이전 +next.title=다음 페이지 +next_label=다음 + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=페이지 +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=축소 +zoom_out_label=축소 +zoom_in.title=확대 +zoom_in_label=확대 +zoom.title=확대/축소 +presentation_mode.title=프레젠테이션 모드로 전환 +presentation_mode_label=프레젠테이션 모드 +open_file.title=파일 열기 +open_file_label=열기 +print.title=인쇄 +print_label=인쇄 +download.title=다운로드 +download_label=다운로드 +save.title=저장 +save_label=저장 +bookmark.title=현재 보기 (복사 또는 새 창에서 열기) +bookmark_label=현재 보기 + +# Secondary toolbar and context menu +tools.title=도구 +tools_label=도구 +first_page.title=첫 페이지로 이동 +first_page_label=첫 페이지로 이동 +last_page.title=마지막 페이지로 이동 +last_page_label=마지막 페이지로 이동 +page_rotate_cw.title=시계방향으로 회전 +page_rotate_cw_label=시계방향으로 회전 +page_rotate_ccw.title=시계 반대방향으로 회전 +page_rotate_ccw_label=시계 반대방향으로 회전 + +cursor_text_select_tool.title=텍스트 선택 도구 활성화 +cursor_text_select_tool_label=텍스트 선택 도구 +cursor_hand_tool.title=손 도구 활성화 +cursor_hand_tool_label=손 도구 + +scroll_page.title=페이지 스크롤 사용 +scroll_page_label=페이지 스크롤 +scroll_vertical.title=세로 스크롤 사용 +scroll_vertical_label=세로 스크롤 +scroll_horizontal.title=가로 스크롤 사용 +scroll_horizontal_label=가로 스크롤 +scroll_wrapped.title=래핑(자동 줄 바꿈) 스크롤 사용 +scroll_wrapped_label=래핑 스크롤 + +spread_none.title=한 페이지 보기 +spread_none_label=펼쳐짐 없음 +spread_odd.title=홀수 페이지로 시작하는 두 페이지 보기 +spread_odd_label=홀수 펼쳐짐 +spread_even.title=짝수 페이지로 시작하는 두 페이지 보기 +spread_even_label=짝수 펼쳐짐 + +# Document properties dialog box +document_properties.title=문서 속성… +document_properties_label=문서 속성… +document_properties_file_name=파일 이름: +document_properties_file_size=파일 크기: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}}바이트) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}}바이트) +document_properties_title=제목: +document_properties_author=작성자: +document_properties_subject=주제: +document_properties_keywords=키워드: +document_properties_creation_date=작성 날짜: +document_properties_modification_date=수정 날짜: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=작성 프로그램: +document_properties_producer=PDF 변환 소프트웨어: +document_properties_version=PDF 버전: +document_properties_page_count=페이지 수: +document_properties_page_size=페이지 크기: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=세로 방향 +document_properties_page_size_orientation_landscape=가로 방향 +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=레터 +document_properties_page_size_name_legal=리걸 +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=빠른 웹 보기: +document_properties_linearized_yes=예 +document_properties_linearized_no=아니오 +document_properties_close=닫기 + +print_progress_message=인쇄 문서 준비 중… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=취소 + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=탐색창 표시/숨기기 +toggle_sidebar_notification2.title=탐색창 표시/숨기기 (문서에 아웃라인/첨부파일/레이어 포함됨) +toggle_sidebar_label=탐색창 표시/숨기기 +document_outline.title=문서 아웃라인 보기 (더블 클릭해서 모든 항목 펼치기/접기) +document_outline_label=문서 아웃라인 +attachments.title=첨부파일 보기 +attachments_label=첨부파일 +layers.title=레이어 보기 (더블 클릭해서 모든 레이어를 기본 상태로 재설정) +layers_label=레이어 +thumbs.title=미리보기 +thumbs_label=미리보기 +current_outline_item.title=현재 아웃라인 항목 찾기 +current_outline_item_label=현재 아웃라인 항목 +findbar.title=검색 +findbar_label=검색 + +additional_layers=추가 레이어 +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark={{page}} 페이지 +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} 페이지 +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} 페이지 미리보기 + +# Find panel button title and messages +find_input.title=찾기 +find_input.placeholder=문서에서 찾기… +find_previous.title=지정 문자열에 일치하는 1개 부분을 검색 +find_previous_label=이전 +find_next.title=지정 문자열에 일치하는 다음 부분을 검색 +find_next_label=다음 +find_highlight=모두 강조 표시 +find_match_case_label=대/소문자 구분 +find_match_diacritics_label=분음 부호 일치 +find_entire_word_label=단어 단위로 +find_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다. +find_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다. +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} 중 {{current}} 일치 +find_match_count[two]={{total}} 중 {{current}} 일치 +find_match_count[few]={{total}} 중 {{current}} 일치 +find_match_count[many]={{total}} 중 {{current}} 일치 +find_match_count[other]={{total}} 중 {{current}} 일치 +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} 이상 일치 +find_match_count_limit[one]={{limit}} 이상 일치 +find_match_count_limit[two]={{limit}} 이상 일치 +find_match_count_limit[few]={{limit}} 이상 일치 +find_match_count_limit[many]={{limit}} 이상 일치 +find_match_count_limit[other]={{limit}} 이상 일치 +find_not_found=검색 결과 없음 + +# Error panel labels +error_more_info=자세한 정보 +error_less_info=정보 간단히 보기 +error_close=닫기 +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (빌드: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=메시지: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=스택: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=파일: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=줄 번호: {{line}} + +# Predefined zoom values +page_scale_width=페이지 너비에 맞추기 +page_scale_fit=페이지에 맞추기 +page_scale_auto=자동 +page_scale_actual=실제 크기 +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=로드 중… +loading_error=PDF를 로드하는 동안 오류가 발생했습니다. +invalid_file_error=잘못되었거나 손상된 PDF 파일. +missing_file_error=PDF 파일 없음. +unexpected_response_error=예기치 않은 서버 응답입니다. + +rendering_error=페이지를 렌더링하는 동안 오류가 발생했습니다. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 주석] +password_label=이 PDF 파일을 열 수 있는 비밀번호를 입력하세요. +password_invalid=잘못된 비밀번호입니다. 다시 시도하세요. +password_ok=확인 +password_cancel=취소 + +printing_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다. +printing_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다. +web_fonts_disabled=웹 폰트가 비활성화됨: 내장된 PDF 글꼴을 사용할 수 없습니다. + +# Editor +editor_free_text2.title=텍스트 +editor_free_text2_label=텍스트 +editor_ink2.title=그리기 +editor_ink2_label=그리기 + +free_text2_default_content=입력하세요… + +# Editor Parameters +editor_free_text_color=색상 +editor_free_text_size=크기 +editor_ink_color=색상 +editor_ink_thickness=두께 +editor_ink_opacity=불투명도 + +# Editor aria +editor_free_text2_aria_label=텍스트 편집기 +editor_ink2_aria_label=그리기 편집기 +editor_ink_canvas_aria_label=사용자 생성 이미지 diff --git a/src/assets/pdf-annotation/web/locale/lij/viewer.properties b/src/assets/pdf-annotation/web/locale/lij/viewer.properties new file mode 100755 index 0000000..a7854d1 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/lij/viewer.properties @@ -0,0 +1,235 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina primma +previous_label=Precedente +next.title=Pagina dòppo +next_label=Pròscima + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Diminoisci zoom +zoom_out_label=Diminoisci zoom +zoom_in.title=Aomenta zoom +zoom_in_label=Aomenta zoom +zoom.title=Zoom +presentation_mode.title=Vanni into mòddo de prezentaçion +presentation_mode_label=Mòddo de prezentaçion +open_file.title=Arvi file +open_file_label=Arvi +print.title=Stanpa +print_label=Stanpa +download.title=Descaregamento +download_label=Descaregamento +bookmark.title=Vixon corente (còpia ò arvi inte 'n neuvo barcon) +bookmark_label=Vixon corente + +# Secondary toolbar and context menu +tools.title=Atressi +tools_label=Atressi +first_page.title=Vanni a-a primma pagina +first_page_label=Vanni a-a primma pagina +last_page.title=Vanni a l'urtima pagina +last_page_label=Vanni a l'urtima pagina +page_rotate_cw.title=Gia into verso oraio +page_rotate_cw_label=Gia into verso oraio +page_rotate_ccw.title=Gia into verso antioraio +page_rotate_ccw_label=Gia into verso antioraio + +cursor_text_select_tool.title=Abilita strumento de seleçion do testo +cursor_text_select_tool_label=Strumento de seleçion do testo +cursor_hand_tool.title=Abilita strumento man +cursor_hand_tool_label=Strumento man + +scroll_vertical.title=Deuvia rebelamento verticale +scroll_vertical_label=Rebelamento verticale +scroll_horizontal.title=Deuvia rebelamento orizontâ +scroll_horizontal_label=Rebelamento orizontâ +scroll_wrapped.title=Deuvia rebelamento incapsolou +scroll_wrapped_label=Rebelamento incapsolou + +spread_none.title=No unite a-a difuxon de pagina +spread_none_label=No difuxon +spread_odd.title=Uniscite a-a difuxon de pagina co-o numero dèspa +spread_odd_label=Difuxon dèspa +spread_even.title=Uniscite a-a difuxon de pagina co-o numero pari +spread_even_label=Difuxon pari + +# Document properties dialog box +document_properties.title=Propietæ do documento… +document_properties_label=Propietæ do documento… +document_properties_file_name=Nomme schedaio: +document_properties_file_size=Dimenscion schedaio: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Titolo: +document_properties_author=Aoto: +document_properties_subject=Ogetto: +document_properties_keywords=Paròlle ciave: +document_properties_creation_date=Dæta creaçion: +document_properties_modification_date=Dæta cangiamento: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Aotô originale: +document_properties_producer=Produtô PDF: +document_properties_version=Verscion PDF: +document_properties_page_count=Contezzo pagine: +document_properties_page_size=Dimenscion da pagina: +document_properties_page_size_unit_inches=dii gròsci +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=drito +document_properties_page_size_orientation_landscape=desteizo +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letia +document_properties_page_size_name_legal=Lezze +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista veloce do Web: +document_properties_linearized_yes=Sci +document_properties_linearized_no=No +document_properties_close=Særa + +print_progress_message=Praparo o documento pe-a stanpa… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Anulla + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Ativa/dizativa bara de scianco +toggle_sidebar_label=Ativa/dizativa bara de scianco +document_outline.title=Fanni vedde o contorno do documento (scicca doggio pe espande/ridue tutti i elementi) +document_outline_label=Contorno do documento +attachments.title=Fanni vedde alegæ +attachments_label=Alegæ +thumbs.title=Mostra miniatue +thumbs_label=Miniatue +findbar.title=Treuva into documento +findbar_label=Treuva + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatua da pagina {{page}} + +# Find panel button title and messages +find_input.title=Treuva +find_input.placeholder=Treuva into documento… +find_previous.title=Treuva a ripetiçion precedente do testo da çercâ +find_previous_label=Precedente +find_next.title=Treuva a ripetiçion dòppo do testo da çercâ +find_next_label=Segoente +find_highlight=Evidençia +find_match_case_label=Maioscole/minoscole +find_entire_word_label=Poula intrega +find_reached_top=Razonto a fin da pagina, continoa da l'iniçio +find_reached_bottom=Razonto l'iniçio da pagina, continoa da-a fin +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} corispondensa +find_match_count[two]={{current}} de {{total}} corispondense +find_match_count[few]={{current}} de {{total}} corispondense +find_match_count[many]={{current}} de {{total}} corispondense +find_match_count[other]={{current}} de {{total}} corispondense +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Ciù de {{limit}} corispondense +find_match_count_limit[one]=Ciù de {{limit}} corispondensa +find_match_count_limit[two]=Ciù de {{limit}} corispondense +find_match_count_limit[few]=Ciù de {{limit}} corispondense +find_match_count_limit[many]=Ciù de {{limit}} corispondense +find_match_count_limit[other]=Ciù de {{limit}} corispondense +find_not_found=Testo no trovou + +# Error panel labels +error_more_info=Ciù informaçioin +error_less_info=Meno informaçioin +error_close=Særa +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesaggio: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Schedaio: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linia: {{line}} +rendering_error=Gh'é stæto 'n'erô itno rendering da pagina. + +# Predefined zoom values +page_scale_width=Larghessa pagina +page_scale_fit=Adatta a una pagina +page_scale_auto=Zoom aotomatico +page_scale_actual=Dimenscioin efetive +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=S'é verificou 'n'erô itno caregamento do PDF. +invalid_file_error=O schedaio PDF o l'é no valido ò aroinou. +missing_file_error=O schedaio PDF o no gh'é. +unexpected_response_error=Risposta inprevista do-u server + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotaçion: {{type}}] +password_label=Dimme a paròlla segreta pe arvî sto schedaio PDF. +password_invalid=Paròlla segreta sbalia. Preuva torna. +password_ok=Va ben +password_cancel=Anulla + +printing_not_supported=Atençion: a stanpa a no l'é conpletamente soportâ da sto navegatô. +printing_not_ready=Atençion: o PDF o no l'é ancon caregou conpletamente pe-a stanpa. +web_fonts_disabled=I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF. + diff --git a/src/assets/pdf-annotation/web/locale/lo/viewer.properties b/src/assets/pdf-annotation/web/locale/lo/viewer.properties new file mode 100755 index 0000000..8b877d0 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/lo/viewer.properties @@ -0,0 +1,145 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ຫນ້າກ່ອນຫນ້າ +previous_label=ກ່ອນຫນ້າ +next.title=ຫນ້າຖັດໄປ +next_label=ຖັດໄປ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ຫນ້າ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=ຈາກ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} ຈາກ {{pagesCount}}) + +zoom_out.title=ຂະຫຍາຍອອກ +zoom_out_label=ຂະຫຍາຍອອກ +zoom_in.title=ຂະຫຍາຍເຂົ້າ +zoom_in_label=ຂະຫຍາຍເຂົ້າ +zoom.title=ຂະຫຍາຍ +presentation_mode.title=ສັບປ່ຽນເປັນໂຫມດການນຳສະເຫນີ +presentation_mode_label=ໂຫມດການນຳສະເຫນີ +open_file.title=ເປີດໄຟລ໌ +open_file_label=ເປີດ +print.title=ພິມ +print_label=ພິມ +download.title=ດາວໂຫລດ +download_label=ດາວໂຫລດ +bookmark.title=ມຸມມອງປະຈຸບັນ (ສຳເນົາ ຫລື ເປີດໃນວິນໂດໃຫມ່) +bookmark_label=ມຸມມອງປະຈຸບັນ + +# Secondary toolbar and context menu +tools.title=ເຄື່ອງມື +tools_label=ເຄື່ອງມື +first_page.title=ໄປທີ່ຫນ້າທຳອິດ +first_page_label=ໄປທີ່ຫນ້າທຳອິດ +last_page.title=ໄປທີ່ຫນ້າສຸດທ້າຍ +last_page_label=ໄປທີ່ຫນ້າສຸດທ້າຍ +page_rotate_cw.title=ຫມູນຕາມເຂັມໂມງ +page_rotate_cw_label=ຫມູນຕາມເຂັມໂມງ +page_rotate_ccw.title=ຫມູນທວນເຂັມໂມງ +page_rotate_ccw_label=ຫມູນທວນເຂັມໂມງ + + + + +# Document properties dialog box +document_properties_file_name=ຊື່ໄຟລ໌: +document_properties_file_size=ຂະຫນາດໄຟລ໌: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=ລວງຕັ້ງ +document_properties_page_size_orientation_landscape=ລວງນອນ +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=ຈົດໝາຍ +document_properties_page_size_name_legal=ຂໍ້ກົດຫມາຍ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_close=ປິດ + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_close=ຍົກເລີກ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ເປີດ/ປິດແຖບຂ້າງ +toggle_sidebar_label=ເປີດ/ປິດແຖບຂ້າງ +document_outline_label=ເຄົ້າຮ່າງເອກະສານ +findbar_label=ຄົ້ນຫາ + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_input.title=ຄົ້ນຫາ +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. + +# Error panel labels +error_more_info=ຂໍ້ມູນເພີ່ມເຕີມ +error_less_info=ຂໍ້ມູນນ້ອຍລົງ +error_close=ປິດ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +rendering_error=ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະນະທີ່ກຳລັງເຣັນເດີຫນ້າ. + +# Predefined zoom values +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +loading_error=ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະນະທີ່ກຳລັງໂຫລດ PDF. +invalid_file_error=ໄຟລ໌ PDF ບໍ່ຖືກຕ້ອງຫລືເສຍຫາຍ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_ok=ຕົກລົງ +password_cancel=ຍົກເລີກ + diff --git a/src/assets/pdf-annotation/web/locale/locale.properties b/src/assets/pdf-annotation/web/locale/locale.properties new file mode 100755 index 0000000..c432bf5 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/locale.properties @@ -0,0 +1,330 @@ +[ach] +@import url(ach/viewer.properties) + +[af] +@import url(af/viewer.properties) + +[an] +@import url(an/viewer.properties) + +[ar] +@import url(ar/viewer.properties) + +[ast] +@import url(ast/viewer.properties) + +[az] +@import url(az/viewer.properties) + +[be] +@import url(be/viewer.properties) + +[bg] +@import url(bg/viewer.properties) + +[bn] +@import url(bn/viewer.properties) + +[bo] +@import url(bo/viewer.properties) + +[br] +@import url(br/viewer.properties) + +[brx] +@import url(brx/viewer.properties) + +[bs] +@import url(bs/viewer.properties) + +[ca] +@import url(ca/viewer.properties) + +[cak] +@import url(cak/viewer.properties) + +[ckb] +@import url(ckb/viewer.properties) + +[cs] +@import url(cs/viewer.properties) + +[cy] +@import url(cy/viewer.properties) + +[da] +@import url(da/viewer.properties) + +[de] +@import url(de/viewer.properties) + +[dsb] +@import url(dsb/viewer.properties) + +[el] +@import url(el/viewer.properties) + +[en-CA] +@import url(en-CA/viewer.properties) + +[en-GB] +@import url(en-GB/viewer.properties) + +[en-US] +@import url(en-US/viewer.properties) + +[eo] +@import url(eo/viewer.properties) + +[es-AR] +@import url(es-AR/viewer.properties) + +[es-CL] +@import url(es-CL/viewer.properties) + +[es-ES] +@import url(es-ES/viewer.properties) + +[es-MX] +@import url(es-MX/viewer.properties) + +[et] +@import url(et/viewer.properties) + +[eu] +@import url(eu/viewer.properties) + +[fa] +@import url(fa/viewer.properties) + +[ff] +@import url(ff/viewer.properties) + +[fi] +@import url(fi/viewer.properties) + +[fr] +@import url(fr/viewer.properties) + +[fur] +@import url(fur/viewer.properties) + +[fy-NL] +@import url(fy-NL/viewer.properties) + +[ga-IE] +@import url(ga-IE/viewer.properties) + +[gd] +@import url(gd/viewer.properties) + +[gl] +@import url(gl/viewer.properties) + +[gn] +@import url(gn/viewer.properties) + +[gu-IN] +@import url(gu-IN/viewer.properties) + +[he] +@import url(he/viewer.properties) + +[hi-IN] +@import url(hi-IN/viewer.properties) + +[hr] +@import url(hr/viewer.properties) + +[hsb] +@import url(hsb/viewer.properties) + +[hu] +@import url(hu/viewer.properties) + +[hy-AM] +@import url(hy-AM/viewer.properties) + +[hye] +@import url(hye/viewer.properties) + +[ia] +@import url(ia/viewer.properties) + +[id] +@import url(id/viewer.properties) + +[is] +@import url(is/viewer.properties) + +[it] +@import url(it/viewer.properties) + +[ja] +@import url(ja/viewer.properties) + +[ka] +@import url(ka/viewer.properties) + +[kab] +@import url(kab/viewer.properties) + +[kk] +@import url(kk/viewer.properties) + +[km] +@import url(km/viewer.properties) + +[kn] +@import url(kn/viewer.properties) + +[ko] +@import url(ko/viewer.properties) + +[lij] +@import url(lij/viewer.properties) + +[lo] +@import url(lo/viewer.properties) + +[lt] +@import url(lt/viewer.properties) + +[ltg] +@import url(ltg/viewer.properties) + +[lv] +@import url(lv/viewer.properties) + +[meh] +@import url(meh/viewer.properties) + +[mk] +@import url(mk/viewer.properties) + +[mr] +@import url(mr/viewer.properties) + +[ms] +@import url(ms/viewer.properties) + +[my] +@import url(my/viewer.properties) + +[nb-NO] +@import url(nb-NO/viewer.properties) + +[ne-NP] +@import url(ne-NP/viewer.properties) + +[nl] +@import url(nl/viewer.properties) + +[nn-NO] +@import url(nn-NO/viewer.properties) + +[oc] +@import url(oc/viewer.properties) + +[pa-IN] +@import url(pa-IN/viewer.properties) + +[pl] +@import url(pl/viewer.properties) + +[pt-BR] +@import url(pt-BR/viewer.properties) + +[pt-PT] +@import url(pt-PT/viewer.properties) + +[rm] +@import url(rm/viewer.properties) + +[ro] +@import url(ro/viewer.properties) + +[ru] +@import url(ru/viewer.properties) + +[sat] +@import url(sat/viewer.properties) + +[sc] +@import url(sc/viewer.properties) + +[scn] +@import url(scn/viewer.properties) + +[sco] +@import url(sco/viewer.properties) + +[si] +@import url(si/viewer.properties) + +[sk] +@import url(sk/viewer.properties) + +[sl] +@import url(sl/viewer.properties) + +[son] +@import url(son/viewer.properties) + +[sq] +@import url(sq/viewer.properties) + +[sr] +@import url(sr/viewer.properties) + +[sv-SE] +@import url(sv-SE/viewer.properties) + +[szl] +@import url(szl/viewer.properties) + +[ta] +@import url(ta/viewer.properties) + +[te] +@import url(te/viewer.properties) + +[tg] +@import url(tg/viewer.properties) + +[th] +@import url(th/viewer.properties) + +[tl] +@import url(tl/viewer.properties) + +[tr] +@import url(tr/viewer.properties) + +[trs] +@import url(trs/viewer.properties) + +[uk] +@import url(uk/viewer.properties) + +[ur] +@import url(ur/viewer.properties) + +[uz] +@import url(uz/viewer.properties) + +[vi] +@import url(vi/viewer.properties) + +[wo] +@import url(wo/viewer.properties) + +[xh] +@import url(xh/viewer.properties) + +[zh-CN] +@import url(zh-CN/viewer.properties) + +[zh-TW] +@import url(zh-TW/viewer.properties) + diff --git a/src/assets/pdf-annotation/web/locale/lt/viewer.properties b/src/assets/pdf-annotation/web/locale/lt/viewer.properties new file mode 100755 index 0000000..2c4fb8a --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/lt/viewer.properties @@ -0,0 +1,260 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Ankstesnis puslapis +previous_label=Ankstesnis +next.title=Kitas puslapis +next_label=Kitas + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Puslapis +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=iš {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} iš {{pagesCount}}) + +zoom_out.title=Sumažinti +zoom_out_label=Sumažinti +zoom_in.title=Padidinti +zoom_in_label=Padidinti +zoom.title=Mastelis +presentation_mode.title=Pereiti į pateikties veikseną +presentation_mode_label=Pateikties veiksena +open_file.title=Atverti failą +open_file_label=Atverti +print.title=Spausdinti +print_label=Spausdinti +download.title=Parsiųsti +download_label=Parsiųsti +bookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange) +bookmark_label=Esamasis rodinys + +# Secondary toolbar and context menu +tools.title=Priemonės +tools_label=Priemonės +first_page.title=Eiti į pirmą puslapį +first_page_label=Eiti į pirmą puslapį +last_page.title=Eiti į paskutinį puslapį +last_page_label=Eiti į paskutinį puslapį +page_rotate_cw.title=Pasukti pagal laikrodžio rodyklę +page_rotate_cw_label=Pasukti pagal laikrodžio rodyklę +page_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę +page_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę + +cursor_text_select_tool.title=Įjungti teksto žymėjimo įrankį +cursor_text_select_tool_label=Teksto žymėjimo įrankis +cursor_hand_tool.title=Įjungti vilkimo įrankį +cursor_hand_tool_label=Vilkimo įrankis + +scroll_page.title=Naudoti puslapio slinkimą +scroll_page_label=Puslapio slinkimas +scroll_vertical.title=Naudoti vertikalų slinkimą +scroll_vertical_label=Vertikalus slinkimas +scroll_horizontal.title=Naudoti horizontalų slinkimą +scroll_horizontal_label=Horizontalus slinkimas +scroll_wrapped.title=Naudoti išklotą slinkimą +scroll_wrapped_label=Išklotas slinkimas + +spread_none.title=Nejungti puslapių į dvilapius +spread_none_label=Be dvilapių +spread_odd.title=Sujungti į dvilapius pradedant nelyginiais puslapiais +spread_odd_label=Nelyginiai dvilapiai +spread_even.title=Sujungti į dvilapius pradedant lyginiais puslapiais +spread_even_label=Lyginiai dvilapiai + +# Document properties dialog box +document_properties.title=Dokumento savybės… +document_properties_label=Dokumento savybės… +document_properties_file_name=Failo vardas: +document_properties_file_size=Failo dydis: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} B) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} B) +document_properties_title=Antraštė: +document_properties_author=Autorius: +document_properties_subject=Tema: +document_properties_keywords=Reikšminiai žodžiai: +document_properties_creation_date=Sukūrimo data: +document_properties_modification_date=Modifikavimo data: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Kūrėjas: +document_properties_producer=PDF generatorius: +document_properties_version=PDF versija: +document_properties_page_count=Puslapių skaičius: +document_properties_page_size=Puslapio dydis: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=stačias +document_properties_page_size_orientation_landscape=gulsčias +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Laiškas +document_properties_page_size_name_legal=Dokumentas +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Spartus žiniatinklio rodinys: +document_properties_linearized_yes=Taip +document_properties_linearized_no=Ne +document_properties_close=Užverti + +print_progress_message=Dokumentas ruošiamas spausdinimui… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Atsisakyti + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Rodyti / slėpti šoninį polangį +toggle_sidebar_notification2.title=Parankinė (dokumentas turi struktūrą / priedų / sluoksnių) +toggle_sidebar_label=Šoninis polangis +document_outline.title=Rodyti dokumento struktūrą (spustelėkite dukart norėdami išplėsti/suskleisti visus elementus) +document_outline_label=Dokumento struktūra +attachments.title=Rodyti priedus +attachments_label=Priedai +layers.title=Rodyti sluoksnius (spustelėkite dukart, norėdami atstatyti visus sluoksnius į numatytąją būseną) +layers_label=Sluoksniai +thumbs.title=Rodyti puslapių miniatiūras +thumbs_label=Miniatiūros +current_outline_item.title=Rasti dabartinį struktūros elementą +current_outline_item_label=Dabartinis struktūros elementas +findbar.title=Ieškoti dokumente +findbar_label=Rasti + +additional_layers=Papildomi sluoksniai +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark={{page}} puslapis +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} puslapis +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} puslapio miniatiūra + +# Find panel button title and messages +find_input.title=Rasti +find_input.placeholder=Rasti dokumente… +find_previous.title=Ieškoti ankstesnio frazės egzemplioriaus +find_previous_label=Ankstesnis +find_next.title=Ieškoti tolesnio frazės egzemplioriaus +find_next_label=Tolesnis +find_highlight=Viską paryškinti +find_match_case_label=Skirti didžiąsias ir mažąsias raides +find_match_diacritics_label=Skirti diakritinius ženklus +find_entire_word_label=Ištisi žodžiai +find_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos +find_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} iš {{total}} atitikmens +find_match_count[two]={{current}} iš {{total}} atitikmenų +find_match_count[few]={{current}} iš {{total}} atitikmenų +find_match_count[many]={{current}} iš {{total}} atitikmenų +find_match_count[other]={{current}} iš {{total}} atitikmens +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Daugiau nei {{limit}} atitikmenų +find_match_count_limit[one]=Daugiau nei {{limit}} atitikmuo +find_match_count_limit[two]=Daugiau nei {{limit}} atitikmenys +find_match_count_limit[few]=Daugiau nei {{limit}} atitikmenys +find_match_count_limit[many]=Daugiau nei {{limit}} atitikmenų +find_match_count_limit[other]=Daugiau nei {{limit}} atitikmuo +find_not_found=Ieškoma frazė nerasta + +# Error panel labels +error_more_info=Išsamiau +error_less_info=Glausčiau +error_close=Užverti +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v. {{version}} (darinys: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Pranešimas: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Dėklas: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Failas: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Eilutė: {{line}} +rendering_error=Atvaizduojant puslapį įvyko klaida. + +# Predefined zoom values +page_scale_width=Priderinti prie lapo pločio +page_scale_fit=Pritaikyti prie lapo dydžio +page_scale_auto=Automatinis mastelis +page_scale_actual=Tikras dydis +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Įkeliama… +loading_error=Įkeliant PDF failą įvyko klaida. +invalid_file_error=Tai nėra PDF failas arba jis yra sugadintas. +missing_file_error=PDF failas nerastas. +unexpected_response_error=Netikėtas serverio atsakas. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[„{{type}}“ tipo anotacija] +password_label=Įveskite slaptažodį šiam PDF failui atverti. +password_invalid=Slaptažodis neteisingas. Bandykite dar kartą. +password_ok=Gerai +password_cancel=Atsisakyti + +printing_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas. +printing_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui. +web_fonts_disabled=Saityno šriftai išjungti – PDF faile esančių šriftų naudoti negalima. + +# Editor +editor_none.title=Išjungti komentarų redagavimą +editor_none_label=Išjungti redagavimą +editor_free_text.title=Pridėti „FreeText“ komentarą +editor_free_text_label=„FreeText“ komentaras +editor_ink.title=Pridėti laisvo stiliaus komentarą +editor_ink_label=Laisvo stiliaus komentaras + diff --git a/src/assets/pdf-annotation/web/locale/ltg/viewer.properties b/src/assets/pdf-annotation/web/locale/ltg/viewer.properties new file mode 100755 index 0000000..b117a0e --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ltg/viewer.properties @@ -0,0 +1,213 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Īprīkšejā lopa +previous_label=Īprīkšejā +next.title=Nuokomuo lopa +next_label=Nuokomuo + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Lopa +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=nu {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} nu {{pagesCount}}) + +zoom_out.title=Attuolynuot +zoom_out_label=Attuolynuot +zoom_in.title=Pītuvynuot +zoom_in_label=Pītuvynuot +zoom.title=Palelynuojums +presentation_mode.title=Puorslēgtīs iz Prezentacejis režymu +presentation_mode_label=Prezentacejis režyms +open_file.title=Attaiseit failu +open_file_label=Attaiseit +print.title=Drukuošona +print_label=Drukōt +download.title=Lejupīluode +download_label=Lejupīluodeit +bookmark.title=Pošreizejais skots (kopēt voi attaiseit jaunā lūgā) +bookmark_label=Pošreizejais skots + +# Secondary toolbar and context menu +tools.title=Reiki +tools_label=Reiki +first_page.title=Īt iz pyrmū lopu +first_page_label=Īt iz pyrmū lopu +last_page.title=Īt iz piedejū lopu +last_page_label=Īt iz piedejū lopu +page_rotate_cw.title=Pagrīzt pa pulksteni +page_rotate_cw_label=Pagrīzt pa pulksteni +page_rotate_ccw.title=Pagrīzt pret pulksteni +page_rotate_ccw_label=Pagrīzt pret pulksteni + +cursor_text_select_tool.title=Aktivizēt teksta izvieles reiku +cursor_text_select_tool_label=Teksta izvieles reiks +cursor_hand_tool.title=Aktivēt rūkys reiku +cursor_hand_tool_label=Rūkys reiks + +scroll_vertical.title=Izmontōt vertikalū ritinōšonu +scroll_vertical_label=Vertikalō ritinōšona +scroll_horizontal.title=Izmontōt horizontalū ritinōšonu +scroll_horizontal_label=Horizontalō ritinōšona +scroll_wrapped.title=Izmontōt mārūgojamū ritinōšonu +scroll_wrapped_label=Mārūgojamō ritinōšona + +spread_none.title=Naizmontōt lopu atvāruma režimu +spread_none_label=Bez atvārumim +spread_odd.title=Izmontōt lopu atvārumus sōkut nu napōra numeru lopom +spread_odd_label=Napōra lopys pa kreisi +spread_even.title=Izmontōt lopu atvārumus sōkut nu pōra numeru lopom +spread_even_label=Pōra lopys pa kreisi + +# Document properties dialog box +document_properties.title=Dokumenta īstatiejumi… +document_properties_label=Dokumenta īstatiejumi… +document_properties_file_name=Faila nūsaukums: +document_properties_file_size=Faila izmārs: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} biti) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} biti) +document_properties_title=Nūsaukums: +document_properties_author=Autors: +document_properties_subject=Tema: +document_properties_keywords=Atslāgi vuordi: +document_properties_creation_date=Izveides datums: +document_properties_modification_date=lobuošonys datums: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Radeituojs: +document_properties_producer=PDF producents: +document_properties_version=PDF verseja: +document_properties_page_count=Lopu skaits: +document_properties_page_size=Lopas izmārs: +document_properties_page_size_unit_inches=collas +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portreta orientaceja +document_properties_page_size_orientation_landscape=ainovys orientaceja +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Jā +document_properties_linearized_no=Nā +document_properties_close=Aiztaiseit + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Atceļt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Puorslēgt suonu jūslu +toggle_sidebar_label=Puorslēgt suonu jūslu +document_outline.title=Show Document Outline (double-click to expand/collapse all items) +document_outline_label=Dokumenta saturs +attachments.title=Show Attachments +attachments_label=Attachments +thumbs.title=Paruodeit seiktālus +thumbs_label=Seiktāli +findbar.title=Mekleit dokumentā +findbar_label=Mekleit + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Lopa {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Lopys {{page}} seiktāls + +# Find panel button title and messages +find_input.title=Mekleit +find_input.placeholder=Mekleit dokumentā… +find_previous.title=Atrast īprīkšejū +find_previous_label=Īprīkšejā +find_next.title=Atrast nuokamū +find_next_label=Nuokomuo +find_highlight=Īkruosuot vysys +find_match_case_label=Lelū, mozū burtu jiuteigs +find_reached_top=Sasnīgts dokumenta suokums, turpynojom nu beigom +find_reached_bottom=Sasnīgtys dokumenta beigys, turpynojom nu suokuma +find_not_found=Frāze nav atrosta + +# Error panel labels +error_more_info=Vairuok informacejis +error_less_info=mozuok informacejis +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Ziņuojums: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Steks: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Ryndeņa: {{line}} +rendering_error=Attālojūt lopu rodās klaida + +# Predefined zoom values +page_scale_width=Lopys plotumā +page_scale_fit=Ītylpynūt lopu +page_scale_auto=Automatiskais izmārs +page_scale_actual=Patīsais izmārs +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Īluodejūt PDF nūtyka klaida. +invalid_file_error=Nadereigs voi būjuots PDF fails. +missing_file_error=PDF fails nav atrosts. +unexpected_response_error=Unexpected server response. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Īvodit paroli, kab attaiseitu PDF failu. +password_invalid=Napareiza parole, raugit vēļreiz. +password_ok=Labi +password_cancel=Atceļt + +printing_not_supported=Uzmaneibu: Drukuošona nu itei puorlūka dorbojās tikai daleji. +printing_not_ready=Uzmaneibu: PDF nav pilneibā īluodeits drukuošonai. +web_fonts_disabled=Šķārsteikla fonti nav aktivizāti: Navar īgult PDF fontus. + diff --git a/src/assets/pdf-annotation/web/locale/lv/viewer.properties b/src/assets/pdf-annotation/web/locale/lv/viewer.properties new file mode 100755 index 0000000..851728f --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/lv/viewer.properties @@ -0,0 +1,235 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Iepriekšējā lapa +previous_label=Iepriekšējā +next.title=Nākamā lapa +next_label=Nākamā + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Lapa +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=no {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} no {{pagesCount}}) + +zoom_out.title=Attālināt\u0020 +zoom_out_label=Attālināt +zoom_in.title=Pietuvināt +zoom_in_label=Pietuvināt +zoom.title=Palielinājums +presentation_mode.title=Pārslēgties uz Prezentācijas režīmu +presentation_mode_label=Prezentācijas režīms +open_file.title=Atvērt failu +open_file_label=Atvērt +print.title=Drukāšana +print_label=Drukāt +download.title=Lejupielāde +download_label=Lejupielādēt +bookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā) +bookmark_label=Pašreizējais skats + +# Secondary toolbar and context menu +tools.title=Rīki +tools_label=Rīki +first_page.title=Iet uz pirmo lapu +first_page_label=Iet uz pirmo lapu +last_page.title=Iet uz pēdējo lapu +last_page_label=Iet uz pēdējo lapu +page_rotate_cw.title=Pagriezt pa pulksteni +page_rotate_cw_label=Pagriezt pa pulksteni +page_rotate_ccw.title=Pagriezt pret pulksteni +page_rotate_ccw_label=Pagriezt pret pulksteni + +cursor_text_select_tool.title=Aktivizēt teksta izvēles rīku +cursor_text_select_tool_label=Teksta izvēles rīks +cursor_hand_tool.title=Aktivēt rokas rīku +cursor_hand_tool_label=Rokas rīks + +scroll_vertical.title=Izmantot vertikālo ritināšanu +scroll_vertical_label=Vertikālā ritināšana +scroll_horizontal.title=Izmantot horizontālo ritināšanu +scroll_horizontal_label=Horizontālā ritināšana +scroll_wrapped.title=Izmantot apkļauto ritināšanu +scroll_wrapped_label=Apkļautā ritināšana + +spread_none.title=Nepievienoties lapu izpletumiem +spread_none_label=Neizmantot izpletumus +spread_odd.title=Izmantot lapu izpletumus sākot ar nepāra numuru lapām +spread_odd_label=Nepāra izpletumi +spread_even.title=Izmantot lapu izpletumus sākot ar pāra numuru lapām +spread_even_label=Pāra izpletumi + +# Document properties dialog box +document_properties.title=Dokumenta iestatījumi… +document_properties_label=Dokumenta iestatījumi… +document_properties_file_name=Faila nosaukums: +document_properties_file_size=Faila izmērs: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} biti) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} biti) +document_properties_title=Nosaukums: +document_properties_author=Autors: +document_properties_subject=Tēma: +document_properties_keywords=Atslēgas vārdi: +document_properties_creation_date=Izveides datums: +document_properties_modification_date=LAbošanas datums: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Radītājs: +document_properties_producer=PDF producents: +document_properties_version=PDF versija: +document_properties_page_count=Lapu skaits: +document_properties_page_size=Papīra izmērs: +document_properties_page_size_unit_inches=collas +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portretorientācija +document_properties_page_size_orientation_landscape=ainavorientācija +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Vēstule +document_properties_page_size_name_legal=Juridiskie teksti +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Ātrā tīmekļa skats: +document_properties_linearized_yes=Jā +document_properties_linearized_no=Nē +document_properties_close=Aizvērt + +print_progress_message=Gatavo dokumentu drukāšanai... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Atcelt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Pārslēgt sānu joslu +toggle_sidebar_label=Pārslēgt sānu joslu +document_outline.title=Rādīt dokumenta struktūru (veiciet dubultklikšķi lai izvērstu/sakļautu visus vienumus) +document_outline_label=Dokumenta saturs +attachments.title=Rādīt pielikumus +attachments_label=Pielikumi +thumbs.title=Parādīt sīktēlus +thumbs_label=Sīktēli +findbar.title=Meklēt dokumentā +findbar_label=Meklēt + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Lapa {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Lapas {{page}} sīktēls + +# Find panel button title and messages +find_input.title=Meklēt +find_input.placeholder=Meklēt dokumentā… +find_previous.title=Atrast iepriekšējo +find_previous_label=Iepriekšējā +find_next.title=Atrast nākamo +find_next_label=Nākamā +find_highlight=Iekrāsot visas +find_match_case_label=Lielo, mazo burtu jutīgs +find_entire_word_label=Veselus vārdus +find_reached_top=Sasniegts dokumenta sākums, turpinām no beigām +find_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} no {{total}} rezultāta +find_match_count[two]={{current}} no {{total}} rezultātiem +find_match_count[few]={{current}} no {{total}} rezultātiem +find_match_count[many]={{current}} no {{total}} rezultātiem +find_match_count[other]={{current}} no {{total}} rezultātiem +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Vairāk nekā {{limit}} rezultāti +find_match_count_limit[one]=Vairāk nekā {{limit}} rezultāti +find_match_count_limit[two]=Vairāk nekā {{limit}} rezultāti +find_match_count_limit[few]=Vairāk nekā {{limit}} rezultāti +find_match_count_limit[many]=Vairāk nekā {{limit}} rezultāti +find_match_count_limit[other]=Vairāk nekā {{limit}} rezultāti +find_not_found=Frāze nav atrasta + +# Error panel labels +error_more_info=Vairāk informācijas +error_less_info=MAzāk informācijas +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Ziņojums: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Steks: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rindiņa: {{line}} +rendering_error=Attēlojot lapu radās kļūda + +# Predefined zoom values +page_scale_width=Lapas platumā +page_scale_fit=Ietilpinot lapu +page_scale_auto=Automātiskais izmērs +page_scale_actual=Patiesais izmērs +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Ielādējot PDF notika kļūda. +invalid_file_error=Nederīgs vai bojāts PDF fails. +missing_file_error=PDF fails nav atrasts. +unexpected_response_error=Negaidīa servera atbilde. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} anotācija] +password_label=Ievadiet paroli, lai atvērtu PDF failu. +password_invalid=Nepareiza parole, mēģiniet vēlreiz. +password_ok=Labi +password_cancel=Atcelt + +printing_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji. +printing_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai. +web_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus. + diff --git a/src/assets/pdf-annotation/web/locale/meh/viewer.properties b/src/assets/pdf-annotation/web/locale/meh/viewer.properties new file mode 100755 index 0000000..7a1bf04 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/meh/viewer.properties @@ -0,0 +1,111 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página yata + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom.title=Nasa´a ka´nu/Nasa´a luli +open_file_label=Síne + +# Secondary toolbar and context menu + + + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized_yes=Kuvi +document_properties_close=Nakasɨ + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Nkuvi-ka + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +findbar_label=Nánuku + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_input.title=Nánuku +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} + +# Error panel labels +error_close=Nakasɨ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number + +# Predefined zoom values +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_cancel=Nkuvi-ka + diff --git a/src/assets/pdf-annotation/web/locale/mk/viewer.properties b/src/assets/pdf-annotation/web/locale/mk/viewer.properties new file mode 100755 index 0000000..6d59400 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/mk/viewer.properties @@ -0,0 +1,139 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Претходна страница +previous_label=Претходна +next.title=Следна страница +next_label=Следна + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Намалување +zoom_out_label=Намали +zoom_in.title=Зголемување +zoom_in_label=Зголеми +zoom.title=Променување на големина +presentation_mode.title=Премини во презентациски режим +presentation_mode_label=Презентациски режим +open_file.title=Отворање датотека +open_file_label=Отвори +print.title=Печатење +print_label=Печати +download.title=Преземање +download_label=Преземи +bookmark.title=Овој преглед (копирај или отвори во нов прозорец) +bookmark_label=Овој преглед + +# Secondary toolbar and context menu +tools.title=Алатки + + + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_close=Откажи + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Вклучи странична лента +toggle_sidebar_label=Вклучи странична лента +thumbs.title=Прикажување на икони +thumbs_label=Икони +findbar.title=Најди во документот +findbar_label=Најди + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Страница {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Икона од страница {{page}} + +# Find panel button title and messages +find_previous.title=Најди ја предходната појава на фразата +find_previous_label=Претходно +find_next.title=Најди ја следната појава на фразата +find_next_label=Следно +find_highlight=Означи сѐ +find_match_case_label=Токму така +find_reached_top=Барањето стигна до почетокот на документот и почнува од крајот +find_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток +find_not_found=Фразата не е пронајдена + +# Error panel labels +error_more_info=Повеќе информации +error_less_info=Помалку информации +error_close=Затвори +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Порака: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Датотека: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Линија: {{line}} +rendering_error=Настана грешка при прикажувањето на страницата. + +# Predefined zoom values +page_scale_width=Ширина на страница +page_scale_fit=Цела страница +page_scale_auto=Автоматска големина +page_scale_actual=Вистинска големина +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +loading_error=Настана грешка при вчитувањето на PDF-от. +invalid_file_error=Невалидна или корумпирана PDF датотека. +missing_file_error=Недостасува PDF документ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_cancel=Откажи + +printing_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач. +printing_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење. +web_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови. + diff --git a/src/assets/pdf-annotation/web/locale/mr/viewer.properties b/src/assets/pdf-annotation/web/locale/mr/viewer.properties new file mode 100755 index 0000000..40080f9 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/mr/viewer.properties @@ -0,0 +1,231 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=मागील पृष्ठ +previous_label=मागील +next.title=पुढील पृष्ठ +next_label=पुढील + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=पृष्ठ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}}पैकी +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} पैकी {{pageNumber}}) + +zoom_out.title=छोटे करा +zoom_out_label=छोटे करा +zoom_in.title=मोठे करा +zoom_in_label=मोठे करा +zoom.title=लहान किंवा मोठे करा +presentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा +presentation_mode_label=प्रस्तुतिकरण मोड +open_file.title=फाइल उघडा +open_file_label=उघडा +print.title=छपाई करा +print_label=छपाई करा +download.title=डाउनलोड करा +download_label=डाउनलोड करा +bookmark.title=सध्याचे अवलोकन (नवीन पटलात प्रत बनवा किंवा उघडा) +bookmark_label=सध्याचे अवलोकन + +# Secondary toolbar and context menu +tools.title=साधने +tools_label=साधने +first_page.title=पहिल्या पृष्ठावर जा +first_page_label=पहिल्या पृष्ठावर जा +last_page.title=शेवटच्या पृष्ठावर जा +last_page_label=शेवटच्या पृष्ठावर जा +page_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा +page_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा +page_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा +page_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा + +cursor_text_select_tool.title=मजकूर निवड साधन कार्यान्वयीत करा +cursor_text_select_tool_label=मजकूर निवड साधन +cursor_hand_tool.title=हात साधन कार्यान्वित करा +cursor_hand_tool_label=हस्त साधन + +scroll_vertical.title=अनुलंब स्क्रोलिंग वापरा +scroll_vertical_label=अनुलंब स्क्रोलिंग +scroll_horizontal.title=क्षैतिज स्क्रोलिंग वापरा +scroll_horizontal_label=क्षैतिज स्क्रोलिंग + + +# Document properties dialog box +document_properties.title=दस्तऐवज गुणधर्म… +document_properties_label=दस्तऐवज गुणधर्म… +document_properties_file_name=फाइलचे नाव: +document_properties_file_size=फाइल आकार: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स) +document_properties_title=शिर्षक: +document_properties_author=लेखक: +document_properties_subject=विषय: +document_properties_keywords=मुख्यशब्द: +document_properties_creation_date=निर्माण दिनांक: +document_properties_modification_date=दुरूस्ती दिनांक: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=निर्माता: +document_properties_producer=PDF निर्माता: +document_properties_version=PDF आवृत्ती: +document_properties_page_count=पृष्ठ संख्या: +document_properties_page_size=पृष्ठ आकार: +document_properties_page_size_unit_inches=इंच +document_properties_page_size_unit_millimeters=मीमी +document_properties_page_size_orientation_portrait=उभी मांडणी +document_properties_page_size_orientation_landscape=आडवे +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=जलद वेब दृष्य: +document_properties_linearized_yes=हो +document_properties_linearized_no=नाही +document_properties_close=बंद करा + +print_progress_message=छपाई करीता पृष्ठ तयार करीत आहे… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=रद्द करा + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=बाजूचीपट्टी टॉगल करा +toggle_sidebar_label=बाजूचीपट्टी टॉगल करा +document_outline.title=दस्तऐवज बाह्यरेखा दर्शवा (विस्तृत करण्यासाठी दोनवेळा क्लिक करा /सर्व घटक दाखवा) +document_outline_label=दस्तऐवज रूपरेषा +attachments.title=जोडपत्र दाखवा +attachments_label=जोडपत्र +thumbs.title=थंबनेल्स् दाखवा +thumbs_label=थंबनेल्स् +findbar.title=दस्तऐवजात शोधा +findbar_label=शोधा + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=पृष्ठ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=पृष्ठाचे थंबनेल {{page}} + +# Find panel button title and messages +find_input.title=शोधा +find_input.placeholder=दस्तऐवजात शोधा… +find_previous.title=वाकप्रयोगची मागील घटना शोधा +find_previous_label=मागील +find_next.title=वाकप्रयोगची पुढील घटना शोधा +find_next_label=पुढील +find_highlight=सर्व ठळक करा +find_match_case_label=आकार जुळवा +find_entire_word_label=संपूर्ण शब्द +find_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे +find_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} पैकी {{current}} सुसंगत +find_match_count[two]={{total}} पैकी {{current}} सुसंगत +find_match_count[few]={{total}} पैकी {{current}} सुसंगत +find_match_count[many]={{total}} पैकी {{current}} सुसंगत +find_match_count[other]={{total}} पैकी {{current}} सुसंगत +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[one]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[two]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[few]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[many]={{limit}} पेक्षा अधिक जुळण्या +find_match_count_limit[other]={{limit}} पेक्षा अधिक जुळण्या +find_not_found=वाकप्रयोग आढळले नाही + +# Error panel labels +error_more_info=आणखी माहिती +error_less_info=कमी माहिती +error_close=बंद करा +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=संदेश: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=स्टॅक: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=फाइल: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=रेष: {{line}} +rendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली. + +# Predefined zoom values +page_scale_width=पृष्ठाची रूंदी +page_scale_fit=पृष्ठ बसवा +page_scale_auto=स्वयं लाहन किंवा मोठे करणे +page_scale_actual=प्रत्यक्ष आकार +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF लोड करतेवेळी त्रुटी आढळली. +invalid_file_error=अवैध किंवा दोषीत PDF फाइल. +missing_file_error=न आढळणारी PDF फाइल. +unexpected_response_error=अनपेक्षित सर्व्हर प्रतिसाद. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} टिपण्णी] +password_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या. +password_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा. +password_ok=ठीक आहे +password_cancel=रद्द करा + +printing_not_supported=सावधानता: या ब्राउझरतर्फे छपाइ पूर्णपणे समर्थीत नाही. +printing_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही. +web_fonts_disabled=वेब टंक असमर्थीत आहेत: एम्बेडेड PDF टंक वापर अशक्य. + diff --git a/src/assets/pdf-annotation/web/locale/ms/viewer.properties b/src/assets/pdf-annotation/web/locale/ms/viewer.properties new file mode 100755 index 0000000..21542e2 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ms/viewer.properties @@ -0,0 +1,235 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Halaman Dahulu +previous_label=Dahulu +next.title=Halaman Berikut +next_label=Berikut + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Halaman +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=daripada {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} daripada {{pagesCount}}) + +zoom_out.title=Zum Keluar +zoom_out_label=Zum Keluar +zoom_in.title=Zum Masuk +zoom_in_label=Zum Masuk +zoom.title=Zum +presentation_mode.title=Tukar ke Mod Persembahan +presentation_mode_label=Mod Persembahan +open_file.title=Buka Fail +open_file_label=Buka +print.title=Cetak +print_label=Cetak +download.title=Muat turun +download_label=Muat turun +bookmark.title=Paparan semasa (salin atau buka dalam tetingkap baru) +bookmark_label=Paparan Semasa + +# Secondary toolbar and context menu +tools.title=Alatan +tools_label=Alatan +first_page.title=Pergi ke Halaman Pertama +first_page_label=Pergi ke Halaman Pertama +last_page.title=Pergi ke Halaman Terakhir +last_page_label=Pergi ke Halaman Terakhir +page_rotate_cw.title=Berputar ikut arah Jam +page_rotate_cw_label=Berputar ikut arah Jam +page_rotate_ccw.title=Pusing berlawan arah jam +page_rotate_ccw_label=Pusing berlawan arah jam + +cursor_text_select_tool.title=Dayakan Alatan Pilihan Teks +cursor_text_select_tool_label=Alatan Pilihan Teks +cursor_hand_tool.title=Dayakan Alatan Tangan +cursor_hand_tool_label=Alatan Tangan + +scroll_vertical.title=Guna Skrol Menegak +scroll_vertical_label=Skrol Menegak +scroll_horizontal.title=Guna Skrol Mengufuk +scroll_horizontal_label=Skrol Mengufuk +scroll_wrapped.title=Guna Skrol Berbalut +scroll_wrapped_label=Skrol Berbalut + +spread_none.title=Jangan hubungkan hamparan halaman +spread_none_label=Tanpa Hamparan +spread_odd.title=Hubungkan hamparan halaman dengan halaman nombor ganjil +spread_odd_label=Hamparan Ganjil +spread_even.title=Hubungkan hamparan halaman dengan halaman nombor genap +spread_even_label=Hamparan Seimbang + +# Document properties dialog box +document_properties.title=Sifat Dokumen… +document_properties_label=Sifat Dokumen… +document_properties_file_name=Nama fail: +document_properties_file_size=Saiz fail: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bait) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bait) +document_properties_title=Tajuk: +document_properties_author=Pengarang: +document_properties_subject=Subjek: +document_properties_keywords=Kata kunci: +document_properties_creation_date=Masa Dicipta: +document_properties_modification_date=Tarikh Ubahsuai: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Pencipta: +document_properties_producer=Pengeluar PDF: +document_properties_version=Versi PDF: +document_properties_page_count=Kiraan Laman: +document_properties_page_size=Saiz Halaman: +document_properties_page_size_unit_inches=dalam +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=potret +document_properties_page_size_orientation_landscape=landskap +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Paparan Web Pantas: +document_properties_linearized_yes=Ya +document_properties_linearized_no=Tidak +document_properties_close=Tutup + +print_progress_message=Menyediakan dokumen untuk dicetak… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Batal + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Togol Bar Sisi +toggle_sidebar_label=Togol Bar Sisi +document_outline.title=Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item) +document_outline_label=Rangka Dokumen +attachments.title=Papar Lampiran +attachments_label=Lampiran +thumbs.title=Papar Thumbnails +thumbs_label=Imej kecil +findbar.title=Cari didalam Dokumen +findbar_label=Cari + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Halaman {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Halaman Imej kecil {{page}} + +# Find panel button title and messages +find_input.title=Cari +find_input.placeholder=Cari dalam dokumen… +find_previous.title=Cari teks frasa berkenaan yang terdahulu +find_previous_label=Dahulu +find_next.title=Cari teks frasa berkenaan yang berikut +find_next_label=Berikut +find_highlight=Serlahkan semua +find_match_case_label=Huruf sepadan +find_entire_word_label=Seluruh perkataan +find_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah +find_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} daripada {{total}} padanan +find_match_count[two]={{current}} daripada {{total}} padanan +find_match_count[few]={{current}} daripada {{total}} padanan +find_match_count[many]={{current}} daripada {{total}} padanan +find_match_count[other]={{current}} daripada {{total}} padanan +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Lebih daripada {{limit}} padanan +find_match_count_limit[one]=Lebih daripada {{limit}} padanan +find_match_count_limit[two]=Lebih daripada {{limit}} padanan +find_match_count_limit[few]=Lebih daripada {{limit}} padanan +find_match_count_limit[many]=Lebih daripada {{limit}} padanan +find_match_count_limit[other]=Lebih daripada {{limit}} padanan +find_not_found=Frasa tidak ditemui + +# Error panel labels +error_more_info=Maklumat Lanjut +error_less_info=Kurang Informasi +error_close=Tutup +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesej: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Timbun: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fail: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Garis: {{line}} +rendering_error=Ralat berlaku ketika memberikan halaman. + +# Predefined zoom values +page_scale_width=Lebar Halaman +page_scale_fit=Muat Halaman +page_scale_auto=Zoom Automatik +page_scale_actual=Saiz Sebenar +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Masalah berlaku semasa menuatkan sebuah PDF. +invalid_file_error=Tidak sah atau fail PDF rosak. +missing_file_error=Fail PDF Hilang. +unexpected_response_error=Respon pelayan yang tidak dijangka. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Anotasi] +password_label=Masukan kata kunci untuk membuka fail PDF ini. +password_invalid=Kata laluan salah. Cuba lagi. +password_ok=OK +password_cancel=Batal + +printing_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini. +printing_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak. +web_fonts_disabled=Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF. + diff --git a/src/assets/pdf-annotation/web/locale/my/viewer.properties b/src/assets/pdf-annotation/web/locale/my/viewer.properties new file mode 100755 index 0000000..0c97432 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/my/viewer.properties @@ -0,0 +1,191 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=အရင် စာမျက်နှာ +previous_label=အရင်နေရာ +next.title=ရှေ့ စာမျက်နှာ +next_label=နောက်တခု + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=စာမျက်နှာ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ၏ +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} ၏ {{pageNumber}}) + +zoom_out.title=ချုံ့ပါ +zoom_out_label=ချုံ့ပါ +zoom_in.title=ချဲ့ပါ +zoom_in_label=ချဲ့ပါ +zoom.title=ချုံ့/ချဲ့ပါ +presentation_mode.title=ဆွေးနွေးတင်ပြစနစ်သို့ ကူးပြောင်းပါ +presentation_mode_label=ဆွေးနွေးတင်ပြစနစ် +open_file.title=ဖိုင်အားဖွင့်ပါ။ +open_file_label=ဖွင့်ပါ +print.title=ပုံနှိုပ်ပါ +print_label=ပုံနှိုပ်ပါ +download.title=ကူးဆွဲ +download_label=ကူးဆွဲ +bookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ) +bookmark_label=လက်ရှိ မြင်ကွင်း + +# Secondary toolbar and context menu +tools.title=ကိရိယာများ +tools_label=ကိရိယာများ +first_page.title=ပထမ စာမျက်နှာသို့ +first_page_label=ပထမ စာမျက်နှာသို့ +last_page.title=နောက်ဆုံး စာမျက်နှာသို့ +last_page_label=နောက်ဆုံး စာမျက်နှာသို့ +page_rotate_cw.title=နာရီလက်တံ အတိုင်း +page_rotate_cw_label=နာရီလက်တံ အတိုင်း +page_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန် +page_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန် + + + + +# Document properties dialog box +document_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ +document_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ +document_properties_file_name=ဖိုင် : +document_properties_file_size=ဖိုင်ဆိုဒ် : +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ကီလိုဘိုတ် ({{size_b}}ဘိုတ်) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=ခေါင်းစဉ်‌ - +document_properties_author=ရေးသားသူ: +document_properties_subject=အကြောင်းအရာ:\u0020 +document_properties_keywords=သော့ချက် စာလုံး: +document_properties_creation_date=ထုတ်လုပ်ရက်စွဲ: +document_properties_modification_date=ပြင်ဆင်ရက်စွဲ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ဖန်တီးသူ: +document_properties_producer=PDF ထုတ်လုပ်သူ: +document_properties_version=PDF ဗားရှင်း: +document_properties_page_count=စာမျက်နှာအရေအတွက်: +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_close=ပိတ် + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ပယ်​ဖျက်ပါ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ် +toggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ +document_outline.title=စာတမ်းအကျဉ်းချုပ်ကို ပြပါ (စာရင်းအားလုံးကို ချုံ့/ချဲ့ရန် ကလစ်နှစ်ချက်နှိပ်ပါ) +document_outline_label=စာတမ်းအကျဉ်းချုပ် +attachments.title=တွဲချက်များ ပြပါ +attachments_label=တွဲထားချက်များ +thumbs.title=ပုံရိပ်ငယ်များကို ပြပါ +thumbs_label=ပုံရိပ်ငယ်များ +findbar.title=Find in Document +findbar_label=ရှာဖွေပါ + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=စာမျက်နှာ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}} + +# Find panel button title and messages +find_input.title=ရှာဖွေပါ +find_input.placeholder=စာတမ်းထဲတွင် ရှာဖွေရန်… +find_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ +find_previous_label=နောက်သို့ +find_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ +find_next_label=ရှေ့သို့ +find_highlight=အားလုံးကို မျဉ်းသားပါ +find_match_case_label=စာလုံး တိုက်ဆိုင်ပါ +find_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ +find_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_not_found=စကားစု မတွေ့ရဘူး + +# Error panel labels +error_more_info=နောက်ထပ်အချက်အလက်များ +error_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက် +error_close=ပိတ် +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=မက်ဆေ့ - {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=အထပ် - {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ဖိုင် {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=လိုင်း - {{line}} +rendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ + +# Predefined zoom values +page_scale_width=စာမျက်နှာ အကျယ် +page_scale_fit=စာမျက်နှာ ကွက်တိ +page_scale_auto=အလိုအလျောက် ချုံ့ချဲ့ +page_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ် +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ +invalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင် +missing_file_error=PDF ပျောက်ဆုံး +unexpected_response_error=မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက် + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်] +password_label=ယခု PDF ကို ဖွင့်ရန် စကားဝှက်ကို ရိုက်ပါ။ +password_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။ +password_ok=OK +password_cancel=ပယ်​ဖျက်ပါ + +printing_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။ +printing_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. + diff --git a/src/assets/pdf-annotation/web/locale/nb-NO/viewer.properties b/src/assets/pdf-annotation/web/locale/nb-NO/viewer.properties new file mode 100755 index 0000000..fea167d --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/nb-NO/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Forrige side +previous_label=Forrige +next.title=Neste side +next_label=Neste + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=av {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} av {{pagesCount}}) + +zoom_out.title=Zoom ut +zoom_out_label=Zoom ut +zoom_in.title=Zoom inn +zoom_in_label=Zoom inn +zoom.title=Zoom +presentation_mode.title=Bytt til presentasjonsmodus +presentation_mode_label=Presentasjonsmodus +open_file.title=Åpne fil +open_file_label=Åpne +print.title=Skriv ut +print_label=Skriv ut +download.title=Last ned +download_label=Last ned +save.title=Lagre +save_label=Lagre +bookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu) +bookmark_label=Nåværende visning + +# Secondary toolbar and context menu +tools.title=Verktøy +tools_label=Verktøy +first_page.title=Gå til første side +first_page_label=Gå til første side +last_page.title=Gå til siste side +last_page_label=Gå til siste side +page_rotate_cw.title=Roter med klokken +page_rotate_cw_label=Roter med klokken +page_rotate_ccw.title=Roter mot klokken +page_rotate_ccw_label=Roter mot klokken + +cursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy +cursor_text_select_tool_label=Tekstmarkeringsverktøy +cursor_hand_tool.title=Aktiver handverktøy +cursor_hand_tool_label=Handverktøy + +scroll_page.title=Bruk siderulling +scroll_page_label=Siderulling +scroll_vertical.title=Bruk vertikal rulling +scroll_vertical_label=Vertikal rulling +scroll_horizontal.title=Bruk horisontal rulling +scroll_horizontal_label=Horisontal rulling +scroll_wrapped.title=Bruk flersiderulling +scroll_wrapped_label=Flersiderulling + +spread_none.title=Vis enkeltsider +spread_none_label=Enkeltsider +spread_odd.title=Vis oppslag med ulike sidenumre til venstre +spread_odd_label=Oppslag med forside +spread_even.title=Vis oppslag med like sidenumre til venstre +spread_even_label=Oppslag uten forside + +# Document properties dialog box +document_properties.title=Dokumentegenskaper … +document_properties_label=Dokumentegenskaper … +document_properties_file_name=Filnavn: +document_properties_file_size=Filstørrelse: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Dokumentegenskaper … +document_properties_author=Forfatter: +document_properties_subject=Emne: +document_properties_keywords=Nøkkelord: +document_properties_creation_date=Opprettet dato: +document_properties_modification_date=Endret dato: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Opprettet av: +document_properties_producer=PDF-verktøy: +document_properties_version=PDF-versjon: +document_properties_page_count=Sideantall: +document_properties_page_size=Sidestørrelse: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=stående +document_properties_page_size_orientation_landscape=liggende +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Hurtig nettvisning: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Nei +document_properties_close=Lukk + +print_progress_message=Forbereder dokument for utskrift … +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Avbryt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Slå av/på sidestolpe +toggle_sidebar_notification2.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg/lag) +toggle_sidebar_label=Slå av/på sidestolpe +document_outline.title=Vis dokumentdisposisjonen (dobbeltklikk for å utvide/skjule alle elementer) +document_outline_label=Dokumentdisposisjon +attachments.title=Vis vedlegg +attachments_label=Vedlegg +layers.title=Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand) +layers_label=Lag +thumbs.title=Vis miniatyrbilde +thumbs_label=Miniatyrbilde +current_outline_item.title=Finn gjeldende disposisjonselement +current_outline_item_label=Gjeldende disposisjonselement +findbar.title=Finn i dokumentet +findbar_label=Finn + +additional_layers=Ytterligere lag +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Side {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatyrbilde av side {{page}} + +# Find panel button title and messages +find_input.title=Søk +find_input.placeholder=Søk i dokument… +find_previous.title=Finn forrige forekomst av frasen +find_previous_label=Forrige +find_next.title=Finn neste forekomst av frasen +find_next_label=Neste +find_highlight=Uthev alle +find_match_case_label=Skill store/små bokstaver +find_match_diacritics_label=Samsvar diakritiske tegn +find_entire_word_label=Hele ord +find_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen +find_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} av {{total}} treff +find_match_count[two]={{current}} av {{total}} treff +find_match_count[few]={{current}} av {{total}} treff +find_match_count[many]={{current}} av {{total}} treff +find_match_count[other]={{current}} av {{total}} treff +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mer enn {{limit}} treff +find_match_count_limit[one]=Mer enn {{limit}} treff +find_match_count_limit[two]=Mer enn {{limit}} treff +find_match_count_limit[few]=Mer enn {{limit}} treff +find_match_count_limit[many]=Mer enn {{limit}} treff +find_match_count_limit[other]=Mer enn {{limit}} treff +find_not_found=Fant ikke teksten + +# Error panel labels +error_more_info=Mer info +error_less_info=Mindre info +error_close=Lukk +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (bygg: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Melding: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stakk: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linje: {{line}} + +# Predefined zoom values +page_scale_width=Sidebredde +page_scale_fit=Tilpass til siden +page_scale_auto=Automatisk zoom +page_scale_actual=Virkelig størrelse +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Laster… +loading_error=En feil oppstod ved lasting av PDF. +invalid_file_error=Ugyldig eller skadet PDF-fil. +missing_file_error=Manglende PDF-fil. +unexpected_response_error=Uventet serverrespons. + +rendering_error=En feil oppstod ved opptegning av siden. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} annotasjon] +password_label=Skriv inn passordet for å åpne denne PDF-filen. +password_invalid=Ugyldig passord. Prøv igjen. +password_ok=OK +password_cancel=Avbryt + +printing_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren. +printing_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift. +web_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Tegn +editor_ink2_label=Tegn + +free_text2_default_content=Begynn å skrive… + +# Editor Parameters +editor_free_text_color=Farge +editor_free_text_size=Størrelse +editor_ink_color=Farge +editor_ink_thickness=Tykkelse +editor_ink_opacity=Ugjennomsiktighet + +# Editor aria +editor_free_text2_aria_label=Tekstredigering +editor_ink2_aria_label=Tegneredigering +editor_ink_canvas_aria_label=Brukerskapt bilde diff --git a/src/assets/pdf-annotation/web/locale/ne-NP/viewer.properties b/src/assets/pdf-annotation/web/locale/ne-NP/viewer.properties new file mode 100755 index 0000000..cb7e424 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ne-NP/viewer.properties @@ -0,0 +1,218 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=अघिल्लो पृष्ठ +previous_label=अघिल्लो +next.title=पछिल्लो पृष्ठ +next_label=पछिल्लो + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=पृष्ठ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} मध्ये +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} को {{pageNumber}}) + +zoom_out.title=जुम घटाउनुहोस् +zoom_out_label=जुम घटाउनुहोस् +zoom_in.title=जुम बढाउनुहोस् +zoom_in_label=जुम बढाउनुहोस् +zoom.title=जुम गर्नुहोस् +presentation_mode.title=प्रस्तुति मोडमा जानुहोस् +presentation_mode_label=प्रस्तुति मोड +open_file.title=फाइल खोल्नुहोस् +open_file_label=खोल्नुहोस् +print.title=मुद्रण गर्नुहोस् +print_label=मुद्रण गर्नुहोस् +download.title=डाउनलोडहरू +download_label=डाउनलोडहरू +bookmark.title=वर्तमान दृश्य (प्रतिलिपि गर्नुहोस् वा नयाँ सञ्झ्यालमा खुल्नुहोस्) +bookmark_label=हालको दृश्य + +# Secondary toolbar and context menu +tools.title=औजारहरू +tools_label=औजारहरू +first_page.title=पहिलो पृष्ठमा जानुहोस् +first_page_label=पहिलो पृष्ठमा जानुहोस् +last_page.title=पछिल्लो पृष्ठमा जानुहोस् +last_page_label=पछिल्लो पृष्ठमा जानुहोस् +page_rotate_cw.title=घडीको दिशामा घुमाउनुहोस् +page_rotate_cw_label=घडीको दिशामा घुमाउनुहोस् +page_rotate_ccw.title=घडीको विपरित दिशामा घुमाउनुहोस् +page_rotate_ccw_label=घडीको विपरित दिशामा घुमाउनुहोस् + +cursor_text_select_tool.title=पाठ चयन उपकरण सक्षम गर्नुहोस् +cursor_text_select_tool_label=पाठ चयन उपकरण +cursor_hand_tool.title=हाते उपकरण सक्षम गर्नुहोस् +cursor_hand_tool_label=हाते उपकरण + +scroll_vertical.title=ठाडो स्क्रोलिङ्ग प्रयोग गर्नुहोस् +scroll_vertical_label=ठाडो स्क्र्रोलिङ्ग +scroll_horizontal.title=तेर्सो स्क्रोलिङ्ग प्रयोग गर्नुहोस् +scroll_horizontal_label=तेर्सो स्क्रोलिङ्ग +scroll_wrapped.title=लिपि स्क्रोलिङ्ग प्रयोग गर्नुहोस् +scroll_wrapped_label=लिपि स्क्रोलिङ्ग + +spread_none.title=पृष्ठ स्प्रेडमा सामेल हुनुहुन्न +spread_none_label=स्प्रेड छैन + +# Document properties dialog box +document_properties.title=कागजात विशेषताहरू... +document_properties_label=कागजात विशेषताहरू... +document_properties_file_name=फाइल नाम: +document_properties_file_size=फाइल आकार: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=शीर्षक: +document_properties_author=लेखक: +document_properties_subject=विषयः +document_properties_keywords=शब्दकुञ्जीः +document_properties_creation_date=सिर्जना गरिएको मिति: +document_properties_modification_date=परिमार्जित मिति: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=सर्जक: +document_properties_producer=PDF निर्माता: +document_properties_version=PDF संस्करण +document_properties_page_count=पृष्ठ गणना: +document_properties_page_size=पृष्ठ आकार: +document_properties_page_size_unit_inches=इन्च +document_properties_page_size_unit_millimeters=मि.मि. +document_properties_page_size_orientation_portrait=पोट्रेट +document_properties_page_size_orientation_landscape=परिदृश्य +document_properties_page_size_name_letter=अक्षर +document_properties_page_size_name_legal=कानूनी +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized_yes=हो +document_properties_linearized_no=होइन +document_properties_close=बन्द गर्नुहोस् + +print_progress_message=मुद्रणका लागि कागजात तयारी गरिदै… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=रद्द गर्नुहोस् + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=टगल साइडबार +toggle_sidebar_label=टगल साइडबार +document_outline.title=कागजातको रूपरेखा देखाउनुहोस् (सबै वस्तुहरू विस्तार/पतन गर्न डबल-क्लिक गर्नुहोस्) +document_outline_label=दस्तावेजको रूपरेखा +attachments.title=संलग्नहरू देखाउनुहोस् +attachments_label=संलग्नकहरू +thumbs.title=थम्बनेलहरू देखाउनुहोस् +thumbs_label=थम्बनेलहरू +findbar.title=कागजातमा फेला पार्नुहोस् +findbar_label=फेला पार्नुहोस् + +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=पृष्ठ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} पृष्ठको थम्बनेल + +# Find panel button title and messages +find_input.title=फेला पार्नुहोस् +find_input.placeholder=कागजातमा फेला पार्नुहोस्… +find_previous.title=यस वाक्यांशको अघिल्लो घटना फेला पार्नुहोस् +find_previous_label=अघिल्लो +find_next.title=यस वाक्यांशको पछिल्लो घटना फेला पार्नुहोस् +find_next_label=अर्को +find_highlight=सबै हाइलाइट गर्ने +find_match_case_label=केस जोडा मिलाउनुहोस् +find_entire_word_label=पुरा शब्दहरु +find_reached_top=पृष्ठको शिर्षमा पुगीयो, तलबाट जारी गरिएको थियो +find_reached_bottom=पृष्ठको अन्त्यमा पुगीयो, शिर्षबाट जारी गरिएको थियो +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_not_found=वाक्यांश फेला परेन + +# Error panel labels +error_more_info=थप जानकारी +error_less_info=कम जानकारी +error_close=बन्द गर्नुहोस् +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=सन्देश: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=स्ट्याक: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=फाइल: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=लाइन: {{line}} +rendering_error=पृष्ठ प्रतिपादन गर्दा एउटा त्रुटि देखापर्‍यो। + +# Predefined zoom values +page_scale_width=पृष्ठ चौडाइ +page_scale_fit=पृष्ठ ठिक्क मिल्ने +page_scale_auto=स्वचालित जुम +page_scale_actual=वास्तविक आकार +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error=यो PDF लोड गर्दा एउटा त्रुटि देखापर्‍यो। +invalid_file_error=अवैध वा दुषित PDF फाइल। +missing_file_error=हराईरहेको PDF फाइल। +unexpected_response_error=अप्रत्याशित सर्भर प्रतिक्रिया। + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=यस PDF फाइललाई खोल्न गोप्यशब्द प्रविष्ट गर्नुहोस्। +password_invalid=अवैध गोप्यशब्द। पुनः प्रयास गर्नुहोस्। +password_ok=ठिक छ +password_cancel=रद्द गर्नुहोस् + +printing_not_supported=चेतावनी: यो ब्राउजरमा मुद्रण पूर्णतया समर्थित छैन। +printing_not_ready=चेतावनी: PDF मुद्रणका लागि पूर्णतया लोड भएको छैन। +web_fonts_disabled=वेब फन्ट असक्षम छन्: एम्बेडेड PDF फन्ट प्रयोग गर्न असमर्थ। + diff --git a/src/assets/pdf-annotation/web/locale/nl/viewer.properties b/src/assets/pdf-annotation/web/locale/nl/viewer.properties new file mode 100755 index 0000000..e24994e --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/nl/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Vorige pagina +previous_label=Vorige +next.title=Volgende pagina +next_label=Volgende + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=van {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} van {{pagesCount}}) + +zoom_out.title=Uitzoomen +zoom_out_label=Uitzoomen +zoom_in.title=Inzoomen +zoom_in_label=Inzoomen +zoom.title=Zoomen +presentation_mode.title=Wisselen naar presentatiemodus +presentation_mode_label=Presentatiemodus +open_file.title=Bestand openen +open_file_label=Openen +print.title=Afdrukken +print_label=Afdrukken +download.title=Downloaden +download_label=Downloaden +save.title=Opslaan +save_label=Opslaan +bookmark.title=Huidige weergave (kopiëren of openen in nieuw venster) +bookmark_label=Huidige weergave + +# Secondary toolbar and context menu +tools.title=Hulpmiddelen +tools_label=Hulpmiddelen +first_page.title=Naar eerste pagina gaan +first_page_label=Naar eerste pagina gaan +last_page.title=Naar laatste pagina gaan +last_page_label=Naar laatste pagina gaan +page_rotate_cw.title=Rechtsom draaien +page_rotate_cw_label=Rechtsom draaien +page_rotate_ccw.title=Linksom draaien +page_rotate_ccw_label=Linksom draaien + +cursor_text_select_tool.title=Tekstselectiehulpmiddel inschakelen +cursor_text_select_tool_label=Tekstselectiehulpmiddel +cursor_hand_tool.title=Handhulpmiddel inschakelen +cursor_hand_tool_label=Handhulpmiddel + +scroll_page.title=Paginascrollen gebruiken +scroll_page_label=Paginascrollen +scroll_vertical.title=Verticaal scrollen gebruiken +scroll_vertical_label=Verticaal scrollen +scroll_horizontal.title=Horizontaal scrollen gebruiken +scroll_horizontal_label=Horizontaal scrollen +scroll_wrapped.title=Scrollen met terugloop gebruiken +scroll_wrapped_label=Scrollen met terugloop + +spread_none.title=Dubbele pagina’s niet samenvoegen +spread_none_label=Geen dubbele pagina’s +spread_odd.title=Dubbele pagina’s samenvoegen vanaf oneven pagina’s +spread_odd_label=Oneven dubbele pagina’s +spread_even.title=Dubbele pagina’s samenvoegen vanaf even pagina’s +spread_even_label=Even dubbele pagina’s + +# Document properties dialog box +document_properties.title=Documenteigenschappen… +document_properties_label=Documenteigenschappen… +document_properties_file_name=Bestandsnaam: +document_properties_file_size=Bestandsgrootte: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Auteur: +document_properties_subject=Onderwerp: +document_properties_keywords=Sleutelwoorden: +document_properties_creation_date=Aanmaakdatum: +document_properties_modification_date=Wijzigingsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Maker: +document_properties_producer=PDF-producent: +document_properties_version=PDF-versie: +document_properties_page_count=Aantal pagina’s: +document_properties_page_size=Paginagrootte: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=staand +document_properties_page_size_orientation_landscape=liggend +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Snelle webweergave: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Nee +document_properties_close=Sluiten + +print_progress_message=Document voorbereiden voor afdrukken… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Annuleren + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Zijbalk in-/uitschakelen +toggle_sidebar_notification2.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen/lagen) +toggle_sidebar_label=Zijbalk in-/uitschakelen +document_outline.title=Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen) +document_outline_label=Documentoverzicht +attachments.title=Bijlagen tonen +attachments_label=Bijlagen +layers.title=Lagen tonen (dubbelklik om alle lagen naar de standaardstatus terug te zetten) +layers_label=Lagen +thumbs.title=Miniaturen tonen +thumbs_label=Miniaturen +current_outline_item.title=Huidig item in inhoudsopgave zoeken +current_outline_item_label=Huidig item in inhoudsopgave +findbar.title=Zoeken in document +findbar_label=Zoeken + +additional_layers=Aanvullende lagen +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pagina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatuur van pagina {{page}} + +# Find panel button title and messages +find_input.title=Zoeken +find_input.placeholder=Zoeken in document… +find_previous.title=De vorige overeenkomst van de tekst zoeken +find_previous_label=Vorige +find_next.title=De volgende overeenkomst van de tekst zoeken +find_next_label=Volgende +find_highlight=Alles markeren +find_match_case_label=Hoofdlettergevoelig +find_match_diacritics_label=Diakritische tekens gebruiken +find_entire_word_label=Hele woorden +find_reached_top=Bovenkant van document bereikt, doorgegaan vanaf onderkant +find_reached_bottom=Onderkant van document bereikt, doorgegaan vanaf bovenkant +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} van {{total}} overeenkomst +find_match_count[two]={{current}} van {{total}} overeenkomsten +find_match_count[few]={{current}} van {{total}} overeenkomsten +find_match_count[many]={{current}} van {{total}} overeenkomsten +find_match_count[other]={{current}} van {{total}} overeenkomsten +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Meer dan {{limit}} overeenkomsten +find_match_count_limit[one]=Meer dan {{limit}} overeenkomst +find_match_count_limit[two]=Meer dan {{limit}} overeenkomsten +find_match_count_limit[few]=Meer dan {{limit}} overeenkomsten +find_match_count_limit[many]=Meer dan {{limit}} overeenkomsten +find_match_count_limit[other]=Meer dan {{limit}} overeenkomsten +find_not_found=Tekst niet gevonden + +# Error panel labels +error_more_info=Meer informatie +error_less_info=Minder informatie +error_close=Sluiten +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Bericht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Bestand: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Regel: {{line}} + +# Predefined zoom values +page_scale_width=Paginabreedte +page_scale_fit=Hele pagina +page_scale_auto=Automatisch zoomen +page_scale_actual=Werkelijke grootte +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Laden… +loading_error=Er is een fout opgetreden bij het laden van de PDF. +invalid_file_error=Ongeldig of beschadigd PDF-bestand. +missing_file_error=PDF-bestand ontbreekt. +unexpected_response_error=Onverwacht serverantwoord. + +rendering_error=Er is een fout opgetreden bij het weergeven van de pagina. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-aantekening] +password_label=Voer het wachtwoord in om dit PDF-bestand te openen. +password_invalid=Ongeldig wachtwoord. Probeer het opnieuw. +password_ok=OK +password_cancel=Annuleren + +printing_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser. +printing_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken. +web_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Tekenen +editor_ink2_label=Tekenen + +free_text2_default_content=Begin met typen… + +# Editor Parameters +editor_free_text_color=Kleur +editor_free_text_size=Grootte +editor_ink_color=Kleur +editor_ink_thickness=Dikte +editor_ink_opacity=Opaciteit + +# Editor aria +editor_free_text2_aria_label=Tekstbewerker +editor_ink2_aria_label=Tekeningbewerker +editor_ink_canvas_aria_label=Door gebruiker gemaakte afbeelding diff --git a/src/assets/pdf-annotation/web/locale/nn-NO/viewer.properties b/src/assets/pdf-annotation/web/locale/nn-NO/viewer.properties new file mode 100755 index 0000000..200f78a --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/nn-NO/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Føregåande side +previous_label=Føregåande +next.title=Neste side +next_label=Neste + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=av {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} av {{pagesCount}}) + +zoom_out.title=Zoom ut +zoom_out_label=Zoom ut +zoom_in.title=Zoom inn +zoom_in_label=Zoom inn +zoom.title=Zoom +presentation_mode.title=Byt til presentasjonsmodus +presentation_mode_label=Presentasjonsmodus +open_file.title=Opne fil +open_file_label=Opne +print.title=Skriv ut +print_label=Skriv ut +download.title=Last ned +download_label=Last ned +save.title=Lagre +save_label=Lagre +bookmark.title=Gjeldande vising (kopier eller opne i nytt vindauge) +bookmark_label=Gjeldande vising + +# Secondary toolbar and context menu +tools.title=Verktøy +tools_label=Verktøy +first_page.title=Gå til første side +first_page_label=Gå til første side +last_page.title=Gå til siste side +last_page_label=Gå til siste side +page_rotate_cw.title=Roter med klokka +page_rotate_cw_label=Roter med klokka +page_rotate_ccw.title=Roter mot klokka +page_rotate_ccw_label=Roter mot klokka + +cursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy +cursor_text_select_tool_label=Tekstmarkeringsverktøy +cursor_hand_tool.title=Aktiver handverktøy +cursor_hand_tool_label=Handverktøy + +scroll_page.title=Bruk siderulling +scroll_page_label=Siderulling +scroll_vertical.title=Bruk vertikal rulling +scroll_vertical_label=Vertikal rulling +scroll_horizontal.title=Bruk horisontal rulling +scroll_horizontal_label=Horisontal rulling +scroll_wrapped.title=Bruk fleirsiderulling +scroll_wrapped_label=Fleirsiderulling + +spread_none.title=Vis enkeltsider +spread_none_label=Enkeltside +spread_odd.title=Vis oppslag med ulike sidenummer til venstre +spread_odd_label=Oppslag med framside +spread_even.title=Vis oppslag med like sidenummmer til venstre +spread_even_label=Oppslag utan framside + +# Document properties dialog box +document_properties.title=Dokumenteigenskapar… +document_properties_label=Dokumenteigenskapar… +document_properties_file_name=Filnamn: +document_properties_file_size=Filstorleik: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Tittel: +document_properties_author=Forfattar: +document_properties_subject=Emne: +document_properties_keywords=Stikkord: +document_properties_creation_date=Dato oppretta: +document_properties_modification_date=Dato endra: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Oppretta av: +document_properties_producer=PDF-verktøy: +document_properties_version=PDF-versjon: +document_properties_page_count=Sidetal: +document_properties_page_size=Sidestørrelse: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=ståande +document_properties_page_size_orientation_landscape=liggande +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Brev +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Rask nettvising: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Nei +document_properties_close=Lat att + +print_progress_message=Førebur dokumentet for utskrift… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Avbryt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Slå av/på sidestolpe +toggle_sidebar_notification2.title=Vis/gøym sidestolpe (dokumentet inneheld oversikt/vedlegg/lag) +toggle_sidebar_label=Slå av/på sidestolpe +document_outline.title=Vis dokumentdisposisjonen (dobbelklikk for å utvide/gøyme alle elementa) +document_outline_label=Dokumentdisposisjon +attachments.title=Vis vedlegg +attachments_label=Vedlegg +layers.title=Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand) +layers_label=Lag +thumbs.title=Vis miniatyrbilde +thumbs_label=Miniatyrbilde +current_outline_item.title=Finn gjeldande disposisjonselement +current_outline_item_label=Gjeldande disposisjonselement +findbar.title=Finn i dokumentet +findbar_label=Finn + +additional_layers=Ytterlegare lag +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Side {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatyrbilde av side {{page}} + +# Find panel button title and messages +find_input.title=Søk +find_input.placeholder=Søk i dokument… +find_previous.title=Finn førre førekomst av frasen +find_previous_label=Førre +find_next.title=Finn neste førekomst av frasen +find_next_label=Neste +find_highlight=Uthev alle +find_match_case_label=Skil store/små bokstavar +find_match_diacritics_label=Samsvar diakritiske teikn +find_entire_word_label=Heile ord +find_reached_top=Nådde toppen av dokumentet, fortset frå botnen +find_reached_bottom=Nådde botnen av dokumentet, fortset frå toppen +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} av {{total}} treff +find_match_count[two]={{current}} av {{total}} treff +find_match_count[few]={{current}} av {{total}} treff +find_match_count[many]={{current}} av {{total}} treff +find_match_count[other]={{current}} av {{total}} treff +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Meir enn {{limit}} treff +find_match_count_limit[one]=Meir enn {{limit}} treff +find_match_count_limit[two]=Meir enn {{limit}} treff +find_match_count_limit[few]=Meir enn {{limit}} treff +find_match_count_limit[many]=Meir enn {{limit}} treff +find_match_count_limit[other]=Meir enn {{limit}} treff +find_not_found=Fann ikkje teksten + +# Error panel labels +error_more_info=Meir info +error_less_info=Mindre info +error_close=Lat att +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (bygg: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Melding: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stakk: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linje: {{line}} + +# Predefined zoom values +page_scale_width=Sidebreidde +page_scale_fit=Tilpass til sida +page_scale_auto=Automatisk skalering +page_scale_actual=Verkeleg storleik +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Lastar… +loading_error=Ein feil oppstod ved lasting av PDF. +invalid_file_error=Ugyldig eller korrupt PDF-fil. +missing_file_error=Manglande PDF-fil. +unexpected_response_error=Uventa tenarrespons. + +rendering_error=Ein feil oppstod under vising av sida. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} annotasjon] +password_label=Skriv inn passordet for å opne denne PDF-fila. +password_invalid=Ugyldig passord. Prøv igjen. +password_ok=OK +password_cancel=Avbryt + +printing_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren. +printing_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift. +web_fonts_disabled=Web-skrifter er slått av: Kan ikkje bruke innbundne PDF-skrifter. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Teikne +editor_ink2_label=Teikne + +free_text2_default_content=Byrje å skrive… + +# Editor Parameters +editor_free_text_color=Farge +editor_free_text_size=Storleik +editor_ink_color=Farge +editor_ink_thickness=Tjukkleik +editor_ink_opacity=Ugjennomskinleg + +# Editor aria +editor_free_text2_aria_label=Tekstredigering +editor_ink2_aria_label=Teikneredigering +editor_ink_canvas_aria_label=Brukarskapt bilde diff --git a/src/assets/pdf-annotation/web/locale/oc/viewer.properties b/src/assets/pdf-annotation/web/locale/oc/viewer.properties new file mode 100755 index 0000000..cba952f --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/oc/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina precedenta +previous_label=Precedent +next.title=Pagina seguenta +next_label=Seguent + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=sus {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Zoom arrièr +zoom_out_label=Zoom arrièr +zoom_in.title=Zoom avant +zoom_in_label=Zoom avant +zoom.title=Zoom +presentation_mode.title=Bascular en mòde presentacion +presentation_mode_label=Mòde Presentacion +open_file.title=Dobrir lo fichièr +open_file_label=Dobrir +print.title=Imprimir +print_label=Imprimir +download.title=Telecargar +download_label=Telecargar +save.title=Enregistrar +save_label=Enregistrar +bookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla) +bookmark_label=Afichatge actual + +# Secondary toolbar and context menu +tools.title=Aisinas +tools_label=Aisinas +first_page.title=Anar a la primièra pagina +first_page_label=Anar a la primièra pagina +last_page.title=Anar a la darrièra pagina +last_page_label=Anar a la darrièra pagina +page_rotate_cw.title=Rotacion orària +page_rotate_cw_label=Rotacion orària +page_rotate_ccw.title=Rotacion antiorària +page_rotate_ccw_label=Rotacion antiorària + +cursor_text_select_tool.title=Activar l'aisina de seleccion de tèxte +cursor_text_select_tool_label=Aisina de seleccion de tèxte +cursor_hand_tool.title=Activar l’aisina man +cursor_hand_tool_label=Aisina man + +scroll_page.title=Activar lo desfilament per pagina +scroll_page_label=Desfilament per pagina +scroll_vertical.title=Utilizar lo desfilament vertical +scroll_vertical_label=Desfilament vertical +scroll_horizontal.title=Utilizar lo desfilament orizontal +scroll_horizontal_label=Desfilament orizontal +scroll_wrapped.title=Activar lo desfilament continú +scroll_wrapped_label=Desfilament continú + +spread_none.title=Agropar pas las paginas doas a doas +spread_none_label=Una sola pagina +spread_odd.title=Mostrar doas paginas en començant per las paginas imparas a esquèrra +spread_odd_label=Dobla pagina, impara a drecha +spread_even.title=Mostrar doas paginas en començant per las paginas paras a esquèrra +spread_even_label=Dobla pagina, para a drecha + +# Document properties dialog box +document_properties.title=Proprietats del document… +document_properties_label=Proprietats del document… +document_properties_file_name=Nom del fichièr : +document_properties_file_size=Talha del fichièr : +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} Ko ({{size_b}} octets) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} Mo ({{size_b}} octets) +document_properties_title=Títol : +document_properties_author=Autor : +document_properties_subject=Subjècte : +document_properties_keywords=Mots claus : +document_properties_creation_date=Data de creacion : +document_properties_modification_date=Data de modificacion : +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, a {{time}} +document_properties_creator=Creator : +document_properties_producer=Aisina de conversion PDF : +document_properties_version=Version PDF : +document_properties_page_count=Nombre de paginas : +document_properties_page_size=Talha de la pagina : +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=retrach +document_properties_page_size_orientation_landscape=païsatge +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letra +document_properties_page_size_name_legal=Document juridic +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista web rapida : +document_properties_linearized_yes=Òc +document_properties_linearized_no=Non +document_properties_close=Tampar + +print_progress_message=Preparacion del document per l’impression… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Anullar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Afichar/amagar lo panèl lateral +toggle_sidebar_notification2.title=Afichar/amagar lo panèl lateral (lo document conten esquèmas/pèças juntas/calques) +toggle_sidebar_label=Afichar/amagar lo panèl lateral +document_outline.title=Mostrar los esquèmas del document (dobleclicar per espandre/reduire totes los elements) +document_outline_label=Marcapaginas del document +attachments.title=Visualizar las pèças juntas +attachments_label=Pèças juntas +layers.title=Afichar los calques (doble-clicar per reïnicializar totes los calques a l’estat per defaut) +layers_label=Calques +thumbs.title=Afichar las vinhetas +thumbs_label=Vinhetas +current_outline_item.title=Trobar l’element de plan actual +current_outline_item_label=Element de plan actual +findbar.title=Cercar dins lo document +findbar_label=Recercar + +additional_layers=Calques suplementaris +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pagina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Vinheta de la pagina {{page}} + +# Find panel button title and messages +find_input.title=Recercar +find_input.placeholder=Cercar dins lo document… +find_previous.title=Tròba l'ocurréncia precedenta de la frasa +find_previous_label=Precedent +find_next.title=Tròba l'ocurréncia venenta de la frasa +find_next_label=Seguent +find_highlight=Suslinhar tot +find_match_case_label=Respectar la cassa +find_match_diacritics_label=Respectar los diacritics +find_entire_word_label=Mots entièrs +find_reached_top=Naut de la pagina atenh, perseguida del bas +find_reached_bottom=Bas de la pagina atench, perseguida al començament +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=Ocuréncia {{current}} sus {{total}} +find_match_count[two]=Ocuréncia {{current}} sus {{total}} +find_match_count[few]=Ocuréncia {{current}} sus {{total}} +find_match_count[many]=Ocuréncia {{current}} sus {{total}} +find_match_count[other]=Ocuréncia {{current}} sus {{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mai de {{limit}} ocuréncias +find_match_count_limit[one]=Mai de {{limit}} ocuréncia +find_match_count_limit[two]=Mai de {{limit}} ocuréncias +find_match_count_limit[few]=Mai de {{limit}} ocuréncias +find_match_count_limit[many]=Mai de {{limit}} ocuréncias +find_match_count_limit[other]=Mai de {{limit}} ocuréncias +find_not_found=Frasa pas trobada + +# Error panel labels +error_more_info=Mai de detalhs +error_less_info=Mens d'informacions +error_close=Tampar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Messatge : {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila : {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fichièr : {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linha : {{line}} + +# Predefined zoom values +page_scale_width=Largor plena +page_scale_fit=Pagina entièra +page_scale_auto=Zoom automatic +page_scale_actual=Talha vertadièra +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Cargament… +loading_error=Una error s'es producha pendent lo cargament del fichièr PDF. +invalid_file_error=Fichièr PDF invalid o corromput. +missing_file_error=Fichièr PDF mancant. +unexpected_response_error=Responsa de servidor imprevista. + +rendering_error=Una error s'es producha pendent l'afichatge de la pagina. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} a {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotacion {{type}}] +password_label=Picatz lo senhal per dobrir aqueste fichièr PDF. +password_invalid=Senhal incorrècte. Tornatz ensajar. +password_ok=D'acòrdi +password_cancel=Anullar + +printing_not_supported=Atencion : l'impression es pas completament gerida per aqueste navegador. +printing_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir. +web_fonts_disabled=Las polissas web son desactivadas : impossible d'utilizar las polissas integradas al PDF. + +# Editor +editor_free_text2.title=Tèxte +editor_free_text2_label=Tèxte +editor_ink2.title=Dessenhar +editor_ink2_label=Dessenhar + +free_text2_default_content=Començatz d’escriure… + +# Editor Parameters +editor_free_text_color=Color +editor_free_text_size=Talha +editor_ink_color=Color +editor_ink_thickness=Espessor +editor_ink_opacity=Opacitat + +# Editor aria +editor_free_text2_aria_label=Editor de tèxte +editor_ink2_aria_label=Editor de dessenh +editor_ink_canvas_aria_label=Imatge creat per l’utilizaire diff --git a/src/assets/pdf-annotation/web/locale/pa-IN/viewer.properties b/src/assets/pdf-annotation/web/locale/pa-IN/viewer.properties new file mode 100755 index 0000000..d6ea2bb --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/pa-IN/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ਪਿਛਲਾ ਸਫ਼ਾ +previous_label=ਪਿੱਛੇ +next.title=ਅਗਲਾ ਸਫ਼ਾ +next_label=ਅੱਗੇ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ਸਫ਼ਾ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ਵਿੱਚੋਂ +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages={{pagesCount}}) ਵਿੱਚੋਂ ({{pageNumber}} + +zoom_out.title=ਜ਼ੂਮ ਆਉਟ +zoom_out_label=ਜ਼ੂਮ ਆਉਟ +zoom_in.title=ਜ਼ੂਮ ਇਨ +zoom_in_label=ਜ਼ੂਮ ਇਨ +zoom.title=ਜ਼ੂਨ +presentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ +presentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ +open_file.title=ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹੋ +open_file_label=ਖੋਲ੍ਹੋ +print.title=ਪਰਿੰਟ +print_label=ਪਰਿੰਟ +download.title=ਡਾਊਨਲੋਡ +download_label=ਡਾਊਨਲੋਡ +save.title=ਸੰਭਾਲੋ +save_label=ਸੰਭਾਲੋ +bookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ) +bookmark_label=ਮੌਜੂਦਾ ਝਲਕ + +# Secondary toolbar and context menu +tools.title=ਟੂਲ +tools_label=ਟੂਲ +first_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +first_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +last_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +last_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +page_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ +page_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ +page_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ +page_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ + +cursor_text_select_tool.title=ਲਿਖਤ ਚੋਣ ਟੂਲ ਸਮਰੱਥ ਕਰੋ +cursor_text_select_tool_label=ਲਿਖਤ ਚੋਣ ਟੂਲ +cursor_hand_tool.title=ਹੱਥ ਟੂਲ ਸਮਰੱਥ ਕਰੋ +cursor_hand_tool_label=ਹੱਥ ਟੂਲ + +scroll_page.title=ਸਫ਼ਾ ਖਿਸਕਾਉਣ ਨੂੰ ਵਰਤੋਂ +scroll_page_label=ਸਫ਼ਾ ਖਿਸਕਾਉਣਾ +scroll_vertical.title=ਖੜ੍ਹਵੇਂ ਸਕਰਾਉਣ ਨੂੰ ਵਰਤੋਂ +scroll_vertical_label=ਖੜ੍ਹਵਾਂ ਸਰਕਾਉਣਾ +scroll_horizontal.title=ਲੇਟਵੇਂ ਸਰਕਾਉਣ ਨੂੰ ਵਰਤੋਂ +scroll_horizontal_label=ਲੇਟਵਾਂ ਸਰਕਾਉਣਾ +scroll_wrapped.title=ਸਮੇਟੇ ਸਰਕਾਉਣ ਨੂੰ ਵਰਤੋਂ +scroll_wrapped_label=ਸਮੇਟਿਆ ਸਰਕਾਉਣਾ + +spread_none.title=ਸਫ਼ਾ ਫੈਲਾਅ ਵਿੱਚ ਸ਼ਾਮਲ ਨਾ ਹੋਵੋ +spread_none_label=ਕੋਈ ਫੈਲਾਅ ਨਹੀਂ +spread_odd.title=ਟਾਂਕ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ +spread_odd_label=ਟਾਂਕ ਫੈਲਾਅ +spread_even.title=ਜਿਸਤ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ +spread_even_label=ਜਿਸਤ ਫੈਲਾਅ + +# Document properties dialog box +document_properties.title=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ +document_properties_label=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ +document_properties_file_name=ਫਾਈਲ ਦਾ ਨਾਂ: +document_properties_file_size=ਫਾਈਲ ਦਾ ਆਕਾਰ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} ਬਾਈਟ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} ਬਾਈਟ) +document_properties_title=ਟਾਈਟਲ: +document_properties_author=ਲੇਖਕ: +document_properties_subject=ਵਿਸ਼ਾ: +document_properties_keywords=ਸ਼ਬਦ: +document_properties_creation_date=ਬਣਾਉਣ ਦੀ ਮਿਤੀ: +document_properties_modification_date=ਸੋਧ ਦੀ ਮਿਤੀ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ਨਿਰਮਾਤਾ: +document_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ: +document_properties_version=PDF ਵਰਜਨ: +document_properties_page_count=ਸਫ਼ੇ ਦੀ ਗਿਣਤੀ: +document_properties_page_size=ਸਫ਼ਾ ਆਕਾਰ: +document_properties_page_size_unit_inches=ਇੰਚ +document_properties_page_size_unit_millimeters=ਮਿਮੀ +document_properties_page_size_orientation_portrait=ਪੋਰਟਰੇਟ +document_properties_page_size_orientation_landscape=ਲੈਂਡਸਕੇਪ +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=ਲੈਟਰ +document_properties_page_size_name_legal=ਕਨੂੰਨੀ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=ਤੇਜ਼ ਵੈੱਬ ਝਲਕ: +document_properties_linearized_yes=ਹਾਂ +document_properties_linearized_no=ਨਹੀਂ +document_properties_close=ਬੰਦ ਕਰੋ + +print_progress_message=…ਪਰਿੰਟ ਕਰਨ ਲਈ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ਰੱਦ ਕਰੋ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ +toggle_sidebar_notification2.title=ਬਾਹੀ ਨੂੰ ਬਦਲੋ (ਦਸਤਾਵੇਜ਼ ਖਾਕਾ/ਅਟੈਚਮੈਂਟ/ਪਰਤਾਂ ਰੱਖਦਾ ਹੈ) +toggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ +document_outline.title=ਦਸਤਾਵੇਜ਼ ਖਾਕਾ ਦਿਖਾਓ (ਸਾਰੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਫੈਲਾਉਣ/ਸਮੇਟਣ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ) +document_outline_label=ਦਸਤਾਵੇਜ਼ ਖਾਕਾ +attachments.title=ਅਟੈਚਮੈਂਟ ਵੇਖਾਓ +attachments_label=ਅਟੈਚਮੈਂਟਾਂ +layers.title=ਪਰਤਾਂ ਵੇਖਾਓ (ਸਾਰੀਆਂ ਪਰਤਾਂ ਨੂੰ ਮੂਲ ਹਾਲਤ ਉੱਤੇ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ) +layers_label=ਪਰਤਾਂ +thumbs.title=ਥੰਮਨੇਲ ਨੂੰ ਵੇਖਾਓ +thumbs_label=ਥੰਮਨੇਲ +current_outline_item.title=ਮੌੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼ ਲੱਭੋ +current_outline_item_label=ਮੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼ +findbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ +findbar_label=ਲੱਭੋ + +additional_layers=ਵਾਧੂ ਪਰਤਾਂ +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=ਸਫ਼ਾ {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=ਸਫ਼ਾ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ + +# Find panel button title and messages +find_input.title=ਲੱਭੋ +find_input.placeholder=…ਦਸਤਾਵੇਜ਼ 'ਚ ਲੱਭੋ +find_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ +find_previous_label=ਪਿੱਛੇ +find_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ +find_next_label=ਅੱਗੇ +find_highlight=ਸਭ ਉਭਾਰੋ +find_match_case_label=ਅੱਖਰ ਆਕਾਰ ਨੂੰ ਮਿਲਾਉ +find_match_diacritics_label=ਭੇਦਸੂਚਕ ਮੇਲ +find_entire_word_label=ਪੂਰੇ ਸ਼ਬਦ +find_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ +find_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[two]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[few]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[many]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +find_match_count[other]={{total}} ਵਿੱਚੋਂ {{current}} ਮੇਲ +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[one]={{limit}} ਮੇਲ ਤੋਂ ਵੱਧ +find_match_count_limit[two]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[few]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[many]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_match_count_limit[other]={{limit}} ਮੇਲਾਂ ਤੋਂ ਵੱਧ +find_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ + +# Error panel labels +error_more_info=ਹੋਰ ਜਾਣਕਾਰੀ +error_less_info=ਘੱਟ ਜਾਣਕਾਰੀ +error_close=ਬੰਦ ਕਰੋ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}} +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ਸੁਨੇਹਾ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ਸਟੈਕ: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ਫਾਈਲ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ਲਾਈਨ: {{line}} + +# Predefined zoom values +page_scale_width=ਸਫ਼ੇ ਦੀ ਚੌੜਾਈ +page_scale_fit=ਸਫ਼ਾ ਫਿੱਟ +page_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ ਕਰੋ +page_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=…ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ +loading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। +invalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ। +missing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ। +unexpected_response_error=ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ। + +rendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ਵਿਆਖਿਆ] +password_label=ਇਹ PDF ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ। +password_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ। +password_ok=ਠੀਕ ਹੈ +password_cancel=ਰੱਦ ਕਰੋ + +printing_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। +printing_not_ready=ਸਾਵਧਾਨ: PDF ਨੂੰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ। +web_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਨੂੰ ਵਰਤਣ ਲਈ ਅਸਮਰੱਥ ਹੈ। + +# Editor +editor_free_text2.title=ਲਿਖਤ +editor_free_text2_label=ਲਿਖਤ +editor_ink2.title=ਵਾਹੋ +editor_ink2_label=ਵਾਹੋ + +free_text2_default_content=…ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ + +# Editor Parameters +editor_free_text_color=ਰੰਗ +editor_free_text_size=ਆਕਾਰ +editor_ink_color=ਰੰਗ +editor_ink_thickness=ਮੋਟਾਈ +editor_ink_opacity=ਧੁੰਦਲਾਪਨ + +# Editor aria +editor_free_text2_aria_label=ਲਿਖਤ ਐਡੀਟਰ +editor_ink2_aria_label=ਵਹਾਉਣ ਐਡੀਟਰ +editor_ink_canvas_aria_label=ਵਰਤੋਂਕਾਰ ਵਲੋਂ ਬਣਾਇਆ ਚਿੱਤਰ diff --git a/src/assets/pdf-annotation/web/locale/pl/viewer.properties b/src/assets/pdf-annotation/web/locale/pl/viewer.properties new file mode 100755 index 0000000..956a7da --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/pl/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Poprzednia strona +previous_label=Poprzednia +next.title=Następna strona +next_label=Następna + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strona +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Pomniejsz +zoom_out_label=Pomniejsz +zoom_in.title=Powiększ +zoom_in_label=Powiększ +zoom.title=Skala +presentation_mode.title=Przełącz na tryb prezentacji +presentation_mode_label=Tryb prezentacji +open_file.title=Otwórz plik +open_file_label=Otwórz +print.title=Drukuj +print_label=Drukuj +download.title=Pobierz +download_label=Pobierz +save.title=Zapisz +save_label=Zapisz +bookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie) +bookmark_label=Bieżąca pozycja + +# Secondary toolbar and context menu +tools.title=Narzędzia +tools_label=Narzędzia +first_page.title=Przejdź do pierwszej strony +first_page_label=Przejdź do pierwszej strony +last_page.title=Przejdź do ostatniej strony +last_page_label=Przejdź do ostatniej strony +page_rotate_cw.title=Obróć zgodnie z ruchem wskazówek zegara +page_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara +page_rotate_ccw.title=Obróć przeciwnie do ruchu wskazówek zegara +page_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara + +cursor_text_select_tool.title=Włącz narzędzie zaznaczania tekstu +cursor_text_select_tool_label=Narzędzie zaznaczania tekstu +cursor_hand_tool.title=Włącz narzędzie rączka +cursor_hand_tool_label=Narzędzie rączka + +scroll_page.title=Przewijaj strony +scroll_page_label=Przewijanie stron +scroll_vertical.title=Przewijaj dokument w pionie +scroll_vertical_label=Przewijanie pionowe +scroll_horizontal.title=Przewijaj dokument w poziomie +scroll_horizontal_label=Przewijanie poziome +scroll_wrapped.title=Strony dokumentu wyświetlaj i przewijaj w kolumnach +scroll_wrapped_label=Widok dwóch stron + +spread_none.title=Nie ustawiaj stron obok siebie +spread_none_label=Brak kolumn +spread_odd.title=Strony nieparzyste ustawiaj na lewo od parzystych +spread_odd_label=Nieparzyste po lewej +spread_even.title=Strony parzyste ustawiaj na lewo od nieparzystych +spread_even_label=Parzyste po lewej + +# Document properties dialog box +document_properties.title=Właściwości dokumentu… +document_properties_label=Właściwości dokumentu… +document_properties_file_name=Nazwa pliku: +document_properties_file_size=Rozmiar pliku: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} B) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} B) +document_properties_title=Tytuł: +document_properties_author=Autor: +document_properties_subject=Temat: +document_properties_keywords=Słowa kluczowe: +document_properties_creation_date=Data utworzenia: +document_properties_modification_date=Data modyfikacji: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Utworzony przez: +document_properties_producer=PDF wyprodukowany przez: +document_properties_version=Wersja PDF: +document_properties_page_count=Liczba stron: +document_properties_page_size=Wymiary strony: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=pionowa +document_properties_page_size_orientation_landscape=pozioma +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=US Letter +document_properties_page_size_name_legal=US Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}}×{{height}} {{unit}} (orientacja {{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}}×{{height}} {{unit}} ({{name}}, orientacja {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Szybki podgląd w Internecie: +document_properties_linearized_yes=tak +document_properties_linearized_no=nie +document_properties_close=Zamknij + +print_progress_message=Przygotowywanie dokumentu do druku… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Anuluj + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Przełącz panel boczny +toggle_sidebar_notification2.title=Przełącz panel boczny (dokument zawiera konspekt/załączniki/warstwy) +toggle_sidebar_label=Przełącz panel boczny +document_outline.title=Konspekt dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje) +document_outline_label=Konspekt dokumentu +attachments.title=Załączniki +attachments_label=Załączniki +layers.title=Warstwy (podwójne kliknięcie przywraca wszystkie warstwy do stanu domyślnego) +layers_label=Warstwy +thumbs.title=Miniatury +thumbs_label=Miniatury +current_outline_item.title=Znajdź bieżący element konspektu +current_outline_item_label=Bieżący element konspektu +findbar.title=Znajdź w dokumencie +findbar_label=Znajdź + +additional_layers=Dodatkowe warstwy +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark={{page}}. strona +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}. strona +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura {{page}}. strony + +# Find panel button title and messages +find_input.title=Znajdź +find_input.placeholder=Znajdź w dokumencie… +find_previous.title=Znajdź poprzednie wystąpienie tekstu +find_previous_label=Poprzednie +find_next.title=Znajdź następne wystąpienie tekstu +find_next_label=Następne +find_highlight=Wyróżnianie wszystkich +find_match_case_label=Rozróżnianie wielkości liter +find_match_diacritics_label=Rozróżnianie liter diakrytyzowanych +find_entire_word_label=Całe słowa +find_reached_top=Początek dokumentu. Wyszukiwanie od końca. +find_reached_bottom=Koniec dokumentu. Wyszukiwanie od początku. +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=Pierwsze z {{total}} trafień +find_match_count[two]=Drugie z {{total}} trafień +find_match_count[few]={{current}}. z {{total}} trafień +find_match_count[many]={{current}}. z {{total}} trafień +find_match_count[other]={{current}}. z {{total}} trafień +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Brak trafień. +find_match_count_limit[one]=Więcej niż jedno trafienie. +find_match_count_limit[two]=Więcej niż dwa trafienia. +find_match_count_limit[few]=Więcej niż {{limit}} trafienia. +find_match_count_limit[many]=Więcej niż {{limit}} trafień. +find_match_count_limit[other]=Więcej niż {{limit}} trafień. +find_not_found=Nie znaleziono tekstu + +# Error panel labels +error_more_info=Więcej informacji +error_less_info=Mniej informacji +error_close=Zamknij +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (kompilacja: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Komunikat: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stos: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Plik: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Wiersz: {{line}} + +# Predefined zoom values +page_scale_width=Szerokość strony +page_scale_fit=Dopasowanie strony +page_scale_auto=Skala automatyczna +page_scale_actual=Rozmiar oryginalny +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Wczytywanie… +loading_error=Podczas wczytywania dokumentu PDF wystąpił błąd. +invalid_file_error=Nieprawidłowy lub uszkodzony plik PDF. +missing_file_error=Brak pliku PDF. +unexpected_response_error=Nieoczekiwana odpowiedź serwera. + +rendering_error=Podczas renderowania strony wystąpił błąd. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Przypis: {{type}}] +password_label=Wprowadź hasło, aby otworzyć ten dokument PDF. +password_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie. +password_ok=OK +password_cancel=Anuluj + +printing_not_supported=Ostrzeżenie: drukowanie nie jest w pełni obsługiwane przez tę przeglądarkę. +printing_not_ready=Ostrzeżenie: dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować. +web_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Rysunek +editor_ink2_label=Rysunek + +free_text2_default_content=Zacznij pisać… + +# Editor Parameters +editor_free_text_color=Kolor +editor_free_text_size=Rozmiar +editor_ink_color=Kolor +editor_ink_thickness=Grubość +editor_ink_opacity=Nieprzezroczystość + +# Editor aria +editor_free_text2_aria_label=Edytor tekstu +editor_ink2_aria_label=Edytor rysunku +editor_ink_canvas_aria_label=Obraz utworzony przez użytkownika diff --git a/src/assets/pdf-annotation/web/locale/pt-BR/viewer.properties b/src/assets/pdf-annotation/web/locale/pt-BR/viewer.properties new file mode 100755 index 0000000..638f7c8 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/pt-BR/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Próxima página +next_label=Próxima + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reduzir +zoom_out_label=Reduzir +zoom_in.title=Ampliar +zoom_in_label=Ampliar +zoom.title=Zoom +presentation_mode.title=Mudar para o modo de apresentação +presentation_mode_label=Modo de apresentação +open_file.title=Abrir arquivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Baixar +download_label=Baixar +save.title=Salvo +save_label=Salvo +bookmark.title=Visão atual (copiar ou abrir em nova janela) +bookmark_label=Visualização atual + +# Secondary toolbar and context menu +tools.title=Ferramentas +tools_label=Ferramentas +first_page.title=Ir para a primeira página +first_page_label=Ir para a primeira página +last_page.title=Ir para a última página +last_page_label=Ir para a última página +page_rotate_cw.title=Girar no sentido horário +page_rotate_cw_label=Girar no sentido horário +page_rotate_ccw.title=Girar no sentido anti-horário +page_rotate_ccw_label=Girar no sentido anti-horário + +cursor_text_select_tool.title=Ativar a ferramenta de seleção de texto +cursor_text_select_tool_label=Ferramenta de seleção de texto +cursor_hand_tool.title=Ativar ferramenta de deslocamento +cursor_hand_tool_label=Ferramenta de deslocamento + +scroll_page.title=Usar rolagem de página +scroll_page_label=Rolagem de página +scroll_vertical.title=Usar deslocamento vertical +scroll_vertical_label=Deslocamento vertical +scroll_horizontal.title=Usar deslocamento horizontal +scroll_horizontal_label=Deslocamento horizontal +scroll_wrapped.title=Usar deslocamento contido +scroll_wrapped_label=Deslocamento contido + +spread_none.title=Não reagrupar páginas +spread_none_label=Não estender +spread_odd.title=Agrupar páginas começando em páginas com números ímpares +spread_odd_label=Estender ímpares +spread_even.title=Agrupar páginas começando em páginas com números pares +spread_even_label=Estender pares + +# Document properties dialog box +document_properties.title=Propriedades do documento… +document_properties_label=Propriedades do documento… +document_properties_file_name=Nome do arquivo: +document_properties_file_size=Tamanho do arquivo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Assunto: +document_properties_keywords=Palavras-chave: +document_properties_creation_date=Data da criação: +document_properties_modification_date=Data da modificação: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Criação: +document_properties_producer=Criador do PDF: +document_properties_version=Versão do PDF: +document_properties_page_count=Número de páginas: +document_properties_page_size=Tamanho da página: +document_properties_page_size_unit_inches=pol. +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=retrato +document_properties_page_size_orientation_landscape=paisagem +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Jurídico +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Exibição web rápida: +document_properties_linearized_yes=Sim +document_properties_linearized_no=Não +document_properties_close=Fechar + +print_progress_message=Preparando documento para impressão… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Exibir/ocultar painel lateral +toggle_sidebar_notification2.title=Exibir/ocultar painel (documento contém estrutura/anexos/camadas) +toggle_sidebar_label=Exibir/ocultar painel +document_outline.title=Mostrar a estrutura do documento (dê um duplo-clique para expandir/recolher todos os itens) +document_outline_label=Estrutura do documento +attachments.title=Mostrar anexos +attachments_label=Anexos +layers.title=Exibir camadas (duplo-clique para redefinir todas as camadas ao estado predefinido) +layers_label=Camadas +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Encontrar item atual da estrutura +current_outline_item_label=Item atual da estrutura +findbar.title=Procurar no documento +findbar_label=Procurar + +additional_layers=Camadas adicionais +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Página {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da página {{page}} + +# Find panel button title and messages +find_input.title=Procurar +find_input.placeholder=Procurar no documento… +find_previous.title=Procurar a ocorrência anterior da frase +find_previous_label=Anterior +find_next.title=Procurar a próxima ocorrência da frase +find_next_label=Próxima +find_highlight=Destacar tudo +find_match_case_label=Diferenciar maiúsculas/minúsculas +find_match_diacritics_label=Considerar acentuação +find_entire_word_label=Palavras completas +find_reached_top=Início do documento alcançado, continuando do fim +find_reached_bottom=Fim do documento alcançado, continuando do início +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} ocorrência +find_match_count[two]={{current}} de {{total}} ocorrências +find_match_count[few]={{current}} de {{total}} ocorrências +find_match_count[many]={{current}} de {{total}} ocorrências +find_match_count[other]={{current}} de {{total}} ocorrências +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mais de {{limit}} ocorrências +find_match_count_limit[one]=Mais de {{limit}} ocorrência +find_match_count_limit[two]=Mais de {{limit}} ocorrências +find_match_count_limit[few]=Mais de {{limit}} ocorrências +find_match_count_limit[many]=Mais de {{limit}} ocorrências +find_match_count_limit[other]=Mais de {{limit}} ocorrências +find_not_found=Frase não encontrada + +# Error panel labels +error_more_info=Mais informações +error_less_info=Menos informações +error_close=Fechar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilação: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensagem: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pilha: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Arquivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linha: {{line}} + +# Predefined zoom values +page_scale_width=Largura da página +page_scale_fit=Ajustar à janela +page_scale_auto=Zoom automático +page_scale_actual=Tamanho real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Carregando… +loading_error=Ocorreu um erro ao carregar o PDF. +invalid_file_error=Arquivo PDF corrompido ou inválido. +missing_file_error=Arquivo PDF ausente. +unexpected_response_error=Resposta inesperada do servidor. + +rendering_error=Ocorreu um erro ao renderizar a página. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotação {{type}}] +password_label=Forneça a senha para abrir este arquivo PDF. +password_invalid=Senha inválida. Tente novamente. +password_ok=OK +password_cancel=Cancelar + +printing_not_supported=Aviso: a impressão não é totalmente suportada neste navegador. +printing_not_ready=Aviso: o PDF não está totalmente carregado para impressão. +web_fonts_disabled=As fontes web estão desativadas: não foi possível usar fontes incorporadas do PDF. + +# Editor +editor_free_text2.title=Texto +editor_free_text2_label=Texto +editor_ink2.title=Desenho +editor_ink2_label=Desenho + +free_text2_default_content=Comece digitando… + +# Editor Parameters +editor_free_text_color=Cor +editor_free_text_size=Tamanho +editor_ink_color=Cor +editor_ink_thickness=Espessura +editor_ink_opacity=Opacidade + +# Editor aria +editor_free_text2_aria_label=Editor de texto +editor_ink2_aria_label=Editor de desenho +editor_ink_canvas_aria_label=Imagem criada pelo usuário diff --git a/src/assets/pdf-annotation/web/locale/pt-PT/viewer.properties b/src/assets/pdf-annotation/web/locale/pt-PT/viewer.properties new file mode 100755 index 0000000..b6c8981 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/pt-PT/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página seguinte +next_label=Seguinte + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reduzir +zoom_out_label=Reduzir +zoom_in.title=Ampliar +zoom_in_label=Ampliar +zoom.title=Zoom +presentation_mode.title=Trocar para o modo de apresentação +presentation_mode_label=Modo de apresentação +open_file.title=Abrir ficheiro +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Transferir +download_label=Transferir +save.title=Guardar +save_label=Guardar +bookmark.title=Vista atual (copiar ou abrir numa nova janela) +bookmark_label=Visão atual + +# Secondary toolbar and context menu +tools.title=Ferramentas +tools_label=Ferramentas +first_page.title=Ir para a primeira página +first_page_label=Ir para a primeira página +last_page.title=Ir para a última página +last_page_label=Ir para a última página +page_rotate_cw.title=Rodar à direita +page_rotate_cw_label=Rodar à direita +page_rotate_ccw.title=Rodar à esquerda +page_rotate_ccw_label=Rodar à esquerda + +cursor_text_select_tool.title=Ativar ferramenta de seleção de texto +cursor_text_select_tool_label=Ferramenta de seleção de texto +cursor_hand_tool.title=Ativar ferramenta de mão +cursor_hand_tool_label=Ferramenta de mão + +scroll_page.title=Utilizar deslocamento da página +scroll_page_label=Deslocamento da página +scroll_vertical.title=Utilizar deslocação vertical +scroll_vertical_label=Deslocação vertical +scroll_horizontal.title=Utilizar deslocação horizontal +scroll_horizontal_label=Deslocação horizontal +scroll_wrapped.title=Utilizar deslocação encapsulada +scroll_wrapped_label=Deslocação encapsulada + +spread_none.title=Não juntar páginas dispersas +spread_none_label=Sem spreads +spread_odd.title=Juntar páginas dispersas a partir de páginas com números ímpares +spread_odd_label=Spreads ímpares +spread_even.title=Juntar páginas dispersas a partir de páginas com números pares +spread_even_label=Spreads pares + +# Document properties dialog box +document_properties.title=Propriedades do documento… +document_properties_label=Propriedades do documento… +document_properties_file_name=Nome do ficheiro: +document_properties_file_size=Tamanho do ficheiro: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Assunto: +document_properties_keywords=Palavras-chave: +document_properties_creation_date=Data de criação: +document_properties_modification_date=Data de modificação: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Criador: +document_properties_producer=Produtor de PDF: +document_properties_version=Versão do PDF: +document_properties_page_count=N.º de páginas: +document_properties_page_size=Tamanho da página: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=retrato +document_properties_page_size_orientation_landscape=paisagem +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Carta +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista rápida web: +document_properties_linearized_yes=Sim +document_properties_linearized_no=Não +document_properties_close=Fechar + +print_progress_message=A preparar o documento para impressão… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Alternar barra lateral +toggle_sidebar_notification2.title=Alternar barra lateral (o documento contém contornos/anexos/camadas) +toggle_sidebar_label=Alternar barra lateral +document_outline.title=Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens) +document_outline_label=Esquema do documento +attachments.title=Mostrar anexos +attachments_label=Anexos +layers.title=Mostrar camadas (clique duas vezes para repor todas as camadas para o estado predefinido) +layers_label=Camadas +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Encontrar o item atualmente destacado +current_outline_item_label=Item atualmente destacado +findbar.title=Localizar em documento +findbar_label=Localizar + +additional_layers=Camadas adicionais +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Página {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da página {{page}} + +# Find panel button title and messages +find_input.title=Localizar +find_input.placeholder=Localizar em documento… +find_previous.title=Localizar ocorrência anterior da frase +find_previous_label=Anterior +find_next.title=Localizar ocorrência seguinte da frase +find_next_label=Seguinte +find_highlight=Destacar tudo +find_match_case_label=Correspondência +find_match_diacritics_label=Corresponder diacríticos +find_entire_word_label=Palavras completas +find_reached_top=Topo do documento atingido, a continuar a partir do fundo +find_reached_bottom=Fim do documento atingido, a continuar a partir do topo +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} de {{total}} correspondência +find_match_count[two]={{current}} de {{total}} correspondências +find_match_count[few]={{current}} de {{total}} correspondências +find_match_count[many]={{current}} de {{total}} correspondências +find_match_count[other]={{current}} de {{total}} correspondências +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mais de {{limit}} correspondências +find_match_count_limit[one]=Mais de {{limit}} correspondência +find_match_count_limit[two]=Mais de {{limit}} correspondências +find_match_count_limit[few]=Mais de {{limit}} correspondências +find_match_count_limit[many]=Mais de {{limit}} correspondências +find_match_count_limit[other]=Mais de {{limit}} correspondências +find_not_found=Frase não encontrada + +# Error panel labels +error_more_info=Mais informação +error_less_info=Menos informação +error_close=Fechar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilação: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensagem: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ficheiro: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linha: {{line}} + +# Predefined zoom values +page_scale_width=Ajustar à largura +page_scale_fit=Ajustar à página +page_scale_auto=Zoom automático +page_scale_actual=Tamanho real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=A carregar… +loading_error=Ocorreu um erro ao carregar o PDF. +invalid_file_error=Ficheiro PDF inválido ou danificado. +missing_file_error=Ficheiro PDF inexistente. +unexpected_response_error=Resposta inesperada do servidor. + +rendering_error=Ocorreu um erro ao processar a página. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotação {{type}}] +password_label=Introduza a palavra-passe para abrir este ficheiro PDF. +password_invalid=Palavra-passe inválida. Por favor, tente novamente. +password_ok=OK +password_cancel=Cancelar + +printing_not_supported=Aviso: a impressão não é totalmente suportada por este navegador. +printing_not_ready=Aviso: o PDF ainda não está totalmente carregado. +web_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF embutidos. + +# Editor +editor_free_text2.title=Texto +editor_free_text2_label=Texto +editor_ink2.title=Desenhar +editor_ink2_label=Desenhar + +free_text2_default_content=Começar a digitar… + +# Editor Parameters +editor_free_text_color=Cor +editor_free_text_size=Tamanho +editor_ink_color=Cor +editor_ink_thickness=Espessura +editor_ink_opacity=Opacidade + +# Editor aria +editor_free_text2_aria_label=Editor de texto +editor_ink2_aria_label=Editor de desenho +editor_ink_canvas_aria_label=Imagem criada pelo utilizador diff --git a/src/assets/pdf-annotation/web/locale/rm/viewer.properties b/src/assets/pdf-annotation/web/locale/rm/viewer.properties new file mode 100755 index 0000000..6562c1f --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/rm/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina precedenta +previous_label=Enavos +next.title=Proxima pagina +next_label=Enavant + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=da {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} da {{pagesCount}}) + +zoom_out.title=Empitschnir +zoom_out_label=Empitschnir +zoom_in.title=Engrondir +zoom_in_label=Engrondir +zoom.title=Zoom +presentation_mode.title=Midar en il modus da preschentaziun +presentation_mode_label=Modus da preschentaziun +open_file.title=Avrir datoteca +open_file_label=Avrir +print.title=Stampar +print_label=Stampar +download.title=Telechargiar +download_label=Telechargiar +save.title=Memorisar +save_label=Memorisar +bookmark.title=Vista actuala (copiar u avrir en ina nova fanestra) +bookmark_label=Vista actuala + +# Secondary toolbar and context menu +tools.title=Utensils +tools_label=Utensils +first_page.title=Siglir a l'emprima pagina +first_page_label=Siglir a l'emprima pagina +last_page.title=Siglir a la davosa pagina +last_page_label=Siglir a la davosa pagina +page_rotate_cw.title=Rotar en direcziun da l'ura +page_rotate_cw_label=Rotar en direcziun da l'ura +page_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura +page_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura + +cursor_text_select_tool.title=Activar l'utensil per selecziunar text +cursor_text_select_tool_label=Utensil per selecziunar text +cursor_hand_tool.title=Activar l'utensil da maun +cursor_hand_tool_label=Utensil da maun + +scroll_page.title=Utilisar la defilada per pagina +scroll_page_label=Defilada per pagina +scroll_vertical.title=Utilisar il defilar vertical +scroll_vertical_label=Defilar vertical +scroll_horizontal.title=Utilisar il defilar orizontal +scroll_horizontal_label=Defilar orizontal +scroll_wrapped.title=Utilisar il defilar en colonnas +scroll_wrapped_label=Defilar en colonnas + +spread_none.title=Betg parallelisar las paginas +spread_none_label=Betg parallel +spread_odd.title=Parallelisar las paginas cun cumenzar cun paginas spèras +spread_odd_label=Parallel spèr +spread_even.title=Parallelisar las paginas cun cumenzar cun paginas pèras +spread_even_label=Parallel pèr + +# Document properties dialog box +document_properties.title=Caracteristicas dal document… +document_properties_label=Caracteristicas dal document… +document_properties_file_name=Num da la datoteca: +document_properties_file_size=Grondezza da la datoteca: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Autur: +document_properties_subject=Tema: +document_properties_keywords=Chavazzins: +document_properties_creation_date=Data da creaziun: +document_properties_modification_date=Data da modificaziun: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Creà da: +document_properties_producer=Creà il PDF cun: +document_properties_version=Versiun da PDF: +document_properties_page_count=Dumber da paginas: +document_properties_page_size=Grondezza da la pagina: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=vertical +document_properties_page_size_orientation_landscape=orizontal +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Gea +document_properties_linearized_no=Na +document_properties_close=Serrar + +print_progress_message=Preparar il document per stampar… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Interrumper + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Activar/deactivar la trav laterala +toggle_sidebar_notification2.title=Activar/deactivar la trav laterala (il document cuntegna structura dal document/agiuntas/nivels) +toggle_sidebar_label=Activar/deactivar la trav laterala +document_outline.title=Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils elements) +document_outline_label=Structura dal document +attachments.title=Mussar agiuntas +attachments_label=Agiuntas +layers.title=Mussar ils nivels (cliccar dubel per restaurar il stadi da standard da tut ils nivels) +layers_label=Nivels +thumbs.title=Mussar las miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Tschertgar l'element da structura actual +current_outline_item_label=Element da structura actual +findbar.title=Tschertgar en il document +findbar_label=Tschertgar + +additional_layers=Nivels supplementars +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pagina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da la pagina {{page}} + +# Find panel button title and messages +find_input.title=Tschertgar +find_input.placeholder=Tschertgar en il document… +find_previous.title=Tschertgar la posiziun precedenta da l'expressiun +find_previous_label=Enavos +find_next.title=Tschertgar la proxima posiziun da l'expressiun +find_next_label=Enavant +find_highlight=Relevar tuts +find_match_case_label=Resguardar maiusclas/minusclas +find_match_diacritics_label=Resguardar ils segns diacritics +find_entire_word_label=Pleds entirs +find_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document +find_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} dad {{total}} correspundenza +find_match_count[two]={{current}} da {{total}} correspundenzas +find_match_count[few]={{current}} da {{total}} correspundenzas +find_match_count[many]={{current}} da {{total}} correspundenzas +find_match_count[other]={{current}} da {{total}} correspundenzas +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Dapli che {{limit}} correspundenzas +find_match_count_limit[one]=Dapli che {{limit}} correspundenza +find_match_count_limit[two]=Dapli che {{limit}} correspundenzas +find_match_count_limit[few]=Dapli che {{limit}} correspundenzas +find_match_count_limit[many]=Dapli che {{limit}} correspundenzas +find_match_count_limit[other]=Dapli che {{limit}} correspundenzas +find_not_found=Impussibel da chattar l'expressiun + +# Error panel labels +error_more_info=Dapli infurmaziuns +error_less_info=Damain infurmaziuns +error_close=Serrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Messadi: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datoteca: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lingia: {{line}} + +# Predefined zoom values +page_scale_width=Ladezza da la pagina +page_scale_fit=Entira pagina +page_scale_auto=Zoom automatic +page_scale_actual=Grondezza actuala +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Chargiar… +loading_error=Ina errur è cumparida cun chargiar il PDF. +invalid_file_error=Datoteca PDF nunvalida u donnegiada. +missing_file_error=Datoteca PDF manconta. +unexpected_response_error=Resposta nunspetgada dal server. + +rendering_error=Ina errur è cumparida cun visualisar questa pagina. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Annotaziun da {{type}}] +password_label=Endatescha il pled-clav per avrir questa datoteca da PDF. +password_invalid=Pled-clav nunvalid. Emprova anc ina giada. +password_ok=OK +password_cancel=Interrumper + +printing_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur. +printing_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar. +web_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Dissegnar +editor_ink2_label=Dissegnar + +free_text2_default_content=Cumenzar a tippar… + +# Editor Parameters +editor_free_text_color=Colur +editor_free_text_size=Grondezza +editor_ink_color=Colur +editor_ink_thickness=Grossezza +editor_ink_opacity=Opacitad + +# Editor aria +editor_free_text2_aria_label=Editur da text +editor_ink2_aria_label=Editur dissegn +editor_ink_canvas_aria_label=Maletg creà da l'utilisader diff --git a/src/assets/pdf-annotation/web/locale/ro/viewer.properties b/src/assets/pdf-annotation/web/locale/ro/viewer.properties new file mode 100755 index 0000000..7560849 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ro/viewer.properties @@ -0,0 +1,241 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina precedentă +previous_label=Înapoi +next.title=Pagina următoare +next_label=Înainte + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=din {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} din {{pagesCount}}) + +zoom_out.title=Micșorează +zoom_out_label=Micșorează +zoom_in.title=Mărește +zoom_in_label=Mărește +zoom.title=Zoom +presentation_mode.title=Comută la modul de prezentare +presentation_mode_label=Mod de prezentare +open_file.title=Deschide un fișier +open_file_label=Deschide +print.title=Tipărește +print_label=Tipărește +download.title=Descarcă +download_label=Descarcă +bookmark.title=Vizualizare actuală (copiază sau deschide într-o fereastră nouă) +bookmark_label=Vizualizare actuală + +# Secondary toolbar and context menu +tools.title=Instrumente +tools_label=Instrumente +first_page.title=Mergi la prima pagină +first_page_label=Mergi la prima pagină +last_page.title=Mergi la ultima pagină +last_page_label=Mergi la ultima pagină +page_rotate_cw.title=Rotește în sensul acelor de ceas +page_rotate_cw_label=Rotește în sensul acelor de ceas +page_rotate_ccw.title=Rotește în sens invers al acelor de ceas +page_rotate_ccw_label=Rotește în sens invers al acelor de ceas + +cursor_text_select_tool.title=Activează instrumentul de selecție a textului +cursor_text_select_tool_label=Instrumentul de selecție a textului +cursor_hand_tool.title=Activează instrumentul mână +cursor_hand_tool_label=Unealta mână + +scroll_vertical.title=Folosește derularea verticală +scroll_vertical_label=Derulare verticală +scroll_horizontal.title=Folosește derularea orizontală +scroll_horizontal_label=Derulare orizontală +scroll_wrapped.title=Folosește derularea încadrată +scroll_wrapped_label=Derulare încadrată + +spread_none.title=Nu uni paginile broșate +spread_none_label=Fără pagini broșate +spread_odd.title=Unește paginile broșate începând cu cele impare +spread_odd_label=Broșare pagini impare +spread_even.title=Unește paginile broșate începând cu cele pare +spread_even_label=Broșare pagini pare + +# Document properties dialog box +document_properties.title=Proprietățile documentului… +document_properties_label=Proprietățile documentului… +document_properties_file_name=Numele fișierului: +document_properties_file_size=Mărimea fișierului: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byți) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byți) +document_properties_title=Titlu: +document_properties_author=Autor: +document_properties_subject=Subiect: +document_properties_keywords=Cuvinte cheie: +document_properties_creation_date=Data creării: +document_properties_modification_date=Data modificării: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Autor: +document_properties_producer=Producător PDF: +document_properties_version=Versiune PDF: +document_properties_page_count=Număr de pagini: +document_properties_page_size=Mărimea paginii: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=verticală +document_properties_page_size_orientation_landscape=orizontală +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Literă +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vizualizare web rapidă: +document_properties_linearized_yes=Da +document_properties_linearized_no=Nu +document_properties_close=Închide + +print_progress_message=Se pregătește documentul pentru tipărire… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Renunță + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Comută bara laterală +toggle_sidebar_label=Comută bara laterală +document_outline.title=Afișează schița documentului (dublu-clic pentru a extinde/restrânge toate elementele) +document_outline_label=Schița documentului +attachments.title=Afișează atașamentele +attachments_label=Atașamente +thumbs.title=Afișează miniaturi +thumbs_label=Miniaturi +findbar.title=Caută în document +findbar_label=Caută + +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura paginii {{page}} + +# Find panel button title and messages +find_input.title=Caută +find_input.placeholder=Caută în document… +find_previous.title=Mergi la apariția anterioară a textului +find_previous_label=Înapoi +find_next.title=Mergi la apariția următoare a textului +find_next_label=Înainte +find_highlight=Evidențiază toate aparițiile +find_match_case_label=Ține cont de majuscule și minuscule +find_entire_word_label=Cuvinte întregi +find_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit +find_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} din {{total}} rezultat +find_match_count[two]={{current}} din {{total}} rezultate +find_match_count[few]={{current}} din {{total}} rezultate +find_match_count[many]={{current}} din {{total}} de rezultate +find_match_count[other]={{current}} din {{total}} de rezultate +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Peste {{limit}} rezultate +find_match_count_limit[one]=Peste {{limit}} rezultat +find_match_count_limit[two]=Peste {{limit}} rezultate +find_match_count_limit[few]=Peste {{limit}} rezultate +find_match_count_limit[many]=Peste {{limit}} de rezultate +find_match_count_limit[other]=Peste {{limit}} de rezultate +find_not_found=Nu s-a găsit textul + +# Error panel labels +error_more_info=Mai multe informații +error_less_info=Mai puține informații +error_close=Închide +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (versiunea compilată: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesaj: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stivă: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fișier: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rând: {{line}} +rendering_error=A intervenit o eroare la randarea paginii. + +# Predefined zoom values +page_scale_width=Lățime pagină +page_scale_fit=Potrivire la pagină +page_scale_auto=Zoom automat +page_scale_actual=Mărime reală +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error=A intervenit o eroare la încărcarea PDF-ului. +invalid_file_error=Fișier PDF nevalid sau corupt. +missing_file_error=Fișier PDF lipsă. +unexpected_response_error=Răspuns neașteptat de la server. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Adnotare {{type}}] +password_label=Introdu parola pentru a deschide acest fișier PDF. +password_invalid=Parolă nevalidă. Te rugăm să încerci din nou. +password_ok=OK +password_cancel=Renunță + +printing_not_supported=Avertisment: Tipărirea nu este suportată în totalitate de acest browser. +printing_not_ready=Avertisment: PDF-ul nu este încărcat complet pentru tipărire. +web_fonts_disabled=Fonturile web sunt dezactivate: nu se pot folosi fonturile PDF încorporate. + diff --git a/src/assets/pdf-annotation/web/locale/ru/viewer.properties b/src/assets/pdf-annotation/web/locale/ru/viewer.properties new file mode 100755 index 0000000..0198e4f --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ru/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Предыдущая страница +previous_label=Предыдущая +next.title=Следующая страница +next_label=Следующая + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Страница +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=из {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} из {{pagesCount}}) + +zoom_out.title=Уменьшить +zoom_out_label=Уменьшить +zoom_in.title=Увеличить +zoom_in_label=Увеличить +zoom.title=Масштаб +presentation_mode.title=Перейти в режим презентации +presentation_mode_label=Режим презентации +open_file.title=Открыть файл +open_file_label=Открыть +print.title=Печать +print_label=Печать +download.title=Загрузить +download_label=Загрузить +save.title=Сохранить +save_label=Сохранить +bookmark.title=Ссылка на текущий вид (скопировать или открыть в новом окне) +bookmark_label=Текущий вид + +# Secondary toolbar and context menu +tools.title=Инструменты +tools_label=Инструменты +first_page.title=Перейти на первую страницу +first_page_label=Перейти на первую страницу +last_page.title=Перейти на последнюю страницу +last_page_label=Перейти на последнюю страницу +page_rotate_cw.title=Повернуть по часовой стрелке +page_rotate_cw_label=Повернуть по часовой стрелке +page_rotate_ccw.title=Повернуть против часовой стрелки +page_rotate_ccw_label=Повернуть против часовой стрелки + +cursor_text_select_tool.title=Включить Инструмент «Выделение текста» +cursor_text_select_tool_label=Инструмент «Выделение текста» +cursor_hand_tool.title=Включить Инструмент «Рука» +cursor_hand_tool_label=Инструмент «Рука» + +scroll_page.title=Использовать прокрутку страниц +scroll_page_label=Прокрутка страниц +scroll_vertical.title=Использовать вертикальную прокрутку +scroll_vertical_label=Вертикальная прокрутка +scroll_horizontal.title=Использовать горизонтальную прокрутку +scroll_horizontal_label=Горизонтальная прокрутка +scroll_wrapped.title=Использовать масштабируемую прокрутку +scroll_wrapped_label=Масштабируемая прокрутка + +spread_none.title=Не использовать режим разворотов страниц +spread_none_label=Без разворотов страниц +spread_odd.title=Развороты начинаются с нечётных номеров страниц +spread_odd_label=Нечётные страницы слева +spread_even.title=Развороты начинаются с чётных номеров страниц +spread_even_label=Чётные страницы слева + +# Document properties dialog box +document_properties.title=Свойства документа… +document_properties_label=Свойства документа… +document_properties_file_name=Имя файла: +document_properties_file_size=Размер файла: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байт) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байт) +document_properties_title=Заголовок: +document_properties_author=Автор: +document_properties_subject=Тема: +document_properties_keywords=Ключевые слова: +document_properties_creation_date=Дата создания: +document_properties_modification_date=Дата изменения: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Приложение: +document_properties_producer=Производитель PDF: +document_properties_version=Версия PDF: +document_properties_page_count=Число страниц: +document_properties_page_size=Размер страницы: +document_properties_page_size_unit_inches=дюймов +document_properties_page_size_unit_millimeters=мм +document_properties_page_size_orientation_portrait=книжная +document_properties_page_size_orientation_landscape=альбомная +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Быстрый просмотр в Web: +document_properties_linearized_yes=Да +document_properties_linearized_no=Нет +document_properties_close=Закрыть + +print_progress_message=Подготовка документа к печати… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Отмена + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Показать/скрыть боковую панель +toggle_sidebar_notification2.title=Показать/скрыть боковую панель (документ имеет содержание/вложения/слои) +toggle_sidebar_label=Показать/скрыть боковую панель +document_outline.title=Показать содержание документа (двойной щелчок, чтобы развернуть/свернуть все элементы) +document_outline_label=Содержание документа +attachments.title=Показать вложения +attachments_label=Вложения +layers.title=Показать слои (дважды щёлкните, чтобы сбросить все слои к состоянию по умолчанию) +layers_label=Слои +thumbs.title=Показать миниатюры +thumbs_label=Миниатюры +current_outline_item.title=Найти текущий элемент структуры +current_outline_item_label=Текущий элемент структуры +findbar.title=Найти в документе +findbar_label=Найти + +additional_layers=Дополнительные слои +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Страница {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Страница {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Миниатюра страницы {{page}} + +# Find panel button title and messages +find_input.title=Найти +find_input.placeholder=Найти в документе… +find_previous.title=Найти предыдущее вхождение фразы в текст +find_previous_label=Назад +find_next.title=Найти следующее вхождение фразы в текст +find_next_label=Далее +find_highlight=Подсветить все +find_match_case_label=С учётом регистра +find_match_diacritics_label=С учётом диакритических знаков +find_entire_word_label=Слова целиком +find_reached_top=Достигнут верх документа, продолжено снизу +find_reached_bottom=Достигнут конец документа, продолжено сверху +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} из {{total}} совпадения +find_match_count[two]={{current}} из {{total}} совпадений +find_match_count[few]={{current}} из {{total}} совпадений +find_match_count[many]={{current}} из {{total}} совпадений +find_match_count[other]={{current}} из {{total}} совпадений +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Более {{limit}} совпадений +find_match_count_limit[one]=Более {{limit}} совпадения +find_match_count_limit[two]=Более {{limit}} совпадений +find_match_count_limit[few]=Более {{limit}} совпадений +find_match_count_limit[many]=Более {{limit}} совпадений +find_match_count_limit[other]=Более {{limit}} совпадений +find_not_found=Фраза не найдена + +# Error panel labels +error_more_info=Детали +error_less_info=Скрыть детали +error_close=Закрыть +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (сборка: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Сообщение: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стeк: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Строка: {{line}} + +# Predefined zoom values +page_scale_width=По ширине страницы +page_scale_fit=По размеру страницы +page_scale_auto=Автоматически +page_scale_actual=Реальный размер +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Загрузка… +loading_error=При загрузке PDF произошла ошибка. +invalid_file_error=Некорректный или повреждённый PDF-файл. +missing_file_error=PDF-файл отсутствует. +unexpected_response_error=Неожиданный ответ сервера. + +rendering_error=При создании страницы произошла ошибка. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Аннотация {{type}}] +password_label=Введите пароль, чтобы открыть этот PDF-файл. +password_invalid=Неверный пароль. Пожалуйста, попробуйте снова. +password_ok=OK +password_cancel=Отмена + +printing_not_supported=Предупреждение: В этом браузере не полностью поддерживается печать. +printing_not_ready=Предупреждение: PDF не полностью загружен для печати. +web_fonts_disabled=Веб-шрифты отключены: не удалось задействовать встроенные PDF-шрифты. + +# Editor +editor_free_text2.title=Текст +editor_free_text2_label=Текст +editor_ink2.title=Рисовать +editor_ink2_label=Рисовать + +free_text2_default_content=Начните вводить… + +# Editor Parameters +editor_free_text_color=Цвет +editor_free_text_size=Размер +editor_ink_color=Цвет +editor_ink_thickness=Толщина +editor_ink_opacity=Прозрачность + +# Editor aria +editor_free_text2_aria_label=Текстовый редактор +editor_ink2_aria_label=Редактор рисования +editor_ink_canvas_aria_label=Созданное пользователем изображение diff --git a/src/assets/pdf-annotation/web/locale/sat/viewer.properties b/src/assets/pdf-annotation/web/locale/sat/viewer.properties new file mode 100755 index 0000000..d0d138d --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sat/viewer.properties @@ -0,0 +1,198 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ᱢᱟᱲᱟᱝ ᱥᱟᱦᱴᱟ +previous_label=ᱢᱟᱲᱟᱝᱟᱜ +next.title=ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ ᱥᱟᱦᱴᱟ +next_label=ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ᱥᱟᱦᱴᱟ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=ᱨᱮᱭᱟᱜ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} ᱠᱷᱚᱱ {{pagesCount}}) + +zoom_out.title=ᱦᱤᱲᱤᱧ ᱛᱮᱭᱟᱨ +zoom_out_label=ᱦᱤᱲᱤᱧ ᱛᱮᱭᱟᱨ +zoom_in.title=ᱢᱟᱨᱟᱝ ᱛᱮᱭᱟᱨ +zoom_in_label=ᱢᱟᱨᱟᱝ ᱛᱮᱭᱟᱨ +zoom.title=ᱡᱩᱢ +presentation_mode.title=ᱩᱫᱩᱜ ᱥᱚᱫᱚᱨ ᱚᱵᱚᱥᱛᱟ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ +presentation_mode_label=ᱩᱫᱩᱜ ᱥᱚᱫᱚᱨ ᱚᱵᱚᱥᱛᱟ ᱨᱮ +open_file.title=ᱨᱮᱫ ᱡᱷᱤᱡᱽ ᱢᱮ +open_file_label=ᱡᱷᱤᱡᱽ ᱢᱮ +print.title=ᱪᱷᱟᱯᱟ +print_label=ᱪᱷᱟᱯᱟ +download.title=ᱰᱟᱩᱱᱞᱚᱰ +download_label=ᱰᱟᱩᱱᱞᱚᱰ +bookmark.title=ᱱᱤᱛᱚᱜᱟᱜ ᱧᱮᱞ (ᱱᱚᱶᱟ ᱡᱷᱚᱨᱠᱟ ᱨᱮ ᱱᱚᱠᱚᱞ ᱟᱨ ᱵᱟᱝ ᱡᱷᱤᱡᱽ ᱢᱮ ) +bookmark_label=ᱱᱤᱛᱚᱜᱟᱜ ᱧᱮᱞ + +# Secondary toolbar and context menu +tools.title=ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱠᱚ +tools_label=ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱠᱚ +first_page.title=ᱯᱩᱭᱞᱩ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +first_page_label=ᱯᱩᱭᱞᱩ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +last_page.title=ᱢᱩᱪᱟᱹᱫ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +last_page_label=ᱢᱩᱪᱟᱹᱫ ᱥᱟᱦᱴᱟ ᱥᱮᱫ ᱪᱟᱞᱟᱜ ᱢᱮ +page_rotate_cw.title=ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱟᱹᱪᱩᱨ +page_rotate_cw_label=ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱟᱹᱪᱩᱨ +page_rotate_ccw.title=ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱩᱞᱴᱟᱹ ᱟᱹᱪᱩᱨ +page_rotate_ccw_label=ᱜᱷᱚᱰᱤ ᱦᱤᱥᱟᱹᱵ ᱛᱮ ᱩᱞᱴᱟᱹ ᱟᱹᱪᱩᱨ + +cursor_text_select_tool.title=ᱚᱞ ᱵᱟᱪᱷᱟᱣ ᱦᱟᱹᱛᱤᱭᱟᱨ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ +cursor_text_select_tool_label=ᱚᱞ ᱵᱟᱪᱷᱟᱣ ᱦᱟᱹᱛᱤᱭᱟᱨ +cursor_hand_tool.title=ᱛᱤ ᱦᱟᱹᱛᱤᱭᱟᱨ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ +cursor_hand_tool_label=ᱛᱤ ᱦᱟᱹᱛᱤᱭᱟᱨ + +scroll_page.title=ᱥᱟᱦᱴᱟ ᱜᱩᱲᱟᱹᱣ ᱵᱮᱵᱷᱟᱨ ᱢᱮ +scroll_page_label=ᱥᱟᱦᱴᱟ ᱜᱩᱲᱟᱹᱣ +scroll_vertical.title=ᱥᱤᱫᱽ ᱜᱩᱲᱟᱹᱣ ᱵᱮᱵᱷᱟᱨ ᱢᱮ +scroll_vertical_label=ᱥᱤᱫᱽ ᱜᱩᱲᱟᱹᱣ +scroll_horizontal.title=ᱜᱤᱛᱤᱡ ᱛᱮ ᱜᱩᱲᱟᱹᱣ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + + +# Document properties dialog box +document_properties_file_name=ᱨᱮᱫᱽ ᱧᱩᱛᱩᱢ : +document_properties_file_size=ᱨᱮᱫᱽ ᱢᱟᱯ : +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} ᱵᱟᱭᱤᱴ ᱠᱚ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} ᱵᱟᱭᱤᱴ ᱠᱚ) +document_properties_title=ᱧᱩᱛᱩᱢ : +document_properties_author=ᱚᱱᱚᱞᱤᱭᱟᱹ : +document_properties_subject=ᱵᱤᱥᱚᱭ : +document_properties_keywords=ᱠᱟᱹᱴᱷᱤ ᱥᱟᱵᱟᱫᱽ : +document_properties_creation_date=ᱛᱮᱭᱟᱨ ᱢᱟᱸᱦᱤᱛ : +document_properties_modification_date=ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱢᱟᱹᱦᱤᱛ : +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ᱵᱮᱱᱟᱣᱤᱡ : +document_properties_producer=PDF ᱛᱮᱭᱟᱨ ᱚᱰᱚᱠᱤᱡ : +document_properties_version=PDF ᱵᱷᱟᱹᱨᱥᱚᱱ : +document_properties_page_count=ᱥᱟᱦᱴᱟ ᱞᱮᱠᱷᱟ : +document_properties_page_size=ᱥᱟᱦᱴᱟ ᱢᱟᱯ : +document_properties_page_size_unit_inches=ᱤᱧᱪ +document_properties_page_size_unit_millimeters=ᱢᱤᱢᱤ +document_properties_page_size_orientation_portrait=ᱯᱚᱴᱨᱮᱴ +document_properties_page_size_orientation_landscape=ᱞᱮᱱᱰᱥᱠᱮᱯ +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=ᱪᱤᱴᱷᱤ +document_properties_page_size_name_legal=ᱠᱟᱹᱱᱩᱱᱤ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +document_outline_label=ᱫᱚᱞᱤᱞ ᱛᱮᱭᱟᱨ ᱛᱮᱫ +attachments.title=ᱞᱟᱴᱷᱟ ᱥᱮᱞᱮᱫ ᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ +attachments_label=ᱞᱟᱴᱷᱟ ᱥᱮᱞᱮᱫ ᱠᱚ +thumbs.title=ᱪᱤᱛᱟᱹᱨ ᱟᱦᱞᱟ ᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ +thumbs_label=ᱪᱤᱛᱟᱹᱨ ᱟᱦᱞᱟ ᱠᱚ +findbar.title=ᱫᱚᱞᱤᱞ ᱨᱮ ᱯᱟᱱᱛᱮ +findbar_label=ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ + +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} ᱥᱟᱦᱴᱟ +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱪᱤᱛᱟᱹᱨ ᱟᱦᱞᱟ + +# Find panel button title and messages +find_previous.title=ᱟᱭᱟᱛ ᱦᱤᱸᱥ ᱨᱮᱭᱟᱜ ᱯᱟᱹᱦᱤᱞ ᱥᱮᱫᱟᱜ ᱚᱰᱚᱠ ᱧᱟᱢ ᱢᱮ +find_next.title=ᱟᱭᱟᱛ ᱦᱤᱸᱥ ᱨᱮᱭᱟᱜ ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ ᱚᱰᱚᱠ ᱧᱟᱢ ᱢᱮ +find_highlight=ᱡᱷᱚᱛᱚ ᱩᱫᱩᱜ ᱨᱟᱠᱟᱵ +find_match_case_label=ᱡᱚᱲ ᱠᱟᱛᱷᱟ +find_reached_top=ᱫᱚᱞᱤᱞ ᱨᱮᱭᱟᱜ ᱪᱤᱴ ᱨᱮ ᱥᱮᱴᱮᱨ, ᱞᱟᱛᱟᱨ ᱠᱷᱚᱱ ᱞᱮᱛᱟᱲ +find_reached_bottom=ᱫᱚᱞᱤᱞ ᱨᱮᱭᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱨᱮ ᱥᱮᱴᱮᱨ, ᱪᱚᱴ ᱠᱷᱚᱱ ᱞᱮᱛᱟᱲ +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_not_found=ᱛᱚᱯᱚᱞ ᱫᱚᱱᱚᱲ ᱵᱟᱝ ᱧᱟᱢ ᱞᱮᱱᱟ + +# Error panel labels +error_more_info=ᱵᱟᱹᱲᱛᱤ ᱞᱟᱹᱭ ᱥᱚᱫᱚᱨ +error_less_info=ᱠᱚᱢ ᱞᱟᱹᱭ ᱥᱚᱫᱚᱨ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ᱠᱷᱚᱵᱚᱨ : {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ᱵᱟᱝ : {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ᱨᱮᱫᱽ : {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ᱜᱟᱨ : {{line}} +rendering_error=ᱥᱟᱦᱴᱟ ᱮᱢ ᱡᱚᱦᱚᱠ ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱮᱱᱟ ᱾ + +# Predefined zoom values +page_scale_width=ᱥᱟᱦᱴᱟ ᱚᱥᱟᱨ +page_scale_fit=ᱥᱟᱦᱴᱟ ᱠᱷᱟᱯ +page_scale_auto=ᱟᱡᱼᱟᱡ ᱛᱮ ᱦᱩᱰᱤᱧ ᱞᱟᱹᱴᱩ ᱛᱮᱭᱟᱨ +page_scale_actual=ᱴᱷᱤᱠ ᱢᱟᱨᱟᱝ ᱛᱮᱫ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error=PDF ᱞᱟᱫᱮ ᱡᱚᱦᱚᱜ ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱮᱱᱟ ᱾ +invalid_file_error=ᱵᱟᱝ ᱵᱟᱛᱟᱣ ᱟᱨᱵᱟᱝᱠᱷᱟᱱ ᱰᱤᱜᱟᱹᱣ PDF ᱨᱮᱫᱽ ᱾ +missing_file_error=ᱟᱫᱟᱜ PDF ᱨᱮᱫᱽ ᱾ + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ᱢᱚᱱᱛᱚ ᱮᱢ] +password_label=ᱱᱚᱶᱟ PDF ᱨᱮᱫᱽ ᱡᱷᱤᱡᱽ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱫᱮᱨ ᱢᱮ ᱾ +password_invalid=ᱵᱷᱩᱞ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱾ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱫᱩᱦᱲᱟᱹ ᱪᱮᱥᱴᱟᱭ ᱢᱮ ᱾ +password_ok=ᱴᱷᱤᱠ + +printing_not_supported=ᱦᱚᱥᱤᱭᱟᱨ : ᱪᱷᱟᱯᱟ ᱱᱚᱣᱟ ᱯᱟᱱᱛᱮᱭᱟᱜ ᱫᱟᱨᱟᱭ ᱛᱮ ᱯᱩᱨᱟᱹᱣ ᱵᱟᱭ ᱜᱚᱲᱚᱣᱟᱠᱟᱱᱟ ᱾ +printing_not_ready=ᱦᱩᱥᱤᱭᱟᱹᱨ : ᱪᱷᱟᱯᱟ ᱞᱟᱹᱜᱤᱫ PDF ᱯᱩᱨᱟᱹ ᱵᱟᱭ ᱞᱟᱫᱮ ᱟᱠᱟᱱᱟ ᱾ +web_fonts_disabled=ᱣᱮᱵᱽ ᱪᱤᱠᱤ ᱵᱟᱝ ᱦᱩᱭ ᱦᱚᱪᱚ ᱠᱟᱱᱟ : ᱵᱷᱤᱛᱤᱨ ᱛᱷᱟᱯᱚᱱ PDF ᱪᱤᱠᱤ ᱵᱮᱵᱷᱟᱨ ᱵᱟᱝ ᱦᱩᱭ ᱠᱮᱭᱟ ᱾ + diff --git a/src/assets/pdf-annotation/web/locale/sc/viewer.properties b/src/assets/pdf-annotation/web/locale/sc/viewer.properties new file mode 100755 index 0000000..efcedca --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sc/viewer.properties @@ -0,0 +1,261 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pàgina anteriore +previous_label=S'ischeda chi b'est primu +next.title=Pàgina imbeniente +next_label=Imbeniente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pàgina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Impitica +zoom_out_label=Impitica +zoom_in.title=Ismànnia +zoom_in_label=Ismànnia +zoom.title=Ismànnia +presentation_mode.title=Cola a sa modalidade de presentatzione +presentation_mode_label=Modalidade de presentatzione +open_file.title=Aberi s'archìviu +open_file_label=Abertu +print.title=Imprenta +print_label=Imprenta +download.title=Iscàrriga +download_label=Iscàrriga +save.title=Sarva +save_label=Sarva +bookmark.title=Visualizatzione atuale (còpia o aberi in una ventana noa) +bookmark_label=Visualizatzione atuale + +# Secondary toolbar and context menu +tools.title=Istrumentos +tools_label=Istrumentos +first_page.title=Bae a sa prima pàgina +first_page_label=Bae a sa prima pàgina +last_page.title=Bae a s'ùrtima pàgina +last_page_label=Bae a s'ùrtima pàgina +page_rotate_cw.title=Gira in sensu oràriu +page_rotate_cw_label=Gira in sensu oràriu +page_rotate_ccw.title=Gira in sensu anti-oràriu +page_rotate_ccw_label=Gira in sensu anti-oràriu + +cursor_text_select_tool.title=Ativa s'aina de seletzione de testu +cursor_text_select_tool_label=Aina de seletzione de testu +cursor_hand_tool.title=Ativa s'aina de manu +cursor_hand_tool_label=Aina de manu + +scroll_page.title=Imprea s'iscurrimentu de pàgina +scroll_page_label=Iscurrimentu de pàgina +scroll_vertical.title=Imprea s'iscurrimentu verticale +scroll_vertical_label=Iscurrimentu verticale +scroll_horizontal.title=Imprea s'iscurrimentu orizontale +scroll_horizontal_label=Iscurrimentu orizontale +scroll_wrapped.title=Imprea s'iscurrimentu continu +scroll_wrapped_label=Iscurrimentu continu + + +# Document properties dialog box +document_properties.title=Propiedades de su documentu… +document_properties_label=Propiedades de su documentu… +document_properties_file_name=Nòmine de s'archìviu: +document_properties_file_size=Mannària de s'archìviu: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Tìtulu: +document_properties_author=Autoria: +document_properties_subject=Ogetu: +document_properties_keywords=Faeddos crae: +document_properties_creation_date=Data de creatzione: +document_properties_modification_date=Data de modìfica: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creatzione: +document_properties_producer=Produtore de PDF: +document_properties_version=Versione de PDF: +document_properties_page_count=Contu de pàginas: +document_properties_page_size=Mannària de sa pàgina: +document_properties_page_size_unit_inches=pòddighes +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=verticale +document_properties_page_size_orientation_landscape=orizontale +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Lìtera +document_properties_page_size_name_legal=Legale +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Visualizatzione web lestra: +document_properties_linearized_yes=Eja +document_properties_linearized_no=Nono +document_properties_close=Serra + +print_progress_message=Aparitzende s'imprenta de su documentu… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cantzella + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Ativa/disativa sa barra laterale +toggle_sidebar_notification2.title=Ativa/disativa sa barra laterale (su documentu cuntenet un'ischema, alligongiados o livellos) +toggle_sidebar_label=Ativa/disativa sa barra laterale +document_outline_label=Ischema de su documentu +attachments.title=Ammustra alligongiados +attachments_label=Alliongiados +layers.title=Ammustra livellos (clic dòpiu pro ripristinare totu is livellos a s'istadu predefinidu) +layers_label=Livellos +thumbs.title=Ammustra miniaturas +thumbs_label=Miniaturas +current_outline_item.title=Agata s'elementu atuale de s'ischema +current_outline_item_label=Elementu atuale de s'ischema +findbar.title=Agata in su documentu +findbar_label=Agata + +additional_layers=Livellos additzionales +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Pàgina {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pàgina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de sa pàgina {{page}} + +# Find panel button title and messages +find_input.title=Agata +find_input.placeholder=Agata in su documentu… +find_previous.title=Agata s'ocurrèntzia pretzedente de sa fràsia +find_previous_label=S'ischeda chi b'est primu +find_next.title=Agata s'ocurrèntzia imbeniente de sa fràsia +find_next_label=Imbeniente +find_highlight=Evidèntzia totu +find_match_case_label=Distinghe intre majùsculas e minùsculas +find_match_diacritics_label=Respeta is diacrìticos +find_entire_word_label=Faeddos intreos +find_reached_top=S'est lòmpidu a su cumintzu de su documentu, si sighit dae su bàsciu +find_reached_bottom=Acabbu de su documentu, si sighit dae s'artu +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} dae {{total}} currispondèntzia +find_match_count[two]={{current}} dae {{total}} currispondèntzias +find_match_count[few]={{current}} dae {{total}} currispondèntzias +find_match_count[many]={{current}} dae {{total}} currispondèntzias +find_match_count[other]={{current}} dae {{total}} currispondèntzias +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Prus de {{limit}} currispondèntzias +find_match_count_limit[one]=Prus de {{limit}} currispondèntzia +find_match_count_limit[two]=Prus de {{limit}} currispondèntzias +find_match_count_limit[few]=Prus de {{limit}} currispondèntzias +find_match_count_limit[many]=Prus de {{limit}} currispondèntzias +find_match_count_limit[other]=Prus de {{limit}} currispondèntzias +find_not_found=Testu no agatadu + +# Error panel labels +error_more_info=Àteras informatziones +error_less_info=Prus pagu informatziones +error_close=Serra +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Messàgiu: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archìviu: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lìnia: {{line}} + +# Predefined zoom values +page_scale_auto=Ingrandimentu automàticu +page_scale_actual=Mannària reale +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Carrighende… +loading_error=Faddina in sa càrriga de su PDF. +invalid_file_error=Archìviu PDF non vàlidu o corrùmpidu. +missing_file_error=Ammancat s'archìviu PDF. +unexpected_response_error=Risposta imprevista de su serbidore. + +rendering_error=Faddina in sa visualizatzione de sa pàgina. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_label=Inserta sa crae pro abèrrere custu archìviu PDF. +password_invalid=Sa crae no est curreta. Torra·bi a proare. +password_ok=Andat bene +password_cancel=Cantzella + +printing_not_supported=Atentzione: s'imprenta no est funtzionende de su totu in custu navigadore. +printing_not_ready=Atentzione: su PDF no est istadu carrigadu de su totu pro s'imprenta. +web_fonts_disabled=Is tipografias web sunt disativadas: is tipografias incrustadas a su PDF non podent èssere impreadas. + +# Editor +editor_free_text2.title=Testu +editor_free_text2_label=Testu +editor_ink2.title=Disinnu +editor_ink2_label=Disinnu + +free_text2_default_content=Cumintza a iscrìere… + +# Editor Parameters +editor_free_text_color=Colore +editor_free_text_size=Mannària +editor_ink_color=Colore + +# Editor aria +editor_free_text2_aria_label=Editore de testu +editor_ink2_aria_label=Editore de disinnos +editor_ink_canvas_aria_label=Immàgine creada dae s’utente diff --git a/src/assets/pdf-annotation/web/locale/scn/viewer.properties b/src/assets/pdf-annotation/web/locale/scn/viewer.properties new file mode 100755 index 0000000..e9a650a --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/scn/viewer.properties @@ -0,0 +1,101 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Cchiù nicu +zoom_out_label=Cchiù nicu +zoom_in.title=Cchiù granni +zoom_in_label=Cchiù granni + +# Secondary toolbar and context menu + + + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Vista web lesta: +document_properties_linearized_yes=Se + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_close=Sfai + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. + +# Error panel labels +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number + +# Predefined zoom values +page_scale_width=Larghizza dâ pàggina +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_cancel=Sfai + diff --git a/src/assets/pdf-annotation/web/locale/sco/viewer.properties b/src/assets/pdf-annotation/web/locale/sco/viewer.properties new file mode 100755 index 0000000..3cc9935 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sco/viewer.properties @@ -0,0 +1,249 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Page Afore +previous_label=Previous +next.title=Page Efter +next_label=Neist + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Page +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=o {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} o {{pagesCount}}) + +zoom_out.title=Zoom Oot +zoom_out_label=Zoom Oot +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Flit tae Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Prent +print_label=Prent +download.title=Doonload +download_label=Doonload +bookmark.title=View the noo (copy or open in new windae) +bookmark_label=View The Noo + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Gang tae First Page +first_page_label=Gang tae First Page +last_page.title=Gang tae Lest Page +last_page_label=Gang tae Lest Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Coonterclockwise +page_rotate_ccw_label=Rotate Coonterclockwise + +cursor_text_select_tool.title=Enable Text Walin Tool +cursor_text_select_tool_label=Text Walin Tool +cursor_hand_tool.title=Enable Haun Tool +cursor_hand_tool_label=Haun Tool + +scroll_vertical.title=Yaise Vertical Scrollin +scroll_vertical_label=Vertical Scrollin +scroll_horizontal.title=Yaise Horizontal Scrollin +scroll_horizontal_label=Horizontal Scrollin +scroll_wrapped.title=Yaise Wrapped Scrollin +scroll_wrapped_label=Wrapped Scrollin + +spread_none.title=Dinnae jyn page spreids +spread_none_label=Nae Spreids +spread_odd.title=Jyn page spreids stertin wi odd-numbered pages +spread_odd_label=Odd Spreids +spread_even.title=Jyn page spreids stertin wi even-numbered pages +spread_even_label=Even Spreids + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File nemme: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subjeck: +document_properties_keywords=Keywirds: +document_properties_creation_date=Date o Makkin: +document_properties_modification_date=Date o Chynges: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Makker: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Coont: +document_properties_page_size=Page Size: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portrait +document_properties_page_size_orientation_landscape=landscape +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Wab View: +document_properties_linearized_yes=Aye +document_properties_linearized_no=Naw +document_properties_close=Sneck + +print_progress_message=Reddin document fur prentin… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Stap + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebaur +toggle_sidebar_notification2.title=Toggle Sidebaur (document conteens ootline/attachments/layers) +toggle_sidebar_label=Toggle Sidebaur +document_outline.title=Kythe Document Ootline (double-click fur tae oot-fauld/in-fauld aw items) +document_outline_label=Document Ootline +attachments.title=Kythe Attachments +attachments_label=Attachments +layers.title=Kythe Layers (double-click fur tae reset aw layers tae the staunart state) +layers_label=Layers +thumbs.title=Kythe Thumbnails +thumbs_label=Thumbnails +current_outline_item.title=Find Current Ootline Item +current_outline_item_label=Current Ootline Item +findbar.title=Find in Document +findbar_label=Find + +additional_layers=Mair Layers +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Page {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail o Page {{page}} + +# Find panel button title and messages +find_input.title=Find +find_input.placeholder=Find in document… +find_previous.title=Airt oot the last time this phrase occurred +find_previous_label=Previous +find_next.title=Airt oot the neist time this phrase occurs +find_next_label=Neist +find_highlight=Highlicht aw +find_match_case_label=Match case +find_entire_word_label=Hale Wirds +find_reached_top=Raxed tap o document, went on fae the dowp end +find_reached_bottom=Raxed end o document, went on fae the tap +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} o {{total}} match +find_match_count[two]={{current}} o {{total}} matches +find_match_count[few]={{current}} o {{total}} matches +find_match_count[many]={{current}} o {{total}} matches +find_match_count[other]={{current}} o {{total}} matches +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mair nor {{limit}} matches +find_match_count_limit[one]=Mair nor {{limit}} match +find_match_count_limit[two]=Mair nor {{limit}} matches +find_match_count_limit[few]=Mair nor {{limit}} matches +find_match_count_limit[many]=Mair nor {{limit}} matches +find_match_count_limit[other]=Mair nor {{limit}} matches +find_not_found=Phrase no fund + +# Error panel labels +error_more_info=Mair Information +error_less_info=Less Information +error_close=Sneck +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} +rendering_error=A mishanter tuik place while renderin the page. + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Loadin… +loading_error=An mishanter tuik place while loadin the PDF. +invalid_file_error=No suithfest or camshauchlet PDF file. +missing_file_error=PDF file tint. +unexpected_response_error=Unexpectit server repone. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Inpit the passwird fur tae open this PDF file. +password_invalid=Passwird no suithfest. Gonnae gie it anither shot. +password_ok=OK +password_cancel=Stap + +printing_not_supported=Tak tent: Prentin isnae richt supportit by this stravaiger. +printing_not_ready=Tak tent: The PDF isnae richt loadit fur prentin. +web_fonts_disabled=Wab fonts are disabled: cannae yaise embeddit PDF fonts. + diff --git a/src/assets/pdf-annotation/web/locale/si/viewer.properties b/src/assets/pdf-annotation/web/locale/si/viewer.properties new file mode 100755 index 0000000..04dfaf4 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/si/viewer.properties @@ -0,0 +1,237 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=කලින් පිටුව +previous_label=කලින් +next.title=ඊළඟ පිටුව +next_label=ඊළඟ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=පිටුව +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=කුඩාලනය +zoom_out_label=කුඩාලනය +zoom_in.title=විශාලනය +zoom_in_label=විශාලනය +zoom.title=විශාල කරන්න +presentation_mode.title=සමර්පණ ප්‍රකාරය වෙත මාරුවන්න +presentation_mode_label=සමර්පණ ප්‍රකාරය +open_file.title=ගොනුව අරින්න +open_file_label=අරින්න +print.title=මුද්‍රණය +print_label=මුද්‍රණය +download.title=බාගන්න +download_label=බාගන්න +bookmark.title=වත්මන් දැක්ම (පිටපත් කරන්න හෝ නව කවුළුවක අරින්න) +bookmark_label=වත්මන් දැක්ම + +# Secondary toolbar and context menu +tools.title=මෙවලම් +tools_label=මෙවලම් +first_page.title=මුල් පිටුවට යන්න +first_page_label=මුල් පිටුවට යන්න +last_page.title=අවසන් පිටුවට යන්න +last_page_label=අවසන් පිටුවට යන්න + +cursor_text_select_tool.title=පෙළ තේරීමේ මෙවලම සබල කරන්න +cursor_text_select_tool_label=පෙළ තේරීමේ මෙවලම +cursor_hand_tool.title=අත් මෙවලම සබල කරන්න +cursor_hand_tool_label=අත් මෙවලම + +scroll_page.title=පිටුව අනුචලනය භාවිතය +scroll_page_label=පිටුව අනුචලනය +scroll_vertical.title=සිරස් අනුචලනය භාවිතය +scroll_vertical_label=සිරස් අනුචලනය +scroll_horizontal.title=තිරස් අනුචලනය භාවිතය +scroll_horizontal_label=තිරස් අනුචලනය + + +# Document properties dialog box +document_properties.title=ලේඛනයේ ගුණාංග… +document_properties_label=ලේඛනයේ ගුණාංග… +document_properties_file_name=ගොනුවේ නම: +document_properties_file_size=ගොනුවේ ප්‍රමාණය: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb=කි.බ. {{size_kb}} (බයිට {{size_b}}) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb=මෙ.බ. {{size_mb}} (බයිට {{size_b}}) +document_properties_title=සිරැසිය: +document_properties_author=කතෘ: +document_properties_subject=මාතෘකාව: +document_properties_keywords=මූල පද: +document_properties_creation_date=සෑදූ දිනය: +document_properties_modification_date=සංශෝධිත දිනය: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=නිර්මාතෘ: +document_properties_producer=පීඩීඑෆ් සම්පාදක: +document_properties_version=පීඩීඑෆ් අනුවාදය: +document_properties_page_count=පිටු ගණන: +document_properties_page_size=පිටුවේ තරම: +document_properties_page_size_unit_inches=අඟල් +document_properties_page_size_unit_millimeters=මි.මී. +document_properties_page_size_orientation_portrait=සිරස් +document_properties_page_size_orientation_landscape=තිරස් +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}}×{{height}}{{unit}}{{name}}{{orientation}} +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=වේගවත් වියමන දැක්ම: +document_properties_linearized_yes=ඔව් +document_properties_linearized_no=නැහැ +document_properties_close=වසන්න + +print_progress_message=මුද්‍රණය සඳහා ලේඛනය සූදානම් වෙමින්… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=අවලංගු කරන්න + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +document_outline_label=ලේඛනයේ වටසන +attachments.title=ඇමුණුම් පෙන්වන්න +attachments_label=ඇමුණුම් +layers.title=ස්තර පෙන්වන්න (සියළු ස්තර පෙරනිමි තත්‍වයට යළි සැකසීමට දෙවරක් ඔබන්න) +layers_label=ස්තර +thumbs.title=සිඟිති රූ පෙන්වන්න +thumbs_label=සිඟිති රූ +findbar.title=ලේඛනයෙහි සොයන්න +findbar_label=සොයන්න + +additional_layers=අතිරේක ස්තර +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=පිටුව {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=පිටුව {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=පිටුවේ සිඟිත රූව {{page}} + +# Find panel button title and messages +find_input.title=සොයන්න +find_input.placeholder=ලේඛනයේ සොයන්න… +find_previous.title=මෙම වැකිකඩ කලින් යෙදුණු ස්ථානය සොයන්න +find_previous_label=කලින් +find_next.title=මෙම වැකිකඩ ඊළඟට යෙදෙන ස්ථානය සොයන්න +find_next_label=ඊළඟ +find_highlight=සියල්ල උද්දීපනය +find_entire_word_label=සමස්ත වචන +find_reached_top=ලේඛනයේ මුදුනට ළඟා විය, පහළ සිට ඉහළට +find_reached_bottom=ලේඛනයේ අවසානයට ළඟා විය, ඉහළ සිට පහළට +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit[zero]=ගැළපීම් {{limit}} කට වඩා +find_match_count_limit[two]=ගැළපුම් {{limit}} කට වඩා +find_match_count_limit[few]=ගැළපුම් {{limit}} කට වඩා +find_match_count_limit[many]=ගැළපුම් {{limit}} කට වඩා +find_match_count_limit[other]=ගැළපුම් {{limit}} කට වඩා +find_not_found=වැකිකඩ හමු නොවිණි + +# Error panel labels +error_more_info=තව තොරතුරු +error_less_info=අවම තොරතුරු +error_close=වසන්න +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=පීඩීඑෆ්.js v{{version}} (තැනීම: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=පණිවිඩය: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ගොනුව: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=පේළිය: {{line}} + +# Predefined zoom values +page_scale_width=පිටුවේ පළල +page_scale_auto=ස්වයංක්‍රීය විශාලනය +page_scale_actual=සැබෑ ප්‍රමාණය +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=පූරණය වෙමින්… +loading_error=පීඩීඑෆ් පූරණය කිරීමේදී දෝෂයක් සිදු විය. +invalid_file_error=වලංගු නොවන හෝ හානිවූ පීඩීඑෆ් ගොනුවකි. +missing_file_error=මඟහැරුණු පීඩීඑෆ් ගොනුවකි. +unexpected_response_error=අනපේක්‍ෂිත සේවාදායක ප්‍රතිචාරයකි. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_label=මෙම පීඩීඑෆ් ගොනුව විවෘත කිරීමට මුරපදය යොදන්න. +password_invalid=වැරදි මුරපදයකි. නැවත උත්සාහ කරන්න. +password_ok=හරි +password_cancel=අවලංගු + +printing_not_supported=අවවාදයයි: මෙම අතිරික්සුව මුද්‍රණය සඳහා හොඳින් සහාය නොදක්වයි. +printing_not_ready=අවවාදයයි: මුද්‍රණයට පීඩීඑෆ් ගොනුව සම්පූර්ණයෙන් පූරණය වී නැත. +web_fonts_disabled=වියමන අකුරු අබලයි: පීඩීඑෆ් වෙත කාවැද්දූ අකුරු භාවිතා කළ නොහැකිය. + +# Editor +editor_none_label=සංස්කරණය අබල කරන්න + +free_text_default_content=පෙළ යොදන්න… + +# Editor +editor_free_text2.title=පෙළ +editor_free_text2_label=පෙළ + + +# Editor Parameters +editor_free_text_color=වර්ණය +editor_free_text_size=තරම +editor_ink_color=වර්ණය +editor_ink_thickness=ඝණකම + +# Editor aria +editor_free_text_aria_label=FreeText සංස්කරකය + +# Editor aria +editor_free_text2_aria_label=වදන් සකසනය diff --git a/src/assets/pdf-annotation/web/locale/sk/viewer.properties b/src/assets/pdf-annotation/web/locale/sk/viewer.properties new file mode 100755 index 0000000..db8d7cf --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sk/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Predchádzajúca strana +previous_label=Predchádzajúca +next.title=Nasledujúca strana +next_label=Nasledujúca + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strana +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Zmenšiť veľkosť +zoom_out_label=Zmenšiť veľkosť +zoom_in.title=Zväčšiť veľkosť +zoom_in_label=Zväčšiť veľkosť +zoom.title=Nastavenie veľkosti +presentation_mode.title=Prepnúť na režim prezentácie +presentation_mode_label=Režim prezentácie +open_file.title=Otvoriť súbor +open_file_label=Otvoriť +print.title=Tlačiť +print_label=Tlačiť +download.title=Stiahnuť +download_label=Stiahnuť +save.title=Uložiť +save_label=Uložiť +bookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne) +bookmark_label=Aktuálne zobrazenie + +# Secondary toolbar and context menu +tools.title=Nástroje +tools_label=Nástroje +first_page.title=Prejsť na prvú stranu +first_page_label=Prejsť na prvú stranu +last_page.title=Prejsť na poslednú stranu +last_page_label=Prejsť na poslednú stranu +page_rotate_cw.title=Otočiť v smere hodinových ručičiek +page_rotate_cw_label=Otočiť v smere hodinových ručičiek +page_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek +page_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek + +cursor_text_select_tool.title=Povoliť výber textu +cursor_text_select_tool_label=Výber textu +cursor_hand_tool.title=Povoliť nástroj ruka +cursor_hand_tool_label=Nástroj ruka + +scroll_page.title=Použiť rolovanie po stránkach +scroll_page_label=Rolovanie po stránkach +scroll_vertical.title=Používať zvislé posúvanie +scroll_vertical_label=Zvislé posúvanie +scroll_horizontal.title=Používať vodorovné posúvanie +scroll_horizontal_label=Vodorovné posúvanie +scroll_wrapped.title=Použiť postupné posúvanie +scroll_wrapped_label=Postupné posúvanie + +spread_none.title=Nezdružovať stránky +spread_none_label=Žiadne združovanie +spread_odd.title=Združí stránky a umiestni nepárne stránky vľavo +spread_odd_label=Združiť stránky (nepárne vľavo) +spread_even.title=Združí stránky a umiestni párne stránky vľavo +spread_even_label=Združiť stránky (párne vľavo) + +# Document properties dialog box +document_properties.title=Vlastnosti dokumentu… +document_properties_label=Vlastnosti dokumentu… +document_properties_file_name=Názov súboru: +document_properties_file_size=Veľkosť súboru: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} bajtov) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtov) +document_properties_title=Názov: +document_properties_author=Autor: +document_properties_subject=Predmet: +document_properties_keywords=Kľúčové slová: +document_properties_creation_date=Dátum vytvorenia: +document_properties_modification_date=Dátum úpravy: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Vytvoril: +document_properties_producer=Tvorca PDF: +document_properties_version=Verzia PDF: +document_properties_page_count=Počet strán: +document_properties_page_size=Veľkosť stránky: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=na výšku +document_properties_page_size_orientation_landscape=na šírku +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=List +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Rýchle Web View: +document_properties_linearized_yes=Áno +document_properties_linearized_no=Nie +document_properties_close=Zavrieť + +print_progress_message=Príprava dokumentu na tlač… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Zrušiť + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Prepnúť bočný panel +toggle_sidebar_notification2.title=Prepnúť bočný panel (dokument obsahuje osnovu/prílohy/vrstvy) +toggle_sidebar_label=Prepnúť bočný panel +document_outline.title=Zobraziť osnovu dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky) +document_outline_label=Osnova dokumentu +attachments.title=Zobraziť prílohy +attachments_label=Prílohy +layers.title=Zobraziť vrstvy (dvojitým kliknutím uvediete všetky vrstvy do pôvodného stavu) +layers_label=Vrstvy +thumbs.title=Zobraziť miniatúry +thumbs_label=Miniatúry +current_outline_item.title=Nájsť aktuálnu položku v osnove +current_outline_item_label=Aktuálna položka v osnove +findbar.title=Hľadať v dokumente +findbar_label=Hľadať + +additional_layers=Ďalšie vrstvy +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Strana {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strana {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatúra strany {{page}} + +# Find panel button title and messages +find_input.title=Hľadať +find_input.placeholder=Hľadať v dokumente… +find_previous.title=Vyhľadať predchádzajúci výskyt reťazca +find_previous_label=Predchádzajúce +find_next.title=Vyhľadať ďalší výskyt reťazca +find_next_label=Ďalšie +find_highlight=Zvýrazniť všetky +find_match_case_label=Rozlišovať veľkosť písmen +find_match_diacritics_label=Rozlišovať diakritiku +find_entire_word_label=Celé slová +find_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca +find_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}}. z {{total}} výsledku +find_match_count[two]={{current}}. z {{total}} výsledkov +find_match_count[few]={{current}}. z {{total}} výsledkov +find_match_count[many]={{current}}. z {{total}} výsledkov +find_match_count[other]={{current}}. z {{total}} výsledkov +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Viac než {{limit}} výsledkov +find_match_count_limit[one]=Viac než {{limit}} výsledok +find_match_count_limit[two]=Viac než {{limit}} výsledky +find_match_count_limit[few]=Viac než {{limit}} výsledky +find_match_count_limit[many]=Viac než {{limit}} výsledkov +find_match_count_limit[other]=Viac než {{limit}} výsledkov +find_not_found=Výraz nebol nájdený + +# Error panel labels +error_more_info=Ďalšie informácie +error_less_info=Menej informácií +error_close=Zavrieť +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (zostavenie: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Správa: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Zásobník: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Súbor: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Riadok: {{line}} + +# Predefined zoom values +page_scale_width=Na šírku strany +page_scale_fit=Na veľkosť strany +page_scale_auto=Automatická veľkosť +page_scale_actual=Skutočná veľkosť +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Načítava sa… +loading_error=Počas načítavania dokumentu PDF sa vyskytla chyba. +invalid_file_error=Neplatný alebo poškodený súbor PDF. +missing_file_error=Chýbajúci súbor PDF. +unexpected_response_error=Neočakávaná odpoveď zo servera. + +rendering_error=Pri vykresľovaní stránky sa vyskytla chyba. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotácia typu {{type}}] +password_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo. +password_invalid=Heslo nie je platné. Skúste to znova. +password_ok=OK +password_cancel=Zrušiť + +printing_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná. +printing_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač. +web_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Kreslenie +editor_ink2_label=Kresliť + +free_text2_default_content=Začnite písať… + +# Editor Parameters +editor_free_text_color=Farba +editor_free_text_size=Veľkosť +editor_ink_color=Farba +editor_ink_thickness=Hrúbka +editor_ink_opacity=Priehľadnosť + +# Editor aria +editor_free_text2_aria_label=Textový editor +editor_ink2_aria_label=Editor kreslenia +editor_ink_canvas_aria_label=Obrázok vytvorený používateľom diff --git a/src/assets/pdf-annotation/web/locale/sl/viewer.properties b/src/assets/pdf-annotation/web/locale/sl/viewer.properties new file mode 100755 index 0000000..c556940 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sl/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Prejšnja stran +previous_label=Nazaj +next.title=Naslednja stran +next_label=Naprej + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Stran +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=od {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} od {{pagesCount}}) + +zoom_out.title=Pomanjšaj +zoom_out_label=Pomanjšaj +zoom_in.title=Povečaj +zoom_in_label=Povečaj +zoom.title=Povečava +presentation_mode.title=Preklopi v način predstavitve +presentation_mode_label=Način predstavitve +open_file.title=Odpri datoteko +open_file_label=Odpri +print.title=Natisni +print_label=Natisni +download.title=Prenesi +download_label=Prenesi +save.title=Shrani +save_label=Shrani +bookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu) +bookmark_label=Trenutni pogled + +# Secondary toolbar and context menu +tools.title=Orodja +tools_label=Orodja +first_page.title=Pojdi na prvo stran +first_page_label=Pojdi na prvo stran +last_page.title=Pojdi na zadnjo stran +last_page_label=Pojdi na zadnjo stran +page_rotate_cw.title=Zavrti v smeri urnega kazalca +page_rotate_cw_label=Zavrti v smeri urnega kazalca +page_rotate_ccw.title=Zavrti v nasprotni smeri urnega kazalca +page_rotate_ccw_label=Zavrti v nasprotni smeri urnega kazalca + +cursor_text_select_tool.title=Omogoči orodje za izbor besedila +cursor_text_select_tool_label=Orodje za izbor besedila +cursor_hand_tool.title=Omogoči roko +cursor_hand_tool_label=Roka + +scroll_page.title=Uporabi drsenje po strani +scroll_page_label=Drsenje po strani +scroll_vertical.title=Uporabi navpično drsenje +scroll_vertical_label=Navpično drsenje +scroll_horizontal.title=Uporabi vodoravno drsenje +scroll_horizontal_label=Vodoravno drsenje +scroll_wrapped.title=Uporabi ovito drsenje +scroll_wrapped_label=Ovito drsenje + +spread_none.title=Ne združuj razponov strani +spread_none_label=Brez razponov +spread_odd.title=Združuj razpone strani z začetkom pri lihih straneh +spread_odd_label=Lihi razponi +spread_even.title=Združuj razpone strani z začetkom pri sodih straneh +spread_even_label=Sodi razponi + +# Document properties dialog box +document_properties.title=Lastnosti dokumenta … +document_properties_label=Lastnosti dokumenta … +document_properties_file_name=Ime datoteke: +document_properties_file_size=Velikost datoteke: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtov) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtov) +document_properties_title=Ime: +document_properties_author=Avtor: +document_properties_subject=Tema: +document_properties_keywords=Ključne besede: +document_properties_creation_date=Datum nastanka: +document_properties_modification_date=Datum spremembe: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Ustvaril: +document_properties_producer=Izdelovalec PDF: +document_properties_version=Različica PDF: +document_properties_page_count=Število strani: +document_properties_page_size=Velikost strani: +document_properties_page_size_unit_inches=palcev +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=pokončno +document_properties_page_size_orientation_landscape=ležeče +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Pismo +document_properties_page_size_name_legal=Pravno +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Hitri spletni ogled: +document_properties_linearized_yes=Da +document_properties_linearized_no=Ne +document_properties_close=Zapri + +print_progress_message=Priprava dokumenta na tiskanje … +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Prekliči + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Preklopi stransko vrstico +toggle_sidebar_notification2.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke/plasti) +toggle_sidebar_label=Preklopi stransko vrstico +document_outline.title=Prikaži oris dokumenta (dvokliknite za razširitev/strnitev vseh predmetov) +document_outline_label=Oris dokumenta +attachments.title=Prikaži priponke +attachments_label=Priponke +layers.title=Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje) +layers_label=Plasti +thumbs.title=Prikaži sličice +thumbs_label=Sličice +current_outline_item.title=Najdi trenutni predmet orisa +current_outline_item_label=Trenutni predmet orisa +findbar.title=Iskanje po dokumentu +findbar_label=Najdi + +additional_layers=Dodatne plasti +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Stran {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Stran {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Sličica strani {{page}} + +# Find panel button title and messages +find_input.title=Najdi +find_input.placeholder=Najdi v dokumentu … +find_previous.title=Najdi prejšnjo ponovitev iskanega +find_previous_label=Najdi nazaj +find_next.title=Najdi naslednjo ponovitev iskanega +find_next_label=Najdi naprej +find_highlight=Označi vse +find_match_case_label=Razlikuj velike/male črke +find_match_diacritics_label=Razlikuj diakritične znake +find_entire_word_label=Cele besede +find_reached_top=Dosežen začetek dokumenta iz smeri konca +find_reached_bottom=Doseženo konec dokumenta iz smeri začetka +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=Zadetek {{current}} od {{total}} +find_match_count[two]=Zadetek {{current}} od {{total}} +find_match_count[few]=Zadetek {{current}} od {{total}} +find_match_count[many]=Zadetek {{current}} od {{total}} +find_match_count[other]=Zadetek {{current}} od {{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Več kot {{limit}} zadetkov +find_match_count_limit[one]=Več kot {{limit}} zadetek +find_match_count_limit[two]=Več kot {{limit}} zadetka +find_match_count_limit[few]=Več kot {{limit}} zadetki +find_match_count_limit[many]=Več kot {{limit}} zadetkov +find_match_count_limit[other]=Več kot {{limit}} zadetkov +find_not_found=Iskanega ni mogoče najti + +# Error panel labels +error_more_info=Več informacij +error_less_info=Manj informacij +error_close=Zapri +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js r{{version}} (graditev: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Sporočilo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Sklad: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datoteka: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Vrstica: {{line}} + +# Predefined zoom values +page_scale_width=Širina strani +page_scale_fit=Prilagodi stran +page_scale_auto=Samodejno +page_scale_actual=Dejanska velikost +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading=Nalaganje … +loading_error=Med nalaganjem datoteke PDF je prišlo do napake. +invalid_file_error=Neveljavna ali pokvarjena datoteka PDF. +missing_file_error=Ni datoteke PDF. +unexpected_response_error=Nepričakovan odgovor strežnika. + +rendering_error=Med pripravljanjem strani je prišlo do napake! + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Opomba vrste {{type}}] +password_label=Vnesite geslo za odpiranje te datoteke PDF. +password_invalid=Neveljavno geslo. Poskusite znova. +password_ok=V redu +password_cancel=Prekliči + +printing_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja. +printing_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje. +web_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti. + +# Editor +editor_free_text2.title=Besedilo +editor_free_text2_label=Besedilo +editor_ink2.title=Riši +editor_ink2_label=Riši + +free_text2_default_content=Začnite tipkati … + +# Editor Parameters +editor_free_text_color=Barva +editor_free_text_size=Velikost +editor_ink_color=Barva +editor_ink_thickness=Debelina +editor_ink_opacity=Neprosojnost + +# Editor aria +editor_free_text2_aria_label=Urejevalnik besedila +editor_ink2_aria_label=Urejevalnik risanja +editor_ink_canvas_aria_label=Uporabnikova slika diff --git a/src/assets/pdf-annotation/web/locale/son/viewer.properties b/src/assets/pdf-annotation/web/locale/son/viewer.properties new file mode 100755 index 0000000..d4b0d24 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/son/viewer.properties @@ -0,0 +1,173 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Moo bisante +previous_label=Bisante +next.title=Jinehere moo +next_label=Jine + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Moo +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ra +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} ka hun {{pagesCount}}) ra + +zoom_out.title=Nakasandi +zoom_out_label=Nakasandi +zoom_in.title=Bebbeerandi +zoom_in_label=Bebbeerandi +zoom.title=Bebbeerandi +presentation_mode.title=Bere cebeyan alhaali +presentation_mode_label=Cebeyan alhaali +open_file.title=Tuku feeri +open_file_label=Feeri +print.title=Kar +print_label=Kar +download.title=Zumandi +download_label=Zumandi +bookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra) +bookmark_label=Sohõ gunaroo + +# Secondary toolbar and context menu +tools.title=Goyjinawey +tools_label=Goyjinawey +first_page.title=Koy moo jinaa ga +first_page_label=Koy moo jinaa ga +last_page.title=Koy moo koraa ga +last_page_label=Koy moo koraa ga +page_rotate_cw.title=Kuubi kanbe guma here +page_rotate_cw_label=Kuubi kanbe guma here +page_rotate_ccw.title=Kuubi kanbe wowa here +page_rotate_ccw_label=Kuubi kanbe wowa here + + +# Document properties dialog box +document_properties.title=Takadda mayrawey… +document_properties_label=Takadda mayrawey… +document_properties_file_name=Tuku maa: +document_properties_file_size=Tuku adadu: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}}) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}}) +document_properties_title=Tiiramaa: +document_properties_author=Hantumkaw: +document_properties_subject=Dalil: +document_properties_keywords=Kufalkalimawey: +document_properties_creation_date=Teeyan han: +document_properties_modification_date=Barmayan han: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Teekaw: +document_properties_producer=PDF berandikaw: +document_properties_version=PDF dumi: +document_properties_page_count=Moo hinna: +document_properties_close=Daabu + +print_progress_message=Goo ma takaddaa soolu k'a kar se… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Naŋ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Kanjari ceraw zuu +toggle_sidebar_label=Kanjari ceraw zuu +document_outline.title=Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi) +document_outline_label=Takadda filla-boŋ +attachments.title=Hangarey cebe +attachments_label=Hangarey +thumbs.title=Kabeboy biyey cebe +thumbs_label=Kabeboy biyey +findbar.title=Ceeci takaddaa ra +findbar_label=Ceeci + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} moo +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Kabeboy bii {{page}} moo še + +# Find panel button title and messages +find_input.title=Ceeci +find_input.placeholder=Ceeci takaddaa ra… +find_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci +find_previous_label=Bisante +find_next.title=Kalimaɲaŋoo hiino bangayroo ceeci +find_next_label=Jine +find_highlight=Ikul šilbay +find_match_case_label=Harfu-beeriyan hawgay +find_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo +find_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga +find_not_found=Kalimaɲaa mana duwandi + +# Error panel labels +error_more_info=Alhabar tontoni +error_less_info=Alhabar tontoni +error_close=Daabu +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Alhabar: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Dekeri: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Tuku: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Žeeri: {{line}} +rendering_error=Firka bangay kaŋ moɲoo goo ma willandi. + +# Predefined zoom values +page_scale_width=Mooo hayyan +page_scale_fit=Moo sawayan +page_scale_auto=Boŋše azzaati barmayyan +page_scale_actual=Adadu cimi +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Firka bangay kaŋ PDF goo ma zumandi. +invalid_file_error=PDF tuku laala wala laybante. +missing_file_error=PDF tuku kumante. +unexpected_response_error=Manti feršikaw tuuruyan maatante. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt={{type}} maasa-caw] +password_label=Šennikufal dam ka PDF tukoo woo feeri. +password_invalid=Šennikufal laalo. Ceeci koyne taare. +password_ok=Ayyo +password_cancel=Naŋ + +printing_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo. +printing_not_ready=Yaamar: PDF ši zunbu ka timme karyan še. +web_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey. + diff --git a/src/assets/pdf-annotation/web/locale/sq/viewer.properties b/src/assets/pdf-annotation/web/locale/sq/viewer.properties new file mode 100755 index 0000000..0e1d4d6 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sq/viewer.properties @@ -0,0 +1,267 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Faqja e Mëparshme +previous_label=E mëparshmja +next.title=Faqja Pasuese +next_label=Pasuesja + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Faqe +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=nga {{pagesCount}} gjithsej +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} nga {{pagesCount}}) + +zoom_out.title=Zvogëlojeni +zoom_out_label=Zvogëlojeni +zoom_in.title=Zmadhojeni +zoom_in_label=Zmadhojini +zoom.title=Zoom +presentation_mode.title=Kalo te Mënyra Paraqitje +presentation_mode_label=Mënyra Paraqitje +open_file.title=Hapni Kartelë +open_file_label=Hape +print.title=Shtypje +print_label=Shtype +download.title=Shkarkim +download_label=Shkarkoje +save.title=Ruaje +save_label=Ruaje +bookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re) +bookmark_label=Pamja e Tanishme + +# Secondary toolbar and context menu +tools.title=Mjete +tools_label=Mjete +first_page.title=Kaloni te Faqja e Parë +first_page_label=Kaloni te Faqja e Parë +last_page.title=Kaloni te Faqja e Fundit +last_page_label=Kaloni te Faqja e Fundit +page_rotate_cw.title=Rrotullojeni Në Kahun Orar +page_rotate_cw_label=Rrotulloje Në Kahun Orar +page_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar +page_rotate_ccw_label=Rrotulloje Në Kahun Kundërorar + +cursor_text_select_tool.title=Aktivizo Mjet Përzgjedhjeje Teksti +cursor_text_select_tool_label=Mjet Përzgjedhjeje Teksti +cursor_hand_tool.title=Aktivizo Mjetin Dorë +cursor_hand_tool_label=Mjeti Dorë + +scroll_page.title=Përdor Rrëshqitje Në Faqe +scroll_page_label=Rrëshqitje Në Faqe +scroll_vertical.title=Përdor Rrëshqitje Vertikale +scroll_vertical_label=Rrëshqitje Vertikale +scroll_horizontal.title=Përdor Rrëshqitje Horizontale +scroll_horizontal_label=Rrëshqitje Horizontale +scroll_wrapped.title=Përdor Rrëshqitje Me Mbështjellje +scroll_wrapped_label=Rrëshqitje Me Mbështjellje + + +# Document properties dialog box +document_properties.title=Veti Dokumenti… +document_properties_label=Veti Dokumenti… +document_properties_file_name=Emër kartele: +document_properties_file_size=Madhësi kartele: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajte) +document_properties_title=Titull: +document_properties_author=Autor: +document_properties_subject=Subjekt: +document_properties_keywords=Fjalëkyçe: +document_properties_creation_date=Datë Krijimi: +document_properties_modification_date=Datë Ndryshimi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Krijues: +document_properties_producer=Prodhues PDF-je: +document_properties_version=Version PDF-je: +document_properties_page_count=Numër Faqesh: +document_properties_page_size=Madhësi Faqeje: +document_properties_page_size_unit_inches=inç +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=portret +document_properties_page_size_orientation_landscape=së gjeri +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Parje e Shpjetë në Web: +document_properties_linearized_yes=Po +document_properties_linearized_no=Jo +document_properties_close=Mbylleni + +print_progress_message=Po përgatitet dokumenti për shtypje… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Anuloje + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Shfaqni/Fshihni Anështyllën +toggle_sidebar_notification2.title=Hap/Mbyll Anështylë (dokumenti përmban përvijim/nashkëngjitje/shtresa) +toggle_sidebar_label=Shfaq/Fshih Anështyllën +document_outline.title=Shfaqni Përvijim Dokumenti (dyklikoni që të shfaqen/fshihen krejt elementët) +document_outline_label=Përvijim Dokumenti +attachments.title=Shfaqni Bashkëngjitje +attachments_label=Bashkëngjitje +layers.title=Shfaq Shtresa (dyklikoni që të rikthehen krejt shtresat në gjendjen e tyre parazgjedhje) +layers_label=Shtresa +thumbs.title=Shfaqni Miniatura +thumbs_label=Miniatura +current_outline_item.title=Gjej Objektin e Tanishëm të Përvijuar +current_outline_item_label=Objekt i Tanishëm i Përvijuar +findbar.title=Gjeni në Dokument +findbar_label=Gjej + +additional_layers=Shtresa Shtesë +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Faqja {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Faqja {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniaturë e Faqes {{page}} + +# Find panel button title and messages +find_input.title=Gjej +find_input.placeholder=Gjeni në dokument… +find_previous.title=Gjeni hasjen e mëparshme të togfjalëshit +find_previous_label=E mëparshmja +find_next.title=Gjeni hasjen pasuese të togfjalëshit +find_next_label=Pasuesja +find_highlight=Theksoji të tëra +find_match_case_label=Siç është shkruar +find_entire_word_label=Krejt fjalët +find_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit +find_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} nga {{total}} përputhje gjithsej +find_match_count[two]={{current}} nga {{total}} përputhje gjithsej +find_match_count[few]={{current}} nga {{total}} përputhje gjithsej +find_match_count[many]={{current}} nga {{total}} përputhje gjithsej +find_match_count[other]={{current}} nga {{total}} përputhje gjithsej +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Më shumë se {{limit}} përputhje +find_match_count_limit[one]=Më shumë se {{limit}} përputhje +find_match_count_limit[two]=Më shumë se {{limit}} përputhje +find_match_count_limit[few]=Më shumë se {{limit}} përputhje +find_match_count_limit[many]=Më shumë se {{limit}} përputhje +find_match_count_limit[other]=Më shumë se {{limit}} përputhje +find_not_found=Togfjalësh që s’gjendet + +# Error panel labels +error_more_info=Më Tepër të Dhëna +error_less_info=Më Pak të Dhëna +error_close=Mbylleni +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesazh: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Kartelë: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rresht: {{line}} + +# Predefined zoom values +page_scale_width=Gjerësi Faqeje +page_scale_fit=Sa Nxë Faqja +page_scale_auto=Zoom i Vetvetishëm +page_scale_actual=Madhësia Faktike +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Po ngarkohet… +loading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së. +invalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar. +missing_file_error=Kartelë PDF që mungon. +unexpected_response_error=Përgjigje shërbyesi e papritur. + +rendering_error=Ndodhi një gabim gjatë riprodhimit të faqes. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Nënvizim {{type}}] +password_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF. +password_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni. +password_ok=OK +password_cancel=Anuloje + +printing_not_supported=Kujdes: Shtypja s’mbulohet plotësisht nga ky shfletues. +printing_not_ready=Kujdes: PDF-ja s’është ngarkuar plotësisht që ta shtypni. +web_fonts_disabled=Shkronjat Web janë të çaktivizuara: s’arrihet të përdoren shkronja të trupëzuara në PDF. + +# Editor +editor_free_text2.title=Tekst +editor_free_text2_label=Tekst +editor_ink2.title=Vizatoni +editor_ink2_label=Vizatoni + +free_text2_default_content=Filloni të shtypni… + +# Editor Parameters +editor_free_text_color=Ngjyrë +editor_free_text_size=Madhësi +editor_ink_color=Ngjyrë +editor_ink_thickness=Trashësi +editor_ink_opacity=Patejdukshmëri + +# Editor aria +editor_free_text2_aria_label=Përpunues Tekstesh +editor_ink2_aria_label=Përpunues Vizatimesh +editor_ink_canvas_aria_label=Figurë e krijuar nga përdoruesi diff --git a/src/assets/pdf-annotation/web/locale/sr/viewer.properties b/src/assets/pdf-annotation/web/locale/sr/viewer.properties new file mode 100755 index 0000000..0b95dcf --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sr/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Претходна страница +previous_label=Претходна +next.title=Следећа страница +next_label=Следећа + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Страница +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=од {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} од {{pagesCount}}) + +zoom_out.title=Умањи +zoom_out_label=Умањи +zoom_in.title=Увеличај +zoom_in_label=Увеличај +zoom.title=Увеличавање +presentation_mode.title=Промени на приказ у режиму презентације +presentation_mode_label=Режим презентације +open_file.title=Отвори датотеку +open_file_label=Отвори +print.title=Штампај +print_label=Штампај +download.title=Преузми +download_label=Преузми +save.title=Сачувај +save_label=Сачувај +bookmark.title=Тренутни приказ (копирај или отвори у новом прозору) +bookmark_label=Тренутни приказ + +# Secondary toolbar and context menu +tools.title=Алатке +tools_label=Алатке +first_page.title=Иди на прву страницу +first_page_label=Иди на прву страницу +last_page.title=Иди на последњу страницу +last_page_label=Иди на последњу страницу +page_rotate_cw.title=Ротирај у смеру казаљке на сату +page_rotate_cw_label=Ротирај у смеру казаљке на сату +page_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату +page_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату + +cursor_text_select_tool.title=Омогући алат за селектовање текста +cursor_text_select_tool_label=Алат за селектовање текста +cursor_hand_tool.title=Омогући алат за померање +cursor_hand_tool_label=Алат за померање + +scroll_page.title=Користи скроловање по омоту +scroll_page_label=Скроловање странице +scroll_vertical.title=Користи вертикално скроловање +scroll_vertical_label=Вертикално скроловање +scroll_horizontal.title=Користи хоризонтално скроловање +scroll_horizontal_label=Хоризонтално скроловање +scroll_wrapped.title=Користи скроловање по омоту +scroll_wrapped_label=Скроловање по омоту + +spread_none.title=Немој спајати ширења страница +spread_none_label=Без распростирања +spread_odd.title=Споји ширења страница које почињу непарним бројем +spread_odd_label=Непарна распростирања +spread_even.title=Споји ширења страница које почињу парним бројем +spread_even_label=Парна распростирања + +# Document properties dialog box +document_properties.title=Параметри документа… +document_properties_label=Параметри документа… +document_properties_file_name=Име датотеке: +document_properties_file_size=Величина датотеке: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} B) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} B) +document_properties_title=Наслов: +document_properties_author=Аутор: +document_properties_subject=Тема: +document_properties_keywords=Кључне речи: +document_properties_creation_date=Датум креирања: +document_properties_modification_date=Датум модификације: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Стваралац: +document_properties_producer=PDF произвођач: +document_properties_version=PDF верзија: +document_properties_page_count=Број страница: +document_properties_page_size=Величина странице: +document_properties_page_size_unit_inches=ин +document_properties_page_size_unit_millimeters=мм +document_properties_page_size_orientation_portrait=усправно +document_properties_page_size_orientation_landscape=водоравно +document_properties_page_size_name_a3=А3 +document_properties_page_size_name_a4=А4 +document_properties_page_size_name_letter=Слово +document_properties_page_size_name_legal=Права +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Брз веб приказ: +document_properties_linearized_yes=Да +document_properties_linearized_no=Не +document_properties_close=Затвори + +print_progress_message=Припремам документ за штампање… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Откажи + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Прикажи додатну палету +toggle_sidebar_notification2.title=Прикажи/сакриј бочну траку (документ садржи контуру/прилоге/слојеве) +toggle_sidebar_label=Прикажи додатну палету +document_outline.title=Прикажи структуру документа (двоструким кликом проширујете/скупљате све ставке) +document_outline_label=Контура документа +attachments.title=Прикажи прилоге +attachments_label=Прилози +layers.title=Прикажи слојеве (дупли клик за враћање свих слојева у подразумевано стање) +layers_label=Слојеви +thumbs.title=Прикажи сличице +thumbs_label=Сличице +current_outline_item.title=Пронађите тренутни елемент структуре +current_outline_item_label=Тренутна контура +findbar.title=Пронађи у документу +findbar_label=Пронађи + +additional_layers=Додатни слојеви +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Страница {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Страница {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Сличица од странице {{page}} + +# Find panel button title and messages +find_input.title=Пронађи +find_input.placeholder=Пронађи у документу… +find_previous.title=Пронађи претходно појављивање фразе +find_previous_label=Претходна +find_next.title=Пронађи следеће појављивање фразе +find_next_label=Следећа +find_highlight=Истакнути све +find_match_case_label=Подударања +find_match_diacritics_label=Дијакритика +find_entire_word_label=Целе речи +find_reached_top=Достигнут врх документа, наставио са дна +find_reached_bottom=Достигнуто дно документа, наставио са врха +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} од {{total}} одговара +find_match_count[two]={{current}} од {{total}} одговара +find_match_count[few]={{current}} од {{total}} одговара +find_match_count[many]={{current}} од {{total}} одговара +find_match_count[other]={{current}} од {{total}} одговара +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Више од {{limit}} одговара +find_match_count_limit[one]=Више од {{limit}} одговара +find_match_count_limit[two]=Више од {{limit}} одговара +find_match_count_limit[few]=Више од {{limit}} одговара +find_match_count_limit[many]=Више од {{limit}} одговара +find_match_count_limit[other]=Више од {{limit}} одговара +find_not_found=Фраза није пронађена + +# Error panel labels +error_more_info=Више информација +error_less_info=Мање информација +error_close=Затвори +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Порука: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Датотека: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Линија: {{line}} + +# Predefined zoom values +page_scale_width=Ширина странице +page_scale_fit=Прилагоди страницу +page_scale_auto=Аутоматско увеличавање +page_scale_actual=Стварна величина +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Учитавање… +loading_error=Дошло је до грешке приликом учитавања PDF-а. +invalid_file_error=PDF датотека је неважећа или је оштећена. +missing_file_error=Недостаје PDF датотека. +unexpected_response_error=Неочекиван одговор од сервера. + +rendering_error=Дошло је до грешке приликом рендеровања ове странице. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} коментар] +password_label=Унесите лозинку да бисте отворили овај PDF докуменат. +password_invalid=Неисправна лозинка. Покушајте поново. +password_ok=У реду +password_cancel=Откажи + +printing_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу. +printing_not_ready=Упозорење: PDF није у потпуности учитан за штампу. +web_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове. + +# Editor +editor_free_text2.title=Текст +editor_free_text2_label=Текст +editor_ink2.title=Цртај +editor_ink2_label=Цртај + +free_text2_default_content=Почни куцање… + +# Editor Parameters +editor_free_text_color=Боја +editor_free_text_size=Величина +editor_ink_color=Боја +editor_ink_thickness=Дебљина +editor_ink_opacity=Опацитет + +# Editor aria +editor_free_text2_aria_label=Уређивач текста +editor_ink2_aria_label=Уређивач цртежа +editor_ink_canvas_aria_label=Кориснички направљена слика diff --git a/src/assets/pdf-annotation/web/locale/sv-SE/viewer.properties b/src/assets/pdf-annotation/web/locale/sv-SE/viewer.properties new file mode 100755 index 0000000..78a088c --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/sv-SE/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Föregående sida +previous_label=Föregående +next.title=Nästa sida +next_label=Nästa + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Sida +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=av {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} av {{pagesCount}}) + +zoom_out.title=Zooma ut +zoom_out_label=Zooma ut +zoom_in.title=Zooma in +zoom_in_label=Zooma in +zoom.title=Zoom +presentation_mode.title=Byt till presentationsläge +presentation_mode_label=Presentationsläge +open_file.title=Öppna fil +open_file_label=Öppna +print.title=Skriv ut +print_label=Skriv ut +download.title=Hämta +download_label=Hämta +save.title=Spara +save_label=Spara +bookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster) +bookmark_label=Aktuell vy + +# Secondary toolbar and context menu +tools.title=Verktyg +tools_label=Verktyg +first_page.title=Gå till första sidan +first_page_label=Gå till första sidan +last_page.title=Gå till sista sidan +last_page_label=Gå till sista sidan +page_rotate_cw.title=Rotera medurs +page_rotate_cw_label=Rotera medurs +page_rotate_ccw.title=Rotera moturs +page_rotate_ccw_label=Rotera moturs + +cursor_text_select_tool.title=Aktivera textmarkeringsverktyg +cursor_text_select_tool_label=Textmarkeringsverktyg +cursor_hand_tool.title=Aktivera handverktyg +cursor_hand_tool_label=Handverktyg + +scroll_page.title=Använd sidrullning +scroll_page_label=Sidrullning +scroll_vertical.title=Använd vertikal rullning +scroll_vertical_label=Vertikal rullning +scroll_horizontal.title=Använd horisontell rullning +scroll_horizontal_label=Horisontell rullning +scroll_wrapped.title=Använd överlappande rullning +scroll_wrapped_label=Överlappande rullning + +spread_none.title=Visa enkelsidor +spread_none_label=Enkelsidor +spread_odd.title=Visa uppslag med olika sidnummer till vänster +spread_odd_label=Uppslag med framsida +spread_even.title=Visa uppslag med lika sidnummer till vänster +spread_even_label=Uppslag utan framsida + +# Document properties dialog box +document_properties.title=Dokumentegenskaper… +document_properties_label=Dokumentegenskaper… +document_properties_file_name=Filnamn: +document_properties_file_size=Filstorlek: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Titel: +document_properties_author=Författare: +document_properties_subject=Ämne: +document_properties_keywords=Nyckelord: +document_properties_creation_date=Skapades: +document_properties_modification_date=Ändrades: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Skapare: +document_properties_producer=PDF-producent: +document_properties_version=PDF-version: +document_properties_page_count=Sidantal: +document_properties_page_size=Pappersstorlek: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=porträtt +document_properties_page_size_orientation_landscape=landskap +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Snabb webbvisning: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Nej +document_properties_close=Stäng + +print_progress_message=Förbereder sidor för utskrift… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Avbryt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Visa/dölj sidofält +toggle_sidebar_notification2.title=Växla sidofält (dokumentet innehåller dokumentstruktur/bilagor/lager) +toggle_sidebar_label=Visa/dölj sidofält +document_outline.title=Visa dokumentdisposition (dubbelklicka för att expandera/komprimera alla objekt) +document_outline_label=Dokumentöversikt +attachments.title=Visa Bilagor +attachments_label=Bilagor +layers.title=Visa lager (dubbelklicka för att återställa alla lager till standardläge) +layers_label=Lager +thumbs.title=Visa miniatyrer +thumbs_label=Miniatyrer +current_outline_item.title=Hitta aktuellt dispositionsobjekt +current_outline_item_label=Aktuellt dispositionsobjekt +findbar.title=Sök i dokument +findbar_label=Sök + +additional_layers=Ytterligare lager +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Sida {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Sida {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatyr av sida {{page}} + +# Find panel button title and messages +find_input.title=Sök +find_input.placeholder=Sök i dokument… +find_previous.title=Hitta föregående förekomst av frasen +find_previous_label=Föregående +find_next.title=Hitta nästa förekomst av frasen +find_next_label=Nästa +find_highlight=Markera alla +find_match_case_label=Matcha versal/gemen +find_match_diacritics_label=Matcha diakritiska tecken +find_entire_word_label=Hela ord +find_reached_top=Nådde början av dokumentet, började från slutet +find_reached_bottom=Nådde slutet på dokumentet, började från början +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} av {{total}} träff +find_match_count[two]={{current}} av {{total}} träffar +find_match_count[few]={{current}} av {{total}} träffar +find_match_count[many]={{current}} av {{total}} träffar +find_match_count[other]={{current}} av {{total}} träffar +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Mer än {{limit}} träffar +find_match_count_limit[one]=Mer än {{limit}} träff +find_match_count_limit[two]=Mer än {{limit}} träffar +find_match_count_limit[few]=Mer än {{limit}} träffar +find_match_count_limit[many]=Mer än {{limit}} träffar +find_match_count_limit[other]=Mer än {{limit}} träffar +find_not_found=Frasen hittades inte + +# Error panel labels +error_more_info=Mer information +error_less_info=Mindre information +error_close=Stäng +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Meddelande: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rad: {{line}} + +# Predefined zoom values +page_scale_width=Sidbredd +page_scale_fit=Anpassa sida +page_scale_auto=Automatisk zoom +page_scale_actual=Verklig storlek +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Laddar… +loading_error=Ett fel uppstod vid laddning av PDF-filen. +invalid_file_error=Ogiltig eller korrupt PDF-fil. +missing_file_error=Saknad PDF-fil. +unexpected_response_error=Oväntat svar från servern. + +rendering_error=Ett fel uppstod vid visning av sidan. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-annotering] +password_label=Skriv in lösenordet för att öppna PDF-filen. +password_invalid=Ogiltigt lösenord. Försök igen. +password_ok=OK +password_cancel=Avbryt + +printing_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren. +printing_not_ready=Varning: PDF:en är inte klar för utskrift. +web_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt. + +# Editor +editor_free_text2.title=Text +editor_free_text2_label=Text +editor_ink2.title=Rita +editor_ink2_label=Rita + +free_text2_default_content=Börja skriva… + +# Editor Parameters +editor_free_text_color=Färg +editor_free_text_size=Storlek +editor_ink_color=Färg +editor_ink_thickness=Tjocklek +editor_ink_opacity=Opacitet + +# Editor aria +editor_free_text2_aria_label=Textredigerare +editor_ink2_aria_label=Ritredigerare +editor_ink_canvas_aria_label=Användarskapad bild diff --git a/src/assets/pdf-annotation/web/locale/szl/viewer.properties b/src/assets/pdf-annotation/web/locale/szl/viewer.properties new file mode 100755 index 0000000..88bc57a --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/szl/viewer.properties @@ -0,0 +1,245 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Piyrwyjszo strōna +previous_label=Piyrwyjszo +next.title=Nastympno strōna +next_label=Dalij + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strōna +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=ze {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} ze {{pagesCount}}) + +zoom_out.title=Zmyńsz +zoom_out_label=Zmyńsz +zoom_in.title=Zwiynksz +zoom_in_label=Zwiynksz +zoom.title=Srogość +presentation_mode.title=Przełōncz na tryb prezyntacyje +presentation_mode_label=Tryb prezyntacyje +open_file.title=Ôdewrzij zbiōr +open_file_label=Ôdewrzij +print.title=Durkuj +print_label=Durkuj +download.title=Pobier +download_label=Pobier +bookmark.title=Aktualny widok (kopiuj abo ôdewrzij w nowym ôknie) +bookmark_label=Aktualny widok + +# Secondary toolbar and context menu +tools.title=Noczynia +tools_label=Noczynia +first_page.title=Idź ku piyrszyj strōnie +first_page_label=Idź ku piyrszyj strōnie +last_page.title=Idź ku ôstatnij strōnie +last_page_label=Idź ku ôstatnij strōnie +page_rotate_cw.title=Zwyrtnij w prawo +page_rotate_cw_label=Zwyrtnij w prawo +page_rotate_ccw.title=Zwyrtnij w lewo +page_rotate_ccw_label=Zwyrtnij w lewo + +cursor_text_select_tool.title=Załōncz noczynie ôbiyranio tekstu +cursor_text_select_tool_label=Noczynie ôbiyranio tekstu +cursor_hand_tool.title=Załōncz noczynie rōnczka +cursor_hand_tool_label=Noczynie rōnczka + +scroll_vertical.title=Używej piōnowego przewijanio +scroll_vertical_label=Piōnowe przewijanie +scroll_horizontal.title=Używej poziōmego przewijanio +scroll_horizontal_label=Poziōme przewijanie +scroll_wrapped.title=Używej szichtowego przewijanio +scroll_wrapped_label=Szichtowe przewijanie + +spread_none.title=Niy dowej strōn w widoku po dwie +spread_none_label=Po jednyj strōnie +spread_odd.title=Pokoż strōny po dwie; niyporziste po lewyj +spread_odd_label=Niyporziste po lewyj +spread_even.title=Pokoż strōny po dwie; porziste po lewyj +spread_even_label=Porziste po lewyj + +# Document properties dialog box +document_properties.title=Włosności dokumyntu… +document_properties_label=Włosności dokumyntu… +document_properties_file_name=Miano zbioru: +document_properties_file_size=Srogość zbioru: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} B) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} B) +document_properties_title=Tytuł: +document_properties_author=Autōr: +document_properties_subject=Tymat: +document_properties_keywords=Kluczowe słowa: +document_properties_creation_date=Data zrychtowanio: +document_properties_modification_date=Data zmiany: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Zrychtowane ôd: +document_properties_producer=PDF ôd: +document_properties_version=Wersyjo PDF: +document_properties_page_count=Wielość strōn: +document_properties_page_size=Srogość strōny: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=piōnowo +document_properties_page_size_orientation_landscape=poziōmo +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Gibki necowy podglōnd: +document_properties_linearized_yes=Ja +document_properties_linearized_no=Niy +document_properties_close=Zawrzij + +print_progress_message=Rychtowanie dokumyntu do durku… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Pociep + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Przełōncz posek na rancie +toggle_sidebar_notification2.title=Przełōncz posek na rancie (dokumynt mo struktura/przidowki/warstwy) +toggle_sidebar_label=Przełōncz posek na rancie +document_outline.title=Pokoż struktura dokumyntu (tuplowane klikniyncie rozszyrzo/swijo wszyskie elymynta) +document_outline_label=Struktura dokumyntu +attachments.title=Pokoż przidowki +attachments_label=Przidowki +layers.title=Pokoż warstwy (tuplowane klikniyncie resetuje wszyskie warstwy do bazowego stanu) +layers_label=Warstwy +thumbs.title=Pokoż miniatury +thumbs_label=Miniatury +findbar.title=Znojdź w dokumyncie +findbar_label=Znojdź + +additional_layers=Nadbytnie warstwy +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strōna {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura strōny {{page}} + +# Find panel button title and messages +find_input.title=Znojdź +find_input.placeholder=Znojdź w dokumyncie… +find_previous.title=Znojdź piyrwyjsze pokozanie sie tyj frazy +find_previous_label=Piyrwyjszo +find_next.title=Znojdź nastympne pokozanie sie tyj frazy +find_next_label=Dalij +find_highlight=Zaznacz wszysko +find_match_case_label=Poznowej srogość liter +find_entire_word_label=Cołke słowa +find_reached_top=Doszło do samego wiyrchu strōny, dalij ôd spodku +find_reached_bottom=Doszło do samego spodku strōny, dalij ôd wiyrchu +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} ze {{total}}, co pasujōm +find_match_count[two]={{current}} ze {{total}}, co pasujōm +find_match_count[few]={{current}} ze {{total}}, co pasujōm +find_match_count[many]={{current}} ze {{total}}, co pasujōm +find_match_count[other]={{current}} ze {{total}}, co pasujōm +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(total) ]} +find_match_count_limit[zero]=Wiyncyj jak {{limit}}, co pasujōm +find_match_count_limit[one]=Wiyncyj jak {{limit}}, co pasuje +find_match_count_limit[two]=Wiyncyj jak {{limit}}, co pasujōm +find_match_count_limit[few]=Wiyncyj jak {{limit}}, co pasujōm +find_match_count_limit[many]=Wiyncyj jak {{limit}}, co pasujōm +find_match_count_limit[other]=Wiyncyj jak {{limit}}, co pasujōm +find_not_found=Fraza niy znaleziōno + +# Error panel labels +error_more_info=Wiyncyj informacyji +error_less_info=Mynij informacyji +error_close=Zawrzij +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Wiadōmość: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Sztapel: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Zbiōr: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linijo: {{line}} +rendering_error=Przi renderowaniu strōny pokozoł sie feler. + +# Predefined zoom values +page_scale_width=Szyrzka strōny +page_scale_fit=Napasowanie strōny +page_scale_auto=Autōmatyczno srogość +page_scale_actual=Aktualno srogość +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error=Przi ladowaniu PDFa pokozoł sie feler. +invalid_file_error=Zły abo felerny zbiōr PDF. +missing_file_error=Chybio zbioru PDF. +unexpected_response_error=Niyôczekowano ôdpowiydź serwera. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotacyjo typu {{type}}] +password_label=Wkludź hasło, coby ôdewrzić tyn zbiōr PDF. +password_invalid=Hasło je złe. Sprōbuj jeszcze roz. +password_ok=OK +password_cancel=Pociep + +printing_not_supported=Pozōr: Ta przeglōndarka niy cołkiym ôbsuguje durk. +printing_not_ready=Pozōr: Tyn PDF niy ma za tela zaladowany do durku. +web_fonts_disabled=Necowe fōnty sōm zastawiōne: niy idzie użyć wkludzōnych fōntōw PDF. + diff --git a/src/assets/pdf-annotation/web/locale/ta/viewer.properties b/src/assets/pdf-annotation/web/locale/ta/viewer.properties new file mode 100755 index 0000000..72f75e2 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ta/viewer.properties @@ -0,0 +1,194 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=முந்தைய பக்கம் +previous_label=முந்தையது +next.title=அடுத்த பக்கம் +next_label=அடுத்து + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=பக்கம் +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} இல் +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages={{pagesCount}}) இல் ({{pageNumber}} + +zoom_out.title=சிறிதாக்கு +zoom_out_label=சிறிதாக்கு +zoom_in.title=பெரிதாக்கு +zoom_in_label=பெரிதாக்கு +zoom.title=பெரிதாக்கு +presentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு +presentation_mode_label=விளக்ககாட்சி பயன்முறை +open_file.title=கோப்பினை திற +open_file_label=திற +print.title=அச்சிடு +print_label=அச்சிடு +download.title=பதிவிறக்கு +download_label=பதிவிறக்கு +bookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற) +bookmark_label=தற்போதைய காட்சி + +# Secondary toolbar and context menu +tools.title=கருவிகள் +tools_label=கருவிகள் +first_page.title=முதல் பக்கத்திற்கு செல்லவும் +first_page_label=முதல் பக்கத்திற்கு செல்லவும் +last_page.title=கடைசி பக்கத்திற்கு செல்லவும் +last_page_label=கடைசி பக்கத்திற்கு செல்லவும் +page_rotate_cw.title=வலஞ்சுழியாக சுழற்று +page_rotate_cw_label=வலஞ்சுழியாக சுழற்று +page_rotate_ccw.title=இடஞ்சுழியாக சுழற்று +page_rotate_ccw_label=இடஞ்சுழியாக சுழற்று + +cursor_text_select_tool.title=உரைத் தெரிவு கருவியைச் செயல்படுத்து +cursor_text_select_tool_label=உரைத் தெரிவு கருவி +cursor_hand_tool.title=கைக் கருவிக்ச் செயற்படுத்து +cursor_hand_tool_label=கைக்குருவி + +# Document properties dialog box +document_properties.title=ஆவண பண்புகள்... +document_properties_label=ஆவண பண்புகள்... +document_properties_file_name=கோப்பு பெயர்: +document_properties_file_size=கோப்பின் அளவு: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்) +document_properties_title=தலைப்பு: +document_properties_author=எழுதியவர் +document_properties_subject=பொருள்: +document_properties_keywords=முக்கிய வார்த்தைகள்: +document_properties_creation_date=படைத்த தேதி : +document_properties_modification_date=திருத்திய தேதி: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=உருவாக்குபவர்: +document_properties_producer=பிடிஎஃப் தயாரிப்பாளர்: +document_properties_version=PDF பதிப்பு: +document_properties_page_count=பக்க எண்ணிக்கை: +document_properties_page_size=பக்க அளவு: +document_properties_page_size_unit_inches=இதில் +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=நிலைபதிப்பு +document_properties_page_size_orientation_landscape=நிலைபரப்பு +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=கடிதம் +document_properties_page_size_name_legal=சட்டபூர்வ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +document_properties_close=மூடுக + +print_progress_message=அச்சிடுவதற்கான ஆவணம் தயாராகிறது... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ரத்து + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று +toggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று +document_outline.title=ஆவண அடக்கத்தைக் காட்டு (இருமுறைச் சொடுக்கி அனைத்து உறுப்பிடிகளையும் விரி/சேர்) +document_outline_label=ஆவண வெளிவரை +attachments.title=இணைப்புகளை காண்பி +attachments_label=இணைப்புகள் +thumbs.title=சிறுபடங்களைக் காண்பி +thumbs_label=சிறுபடங்கள் +findbar.title=ஆவணத்தில் கண்டறி +findbar_label=தேடு + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=பக்கம் {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}} + +# Find panel button title and messages +find_input.title=கண்டுபிடி +find_input.placeholder=ஆவணத்தில் கண்டறி… +find_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு +find_previous_label=முந்தையது +find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு +find_next_label=அடுத்து +find_highlight=அனைத்தையும் தனிப்படுத்து +find_match_case_label=பேரெழுத்தாக்கத்தை உணர் +find_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது +find_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது +find_not_found=சொற்றொடர் காணவில்லை + +# Error panel labels +error_more_info=கூடுதல் தகவல் +error_less_info=குறைந்த தகவல் +error_close=மூடுக +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=செய்தி: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ஸ்டேக்: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=கோப்பு: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=வரி: {{line}} +rendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது. + +# Predefined zoom values +page_scale_width=பக்க அகலம் +page_scale_fit=பக்கப் பொருத்தம் +page_scale_auto=தானியக்க பெரிதாக்கல் +page_scale_actual=உண்மையான அளவு +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது. +invalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு. +missing_file_error=PDF கோப்பு காணவில்லை. +unexpected_response_error=சேவகன் பதில் எதிர்பாரதது. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} விளக்கம்] +password_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும். +password_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க. +password_ok=சரி +password_cancel=ரத்து + +printing_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை. +printing_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை. +web_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை. + diff --git a/src/assets/pdf-annotation/web/locale/te/viewer.properties b/src/assets/pdf-annotation/web/locale/te/viewer.properties new file mode 100755 index 0000000..3c82095 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/te/viewer.properties @@ -0,0 +1,237 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=మునుపటి పేజీ +previous_label=క్రితం +next.title=తరువాత పేజీ +next_label=తరువాత + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=పేజీ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=మొత్తం {{pagesCount}} లో +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=(మొత్తం {{pagesCount}} లో {{pageNumber}}వది) + +zoom_out.title=జూమ్ తగ్గించు +zoom_out_label=జూమ్ తగ్గించు +zoom_in.title=జూమ్ చేయి +zoom_in_label=జూమ్ చేయి +zoom.title=జూమ్ +presentation_mode.title=ప్రదర్శనా రీతికి మారు +presentation_mode_label=ప్రదర్శనా రీతి +open_file.title=ఫైల్ తెరువు +open_file_label=తెరువు +print.title=ముద్రించు +print_label=ముద్రించు +download.title=దింపుకోళ్ళు +download_label=దింపుకోళ్ళు +bookmark.title=ప్రస్తుత దర్శనం (కాపీ చేయి లేదా కొత్త విండోలో తెరువు) +bookmark_label=ప్రస్తుత దర్శనం + +# Secondary toolbar and context menu +tools.title=పనిముట్లు +tools_label=పనిముట్లు +first_page.title=మొదటి పేజీకి వెళ్ళు +first_page_label=మొదటి పేజీకి వెళ్ళు +last_page.title=చివరి పేజీకి వెళ్ళు +last_page_label=చివరి పేజీకి వెళ్ళు +page_rotate_cw.title=సవ్యదిశలో తిప్పు +page_rotate_cw_label=సవ్యదిశలో తిప్పు +page_rotate_ccw.title=అపసవ్యదిశలో తిప్పు +page_rotate_ccw_label=అపసవ్యదిశలో తిప్పు + +cursor_text_select_tool.title=టెక్స్ట్ ఎంపిక సాధనాన్ని ప్రారంభించండి +cursor_text_select_tool_label=టెక్స్ట్ ఎంపిక సాధనం +cursor_hand_tool.title=చేతి సాధనం చేతనించు +cursor_hand_tool_label=చేతి సాధనం + +scroll_vertical_label=నిలువు స్క్రోలింగు + + +# Document properties dialog box +document_properties.title=పత్రము లక్షణాలు... +document_properties_label=పత్రము లక్షణాలు... +document_properties_file_name=దస్త్రం పేరు: +document_properties_file_size=దస్త్రం పరిమాణం: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=శీర్షిక: +document_properties_author=మూలకర్త: +document_properties_subject=విషయం: +document_properties_keywords=కీ పదాలు: +document_properties_creation_date=సృష్టించిన తేదీ: +document_properties_modification_date=సవరించిన తేదీ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=సృష్టికర్త: +document_properties_producer=PDF ఉత్పాదకి: +document_properties_version=PDF వర్షన్: +document_properties_page_count=పేజీల సంఖ్య: +document_properties_page_size=కాగితం పరిమాణం: +document_properties_page_size_unit_inches=లో +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=నిలువుచిత్రం +document_properties_page_size_orientation_landscape=అడ్డచిత్రం +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=లేఖ +document_properties_page_size_name_legal=చట్టపరమైన +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized_yes=అవును +document_properties_linearized_no=కాదు +document_properties_close=మూసివేయి + +print_progress_message=ముద్రించడానికి పత్రము సిద్ధమవుతున్నది… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=రద్దుచేయి + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=పక్కపట్టీ మార్చు +toggle_sidebar_label=పక్కపట్టీ మార్చు +document_outline.title=పత్రము రూపము చూపించు (డబుల్ క్లిక్ చేసి అన్ని అంశాలను విస్తరించు/కూల్చు) +document_outline_label=పత్రము అవుట్‌లైన్ +attachments.title=అనుబంధాలు చూపు +attachments_label=అనుబంధాలు +layers_label=పొరలు +thumbs.title=థంబ్‌నైల్స్ చూపు +thumbs_label=థంబ్‌నైల్స్ +findbar.title=పత్రములో కనుగొనుము +findbar_label=కనుగొను + +additional_layers=అదనపు పొరలు +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=పేజీ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} పేజీ నఖచిత్రం + +# Find panel button title and messages +find_input.title=కనుగొను +find_input.placeholder=పత్రములో కనుగొను… +find_previous.title=పదం యొక్క ముందు సంభవాన్ని కనుగొను +find_previous_label=మునుపటి +find_next.title=పదం యొక్క తర్వాతి సంభవాన్ని కనుగొను +find_next_label=తరువాత +find_highlight=అన్నిటిని ఉద్దీపనం చేయుము +find_match_case_label=అక్షరముల తేడాతో పోల్చు +find_entire_word_label=పూర్తి పదాలు +find_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి +find_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_not_found=పదబంధం కనబడలేదు + +# Error panel labels +error_more_info=మరింత సమాచారం +error_less_info=తక్కువ సమాచారం +error_close=మూసివేయి +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=సందేశం: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=స్టాక్: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ఫైలు: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=వరుస: {{line}} +rendering_error=పేజీను రెండర్ చేయుటలో ఒక దోషం ఎదురైంది. + +# Predefined zoom values +page_scale_width=పేజీ వెడల్పు +page_scale_fit=పేజీ అమర్పు +page_scale_auto=స్వయంచాలక జూమ్ +page_scale_actual=యథార్ధ పరిమాణం +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error=PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది. +invalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు. +missing_file_error=దొరకని PDF ఫైలు. +unexpected_response_error=అనుకోని సర్వర్ స్పందన. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} టీకా] +password_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము. +password_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి. +password_ok=సరే +password_cancel=రద్దుచేయి + +printing_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటు లేదు. +printing_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు. +web_fonts_disabled=వెబ్ ఫాంట్లు అచేతనించబడెను: ఎంబెడెడ్ PDF ఫాంట్లు ఉపయోగించలేక పోయింది. + +# Editor + + +# Editor + + +# Editor Parameters +editor_free_text_color=రంగు +editor_free_text_size=పరిమాణం +editor_ink_color=రంగు +editor_ink_thickness=మందం +editor_ink_opacity=అకిరణ్యత + +# Editor aria + +# Editor aria + diff --git a/src/assets/pdf-annotation/web/locale/tg/viewer.properties b/src/assets/pdf-annotation/web/locale/tg/viewer.properties new file mode 100755 index 0000000..d50ccdf --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/tg/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Саҳифаи қаблӣ +previous_label=Қаблӣ +next.title=Саҳифаи навбатӣ +next_label=Навбатӣ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Саҳифа +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=аз {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} аз {{pagesCount}}) + +zoom_out.title=Хурд кардан +zoom_out_label=Хурд кардан +zoom_in.title=Калон кардан +zoom_in_label=Калон кардан +zoom.title=Танзими андоза +presentation_mode.title=Гузариш ба реҷаи тақдим +presentation_mode_label=Реҷаи тақдим +open_file.title=Кушодани файл +open_file_label=Кушодан +print.title=Чоп кардан +print_label=Чоп кардан +download.title=Боргирӣ кардан +download_label=Боргирӣ кардан +save.title=Нигоҳ доштан +save_label=Нигоҳ доштан +bookmark.title=Намуди ҷорӣ (нусха бардоштан ё кушодан дар равзанаи нав) +bookmark_label=Намуди ҷорӣ + +# Secondary toolbar and context menu +tools.title=Абзорҳо +tools_label=Абзорҳо +first_page.title=Ба саҳифаи аввал гузаред +first_page_label=Ба саҳифаи аввал гузаред +last_page.title=Ба саҳифаи охирин гузаред +last_page_label=Ба саҳифаи охирин гузаред +page_rotate_cw.title=Ба самти ҳаракати ақрабаки соат давр задан +page_rotate_cw_label=Ба самти ҳаракати ақрабаки соат давр задан +page_rotate_ccw.title=Ба муқобили самти ҳаракати ақрабаки соат давр задан +page_rotate_ccw_label=Ба муқобили самти ҳаракати ақрабаки соат давр задан + +cursor_text_select_tool.title=Фаъол кардани «Абзори интихоби матн» +cursor_text_select_tool_label=Абзори интихоби матн +cursor_hand_tool.title=Фаъол кардани «Абзори даст» +cursor_hand_tool_label=Абзори даст + +scroll_page.title=Истифодаи варақзанӣ +scroll_page_label=Варақзанӣ +scroll_vertical.title=Истифодаи варақзании амудӣ +scroll_vertical_label=Варақзании амудӣ +scroll_horizontal.title=Истифодаи варақзании уфуқӣ +scroll_horizontal_label=Варақзании уфуқӣ +scroll_wrapped.title=Истифодаи варақзании миқёсбандӣ +scroll_wrapped_label=Варақзании миқёсбандӣ + +spread_none.title=Густариши саҳифаҳо истифода бурда нашавад +spread_none_label=Бе густурдани саҳифаҳо +spread_odd.title=Густариши саҳифаҳо аз саҳифаҳо бо рақамҳои тоқ оғоз карда мешавад +spread_odd_label=Саҳифаҳои тоқ аз тарафи чап +spread_even.title=Густариши саҳифаҳо аз саҳифаҳо бо рақамҳои ҷуфт оғоз карда мешавад +spread_even_label=Саҳифаҳои ҷуфт аз тарафи чап + +# Document properties dialog box +document_properties.title=Хусусиятҳои ҳуҷҷат… +document_properties_label=Хусусиятҳои ҳуҷҷат… +document_properties_file_name=Номи файл: +document_properties_file_size=Андозаи файл: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байт) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байт) +document_properties_title=Сарлавҳа: +document_properties_author=Муаллиф: +document_properties_subject=Мавзуъ: +document_properties_keywords=Калимаҳои калидӣ: +document_properties_creation_date=Санаи эҷод: +document_properties_modification_date=Санаи тағйирот: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Эҷодкунанда: +document_properties_producer=Таҳиякунандаи «PDF»: +document_properties_version=Версияи «PDF»: +document_properties_page_count=Шумораи саҳифаҳо: +document_properties_page_size=Андозаи саҳифа: +document_properties_page_size_unit_inches=дюйм +document_properties_page_size_unit_millimeters=мм +document_properties_page_size_orientation_portrait=амудӣ +document_properties_page_size_orientation_landscape=уфуқӣ +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Мактуб +document_properties_page_size_name_legal=Ҳуқуқӣ +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Намоиши тез дар Интернет: +document_properties_linearized_yes=Ҳа +document_properties_linearized_no=Не +document_properties_close=Пӯшидан + +print_progress_message=Омодасозии ҳуҷҷат барои чоп… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Бекор кардан + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Фаъол кардани навори ҷонибӣ +toggle_sidebar_notification2.title=Фаъол кардани навори ҷонибӣ (ҳуҷҷат дорои сохтор/замимаҳо/қабатҳо мебошад) +toggle_sidebar_label=Фаъол кардани навори ҷонибӣ +document_outline.title=Намоиш додани сохтори ҳуҷҷат (барои баркушодан/пеҷондани ҳамаи унсурҳо дубора зер кунед) +document_outline_label=Сохтори ҳуҷҷат +attachments.title=Намоиш додани замимаҳо +attachments_label=Замимаҳо +layers.title=Намоиш додани қабатҳо (барои барқарор кардани ҳамаи қабатҳо ба вазъияти пешфарз дубора зер кунед) +layers_label=Қабатҳо +thumbs.title=Намоиш додани тасвирчаҳо +thumbs_label=Тасвирчаҳо +current_outline_item.title=Ёфтани унсури сохтори ҷорӣ +current_outline_item_label=Унсури сохтори ҷорӣ +findbar.title=Ёфтан дар ҳуҷҷат +findbar_label=Ёфтан + +additional_layers=Қабатҳои иловагӣ +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Саҳифаи {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Саҳифаи {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Тасвирчаи саҳифаи {{page}} + +# Find panel button title and messages +find_input.title=Ёфтан +find_input.placeholder=Ёфтан дар ҳуҷҷат… +find_previous.title=Ҷустуҷӯи мавриди қаблии ибораи пешниҳодшуда +find_previous_label=Қаблӣ +find_next.title=Ҷустуҷӯи мавриди навбатии ибораи пешниҳодшуда +find_next_label=Навбатӣ +find_highlight=Ҳамаашро бо ранг ҷудо кардан +find_match_case_label=Бо дарназардошти ҳарфҳои хурду калон +find_match_diacritics_label=Бо дарназардошти аломатҳои диакритикӣ +find_entire_word_label=Калимаҳои пурра +find_reached_top=Ба болои ҳуҷҷат расид, аз поён идома ёфт +find_reached_bottom=Ба поёни ҳуҷҷат расид, аз боло идома ёфт +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} аз {{total}} мувофиқат +find_match_count[two]={{current}} аз {{total}} мувофиқат +find_match_count[few]={{current}} аз {{total}} мувофиқат +find_match_count[many]={{current}} аз {{total}} мувофиқат +find_match_count[other]={{current}} аз {{total}} мувофиқат +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Зиёда аз {{limit}} мувофиқат +find_match_count_limit[one]=Зиёда аз {{limit}} мувофиқат +find_match_count_limit[two]=Зиёда аз {{limit}} мувофиқат +find_match_count_limit[few]=Зиёда аз {{limit}} мувофиқат +find_match_count_limit[many]=Зиёда аз {{limit}} мувофиқат +find_match_count_limit[other]=Зиёда аз {{limit}} мувофиқат +find_not_found=Ибора ёфт нашуд + +# Error panel labels +error_more_info=Маълумоти бештар +error_less_info=Маълумоти камтар +error_close=Пӯшидан +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (сохт: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Паём: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Даста: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Сатр: {{line}} + +# Predefined zoom values +page_scale_width=Аз рӯи паҳнои саҳифа +page_scale_fit=Аз рӯи андозаи саҳифа +page_scale_auto=Андозаи худкор +page_scale_actual=Андозаи воқеӣ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Бор шуда истодааст… +loading_error=Ҳангоми боркунии «PDF» хато ба миён омад. +invalid_file_error=Файли «PDF» нодуруст ё вайроншуда мебошад. +missing_file_error=Файли «PDF» ғоиб аст. +unexpected_response_error=Ҷавоби ногаҳон аз сервер. + +rendering_error=Ҳангоми шаклсозии саҳифа хато ба миён омад. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Ҳошиянависӣ - {{type}}] +password_label=Барои кушодани ин файли «PDF» ниҳонвожаро ворид кунед. +password_invalid=Ниҳонвожаи нодуруст. Лутфан, аз нав кӯшиш кунед. +password_ok=ХУБ +password_cancel=Бекор кардан + +printing_not_supported=Диққат: Чопкунӣ аз тарафи ин браузер ба таври пурра дастгирӣ намешавад. +printing_not_ready=Диққат: Файли «PDF» барои чопкунӣ пурра бор карда нашуд. +web_fonts_disabled=Шрифтҳои интернетӣ ғайрифаъоланд: истифодаи шрифтҳои дарунсохти «PDF» ғайриимкон аст. + +# Editor +editor_free_text2.title=Матн +editor_free_text2_label=Матн +editor_ink2.title=Расмкашӣ +editor_ink2_label=Расмкашӣ + +free_text2_default_content=Нависед… + +# Editor Parameters +editor_free_text_color=Ранг +editor_free_text_size=Андоза +editor_ink_color=Ранг +editor_ink_thickness=Ғафсӣ +editor_ink_opacity=Шаффофӣ + +# Editor aria +editor_free_text2_aria_label=Муҳаррири матн +editor_ink2_aria_label=Муҳаррири расмкашӣ +editor_ink_canvas_aria_label=Тасвири эҷодкардаи корбар diff --git a/src/assets/pdf-annotation/web/locale/th/viewer.properties b/src/assets/pdf-annotation/web/locale/th/viewer.properties new file mode 100755 index 0000000..67a1bdd --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/th/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=หน้าก่อนหน้า +previous_label=ก่อนหน้า +next.title=หน้าถัดไป +next_label=ถัดไป + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=หน้า +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=จาก {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} จาก {{pagesCount}}) + +zoom_out.title=ซูมออก +zoom_out_label=ซูมออก +zoom_in.title=ซูมเข้า +zoom_in_label=ซูมเข้า +zoom.title=ซูม +presentation_mode.title=สลับเป็นโหมดการนำเสนอ +presentation_mode_label=โหมดการนำเสนอ +open_file.title=เปิดไฟล์ +open_file_label=เปิด +print.title=พิมพ์ +print_label=พิมพ์ +download.title=ดาวน์โหลด +download_label=ดาวน์โหลด +save.title=บันทึก +save_label=บันทึก +bookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่) +bookmark_label=มุมมองปัจจุบัน + +# Secondary toolbar and context menu +tools.title=เครื่องมือ +tools_label=เครื่องมือ +first_page.title=ไปยังหน้าแรก +first_page_label=ไปยังหน้าแรก +last_page.title=ไปยังหน้าสุดท้าย +last_page_label=ไปยังหน้าสุดท้าย +page_rotate_cw.title=หมุนตามเข็มนาฬิกา +page_rotate_cw_label=หมุนตามเข็มนาฬิกา +page_rotate_ccw.title=หมุนทวนเข็มนาฬิกา +page_rotate_ccw_label=หมุนทวนเข็มนาฬิกา + +cursor_text_select_tool.title=เปิดใช้งานเครื่องมือการเลือกข้อความ +cursor_text_select_tool_label=เครื่องมือการเลือกข้อความ +cursor_hand_tool.title=เปิดใช้งานเครื่องมือมือ +cursor_hand_tool_label=เครื่องมือมือ + +scroll_page.title=ใช้การเลื่อนหน้า +scroll_page_label=การเลื่อนหน้า +scroll_vertical.title=ใช้การเลื่อนแนวตั้ง +scroll_vertical_label=การเลื่อนแนวตั้ง +scroll_horizontal.title=ใช้การเลื่อนแนวนอน +scroll_horizontal_label=การเลื่อนแนวนอน +scroll_wrapped.title=ใช้การเลื่อนแบบคลุม +scroll_wrapped_label=เลื่อนแบบคลุม + +spread_none.title=ไม่ต้องรวมการกระจายหน้า +spread_none_label=ไม่กระจาย +spread_odd.title=รวมการกระจายหน้าเริ่มจากหน้าคี่ +spread_odd_label=กระจายอย่างเหลือเศษ +spread_even.title=รวมการกระจายหน้าเริ่มจากหน้าคู่ +spread_even_label=กระจายอย่างเท่าเทียม + +# Document properties dialog box +document_properties.title=คุณสมบัติเอกสาร… +document_properties_label=คุณสมบัติเอกสาร… +document_properties_file_name=ชื่อไฟล์: +document_properties_file_size=ขนาดไฟล์: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} ไบต์) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} ไบต์) +document_properties_title=ชื่อเรื่อง: +document_properties_author=ผู้สร้าง: +document_properties_subject=ชื่อเรื่อง: +document_properties_keywords=คำสำคัญ: +document_properties_creation_date=วันที่สร้าง: +document_properties_modification_date=วันที่แก้ไข: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ผู้สร้าง: +document_properties_producer=ผู้ผลิต PDF: +document_properties_version=รุ่น PDF: +document_properties_page_count=จำนวนหน้า: +document_properties_page_size=ขนาดหน้า: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=แนวตั้ง +document_properties_page_size_orientation_landscape=แนวนอน +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=จดหมาย +document_properties_page_size_name_legal=ข้อกฎหมาย +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=มุมมองเว็บแบบรวดเร็ว: +document_properties_linearized_yes=ใช่ +document_properties_linearized_no=ไม่ +document_properties_close=ปิด + +print_progress_message=กำลังเตรียมเอกสารสำหรับการพิมพ์… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ยกเลิก + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=เปิด/ปิดแถบข้าง +toggle_sidebar_notification2.title=เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ/เลเยอร์) +toggle_sidebar_label=เปิด/ปิดแถบข้าง +document_outline.title=แสดงเค้าร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด) +document_outline_label=เค้าร่างเอกสาร +attachments.title=แสดงไฟล์แนบ +attachments_label=ไฟล์แนบ +layers.title=แสดงเลเยอร์ (คลิกสองครั้งเพื่อรีเซ็ตเลเยอร์ทั้งหมดเป็นสถานะเริ่มต้น) +layers_label=เลเยอร์ +thumbs.title=แสดงภาพขนาดย่อ +thumbs_label=ภาพขนาดย่อ +current_outline_item.title=ค้นหารายการเค้าร่างปัจจุบัน +current_outline_item_label=รายการเค้าร่างปัจจุบัน +findbar.title=ค้นหาในเอกสาร +findbar_label=ค้นหา + +additional_layers=เลเยอร์เพิ่มเติม +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=หน้า {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=หน้า {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=ภาพขนาดย่อของหน้า {{page}} + +# Find panel button title and messages +find_input.title=ค้นหา +find_input.placeholder=ค้นหาในเอกสาร… +find_previous.title=หาตำแหน่งก่อนหน้าของวลี +find_previous_label=ก่อนหน้า +find_next.title=หาตำแหน่งถัดไปของวลี +find_next_label=ถัดไป +find_highlight=เน้นสีทั้งหมด +find_match_case_label=ตัวพิมพ์ใหญ่เล็กตรงกัน +find_match_diacritics_label=เครื่องหมายกำกับการออกเสียงตรงกัน +find_entire_word_label=ทั้งคำ +find_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง +find_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} จาก {{total}} ที่ตรงกัน +find_match_count[two]={{current}} จาก {{total}} ที่ตรงกัน +find_match_count[few]={{current}} จาก {{total}} ที่ตรงกัน +find_match_count[many]={{current}} จาก {{total}} ที่ตรงกัน +find_match_count[other]={{current}} จาก {{total}} ที่ตรงกัน +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=มากกว่า {{limit}} ที่ตรงกัน +find_match_count_limit[one]=มากกว่า {{limit}} ที่ตรงกัน +find_match_count_limit[two]=มากกว่า {{limit}} ที่ตรงกัน +find_match_count_limit[few]=มากกว่า {{limit}} ที่ตรงกัน +find_match_count_limit[many]=มากกว่า {{limit}} ที่ตรงกัน +find_match_count_limit[other]=มากกว่า {{limit}} ที่ตรงกัน +find_not_found=ไม่พบวลี + +# Error panel labels +error_more_info=ข้อมูลเพิ่มเติม +error_less_info=ข้อมูลน้อยลง +error_close=ปิด +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ข้อความ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=สแตก: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ไฟล์: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=บรรทัด: {{line}} + +# Predefined zoom values +page_scale_width=ความกว้างหน้า +page_scale_fit=พอดีหน้า +page_scale_auto=ซูมอัตโนมัติ +page_scale_actual=ขนาดจริง +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=กำลังโหลด… +loading_error=เกิดข้อผิดพลาดขณะโหลด PDF +invalid_file_error=ไฟล์ PDF ไม่ถูกต้องหรือเสียหาย +missing_file_error=ไฟล์ PDF หายไป +unexpected_response_error=การตอบสนองของเซิร์ฟเวอร์ที่ไม่คาดคิด + +rendering_error=เกิดข้อผิดพลาดขณะเรนเดอร์หน้า + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[คำอธิบายประกอบ {{type}}] +password_label=ป้อนรหัสผ่านเพื่อเปิดไฟล์ PDF นี้ +password_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง +password_ok=ตกลง +password_cancel=ยกเลิก + +printing_not_supported=คำเตือน: เบราว์เซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่ +printing_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์ +web_fonts_disabled=แบบอักษรเว็บถูกปิดใช้งาน: ไม่สามารถใช้แบบอักษร PDF ฝังตัว + +# Editor +editor_free_text2.title=ข้อความ +editor_free_text2_label=ข้อความ +editor_ink2.title=รูปวาด +editor_ink2_label=รูปวาด + +free_text2_default_content=เริ่มพิมพ์… + +# Editor Parameters +editor_free_text_color=สี +editor_free_text_size=ขนาด +editor_ink_color=สี +editor_ink_thickness=ความหนา +editor_ink_opacity=ความทึบ + +# Editor aria +editor_free_text2_aria_label=ตัวแก้ไขข้อความ +editor_ink2_aria_label=ตัวแก้ไขรูปวาด +editor_ink_canvas_aria_label=ภาพที่ผู้ใช้สร้างขึ้น diff --git a/src/assets/pdf-annotation/web/locale/tl/viewer.properties b/src/assets/pdf-annotation/web/locale/tl/viewer.properties new file mode 100755 index 0000000..2d44451 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/tl/viewer.properties @@ -0,0 +1,243 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Naunang Pahina +previous_label=Nakaraan +next.title=Sunod na Pahina +next_label=Sunod + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pahina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=ng {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} ng {{pagesCount}}) + +zoom_out.title=Paliitin +zoom_out_label=Paliitin +zoom_in.title=Palakihin +zoom_in_label=Palakihin +zoom.title=Mag-zoom +presentation_mode.title=Lumipat sa Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Magbukas ng file +open_file_label=Buksan +print.title=i-Print +print_label=i-Print +download.title=i-Download +download_label=i-Download +bookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window) +bookmark_label=Kasalukuyang tingin + +# Secondary toolbar and context menu +tools.title=Mga Kagamitan +tools_label=Mga Kagamitan +first_page.title=Pumunta sa Unang Pahina +first_page_label=Pumunta sa Unang Pahina +last_page.title=Pumunta sa Huling Pahina +last_page_label=Pumunta sa Huling Pahina +page_rotate_cw.title=Paikutin Pakanan +page_rotate_cw_label=Paikutin Pakanan +page_rotate_ccw.title=Paikutin Pakaliwa +page_rotate_ccw_label=Paikutin Pakaliwa + +cursor_text_select_tool.title=I-enable ang Text Selection Tool +cursor_text_select_tool_label=Text Selection Tool +cursor_hand_tool.title=I-enable ang Hand Tool +cursor_hand_tool_label=Hand Tool + +scroll_vertical.title=Gumamit ng Vertical Scrolling +scroll_vertical_label=Vertical Scrolling +scroll_horizontal.title=Gumamit ng Horizontal Scrolling +scroll_horizontal_label=Horizontal Scrolling +scroll_wrapped.title=Gumamit ng Wrapped Scrolling +scroll_wrapped_label=Wrapped Scrolling + +spread_none.title=Huwag pagsamahin ang mga page spread +spread_none_label=No Spreads +spread_odd.title=Join page spreads starting with odd-numbered pages +spread_odd_label=Mga Odd Spread +spread_even.title=Pagsamahin ang mga page spread na nagsisimula sa mga even-numbered na pahina +spread_even_label=Mga Even Spread + +# Document properties dialog box +document_properties.title=Mga Katangian ng Dokumento… +document_properties_label=Mga Katangian ng Dokumento… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Pamagat: +document_properties_author=May-akda: +document_properties_subject=Paksa: +document_properties_keywords=Mga keyword: +document_properties_creation_date=Petsa ng Pagkakagawa: +document_properties_modification_date=Petsa ng Pagkakabago: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Tagalikha: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Bilang ng Pahina: +document_properties_page_size=Laki ng Pahina: +document_properties_page_size_unit_inches=pulgada +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=patayo +document_properties_page_size_orientation_landscape=pahiga +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Fast Web View: +document_properties_linearized_yes=Oo +document_properties_linearized_no=Hindi +document_properties_close=Isara + +print_progress_message=Inihahanda ang dokumento para sa pag-print… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Kanselahin + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Ipakita/Itago ang Sidebar +toggle_sidebar_notification2.title=Ipakita/Itago ang Sidebar (nagtataglay ang dokumento ng balangkas/mga attachment/mga layer) +toggle_sidebar_label=Ipakita/Itago ang Sidebar +document_outline.title=Ipakita ang Document Outline (mag-double-click para i-expand/collapse ang laman) +document_outline_label=Balangkas ng Dokumento +attachments.title=Ipakita ang mga Attachment +attachments_label=Mga attachment +layers.title=Ipakita ang mga Layer (mag-double click para mareset ang lahat ng layer sa orihinal na estado) +layers_label=Mga layer +thumbs.title=Ipakita ang mga Thumbnail +thumbs_label=Mga thumbnail +findbar.title=Hanapin sa Dokumento +findbar_label=Hanapin + +additional_layers=Mga Karagdagang Layer +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pahina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail ng Pahina {{page}} + +# Find panel button title and messages +find_input.title=Hanapin +find_input.placeholder=Hanapin sa dokumento… +find_previous.title=Hanapin ang nakaraang pangyayari ng parirala +find_previous_label=Nakaraan +find_next.title=Hanapin ang susunod na pangyayari ng parirala +find_next_label=Susunod +find_highlight=I-highlight lahat +find_match_case_label=Itugma ang case +find_entire_word_label=Buong salita +find_reached_top=Naabot na ang tuktok ng dokumento, ipinagpatuloy mula sa ilalim +find_reached_bottom=Naabot na ang dulo ng dokumento, ipinagpatuloy mula sa tuktok +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} ng {{total}} tugma +find_match_count[two]={{current}} ng {{total}} tugma +find_match_count[few]={{current}} ng {{total}} tugma +find_match_count[many]={{current}} ng {{total}} tugma +find_match_count[other]={{current}} ng {{total}} tugma +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Higit sa {{limit}} tugma +find_match_count_limit[one]=Higit sa {{limit}} tugma +find_match_count_limit[two]=Higit sa {{limit}} tugma +find_match_count_limit[few]=Higit sa {{limit}} tugma +find_match_count_limit[many]=Higit sa {{limit}} tugma +find_match_count_limit[other]=Higit sa {{limit}} tugma +find_not_found=Hindi natagpuan ang parirala + +# Error panel labels +error_more_info=Karagdagang Impormasyon +error_less_info=Mas Kaunting Impormasyon +error_close=Isara +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensahe: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linya: {{line}} +rendering_error=Nagkaproblema habang nirerender ang pahina. + +# Predefined zoom values +page_scale_width=Lapad ng Pahina +page_scale_fit=Pagkasyahin ang Pahina +page_scale_auto=Automatic Zoom +page_scale_actual=Totoong sukat +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Nagkaproblema habang niloload ang PDF. +invalid_file_error=Di-wasto o sira ang PDF file. +missing_file_error=Nawawalang PDF file. +unexpected_response_error=Hindi inaasahang tugon ng server. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Ipasok ang password upang buksan ang PDF file na ito. +password_invalid=Maling password. Subukan uli. +password_ok=OK +password_cancel=Kanselahin + +printing_not_supported=Babala: Hindi pa ganap na suportado ang pag-print sa browser na ito. +printing_not_ready=Babala: Hindi ganap na nabuksan ang PDF para sa pag-print. +web_fonts_disabled=Naka-disable ang mga Web font: hindi kayang gamitin ang mga naka-embed na PDF font. + diff --git a/src/assets/pdf-annotation/web/locale/tr/viewer.properties b/src/assets/pdf-annotation/web/locale/tr/viewer.properties new file mode 100755 index 0000000..eb14789 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/tr/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Önceki sayfa +previous_label=Önceki +next.title=Sonraki sayfa +next_label=Sonraki + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Sayfa +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Uzaklaştır +zoom_out_label=Uzaklaştır +zoom_in.title=Yaklaştır +zoom_in_label=Yaklaştır +zoom.title=Yakınlaştırma +presentation_mode.title=Sunum moduna geç +presentation_mode_label=Sunum modu +open_file.title=Dosya aç +open_file_label=Aç +print.title=Yazdır +print_label=Yazdır +download.title=İndir +download_label=İndir +save.title=Kaydet +save_label=Kaydet +bookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç) +bookmark_label=Geçerli görünüm + +# Secondary toolbar and context menu +tools.title=Araçlar +tools_label=Araçlar +first_page.title=İlk sayfaya git +first_page_label=İlk sayfaya git +last_page.title=Son sayfaya git +last_page_label=Son sayfaya git +page_rotate_cw.title=Saat yönünde döndür +page_rotate_cw_label=Saat yönünde döndür +page_rotate_ccw.title=Saat yönünün tersine döndür +page_rotate_ccw_label=Saat yönünün tersine döndür + +cursor_text_select_tool.title=Metin seçme aracını etkinleştir +cursor_text_select_tool_label=Metin seçme aracı +cursor_hand_tool.title=El aracını etkinleştir +cursor_hand_tool_label=El aracı + +scroll_page.title=Sayfa kaydırmayı kullan +scroll_page_label=Sayfa kaydırma +scroll_vertical.title=Dikey kaydırma kullan +scroll_vertical_label=Dikey kaydırma +scroll_horizontal.title=Yatay kaydırma kullan +scroll_horizontal_label=Yatay kaydırma +scroll_wrapped.title=Yan yana kaydırmayı kullan +scroll_wrapped_label=Yan yana kaydırma + +spread_none.title=Yan yana sayfaları birleştirme +spread_none_label=Birleştirme +spread_odd.title=Yan yana sayfaları tek numaralı sayfalardan başlayarak birleştir +spread_odd_label=Tek numaralı +spread_even.title=Yan yana sayfaları çift numaralı sayfalardan başlayarak birleştir +spread_even_label=Çift numaralı + +# Document properties dialog box +document_properties.title=Belge özellikleri… +document_properties_label=Belge özellikleri… +document_properties_file_name=Dosya adı: +document_properties_file_size=Dosya boyutu: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bayt) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bayt) +document_properties_title=Başlık: +document_properties_author=Yazar: +document_properties_subject=Konu: +document_properties_keywords=Anahtar kelimeler: +document_properties_creation_date=Oluturma tarihi: +document_properties_modification_date=Değiştirme tarihi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Oluşturan: +document_properties_producer=PDF üreticisi: +document_properties_version=PDF sürümü: +document_properties_page_count=Sayfa sayısı: +document_properties_page_size=Sayfa boyutu: +document_properties_page_size_unit_inches=inç +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=dikey +document_properties_page_size_orientation_landscape=yatay +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Hızlı web görünümü: +document_properties_linearized_yes=Evet +document_properties_linearized_no=Hayır +document_properties_close=Kapat + +print_progress_message=Belge yazdırılmaya hazırlanıyor… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent=%{{progress}} +print_progress_close=İptal + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Kenar çubuğunu aç/kapat +toggle_sidebar_notification2.title=Kenar çubuğunu aç/kapat (Belge ana hat/ekler/katmanlar içeriyor) +toggle_sidebar_label=Kenar çubuğunu aç/kapat +document_outline.title=Belge ana hatlarını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın) +document_outline_label=Belge ana hatları +attachments.title=Ekleri göster +attachments_label=Ekler +layers.title=Katmanları göster (tüm katmanları varsayılan duruma sıfırlamak için çift tıklayın) +layers_label=Katmanlar +thumbs.title=Küçük resimleri göster +thumbs_label=Küçük resimler +current_outline_item.title=Mevcut ana hat öğesini bul +current_outline_item_label=Mevcut ana hat öğesi +findbar.title=Belgede bul +findbar_label=Bul + +additional_layers=Ek katmanlar +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Sayfa {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Sayfa {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. sayfanın küçük hâli + +# Find panel button title and messages +find_input.title=Bul +find_input.placeholder=Belgede bul… +find_previous.title=Önceki eşleşmeyi bul +find_previous_label=Önceki +find_next.title=Sonraki eşleşmeyi bul +find_next_label=Sonraki +find_highlight=Tümünü vurgula +find_match_case_label=Büyük-küçük harfe duyarlı +find_match_diacritics_label=Fonetik işaretleri bul +find_entire_word_label=Tam sözcükler +find_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi +find_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} eşleşmeden {{current}}. eşleşme +find_match_count[two]={{total}} eşleşmeden {{current}}. eşleşme +find_match_count[few]={{total}} eşleşmeden {{current}}. eşleşme +find_match_count[many]={{total}} eşleşmeden {{current}}. eşleşme +find_match_count[other]={{total}} eşleşmeden {{current}}. eşleşme +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]={{limit}} eşleşmeden fazla +find_match_count_limit[one]={{limit}} eşleşmeden fazla +find_match_count_limit[two]={{limit}} eşleşmeden fazla +find_match_count_limit[few]={{limit}} eşleşmeden fazla +find_match_count_limit[many]={{limit}} eşleşmeden fazla +find_match_count_limit[other]={{limit}} eşleşmeden fazla +find_not_found=Eşleşme bulunamadı + +# Error panel labels +error_more_info=Daha fazla bilgi al +error_less_info=Daha az bilgi +error_close=Kapat +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js sürüm {{version}} (yapı: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=İleti: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Yığın: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dosya: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Satır: {{line}} + +# Predefined zoom values +page_scale_width=Sayfa genişliği +page_scale_fit=Sayfayı sığdır +page_scale_auto=Otomatik yakınlaştır +page_scale_actual=Gerçek boyut +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent=%{{scale}} + +# Loading indicator messages +loading=Yükleniyor… +loading_error=PDF yüklenirken bir hata oluştu. +invalid_file_error=Geçersiz veya bozulmuş PDF dosyası. +missing_file_error=PDF dosyası eksik. +unexpected_response_error=Beklenmeyen sunucu yanıtı. + +rendering_error=Sayfa yorumlanırken bir hata oluştu. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} işareti] +password_label=Bu PDF dosyasını açmak için parolasını yazın. +password_invalid=Geçersiz parola. Lütfen yeniden deneyin. +password_ok=Tamam +password_cancel=İptal + +printing_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir. +printing_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil. +web_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor. + +# Editor +editor_free_text2.title=Metin +editor_free_text2_label=Metin +editor_ink2.title=Çiz +editor_ink2_label=Çiz + +free_text2_default_content=Yazmaya başlayın… + +# Editor Parameters +editor_free_text_color=Renk +editor_free_text_size=Boyut +editor_ink_color=Renk +editor_ink_thickness=Kalınlık +editor_ink_opacity=Saydamlık + +# Editor aria +editor_free_text2_aria_label=Metin düzenleyicisi +editor_ink2_aria_label=Çizim düzenleyicisi +editor_ink_canvas_aria_label=Kullanıcı tarafından oluşturulan resim diff --git a/src/assets/pdf-annotation/web/locale/trs/viewer.properties b/src/assets/pdf-annotation/web/locale/trs/viewer.properties new file mode 100755 index 0000000..8bd1fe1 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/trs/viewer.properties @@ -0,0 +1,206 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pajinâ gunâj rukùu +previous_label=Sa gachin +next.title=Pajinâ 'na' ñaan +next_label=Ne' ñaan + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Ñanj +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=si'iaj {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Nagi'iaj li' +zoom_out_label=Nagi'iaj li' +zoom_in.title=Nagi'iaj niko' +zoom_in_label=Nagi'iaj niko' +zoom.title=dàj nìko ma'an +presentation_mode.title=Naduno' daj ga ma +presentation_mode_label=Daj gà ma +open_file.title=Na'nïn' chrû ñanj +open_file_label=Na'nïn +print.title=Nari' ña du'ua +print_label=Nari' ñadu'ua +download.title=Nadunïnj +download_label=Nadunïnj +bookmark.title=Daj hua ma (Guxun' nej na'nïn' riña ventana nakàa) +bookmark_label=Daj hua ma + +# Secondary toolbar and context menu +tools.title=Rasun +tools_label=Nej rasùun +first_page.title=gun' riña pajina asiniin +first_page_label=Gun' riña pajina asiniin +last_page.title=Gun' riña pajina rukù ni'in +last_page_label=Gun' riña pajina rukù ni'inj +page_rotate_cw.title=Tanikaj ne' huat +page_rotate_cw_label=Tanikaj ne' huat +page_rotate_ccw.title=Tanikaj ne' chînt' +page_rotate_ccw_label=Tanikaj ne' chint + +cursor_text_select_tool.title=Dugi'iaj sun' sa ganahui texto +cursor_text_select_tool_label=Nej rasun arajsun' da' nahui' texto +cursor_hand_tool.title=Nachrun' nej rasun +cursor_hand_tool_label=Sa rajsun ro'o' + +scroll_vertical.title=Garasun' dukuán runūu +scroll_vertical_label=Dukuán runūu +scroll_horizontal.title=Garasun' dukuán nikin' nahui +scroll_horizontal_label=Dukuán nikin' nahui +scroll_wrapped.title=Garasun' sa nachree +scroll_wrapped_label=Sa nachree + +spread_none.title=Si nagi'iaj nugun'un' nej pagina hua ninin +spread_none_label=Ni'io daj hua pagina +spread_odd.title=Nagi'iaj nugua'ant nej pajina +spread_odd_label=Ni'io' daj hua libro gurin +spread_even.title=Nakāj dugui' ngà nej pajinâ ayi'ì ngà da' hùi hùi +spread_even_label=Nahuin nìko nej + +# Document properties dialog box +document_properties.title=Nej sa nikāj ñanj… +document_properties_label=Nej sa nikāj ñanj… +document_properties_file_name=Si yugui archîbo: +document_properties_file_size=Dàj yachìj archîbo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Si yugui: +document_properties_author=Sí girirà: +document_properties_subject=Dugui': +document_properties_keywords=Nej nuguan' huìi: +document_properties_creation_date=Gui gurugui' man: +document_properties_modification_date=Nuguan' nahuin nakà: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Guiri ro' +document_properties_producer=Sa ri PDF: +document_properties_version=PDF Version: +document_properties_page_count=Si Guendâ Pâjina: +document_properties_page_size=Dàj yachìj pâjina: +document_properties_page_size_unit_inches=riña +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=nadu'ua +document_properties_page_size_orientation_landscape=dàj huaj +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Da'ngà'a +document_properties_page_size_name_legal=Nuguan' a'nï'ïn +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Nanèt chre ni'iajt riña Web: +document_properties_linearized_yes=Ga'ue +document_properties_linearized_no=Si ga'ue +document_properties_close=Narán + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Duyichin' + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Nadunā barrâ nù yi'nïn +toggle_sidebar_label=Nadunā barrâ nù yi'nïn +findbar_label=Narì' + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_input.title=Narì' +find_previous_label=Sa gachîn +find_next_label=Ne' ñaan +find_highlight=Daran' sa ña'an +find_match_case_label=Match case +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} si'iaj {{total}} guña gè huaj +find_match_count[two]={{current}} si'iaj {{total}} guña gè huaj +find_match_count[few]={{current}} si'iaj {{total}} guña gè huaj +find_match_count[many]={{current}} si'iaj {{total}} guña gè huaj +find_match_count[other]={{current}} of {{total}} matches +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Doj ngà da' {{limit}} nej sa nari' dugui'i +find_match_count_limit[one]=Doj ngà da' {{limit}} sa nari' dugui'i +find_match_count_limit[two]=Doj ngà da' {{limit}} nej sa nari' dugui'i +find_match_count_limit[few]=Doj ngà da' {{limit}} nej sa nari' dugui'i +find_match_count_limit[many]=Doj ngà da' {{limit}} nej sa nari' dugui'i +find_match_count_limit[other]=Doj ngà da' {{limit}} nej sa nari' dugui'i +find_not_found=Nu narì'ij nugua'anj + +# Error panel labels +error_more_info=Doj nuguan' a'min rayi'î nan +error_less_info=Dòj nuguan' a'min rayi'î nan +error_close=Narán +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Naru'ui': {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archîbo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lînia: {{line}} + +# Predefined zoom values +page_scale_actual=Dàj yàchi akuan' nín +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_ok=Ga'ue +password_cancel=Duyichin' + diff --git a/src/assets/pdf-annotation/web/locale/uk/viewer.properties b/src/assets/pdf-annotation/web/locale/uk/viewer.properties new file mode 100755 index 0000000..9249e3f --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/uk/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Попередня сторінка +previous_label=Попередня +next.title=Наступна сторінка +next_label=Наступна + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Сторінка +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=із {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} із {{pagesCount}}) + +zoom_out.title=Зменшити +zoom_out_label=Зменшити +zoom_in.title=Збільшити +zoom_in_label=Збільшити +zoom.title=Масштаб +presentation_mode.title=Перейти в режим презентації +presentation_mode_label=Режим презентації +open_file.title=Відкрити файл +open_file_label=Відкрити +print.title=Друк +print_label=Друк +download.title=Завантажити +download_label=Завантажити +save.title=Зберегти +save_label=Зберегти +bookmark.title=Поточний вигляд (копіювати чи відкрити в новому вікні) +bookmark_label=Поточний вигляд + +# Secondary toolbar and context menu +tools.title=Інструменти +tools_label=Інструменти +first_page.title=На першу сторінку +first_page_label=На першу сторінку +last_page.title=На останню сторінку +last_page_label=На останню сторінку +page_rotate_cw.title=Повернути за годинниковою стрілкою +page_rotate_cw_label=Повернути за годинниковою стрілкою +page_rotate_ccw.title=Повернути проти годинникової стрілки +page_rotate_ccw_label=Повернути проти годинникової стрілки + +cursor_text_select_tool.title=Увімкнути інструмент вибору тексту +cursor_text_select_tool_label=Інструмент вибору тексту +cursor_hand_tool.title=Увімкнути інструмент "Рука" +cursor_hand_tool_label=Інструмент "Рука" + +scroll_page.title=Використовувати прокручування сторінки +scroll_page_label=Прокручування сторінки +scroll_vertical.title=Використовувати вертикальне прокручування +scroll_vertical_label=Вертикальне прокручування +scroll_horizontal.title=Використовувати горизонтальне прокручування +scroll_horizontal_label=Горизонтальне прокручування +scroll_wrapped.title=Використовувати масштабоване прокручування +scroll_wrapped_label=Масштабоване прокручування + +spread_none.title=Не використовувати розгорнуті сторінки +spread_none_label=Без розгорнутих сторінок +spread_odd.title=Розгорнуті сторінки починаються з непарних номерів +spread_odd_label=Непарні сторінки зліва +spread_even.title=Розгорнуті сторінки починаються з парних номерів +spread_even_label=Парні сторінки зліва + +# Document properties dialog box +document_properties.title=Властивості документа… +document_properties_label=Властивості документа… +document_properties_file_name=Назва файла: +document_properties_file_size=Розмір файла: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} bytes) +document_properties_title=Заголовок: +document_properties_author=Автор: +document_properties_subject=Тема: +document_properties_keywords=Ключові слова: +document_properties_creation_date=Дата створення: +document_properties_modification_date=Дата зміни: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Створено: +document_properties_producer=Виробник PDF: +document_properties_version=Версія PDF: +document_properties_page_count=Кількість сторінок: +document_properties_page_size=Розмір сторінки: +document_properties_page_size_unit_inches=дюймів +document_properties_page_size_unit_millimeters=мм +document_properties_page_size_orientation_portrait=книжкова +document_properties_page_size_orientation_landscape=альбомна +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Швидкий перегляд в Інтернеті: +document_properties_linearized_yes=Так +document_properties_linearized_no=Ні +document_properties_close=Закрити + +print_progress_message=Підготовка документу до друку… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Скасувати + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Бічна панель +toggle_sidebar_notification2.title=Перемкнути бічну панель (документ містить ескіз/вкладення/шари) +toggle_sidebar_label=Перемкнути бічну панель +document_outline.title=Показати схему документу (подвійний клік для розгортання/згортання елементів) +document_outline_label=Схема документа +attachments.title=Показати прикріплення +attachments_label=Прикріплення +layers.title=Показати шари (двічі клацніть, щоб скинути всі шари до типового стану) +layers_label=Шари +thumbs.title=Показувати ескізи +thumbs_label=Ескізи +current_outline_item.title=Знайти поточний елемент змісту +current_outline_item_label=Поточний елемент змісту +findbar.title=Знайти в документі +findbar_label=Знайти + +additional_layers=Додаткові шари +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Сторінка {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Сторінка {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ескіз сторінки {{page}} + +# Find panel button title and messages +find_input.title=Знайти +find_input.placeholder=Знайти в документі… +find_previous.title=Знайти попереднє входження фрази +find_previous_label=Попереднє +find_next.title=Знайти наступне входження фрази +find_next_label=Наступне +find_highlight=Підсвітити все +find_match_case_label=З урахуванням регістру +find_match_diacritics_label=Відповідність діакритичних знаків +find_entire_word_label=Цілі слова +find_reached_top=Досягнуто початку документу, продовжено з кінця +find_reached_bottom=Досягнуто кінця документу, продовжено з початку +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} збіг із {{total}} +find_match_count[two]={{current}} збіги з {{total}} +find_match_count[few]={{current}} збігів із {{total}} +find_match_count[many]={{current}} збігів із {{total}} +find_match_count[other]={{current}} збігів із {{total}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Понад {{limit}} збігів +find_match_count_limit[one]=Більше, ніж {{limit}} збіг +find_match_count_limit[two]=Більше, ніж {{limit}} збіги +find_match_count_limit[few]=Більше, ніж {{limit}} збігів +find_match_count_limit[many]=Понад {{limit}} збігів +find_match_count_limit[other]=Понад {{limit}} збігів +find_not_found=Фразу не знайдено + +# Error panel labels +error_more_info=Більше інформації +error_less_info=Менше інформації +error_close=Закрити +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Повідомлення: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Рядок: {{line}} + +# Predefined zoom values +page_scale_width=За шириною +page_scale_fit=Вмістити +page_scale_auto=Автомасштаб +page_scale_actual=Дійсний розмір +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Завантаження… +loading_error=Під час завантаження PDF сталася помилка. +invalid_file_error=Недійсний або пошкоджений PDF-файл. +missing_file_error=Відсутній PDF-файл. +unexpected_response_error=Неочікувана відповідь сервера. + +rendering_error=Під час виведення сторінки сталася помилка. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-анотація] +password_label=Введіть пароль для відкриття цього PDF-файла. +password_invalid=Невірний пароль. Спробуйте ще. +password_ok=Гаразд +password_cancel=Скасувати + +printing_not_supported=Попередження: Цей браузер не повністю підтримує друк. +printing_not_ready=Попередження: PDF не повністю завантажений для друку. +web_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти. + +# Editor +editor_free_text2.title=Текст +editor_free_text2_label=Текст +editor_ink2.title=Малювати +editor_ink2_label=Малювати + +free_text2_default_content=Почніть вводити… + +# Editor Parameters +editor_free_text_color=Колір +editor_free_text_size=Розмір +editor_ink_color=Колір +editor_ink_thickness=Товщина +editor_ink_opacity=Прозорість + +# Editor aria +editor_free_text2_aria_label=Текстовий редактор +editor_ink2_aria_label=Графічний редактор +editor_ink_canvas_aria_label=Зображення, створене користувачем diff --git a/src/assets/pdf-annotation/web/locale/ur/viewer.properties b/src/assets/pdf-annotation/web/locale/ur/viewer.properties new file mode 100755 index 0000000..e3853b0 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/ur/viewer.properties @@ -0,0 +1,239 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=پچھلا صفحہ +previous_label=پچھلا +next.title=اگلا صفحہ +next_label=آگے + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=صفحہ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} کا +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} کا {{pagesCount}}) + +zoom_out.title=باہر زوم کریں +zoom_out_label=باہر زوم کریں +zoom_in.title=اندر زوم کریں +zoom_in_label=اندر زوم کریں +zoom.title=زوم +presentation_mode.title=پیشکش موڈ میں چلے جائیں +presentation_mode_label=پیشکش موڈ +open_file.title=مسل کھولیں +open_file_label=کھولیں +print.title=چھاپیں +print_label=چھاپیں +download.title=ڈاؤن لوڈ +download_label=ڈاؤن لوڈ +bookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں) +bookmark_label=حالیہ نظارہ + +# Secondary toolbar and context menu +tools.title=آلات +tools_label=آلات +first_page.title=پہلے صفحہ پر جائیں +first_page_label=پہلے صفحہ پر جائیں +last_page.title=آخری صفحہ پر جائیں +last_page_label=آخری صفحہ پر جائیں +page_rotate_cw.title=گھڑی وار گھمائیں +page_rotate_cw_label=گھڑی وار گھمائیں +page_rotate_ccw.title=ضد گھڑی وار گھمائیں +page_rotate_ccw_label=ضد گھڑی وار گھمائیں + +cursor_text_select_tool.title=متن کے انتخاب کے ٹول کو فعال بناے +cursor_text_select_tool_label=متن کے انتخاب کا آلہ +cursor_hand_tool.title=ہینڈ ٹول کو فعال بناییں +cursor_hand_tool_label=ہاتھ کا آلہ + +scroll_vertical.title=عمودی اسکرولنگ کا استعمال کریں +scroll_vertical_label=عمودی اسکرولنگ +scroll_horizontal.title=افقی سکرولنگ کا استعمال کریں +scroll_horizontal_label=افقی سکرولنگ + +spread_none.title=صفحہ پھیلانے میں شامل نہ ہوں +spread_none_label=کوئی پھیلاؤ نہیں +spread_odd_label=تاک پھیلاؤ +spread_even_label=جفت پھیلاؤ + +# Document properties dialog box +document_properties.title=دستاویز خواص… +document_properties_label=دستاویز خواص…\u0020 +document_properties_file_name=نام مسل: +document_properties_file_size=مسل سائز: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=عنوان: +document_properties_author=تخلیق کار: +document_properties_subject=موضوع: +document_properties_keywords=کلیدی الفاظ: +document_properties_creation_date=تخلیق کی تاریخ: +document_properties_modification_date=ترمیم کی تاریخ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}، {{time}} +document_properties_creator=تخلیق کار: +document_properties_producer=PDF پیدا کار: +document_properties_version=PDF ورژن: +document_properties_page_count=صفحہ شمار: +document_properties_page_size=صفہ کی لمبائ: +document_properties_page_size_unit_inches=میں +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=عمودی انداز +document_properties_page_size_orientation_landscape=افقى انداز +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=خط +document_properties_page_size_name_legal=قانونی +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} {{name}} {{orientation}} +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=تیز ویب دیکھیں: +document_properties_linearized_yes=ہاں +document_properties_linearized_no=نہیں +document_properties_close=بند کریں + +print_progress_message=چھاپنے کرنے کے لیے دستاویز تیار کیے جا رھے ھیں +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent=*{{progress}}%* +print_progress_close=منسوخ کریں + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=سلائیڈ ٹوگل کریں +toggle_sidebar_label=سلائیڈ ٹوگل کریں +document_outline.title=دستاویز کی سرخیاں دکھایں (تمام اشیاء وسیع / غائب کرنے کے لیے ڈبل کلک کریں) +document_outline_label=دستاویز آؤٹ لائن +attachments.title=منسلکات دکھائیں +attachments_label=منسلکات +thumbs.title=تھمبنیل دکھائیں +thumbs_label=مجمل +findbar.title=دستاویز میں ڈھونڈیں +findbar_label=ڈھونڈیں + +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=صفحہ {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=صفحہ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=صفحے کا مجمل {{page}} + +# Find panel button title and messages +find_input.title=ڈھونڈیں +find_input.placeholder=دستاویز… میں ڈھونڈیں +find_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں +find_previous_label=پچھلا +find_next.title=فقرے کا اگلہ وقوع ڈھونڈیں +find_next_label=آگے +find_highlight=تمام نمایاں کریں +find_match_case_label=حروف مشابہ کریں +find_entire_word_label=تمام الفاظ +find_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا +find_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{total}} میچ کا {{current}} +find_match_count[few]={{total}} میچوں میں سے {{current}} +find_match_count[many]={{total}} میچوں میں سے {{current}} +find_match_count[other]={{total}} میچوں میں سے {{current}} +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(total) ]} +find_match_count_limit[zero]={{limit}} سے زیادہ میچ +find_match_count_limit[one]={{limit}} سے زیادہ میچ +find_match_count_limit[two]={{limit}} سے زیادہ میچ +find_match_count_limit[few]={{limit}} سے زیادہ میچ +find_match_count_limit[many]={{limit}} سے زیادہ میچ +find_match_count_limit[other]={{limit}} سے زیادہ میچ +find_not_found=فقرا نہیں ملا + +# Error panel labels +error_more_info=مزید معلومات +error_less_info=کم معلومات +error_close=بند کریں +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=پیغام: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=سٹیک: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=مسل: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=لائن: {{line}} +rendering_error=صفحہ بناتے ہوئے نقص آ گیا۔ + +# Predefined zoom values +page_scale_width=صفحہ چوڑائی +page_scale_fit=صفحہ فٹنگ +page_scale_auto=خودکار زوم +page_scale_actual=اصل سائز +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error=PDF لوڈ کرتے وقت نقص آ گیا۔ +invalid_file_error=ناجائز یا خراب PDF مسل +missing_file_error=PDF مسل غائب ہے۔ +unexpected_response_error=غیرمتوقع پیش کار جواب + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}.{{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} نوٹ] +password_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں. +password_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں. +password_ok=ٹھیک ہے +password_cancel=منسوخ کریں + +printing_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔ +printing_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔ +web_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔ +# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same +# exact string as in the `chrome.properties` file. + diff --git a/src/assets/pdf-annotation/web/locale/uz/viewer.properties b/src/assets/pdf-annotation/web/locale/uz/viewer.properties new file mode 100755 index 0000000..31c60ae --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/uz/viewer.properties @@ -0,0 +1,163 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Oldingi sahifa +previous_label=Oldingi +next.title=Keyingi sahifa +next_label=Keyingi + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/{{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Kichiklashtirish +zoom_out_label=Kichiklashtirish +zoom_in.title=Kattalashtirish +zoom_in_label=Kattalashtirish +zoom.title=Masshtab +presentation_mode.title=Namoyish usuliga oʻtish +presentation_mode_label=Namoyish usuli +open_file.title=Faylni ochish +open_file_label=Ochish +print.title=Chop qilish +print_label=Chop qilish +download.title=Yuklab olish +download_label=Yuklab olish +bookmark.title=Joriy koʻrinish (nusxa oling yoki yangi oynada oching) +bookmark_label=Joriy koʻrinish + +# Secondary toolbar and context menu +tools.title=Vositalar +tools_label=Vositalar +first_page.title=Birinchi sahifaga oʻtish +first_page_label=Birinchi sahifaga oʻtish +last_page.title=Soʻnggi sahifaga oʻtish +last_page_label=Soʻnggi sahifaga oʻtish +page_rotate_cw.title=Soat yoʻnalishi boʻyicha burish +page_rotate_cw_label=Soat yoʻnalishi boʻyicha burish +page_rotate_ccw.title=Soat yoʻnalishiga qarshi burish +page_rotate_ccw_label=Soat yoʻnalishiga qarshi burish + + +# Document properties dialog box +document_properties.title=Hujjat xossalari +document_properties_label=Hujjat xossalari +document_properties_file_name=Fayl nomi: +document_properties_file_size=Fayl hajmi: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Nomi: +document_properties_author=Muallifi: +document_properties_subject=Mavzusi: +document_properties_keywords=Kalit so‘zlar +document_properties_creation_date=Yaratilgan sanasi: +document_properties_modification_date=O‘zgartirilgan sanasi +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Yaratuvchi: +document_properties_producer=PDF ishlab chiqaruvchi: +document_properties_version=PDF versiyasi: +document_properties_page_count=Sahifa soni: +document_properties_close=Yopish + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Yon panelni yoqib/oʻchirib qoʻyish +toggle_sidebar_label=Yon panelni yoqib/oʻchirib qoʻyish +document_outline_label=Hujjat tuzilishi +attachments.title=Ilovalarni ko‘rsatish +attachments_label=Ilovalar +thumbs.title=Nishonchalarni koʻrsatish +thumbs_label=Nishoncha +findbar.title=Hujjat ichidan topish + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} sahifa +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} sahifa nishonchasi + +# Find panel button title and messages +find_previous.title=Soʻzlardagi oldingi hodisani topish +find_previous_label=Oldingi +find_next.title=Iboradagi keyingi hodisani topish +find_next_label=Keyingi +find_highlight=Barchasini ajratib koʻrsatish +find_match_case_label=Katta-kichik harflarni farqlash +find_reached_top=Hujjatning boshigacha yetib keldik, pastdan davom ettiriladi +find_reached_bottom=Hujjatning oxiriga yetib kelindi, yuqoridan davom ettirladi +find_not_found=Soʻzlar topilmadi + +# Error panel labels +error_more_info=Koʻproq ma`lumot +error_less_info=Kamroq ma`lumot +error_close=Yopish +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Xabar: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Toʻplam: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fayl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Satr: {{line}} +rendering_error=Sahifa renderlanayotganda xato yuz berdi. + +# Predefined zoom values +page_scale_width=Sahifa eni +page_scale_fit=Sahifani moslashtirish +page_scale_auto=Avtomatik masshtab +page_scale_actual=Haqiqiy hajmi +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=PDF yuklanayotganda xato yuz berdi. +invalid_file_error=Xato yoki buzuq PDF fayli. +missing_file_error=PDF fayl kerak. +unexpected_response_error=Kutilmagan server javobi. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=PDF faylni ochish uchun parolni kiriting. +password_invalid=Parol - notoʻgʻri. Qaytadan urinib koʻring. +password_ok=OK + +printing_not_supported=Diqqat: chop qilish bruzer tomonidan toʻliq qoʻllab-quvvatlanmaydi. +printing_not_ready=Diqqat: PDF fayl chop qilish uchun toʻliq yuklanmadi. +web_fonts_disabled=Veb shriftlar oʻchirilgan: ichki PDF shriftlardan foydalanib boʻlmmaydi. + diff --git a/src/assets/pdf-annotation/web/locale/vi/viewer.properties b/src/assets/pdf-annotation/web/locale/vi/viewer.properties new file mode 100755 index 0000000..6ca1c0a --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/vi/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Trang trước +previous_label=Trước +next.title=Trang Sau +next_label=Tiếp + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Trang +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=trên {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} trên {{pagesCount}}) + +zoom_out.title=Thu nhỏ +zoom_out_label=Thu nhỏ +zoom_in.title=Phóng to +zoom_in_label=Phóng to +zoom.title=Thu phóng +presentation_mode.title=Chuyển sang chế độ trình chiếu +presentation_mode_label=Chế độ trình chiếu +open_file.title=Mở tập tin +open_file_label=Mở tập tin +print.title=In +print_label=In +download.title=Tải xuống +download_label=Tải xuống +save.title=Lưu +save_label=Lưu +bookmark.title=Chế độ xem hiện tại (sao chép hoặc mở trong cửa sổ mới) +bookmark_label=Chế độ xem hiện tại + +# Secondary toolbar and context menu +tools.title=Công cụ +tools_label=Công cụ +first_page.title=Về trang đầu +first_page_label=Về trang đầu +last_page.title=Đến trang cuối +last_page_label=Đến trang cuối +page_rotate_cw.title=Xoay theo chiều kim đồng hồ +page_rotate_cw_label=Xoay theo chiều kim đồng hồ +page_rotate_ccw.title=Xoay ngược chiều kim đồng hồ +page_rotate_ccw_label=Xoay ngược chiều kim đồng hồ + +cursor_text_select_tool.title=Kích hoạt công cụ chọn vùng văn bản +cursor_text_select_tool_label=Công cụ chọn vùng văn bản +cursor_hand_tool.title=Kích hoạt công cụ con trỏ +cursor_hand_tool_label=Công cụ con trỏ + +scroll_page.title=Sử dụng cuộn trang hiện tại +scroll_page_label=Cuộn trang hiện tại +scroll_vertical.title=Sử dụng cuộn dọc +scroll_vertical_label=Cuộn dọc +scroll_horizontal.title=Sử dụng cuộn ngang +scroll_horizontal_label=Cuộn ngang +scroll_wrapped.title=Sử dụng cuộn ngắt dòng +scroll_wrapped_label=Cuộn ngắt dòng + +spread_none.title=Không nối rộng trang +spread_none_label=Không có phân cách +spread_odd.title=Nối trang bài bắt đầu với các trang được đánh số lẻ +spread_odd_label=Phân cách theo số lẻ +spread_even.title=Nối trang bài bắt đầu với các trang được đánh số chẵn +spread_even_label=Phân cách theo số chẵn + +# Document properties dialog box +document_properties.title=Thuộc tính của tài liệu… +document_properties_label=Thuộc tính của tài liệu… +document_properties_file_name=Tên tập tin: +document_properties_file_size=Kích thước: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Tiêu đề: +document_properties_author=Tác giả: +document_properties_subject=Chủ đề: +document_properties_keywords=Từ khóa: +document_properties_creation_date=Ngày tạo: +document_properties_modification_date=Ngày sửa đổi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Người tạo: +document_properties_producer=Phần mềm tạo PDF: +document_properties_version=Phiên bản PDF: +document_properties_page_count=Tổng số trang: +document_properties_page_size=Kích thước trang: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=khổ dọc +document_properties_page_size_orientation_landscape=khổ ngang +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Thư +document_properties_page_size_name_legal=Pháp lý +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=Xem nhanh trên web: +document_properties_linearized_yes=Có +document_properties_linearized_no=Không +document_properties_close=Ðóng + +print_progress_message=Chuẩn bị trang để in… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Hủy bỏ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Bật/Tắt thanh lề +toggle_sidebar_notification2.title=Bật tắt thanh lề (tài liệu bao gồm bản phác thảo/tập tin đính kèm/lớp) +toggle_sidebar_label=Bật/Tắt thanh lề +document_outline.title=Hiển thị tài liệu phác thảo (nhấp đúp vào để mở rộng/thu gọn tất cả các mục) +document_outline_label=Bản phác tài liệu +attachments.title=Hiện nội dung đính kèm +attachments_label=Nội dung đính kèm +layers.title=Hiển thị các lớp (nhấp đúp để đặt lại tất cả các lớp về trạng thái mặc định) +layers_label=Lớp +thumbs.title=Hiển thị ảnh thu nhỏ +thumbs_label=Ảnh thu nhỏ +current_outline_item.title=Tìm mục phác thảo hiện tại +current_outline_item_label=Mục phác thảo hiện tại +findbar.title=Tìm trong tài liệu +findbar_label=Tìm + +additional_layers=Các lớp bổ sung +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=Trang {{page}} +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Trang {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ảnh thu nhỏ của trang {{page}} + +# Find panel button title and messages +find_input.title=Tìm +find_input.placeholder=Tìm trong tài liệu… +find_previous.title=Tìm cụm từ ở phần trước +find_previous_label=Trước +find_next.title=Tìm cụm từ ở phần sau +find_next_label=Tiếp +find_highlight=Tô sáng tất cả +find_match_case_label=Phân biệt hoa, thường +find_match_diacritics_label=Khớp dấu phụ +find_entire_word_label=Toàn bộ từ +find_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối +find_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]={{current}} của {{total}} đã trùng +find_match_count[two]={{current}} của {{total}} đã trùng +find_match_count[few]={{current}} của {{total}} đã trùng +find_match_count[many]={{current}} của {{total}} đã trùng +find_match_count[other]={{current}} của {{total}} đã trùng +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=Nhiều hơn {{limit}} đã trùng +find_match_count_limit[one]=Nhiều hơn {{limit}} đã trùng +find_match_count_limit[two]=Nhiều hơn {{limit}} đã trùng +find_match_count_limit[few]=Nhiều hơn {{limit}} đã trùng +find_match_count_limit[many]=Nhiều hơn {{limit}} đã trùng +find_match_count_limit[other]=Nhiều hơn {{limit}} đã trùng +find_not_found=Không tìm thấy cụm từ này + +# Error panel labels +error_more_info=Thông tin thêm +error_less_info=Hiển thị ít thông tin hơn +error_close=Đóng +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Thông điệp: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Tập tin: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Dòng: {{line}} + +# Predefined zoom values +page_scale_width=Vừa chiều rộng +page_scale_fit=Vừa chiều cao +page_scale_auto=Tự động chọn kích thước +page_scale_actual=Kích thước thực +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=Đang tải… +loading_error=Lỗi khi tải tài liệu PDF. +invalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ. +missing_file_error=Thiếu tập tin PDF. +unexpected_response_error=Máy chủ có phản hồi lạ. + +rendering_error=Lỗi khi hiển thị trang. + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}}, {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Chú thích] +password_label=Nhập mật khẩu để mở tập tin PDF này. +password_invalid=Mật khẩu không đúng. Vui lòng thử lại. +password_ok=OK +password_cancel=Hủy bỏ + +printing_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này. +printing_not_ready=Cảnh báo: PDF chưa được tải hết để in. +web_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng. + +# Editor +editor_free_text2.title=Văn bản +editor_free_text2_label=Văn bản +editor_ink2.title=Vẽ +editor_ink2_label=Vẽ + +free_text2_default_content=Bắt đầu nhập… + +# Editor Parameters +editor_free_text_color=Màu +editor_free_text_size=Kích cỡ +editor_ink_color=Màu +editor_ink_thickness=Độ dày +editor_ink_opacity=Độ mờ + +# Editor aria +editor_free_text2_aria_label=Trình sửa văn bản +editor_ink2_aria_label=Trình sửa nét vẽ +editor_ink_canvas_aria_label=Hình ảnh do người dùng tạo diff --git a/src/assets/pdf-annotation/web/locale/wo/viewer.properties b/src/assets/pdf-annotation/web/locale/wo/viewer.properties new file mode 100755 index 0000000..71b23cb --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/wo/viewer.properties @@ -0,0 +1,123 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Xët wi jiitu +previous_label=Bi jiitu +next.title=Xët wi ci topp +next_label=Bi ci topp + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Wàññi +zoom_out_label=Wàññi +zoom_in.title=Yaatal +zoom_in_label=Yaatal +zoom.title=Yambalaŋ +presentation_mode.title=Wañarñil ci anamu wone +presentation_mode_label=Anamu Wone +open_file.title=Ubbi benn dencukaay +open_file_label=Ubbi +print.title=Móol +print_label=Móol +download.title=Yeb yi +download_label=Yeb yi +bookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees) +bookmark_label=Wone bi feeñ + +# Secondary toolbar and context menu + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Bopp: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +thumbs.title=Wone nataal yu ndaw yi +thumbs_label=Nataal yu ndaw yi +findbar.title=Gis ci biir jukki bi +findbar_label=Wut + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Xët {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Wiñet bu xët {{page}} + +# Find panel button title and messages +find_previous.title=Seet beneen kaddu bu ni mel te jiitu +find_previous_label=Bi jiitu +find_next.title=Seet beneen kaddu bu ni mel +find_next_label=Bi ci topp +find_highlight=Melaxal lépp +find_match_case_label=Sàmm jëmmalin wi +find_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf +find_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte +find_not_found=Gisiñu kaddu gi + +# Error panel labels +error_more_info=Xibaar yu gën bari +error_less_info=Xibaar yu gën bari +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Bataaxal: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Juug: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dencukaay: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rëdd : {{line}} +rendering_error=Am njumte bu am bi xët bi di wonewu. + +# Predefined zoom values +page_scale_width=Yaatuwaay bu mët +page_scale_fit=Xët lëmm +page_scale_auto=Yambalaŋ ci saa si +page_scale_actual=Dayo bi am +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +loading_error=Am na njumte ci yebum dencukaay PDF bi. +invalid_file_error=Dencukaay PDF bi baaxul walla mu sankar. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Karmat {{type}}] +password_ok=OK +password_cancel=Neenal + +printing_not_supported=Artu: Joowkat bii nanguwul lool mool. + diff --git a/src/assets/pdf-annotation/web/locale/xh/viewer.properties b/src/assets/pdf-annotation/web/locale/xh/viewer.properties new file mode 100755 index 0000000..0bb9e88 --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/xh/viewer.properties @@ -0,0 +1,177 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Iphepha langaphambili +previous_label=Okwangaphambili +next.title=Iphepha elilandelayo +next_label=Okulandelayo + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Iphepha +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=kwali- {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} kwali {{pagesCount}}) + +zoom_out.title=Bhekelisela Kudana +zoom_out_label=Bhekelisela Kudana +zoom_in.title=Sondeza Kufuphi +zoom_in_label=Sondeza Kufuphi +zoom.title=Yandisa / Nciphisa +presentation_mode.title=Tshintshela kwimo yonikezelo +presentation_mode_label=Imo yonikezelo +open_file.title=Vula Ifayile +open_file_label=Vula +print.title=Printa +print_label=Printa +download.title=Khuphela +download_label=Khuphela +bookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha) +bookmark_label=Imbonakalo ekhoyo + +# Secondary toolbar and context menu +tools.title=Izixhobo zemiyalelo +tools_label=Izixhobo zemiyalelo +first_page.title=Yiya kwiphepha lokuqala +first_page_label=Yiya kwiphepha lokuqala +last_page.title=Yiya kwiphepha lokugqibela +last_page_label=Yiya kwiphepha lokugqibela +page_rotate_cw.title=Jikelisa ngasekunene +page_rotate_cw_label=Jikelisa ngasekunene +page_rotate_ccw.title=Jikelisa ngasekhohlo +page_rotate_ccw_label=Jikelisa ngasekhohlo + +cursor_text_select_tool.title=Vumela iSixhobo sokuKhetha iTeksti +cursor_text_select_tool_label=ISixhobo sokuKhetha iTeksti +cursor_hand_tool.title=Yenza iSixhobo seSandla siSebenze +cursor_hand_tool_label=ISixhobo seSandla + +# Document properties dialog box +document_properties.title=Iipropati zoxwebhu… +document_properties_label=Iipropati zoxwebhu… +document_properties_file_name=Igama lefayile: +document_properties_file_size=Isayizi yefayile: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB (iibhayiti{{size_b}}) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB (iibhayithi{{size_b}}) +document_properties_title=Umxholo: +document_properties_author=Umbhali: +document_properties_subject=Umbandela: +document_properties_keywords=Amagama aphambili: +document_properties_creation_date=Umhla wokwenziwa kwayo: +document_properties_modification_date=Umhla wokulungiswa kwayo: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Umntu oyenzileyo: +document_properties_producer=Umvelisi we-PDF: +document_properties_version=Uhlelo lwe-PDF: +document_properties_page_count=Inani lamaphepha: +document_properties_close=Vala + +print_progress_message=Ilungisa uxwebhu ukuze iprinte… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Rhoxisa + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Togola ngebha eseCaleni +toggle_sidebar_label=Togola ngebha eseCaleni +document_outline.title=Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto) +document_outline_label=Isishwankathelo soxwebhu +attachments.title=Bonisa iziqhotyoshelwa +attachments_label=Iziqhoboshelo +thumbs.title=Bonisa ukrobiso kumfanekiso +thumbs_label=Ukrobiso kumfanekiso +findbar.title=Fumana kuXwebhu +findbar_label=Fumana + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Iphepha {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}} + +# Find panel button title and messages +find_input.title=Fumana +find_input.placeholder=Fumana kuXwebhu… +find_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama +find_previous_label=Okwangaphambili +find_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama +find_next_label=Okulandelayo +find_highlight=Qaqambisa konke +find_match_case_label=Tshatisa ngobukhulu bukanobumba +find_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi +find_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu +find_not_found=Ibinzana alifunyenwanga + +# Error panel labels +error_more_info=Inkcazelo Engakumbi +error_less_info=Inkcazelo Encinane +error_close=Vala +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=I-PDF.js v{{version}} (yakha: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Umyalezo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Imfumba: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ifayile: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Umgca: {{line}} +rendering_error=Imposiso yenzekile xa bekunikezelwa iphepha. + +# Predefined zoom values +page_scale_width=Ububanzi bephepha +page_scale_fit=Ukulinganiswa kwephepha +page_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo +page_scale_actual=Ubungakanani bokwenene +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +loading_error=Imposiso yenzekile xa kulayishwa i-PDF. +invalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo. +missing_file_error=Ifayile ye-PDF edukileyo. +unexpected_response_error=Impendulo yeseva engalindelekanga. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Ubhalo-nqaku] +password_label=Faka ipasiwedi ukuze uvule le fayile yePDF. +password_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona. +password_ok=KULUNGILE +password_cancel=Rhoxisa + +printing_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza. +printing_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta. +web_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo. + diff --git a/src/assets/pdf-annotation/web/locale/zh-CN/viewer.properties b/src/assets/pdf-annotation/web/locale/zh-CN/viewer.properties new file mode 100755 index 0000000..025c62e --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/zh-CN/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=上一页 +previous_label=上一页 +next.title=下一页 +next_label=下一页 + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=页面 +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=缩小 +zoom_out_label=缩小 +zoom_in.title=放大 +zoom_in_label=放大 +zoom.title=缩放 +presentation_mode.title=切换到演示模式 +presentation_mode_label=演示模式 +open_file.title=打开文件 +open_file_label=打开 +print.title=打印 +print_label=打印 +download.title=下载 +download_label=下载 +save.title=保存 +save_label=保存 +bookmark.title=当前在看的内容(复制或在新窗口中打开) +bookmark_label=当前在看 + +# Secondary toolbar and context menu +tools.title=工具 +tools_label=工具 +first_page.title=转到第一页 +first_page_label=转到第一页 +last_page.title=转到最后一页 +last_page_label=转到最后一页 +page_rotate_cw.title=顺时针旋转 +page_rotate_cw_label=顺时针旋转 +page_rotate_ccw.title=逆时针旋转 +page_rotate_ccw_label=逆时针旋转 + +cursor_text_select_tool.title=启用文本选择工具 +cursor_text_select_tool_label=文本选择工具 +cursor_hand_tool.title=启用手形工具 +cursor_hand_tool_label=手形工具 + +scroll_page.title=使用页面滚动 +scroll_page_label=页面滚动 +scroll_vertical.title=使用垂直滚动 +scroll_vertical_label=垂直滚动 +scroll_horizontal.title=使用水平滚动 +scroll_horizontal_label=水平滚动 +scroll_wrapped.title=使用平铺滚动 +scroll_wrapped_label=平铺滚动 + +spread_none.title=不加入衔接页 +spread_none_label=单页视图 +spread_odd.title=加入衔接页使奇数页作为起始页 +spread_odd_label=双页视图 +spread_even.title=加入衔接页使偶数页作为起始页 +spread_even_label=书籍视图 + +# Document properties dialog box +document_properties.title=文档属性… +document_properties_label=文档属性… +document_properties_file_name=文件名: +document_properties_file_size=文件大小: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} 字节) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} 字节) +document_properties_title=标题: +document_properties_author=作者: +document_properties_subject=主题: +document_properties_keywords=关键词: +document_properties_creation_date=创建日期: +document_properties_modification_date=修改日期: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=创建者: +document_properties_producer=PDF 生成器: +document_properties_version=PDF 版本: +document_properties_page_count=页数: +document_properties_page_size=页面大小: +document_properties_page_size_unit_inches=英寸 +document_properties_page_size_unit_millimeters=毫米 +document_properties_page_size_orientation_portrait=纵向 +document_properties_page_size_orientation_landscape=横向 +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=文本 +document_properties_page_size_name_legal=法律 +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}}({{name}},{{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=快速 Web 视图: +document_properties_linearized_yes=是 +document_properties_linearized_no=否 +document_properties_close=关闭 + +print_progress_message=正在准备打印文档… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=取消 + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=切换侧栏 +toggle_sidebar_notification2.title=切换侧栏(文档所含的大纲/附件/图层) +toggle_sidebar_label=切换侧栏 +document_outline.title=显示文档大纲(双击展开/折叠所有项) +document_outline_label=文档大纲 +attachments.title=显示附件 +attachments_label=附件 +layers.title=显示图层(双击即可将所有图层重置为默认状态) +layers_label=图层 +thumbs.title=显示缩略图 +thumbs_label=缩略图 +current_outline_item.title=查找当前大纲项目 +current_outline_item_label=当前大纲项目 +findbar.title=在文档中查找 +findbar_label=查找 + +additional_layers=其他图层 +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=第 {{page}} 页 +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=第 {{page}} 页 +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=页面 {{page}} 的缩略图 + +# Find panel button title and messages +find_input.title=查找 +find_input.placeholder=在文档中查找… +find_previous.title=查找词语上一次出现的位置 +find_previous_label=上一页 +find_next.title=查找词语后一次出现的位置 +find_next_label=下一页 +find_highlight=全部高亮显示 +find_match_case_label=区分大小写 +find_match_diacritics_label=匹配变音符号 +find_entire_word_label=字词匹配 +find_reached_top=到达文档开头,从末尾继续 +find_reached_bottom=到达文档末尾,从开头继续 +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=第 {{current}} 项,共匹配 {{total}} 项 +find_match_count[two]=第 {{current}} 项,共匹配 {{total}} 项 +find_match_count[few]=第 {{current}} 项,共匹配 {{total}} 项 +find_match_count[many]=第 {{current}} 项,共匹配 {{total}} 项 +find_match_count[other]=第 {{current}} 项,共匹配 {{total}} 项 +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=超过 {{limit}} 项匹配 +find_match_count_limit[one]=超过 {{limit}} 项匹配 +find_match_count_limit[two]=超过 {{limit}} 项匹配 +find_match_count_limit[few]=超过 {{limit}} 项匹配 +find_match_count_limit[many]=超过 {{limit}} 项匹配 +find_match_count_limit[other]=超过 {{limit}} 项匹配 +find_not_found=找不到指定词语 + +# Error panel labels +error_more_info=更多信息 +error_less_info=更少信息 +error_close=关闭 +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=信息:{{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=堆栈:{{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=文件:{{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=行号:{{line}} + +# Predefined zoom values +page_scale_width=适合页宽 +page_scale_fit=适合页面 +page_scale_auto=自动缩放 +page_scale_actual=实际大小 +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=正在载入… +loading_error=载入 PDF 时发生错误。 +invalid_file_error=无效或损坏的 PDF 文件。 +missing_file_error=缺少 PDF 文件。 +unexpected_response_error=意外的服务器响应。 + +rendering_error=渲染页面时发生错误。 + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}},{{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 注释] +password_label=输入密码以打开此 PDF 文件。 +password_invalid=密码无效。请重试。 +password_ok=确定 +password_cancel=取消 + +printing_not_supported=警告:此浏览器尚未完整支持打印功能。 +printing_not_ready=警告:此 PDF 未完成载入,无法打印。 +web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的 PDF 字体。 + +# Editor +editor_free_text2.title=文本 +editor_free_text2_label=文本 +editor_ink2.title=绘图 +editor_ink2_label=绘图 + +free_text2_default_content=开始输入… + +# Editor Parameters +editor_free_text_color=颜色 +editor_free_text_size=字号 +editor_ink_color=颜色 +editor_ink_thickness=粗细 +editor_ink_opacity=不透明度 + +# Editor aria +editor_free_text2_aria_label=文本编辑器 +editor_ink2_aria_label=绘图编辑器 +editor_ink_canvas_aria_label=用户创建图像 diff --git a/src/assets/pdf-annotation/web/locale/zh-TW/viewer.properties b/src/assets/pdf-annotation/web/locale/zh-TW/viewer.properties new file mode 100755 index 0000000..2f0362b --- /dev/null +++ b/src/assets/pdf-annotation/web/locale/zh-TW/viewer.properties @@ -0,0 +1,274 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=上一頁 +previous_label=上一頁 +next.title=下一頁 +next_label=下一頁 + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=第 +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=頁,共 {{pagesCount}} 頁 +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=(第 {{pageNumber}} 頁,共 {{pagesCount}} 頁) + +zoom_out.title=縮小 +zoom_out_label=縮小 +zoom_in.title=放大 +zoom_in_label=放大 +zoom.title=縮放 +presentation_mode.title=切換至簡報模式 +presentation_mode_label=簡報模式 +open_file.title=開啟檔案 +open_file_label=開啟 +print.title=列印 +print_label=列印 +download.title=下載 +download_label=下載 +save.title=儲存 +save_label=儲存 +bookmark.title=目前畫面(複製或開啟於新視窗) +bookmark_label=目前檢視 + +# Secondary toolbar and context menu +tools.title=工具 +tools_label=工具 +first_page.title=跳到第一頁 +first_page_label=跳到第一頁 +last_page.title=跳到最後一頁 +last_page_label=跳到最後一頁 +page_rotate_cw.title=順時針旋轉 +page_rotate_cw_label=順時針旋轉 +page_rotate_ccw.title=逆時針旋轉 +page_rotate_ccw_label=逆時針旋轉 + +cursor_text_select_tool.title=開啟文字選擇工具 +cursor_text_select_tool_label=文字選擇工具 +cursor_hand_tool.title=開啟頁面移動工具 +cursor_hand_tool_label=頁面移動工具 + +scroll_page.title=使用頁面捲動功能 +scroll_page_label=頁面捲動功能 +scroll_vertical.title=使用垂直捲動版面 +scroll_vertical_label=垂直捲動 +scroll_horizontal.title=使用水平捲動版面 +scroll_horizontal_label=水平捲動 +scroll_wrapped.title=使用多頁捲動版面 +scroll_wrapped_label=多頁捲動 + +spread_none.title=不要進行跨頁顯示 +spread_none_label=不跨頁 +spread_odd.title=從奇數頁開始跨頁 +spread_odd_label=奇數跨頁 +spread_even.title=從偶數頁開始跨頁 +spread_even_label=偶數跨頁 + +# Document properties dialog box +document_properties.title=文件內容… +document_properties_label=文件內容… +document_properties_file_name=檔案名稱: +document_properties_file_size=檔案大小: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB({{size_b}} 位元組) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB({{size_b}} 位元組) +document_properties_title=標題: +document_properties_author=作者: +document_properties_subject=主旨: +document_properties_keywords=關鍵字: +document_properties_creation_date=建立日期: +document_properties_modification_date=修改日期: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=建立者: +document_properties_producer=PDF 產生器: +document_properties_version=PDF 版本: +document_properties_page_count=頁數: +document_properties_page_size=頁面大小: +document_properties_page_size_unit_inches=in +document_properties_page_size_unit_millimeters=mm +document_properties_page_size_orientation_portrait=垂直 +document_properties_page_size_orientation_landscape=水平 +document_properties_page_size_name_a3=A3 +document_properties_page_size_name_a4=A4 +document_properties_page_size_name_letter=Letter +document_properties_page_size_name_legal=Legal +# LOCALIZATION NOTE (document_properties_page_size_dimension_string): +# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement and orientation, of the (current) page. +document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}({{orientation}}) +# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string): +# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by +# the size, respectively their unit of measurement, name, and orientation, of the (current) page. +document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}}({{name}},{{orientation}}) +# LOCALIZATION NOTE (document_properties_linearized): The linearization status of +# the document; usually called "Fast Web View" in English locales of Adobe software. +document_properties_linearized=快速 Web 檢視: +document_properties_linearized_yes=是 +document_properties_linearized_no=否 +document_properties_close=關閉 + +print_progress_message=正在準備列印文件… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=取消 + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=切換側邊欄 +toggle_sidebar_notification2.title=切換側邊欄(包含大綱、附件、圖層的文件) +toggle_sidebar_label=切換側邊欄 +document_outline.title=顯示文件大綱(雙擊展開/摺疊所有項目) +document_outline_label=文件大綱 +attachments.title=顯示附件 +attachments_label=附件 +layers.title=顯示圖層(滑鼠雙擊即可將所有圖層重設為預設狀態) +layers_label=圖層 +thumbs.title=顯示縮圖 +thumbs_label=縮圖 +current_outline_item.title=尋找目前的大綱項目 +current_outline_item_label=目前的大綱項目 +findbar.title=在文件中尋找 +findbar_label=尋找 + +additional_layers=其他圖層 +# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number. +page_landmark=第 {{page}} 頁 +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=第 {{page}} 頁 +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=頁 {{page}} 的縮圖 + +# Find panel button title and messages +find_input.title=尋找 +find_input.placeholder=在文件中搜尋… +find_previous.title=尋找文字前次出現的位置 +find_previous_label=上一個 +find_next.title=尋找文字下次出現的位置 +find_next_label=下一個 +find_highlight=全部強調標示 +find_match_case_label=區分大小寫 +find_match_diacritics_label=符合變音符號 +find_entire_word_label=符合整個字 +find_reached_top=已搜尋至文件頂端,自底端繼續搜尋 +find_reached_bottom=已搜尋至文件底端,自頂端繼續搜尋 +# LOCALIZATION NOTE (find_match_count): The supported plural forms are +# [one|two|few|many|other], with [other] as the default value. +# "{{current}}" and "{{total}}" will be replaced by a number representing the +# index of the currently active find result, respectively a number representing +# the total number of matches in the document. +find_match_count={[ plural(total) ]} +find_match_count[one]=第 {{current}} 筆,共找到 {{total}} 筆 +find_match_count[two]=第 {{current}} 筆,共找到 {{total}} 筆 +find_match_count[few]=第 {{current}} 筆,共找到 {{total}} 筆 +find_match_count[many]=第 {{current}} 筆,共找到 {{total}} 筆 +find_match_count[other]=第 {{current}} 筆,共找到 {{total}} 筆 +# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are +# [zero|one|two|few|many|other], with [other] as the default value. +# "{{limit}}" will be replaced by a numerical value. +find_match_count_limit={[ plural(limit) ]} +find_match_count_limit[zero]=找到超過 {{limit}} 筆 +find_match_count_limit[one]=找到超過 {{limit}} 筆 +find_match_count_limit[two]=找到超過 {{limit}} 筆 +find_match_count_limit[few]=找到超過 {{limit}} 筆 +find_match_count_limit[many]=找到超過 {{limit}} 筆 +find_match_count_limit[other]=找到超過 {{limit}} 筆 +find_not_found=找不到指定文字 + +# Error panel labels +error_more_info=更多資訊 +error_less_info=更少資訊 +error_close=關閉 +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=訊息: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=堆疊: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=檔案: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=行: {{line}} + +# Predefined zoom values +page_scale_width=頁面寬度 +page_scale_fit=縮放至頁面大小 +page_scale_auto=自動縮放 +page_scale_actual=實際大小 +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading=載入中… +loading_error=載入 PDF 時發生錯誤。 +invalid_file_error=無效或毀損的 PDF 檔案。 +missing_file_error=找不到 PDF 檔案。 +unexpected_response_error=伺服器回應未預期的內容。 + +rendering_error=描繪頁面時發生錯誤。 + +# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be +# replaced by the modification date, and time, of the annotation. +annotation_date_string={{date}} {{time}} + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 註解] +password_label=請輸入用來開啟此 PDF 檔案的密碼。 +password_invalid=密碼不正確,請再試一次。 +password_ok=確定 +password_cancel=取消 + +printing_not_supported=警告: 此瀏覽器未完整支援列印功能。 +printing_not_ready=警告: 此 PDF 未完成下載以供列印。 +web_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。 + +# Editor +editor_free_text2.title=文字 +editor_free_text2_label=文字 +editor_ink2.title=繪圖 +editor_ink2_label=繪圖 + +free_text2_default_content=開始打字… + +# Editor Parameters +editor_free_text_color=色彩 +editor_free_text_size=大小 +editor_ink_color=色彩 +editor_ink_thickness=線條粗細 +editor_ink_opacity=透​明度 + +# Editor aria +editor_free_text2_aria_label=文本編輯器 +editor_ink2_aria_label=圖形編輯器 +editor_ink_canvas_aria_label=使用者建立的圖片 diff --git a/src/assets/pdf-annotation/web/standard_fonts/FoxitDingbats.pfb b/src/assets/pdf-annotation/web/standard_fonts/FoxitDingbats.pfb new file mode 100755 index 0000000000000000000000000000000000000000..30d52963e281dcd7e6dd70555340fc987d3568ef GIT binary patch literal 29513 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 DiyeX$ literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/standard_fonts/FoxitFixedBold.pfb b/src/assets/pdf-annotation/web/standard_fonts/FoxitFixedBold.pfb new file mode 100755 index 0000000000000000000000000000000000000000..cf8e24aee5962ebcf7e4d58d932cc3321f3cdd38 GIT binary patch literal 18055 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 aP{6{BWwy2LU5CmZYCDT$C?nq``+oq(ZGoi# literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/standard_fonts/FoxitFixedBoldItalic.pfb b/src/assets/pdf-annotation/web/standard_fonts/FoxitFixedBoldItalic.pfb new file mode 100755 index 0000000000000000000000000000000000000000..d2880017c25716417f837a1c26044a0342fa3f9a GIT binary patch literal 19151 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 M96+?GEz$me0Iy=aZvX%Q literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/standard_fonts/FoxitFixedItalic.pfb b/src/assets/pdf-annotation/web/standard_fonts/FoxitFixedItalic.pfb new file mode 100755 index 0000000000000000000000000000000000000000..d71697d4b638737a5545dd0cb28cba8f613e4eec GIT binary patch literal 18746 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 Zni$D~vCIWrQWpk)bz)RW9#i8~{}=hLJf;8u literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/standard_fonts/FoxitSansBoldItalic.pfb b/src/assets/pdf-annotation/web/standard_fonts/FoxitSansBoldItalic.pfb new file mode 100755 index 0000000000000000000000000000000000000000..e1f60b75465d49e186d9109c9082f56d2c66f806 GIT binary patch literal 16418 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf-annotation/web/standard_fonts/FoxitSerifBold.pfb b/src/assets/pdf-annotation/web/standard_fonts/FoxitSerifBold.pfb new file mode 100755 index 0000000000000000000000000000000000000000..ff7c6ddecf6b689d93823c4c2a8c41e6e058de46 GIT binary patch literal 19395 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